Codebase list osrframework / upstream/0.17.2
New upstream version 0.17.2 Sophie Brun 6 years ago
733 changed file(s) with 85120 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
0 About the authors
1 ==================
2
3 Lead developers
4 ---------------
5
6 This software is a personal project leaded by Yaiza Rubio ([@yrubiosec](https://twitter.com/yrubiosec)) and Félix Brezo ([@febrezo](https://twitter.com/febrezo)), both of whom conform the [i3visio](http://i3visio.com) team.
7
8 Contributors
9 ------------
10
11 * Eva Suárez ([@EvaSuarez22](https://twitter.com/EvaSuarez22))
12 * Lucas Sánchez
13 * Fran J. Gómez ([@ffranz](https://twitter.com/ffranz))
14 * Abilio Almeida ([@aabilio](https://github.com/aabilio))
0 recursive-include config *cfg
1 recursive-include config/plugins *sample
2 recursive-include osrframework/transforms/lib/osrframework-maltego-settings *
3 recursive-include osrframework/transforms/lib *txt
4 recursive-include osrframework/static *
5 recursive-include osrframework/templates *
6 include *md
7 recursive-include doc *md
0 Metadata-Version: 1.1
1 Name: osrframework
2 Version: 0.17.2
3 Summary: OSRFramework - A set of GPLv3+ OSINT tools developed by i3visio analysts for online research.
4 Home-page: http://github.com/i3visio/osrframework
5 Author: Felix Brezo and Yaiza Rubio
6 Author-email: [email protected]
7 License: COPYING
8 Description: OSRFramework
9 ============
10
11 OSRFramework: Open Sources Research Framework
12
13 Copyright (C) 2014-2017 F. Brezo and Y. Rubio, i3visio
14
15 [![Version in PyPI](https://img.shields.io/pypi/v/osrframework.svg)]()
16 [![License](https://img.shields.io/badge/license-GNU%20General%20Public%20License%20Version%203%20or%20Later-blue.svg)]()
17
18 1 - Description
19 ---------------
20
21 OSRFramework is a GNU AGPLv3+ set of libraries developed by i3visio to perform
22 Open Source Intelligence tasks. They include references to a bunch of different
23 applications related to username checking, DNS lookups, information leaks
24 research, deep web search, regular expressions extraction and many others.
25 At the same time, by means of ad-hoc Maltego transforms, OSRFramework provides
26 a way of making these queries graphically as well as several interfaces to
27 interact with like OSRFConsole or a Web interface.
28
29 2 - License: GNU AGPLv3+
30 ------------------------
31
32 This is free software, and you are welcome to redistribute it under certain
33 conditions.
34
35 This program is free software: you can redistribute it and/or modify
36 it under the terms of the GNU Affero General Public License as published by
37 the Free Software Foundation, either version 3 of the License, or
38 (at your option) any later version.
39
40 This program is distributed in the hope that it will be useful,
41 but WITHOUT ANY WARRANTY; without even the implied warranty of
42 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43 GNU Affero General Public License for more details.
44
45 You should have received a copy of the GNU Affero General Public License
46 along with this program. If not, see <http://www.gnu.org/licenses/>.
47
48
49 For more details on this issue, check the [COPYING](COPYING) file.
50
51 3 - Installation
52 ----------------
53
54 Fast way to do it on any system for a user with administration privileges:
55 ```
56 pip install osrframework
57 ```
58 You can upgrade to the latest release of the framework with:
59 ```
60 pip install osrframework --upgrade
61 ```
62 This will manage all the dependencies for you and install the latest version of
63 the framework.
64
65 If you needed further information on how to install OSRFramework on certain
66 systems, note that you may need to add `export PATH=$PATH:$HOME/.local/bin` to
67 your `~/.bashrc_profile`). This has been confirmed in some distributions,
68 including MacOS. In any case, we recommend you yo have a look at the
69 [INSTALL.md](doc/INSTALL.md) file where we provide additional details for these
70 cases.
71
72 4 - Basic usage
73 ---------------
74
75 If everything went correctly (we hope so!), it's time for trying usufy.py,
76 mailfy.py and so on. But we are they? They are installed in your path meaning
77 that you can open a terminal anywhere and typing the name of the program (seems
78 to be an improvement from previous installations...). Examples:
79 ```
80 usufy.py -n i3visio febrezo yrubiosec -p twitter facebook
81 searchfy.py -q "i3visio"
82 mailfy.py -n i3visio
83 osrfconsole.py
84 ```
85
86 Type -h or --help to get more information about which are the parameters of each
87 application.
88
89 You can find the configuration files in a folder created in your user home to
90 define the default behaviour of the applications:
91 ```
92 # Configuration files for Linux and MacOS
93 ~/.config/OSRFramework/
94 # Configuration files for Windows
95 C:\Users\<User>\OSRFramework\
96 ```
97
98 OSRFramework will look for the configuration settings stored there. You can add
99 new credentials there and if something goes wrong, you can always restore the
100 files stored in the `defaults` subfolder.
101
102 5 - HACKING
103 -----------
104
105 If you want to extend the functionalities of OSRFramework and you do not know
106 where to start from, check the [HACKING.md](doc/HACKING.md) file.
107
108 6 - AUTHORS
109 -----------
110
111 More details about the authors in the [AUTHORS.md](AUTHORS.md) file.
112
113 Keywords: python osint harvesting profiling maltego username socialmedia forums
114 Platform: UNKNOWN
115 Classifier: Development Status :: 4 - Beta
116 Classifier: Topic :: Software Development :: Libraries
117 Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
118 Classifier: Programming Language :: Python :: 2 :: Only
119 Classifier: Programming Language :: Python :: 2.7
120 Classifier: Intended Audience :: Developers
121 Classifier: Intended Audience :: Information Technology
122 Classifier: Intended Audience :: Science/Research
123 Classifier: Intended Audience :: Telecommunications Industry
124 Classifier: Natural Language :: English
125 Classifier: Topic :: Communications
126 Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
127 Classifier: Topic :: Scientific/Engineering :: Information Analysis
128 Classifier: Topic :: Scientific/Engineering :: Visualization
129 Classifier: Topic :: Text Processing :: Markup :: HTML
0 OSRFramework
1 ============
2
3 OSRFramework: Open Sources Research Framework
4
5 Copyright (C) 2014-2017 F. Brezo and Y. Rubio, i3visio
6
7 [![Version in PyPI](https://img.shields.io/pypi/v/osrframework.svg)]()
8 [![License](https://img.shields.io/badge/license-GNU%20General%20Public%20License%20Version%203%20or%20Later-blue.svg)]()
9
10 1 - Description
11 ---------------
12
13 OSRFramework is a GNU AGPLv3+ set of libraries developed by i3visio to perform
14 Open Source Intelligence tasks. They include references to a bunch of different
15 applications related to username checking, DNS lookups, information leaks
16 research, deep web search, regular expressions extraction and many others.
17 At the same time, by means of ad-hoc Maltego transforms, OSRFramework provides
18 a way of making these queries graphically as well as several interfaces to
19 interact with like OSRFConsole or a Web interface.
20
21 2 - License: GNU AGPLv3+
22 ------------------------
23
24 This is free software, and you are welcome to redistribute it under certain
25 conditions.
26
27 This program is free software: you can redistribute it and/or modify
28 it under the terms of the GNU Affero General Public License as published by
29 the Free Software Foundation, either version 3 of the License, or
30 (at your option) any later version.
31
32 This program is distributed in the hope that it will be useful,
33 but WITHOUT ANY WARRANTY; without even the implied warranty of
34 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
35 GNU Affero General Public License for more details.
36
37 You should have received a copy of the GNU Affero General Public License
38 along with this program. If not, see <http://www.gnu.org/licenses/>.
39
40
41 For more details on this issue, check the [COPYING](COPYING) file.
42
43 3 - Installation
44 ----------------
45
46 Fast way to do it on any system for a user with administration privileges:
47 ```
48 pip install osrframework
49 ```
50 You can upgrade to the latest release of the framework with:
51 ```
52 pip install osrframework --upgrade
53 ```
54 This will manage all the dependencies for you and install the latest version of
55 the framework.
56
57 If you needed further information on how to install OSRFramework on certain
58 systems, note that you may need to add `export PATH=$PATH:$HOME/.local/bin` to
59 your `~/.bashrc_profile`). This has been confirmed in some distributions,
60 including MacOS. In any case, we recommend you yo have a look at the
61 [INSTALL.md](doc/INSTALL.md) file where we provide additional details for these
62 cases.
63
64 4 - Basic usage
65 ---------------
66
67 If everything went correctly (we hope so!), it's time for trying usufy.py,
68 mailfy.py and so on. But we are they? They are installed in your path meaning
69 that you can open a terminal anywhere and typing the name of the program (seems
70 to be an improvement from previous installations...). Examples:
71 ```
72 usufy.py -n i3visio febrezo yrubiosec -p twitter facebook
73 searchfy.py -q "i3visio"
74 mailfy.py -n i3visio
75 osrfconsole.py
76 ```
77
78 Type -h or --help to get more information about which are the parameters of each
79 application.
80
81 You can find the configuration files in a folder created in your user home to
82 define the default behaviour of the applications:
83 ```
84 # Configuration files for Linux and MacOS
85 ~/.config/OSRFramework/
86 # Configuration files for Windows
87 C:\Users\<User>\OSRFramework\
88 ```
89
90 OSRFramework will look for the configuration settings stored there. You can add
91 new credentials there and if something goes wrong, you can always restore the
92 files stored in the `defaults` subfolder.
93
94 5 - HACKING
95 -----------
96
97 If you want to extend the functionalities of OSRFramework and you do not know
98 where to start from, check the [HACKING.md](doc/HACKING.md) file.
99
100 6 - AUTHORS
101 -----------
102
103 More details about the authors in the [AUTHORS.md](AUTHORS.md) file.
0 ################################################################################
1 #
2 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
3 #
4 # This file is part of OSRFramework. You can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ################################################################################
18
19
20 # ==============================================================================
21 # The sections in this file should match with the parameter used to work with
22 # this platform in the different tools of the framework.
23 # ------------------------------------------------------------------------------
24
25 [eqe]
26 login =
27 password =
28
29 [flixster]
30 login =
31 password =
32
33 [hi5]
34 login =
35 password =
36
37 [pokerstrategy]
38 login =
39 password =
40
41 [rapid]
42 login =
43 password =
44
45 [researchgate]
46 login =
47 password =
48
49 [spotify]
50 login =
51 password =
52
53 [tripit]
54 login =
55 password =
56
57 [thehoodup]
58 login =
59 password =
60
61 # ==============================================================================
0 ################################################################################
1 #
2 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
3 #
4 # This file is part of OSRFramework. You can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ################################################################################
18
19 # NOTE: Lines starting with a '#' are comments provided to assist the user.
20
21 # ==============================================================================
22 # The sections in this file should match with the parameter used to work with
23 # this platform in the different tools of the framework.
24 # ------------------------------------------------------------------------------
25
26 [twitter]
27 # You can get these details in: <https://apps.twitter.com/>
28 consumer_key =
29 consumer_secret =
30 access_key =
31 access_secret =
32
33 # ==============================================================================
34
35
36 # ==============================================================================
37 # The following API keys may be used by other applications in the framework.
38 # ------------------------------------------------------------------------------
39
40 [md5crack_com]
41 api_key =
42
43 [pipl_com]
44 api_key =
45
46 # ==============================================================================
0 ################################################################################
1 #
2 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
3 #
4 # This file is part of OSRFramework. You can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ################################################################################
18
19 # NOTE: Lines starting with a '#' are comments provided to assist the user.
20
21 # ==============================================================================
22 # In this section we will define the browser configuration.
23 # ------------------------------------------------------------------------------
24
25 [Browser]
26
27 # The User Agent to be used. More can be found at:
28 # <http://www.useragentstring.com/pages/useragentstring.php>
29 user_agent = Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36
30 # Seconds considered to timeout a session. Increase this value to something
31 # high like 2000 to debug petitions using proxies such as OWASP ZAP.
32 timeout = 20000
33
34 # ==============================================================================
35
36
37 # ==============================================================================
38 # In this section we will define the proxy settings. This part is optional.
39 # ------------------------------------------------------------------------------
40
41 # This is the protocol of the proxy: 'ProxyHTTP' is parsed to 'http'.
42 [ProxyHTTP]
43
44 # The hostname. It can be an IP Address '127.0.0.1' or a domain 'example.com'.
45 host =
46 # The port of the proxy.
47 port =
48 # The credentials to be used if needed. This part is optional.
49 username =
50 password =
51
52 # A full example is below to contact to a running instance of OWASP ZAP:
53 #host = localhost
54 #port = 8080
55 #username = user
56 #password = 1234
57
58 # This is the protocol of the proxy: 'ProxyHTTPS' is parsed to 'https'.
59 [ProxyHTTPS]
60
61 # The hostname. It can be an IP Address '127.0.0.1' or a domain 'example.com'.
62 host =
63 # The port of the proxy.
64 port =
65 # The credentials to be used if needed. This part is optional.
66 username =
67 password =
68
69 # A full example is below to contact to a running instance of OWASP ZAP:
70 #host = localhost
71 #port = 8080
72 #username = user
73 #password = 1234
74
75 # ==============================================================================
0 ################################################################################
1 #
2 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
3 #
4 # This file is part of OSRFramework. You can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ################################################################################
18
19 # NOTES:
20 # - Lines starting with a '#' are comments provided to assist the user.
21 # - If something goes wrong and you cannot fix it, delete this file to let the
22 # system restore a valid version.
23
24
25 # ==============================================================================
26 # In this section we will define the default OSRFramework server configuration.
27 # ------------------------------------------------------------------------------
28
29 [osrframework-server]
30
31 # Host of the server. It can be localhost or things like 0.0.0.0 (which would
32 # make it accesible from everywhere):
33 host = localhost
34 #host = 0.0.0.0
35 # The port to be used:
36 port = 30230
37 # Whether to use it in debug mode. False is 0 and True is 1.
38 debug = 0
39 # This string should be something random to control who can configure the
40 # searches. If this string is intercepted, anyone would be able to configure
41 # OSRFramework using a specially crafted URL to do what they want, not what
42 # the admin wanted. If None is provided, advanced searches will be blocked.
43 secret_token =
44 #secret_token = thisstringshould_besomething-random-NotJoking-so-ChangeMe
45 upload_folder = /tmp/
46
47 # ==============================================================================
48
49
50 # ==============================================================================
51 # In this section we will define the default domainfy configuration.
52 # ------------------------------------------------------------------------------
53
54 [domainfy]
55
56 # Tlds to be checked by default. It can include several tld:
57 tlds = global
58 #tlds = global generic cc brand geographic
59 # Folder where the output files will be created (without the file name):
60 output_folder = ./
61 # Name of the output file to be used (without the extension):
62 file_header = profiles
63 # Extensions to be created. It can include several extensions:
64 extension = csv
65 #extension = csv xls xlsx
66 # Number of threads to be used. It should be an integer:
67 threads = 32
68 # Domains to be manually added
69 user_defined =
70 #user_defined = .i3visio.com
71 # Domains to be manually excluded
72 exclude_domains =
73 #exclude_domains = .com .net .org
74
75 # ==============================================================================
76
77 # ==============================================================================
78 # In this section we will define the default entify configuration.
79 # ------------------------------------------------------------------------------
80
81 [entify]
82
83 # Folder where the output files will be created (without the file name):
84 output_folder = ./
85 # Name of the output file to be used (without the extension):
86 file_header = profiles
87 # Extensions to be created. It can include several extensions:
88 extension = csv
89 #extension = csv xls xlsx
90
91 # ==============================================================================
92
93 # ==============================================================================
94 # In this section we will define the default mailfy configuration.
95 # ------------------------------------------------------------------------------
96
97 [mailfy]
98
99 # Domains to be checked by default. It can include several extensions:
100 domains = all
101 #domains = gmail.com prontonmail.com
102 # Folder where the output files will be created (without the file name):
103 output_folder = ./
104 # Name of the output file to be used (without the extension):
105 file_header = profiles
106 # Extensions to be created. It can include several extensions:
107 extension = csv
108 #extension = csv xls xlsx
109 # Number of threads to be used. It should be an integer:
110 threads = 32
111 # Domains to be manually excluded
112 exclude_domains =
113 #exclude_domains = gmail.com hotmail.com
114
115 # ==============================================================================
116
117 # ==============================================================================
118 # In this section we will define the default phonefy configuration.
119 # ------------------------------------------------------------------------------
120
121 [phonefy]
122
123 # Platforms to be checked by default. It can include several extensions:
124 platforms = all
125 #platforms = listaspam
126 # Folder where the output files will be created (without the file name):
127 output_folder = ./
128 # Name of the output file to be used (without the extension):
129 file_header = profiles
130 # Extensions to be created. It can include several extensions:
131 extension = csv
132 #extension = csv xls xlsx
133 # Platforms to be manually excluded
134 exclude_platforms =
135 #exclude_platforms = twitter skype
136
137 # ==============================================================================
138
139 # ==============================================================================
140 # In this section we will define the default searchfy configuration.
141 # ------------------------------------------------------------------------------
142
143 [searchfy]
144
145 # Platforms to be checked by default. It can include several extensions:
146 platforms = all
147 #platforms = twitter facebook github
148 # Folder where the output files will be created (without the file name):
149 output_folder = ./
150 # Name of the output file to be used (without the extension):
151 file_header = profiles
152 # Extensions to be created. It can include several extensions:
153 extension = csv
154 #extension = csv xls xlsx
155 # Platforms to be manually excluded
156 exclude_platforms =
157 #exclude_platforms = twitter skype
158
159 # ==============================================================================
160
161 # ==============================================================================
162 # In this section we will define the default usufy configuration.
163 # ------------------------------------------------------------------------------
164
165 [usufy]
166
167 # Platforms to be checked by default. It can include several extensions:
168 platforms = all
169 #platforms = twitter facebook instagram github youtube
170 # Folder where the output files will be created (without the file name):
171 output_folder = ./
172 # Name of the output file to be used (without the extension):
173 file_header = profiles
174 # Extensions to be created. It can include several extensions:
175 extension = csv
176 #extension = csv xls xlsx
177 # Number of threads to be used. It should be an integer:
178 threads = 16
179 # Platforms to be manually excluded
180 exclude_platforms =
181 #exclude_platforms = twitter skype
182
183 # ==============================================================================
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class DemoPattern(RegexpObject):
25 '''
26 <DemoPattern> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.demo"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z1-9]" + "[0-9]{4}-?[A-Z]{3}" +"[^a-zA-Z1-9]"]
40
41 def isValidExp(self, exp):
42 '''
43 Method to verify if a given expression is correct just in case the used regular expression needs additional processing to verify this fact.
44 This method will be overwritten when necessary.
45
46 :param exp: Expression to verify.
47
48 :return: True | False
49 '''
50 return True
51
52
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Demo(Platform):
35 """
36 A <Platform> object for Demo.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Demo"
43 self.tags = ["demo"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://demo.demo/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<error>THIS IS THE ERROR MESSAGE</error>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 Configuring OSRFramework
1 ========================
2
3 TODO.
0 Using the Alias Generator Tool
1 ==============================
2
3 TODO.
0 USing the API
1 =============
2
3 TODO.
0 OSRFramework Changelog
1 ======================
2
3 For more information, check the README.Add some wrappers
4
5 0.17.2, 2017/08/21 -- Fixes with some usernames in Kiwi and Smugmug.
6 - Fix issue #288: Remove the `.` as a valid character for usernames in Smugmug
7 - Fix issue #287: Remove the `.` as a valid character for usernames in Kiwi
8 - Move to pending Oroom and Backyardchickens
9
10 0.17.1, 2017/08/20 -- Some fixes and new wrappers.
11 - Add feature #283: Add Kiwi usufy wrapper
12 - Add feature #284: Add Sarahah usufy wrapper
13 - Fix issue #286: Remove intersect.es wrapper as the platform has been changed
14 - Fix issue #282: Fix openstreetmap usufy wrapper when using usernames containing a dot
15 - Fix issue #280: Fix serieadictos usufy wrapper
16 - Fix issue #279: Fix bebee usufy wrapper
17 - Fix some issues in osrframework_server and the configuration file
18
19 0.17.0, 2017/07/25 -- Prepare the Blackhat Arsenal release
20 - Add feature #267: Add a leaked email search using HaveIBeenPwned.
21 - Add feature #168: Add Get as a new platform
22 - Add feature: Add Seatwish usufy wrapper
23 - Add feature: Add Xtube usufy wrapper
24 - Add feature: Add coloured output in usufy, mailfy, searchfy, phonefy, entify, osrfconsole and domainfy
25 - Add feature: Add colorama utils to general
26 - Fix issue #278: Remove bladna.nl usufy wrapper
27 - Fix issue #276: Fix trip.com usufy wrapper
28 - Fix issue #275: Remove Travian forum usufy wrapper
29 - Fix issue #274: Remove Carder usufy wrapper
30 - Update the print functions
31 - Fix some issues regarding to the display of the license
32 - Patch issue #277: Fix creativemarket usufy wrapper
33 - General update of the way in which functions in `osrframework.utils.general` are documented as well as removal of unneeded functions.
34 - Remove a hack in the export function to set the encoding that implied setting the default encoding using `sys.setdefaultencoding()` and resetting it back after the export.
35
36 0.16.8, 2017/06/22 -- Important update on the setup.py to verify whether the .local/bin folder is in the path.
37 - Fix issue #187: Review installation with --user in Linux systems where ~/.local/bin is NOT in the PATH
38 - Fix issue: Several wrappers have been moved to pending: cardingbins, retailmenot, seatfish and xtube
39
40 0.16.7, 2017/06/15 -- Several fixes on certain platforms.
41 - Temporally removed some wrappers: apsense, flavors, paypal, pinterest, sokule and wordpress
42 - Fix issue #265: False positives in domainfy
43 - Fix Dockerfile by removing an unnecessary `sudo`.
44
45 0.16.6, 2017/05/28 -- Several fixes domainfy.py options.
46 - Add feature #255: Add Metasploit forums as a new usufy wrapper
47 - Add feature #254: Add Steemit.com as a new usufy platform
48 - Add feature #253: Add cryptofresh as a new usufy platform
49 - Fix issue #262: Twitpic now only redirects to Twitter! Thanks for these years, guys!
50 - Fix issue #261: Paypal.me usufy wrapper is throwing false positives
51 - Fix issue #260: Ello.co has changed its error message
52 - Fix issue #259: Gogobot has been moved to trip.com
53 - Fix issue #258: Launching usufy.py -n whatever -t all crashes the app
54 - Fix issue #256: Wrong command shown when stopping domainfy
55 - Fix issue: Rename rapid forum to rapid_i as the platform is rapid-i.com
56 - Fix issue: -u option in domainfy.py was not working appropiately
57 - Fix issue: Appropiately showing the list of pending domains in domainfy
58
59 0.16.5, 2017/04/30 -- Fix mailfy.py by adding a timeout to the verifications.
60 - Fix issue #251: Mailfy seems to be crashing persistently
61 - Minor refactoring of the mailfy.py documentation and comments
62
63 0.16.4, 2017/04/25 -- Fix some OSRFramework false positives and add Taringa, TheVerge and Openstreetmap.
64 - Add feature #246: Add theverge.com as a new usufy platform
65 - Add feature #238: Add Taringa as a new usufy wrapper
66 - Add feature #236: Add Openstreetmap as a new usufy wrapper
67 - Fix issue #250: Pinterest wrapper is throwing sometimes false positives
68 - Fix issue #249: Ixgames usufy wrapper is throwing false positives
69 - Fix issue #248: Echatta usufy wrapper is throwing false positives
70 - Fix issue: Break.com was throwing false positives
71 - Fix issue: Cartodb was throwing false positives
72 - Fix issue: Creativemarket was throwing false positives
73 - Rearrange some tags in certain platforms
74
75 0.16.3, 2017/04/13 -- Fix OSRFramework false positives.
76 - Fix issue #245: Fix BookOfMatches usufy wrapper
77 - Fix issue #244: Fix Pinterest usufy wrapper
78 - Fix issue #243: Domainfy.py is throwing some false positives
79 - Move Stuff platform to pending. It seems that it now permits comments using Facebook Connect
80
81 0.16.2, 2017/03/25 -- Fix OSRFramework false positives.
82 - Fix issue #240: Fix Dreamstime.me usufy wrapper that is throwing false positives
83 - Fix issue #239: Fix Paypal.me usufy wrapper that is throwing false positives
84
85 0.16.1, 2017/03/12 -- Fix OSRFramework Server installation.
86 - Fix issue: Templates and static files were not appropiately dealt by setup.py
87
88 0.16.0, 2017/03/10 -- New major release after participation in the Mobile World Congress Event.
89 - Add feature #228: Add Mozilla as a new usufy platform
90 - Add feature #226: Provide a docker file to let users install easily using Docker
91 - Add feature #223: Providing an API to permit interaction by third party apps
92 - Add feature #201: Add Mozilla as a new usufy platform
93 - Add feature #196: Add Goblinrefuge as a new usufy platform
94 - Add feature #195: Add NotABug as a new usufy platform
95 - Add feature #193: Add Crowdin as a new usufy platform
96 - Add feature #143: Consider adding beBee to supported platforms
97 - Add feature: Add new wrappers as cardingbins.py and unioncarder.py
98 - Add feature: Provide a domainfy.py Maltego transform
99 - Add feature: Provide an API to be used by other applications
100 - Add feature: Provide a GUI to make it easier to launch the commands for newcomers
101 - Add feature: Add metadata extraction for all usufy wrappers starting with 'a'
102 - Add feature: Add metadata extraction for all usufy wrappers starting with 'b'
103 - Add feature: Add Affilorama as a new usufy platform
104 - Add feature: Add Abou as a new usufy platform
105 - Add feature: Add Canva as a new usufy platform
106 - Add feature: Add Cash as a new usufy platform
107 - Add feature: Add Codecademy as a new usufy platform
108 - Add feature: Add Coderwall as a new usufy platform
109 - Add feature: Add Flavors as a new usufy platform
110 - Add feature: Add iFunny as a new usufy platform
111 - Add feature: Add Moneymaker as a new usufy platform
112 - Add feature: Add Okcupid as a new usufy platform
113 - Add feature: Add Reddit as a new usufy platform
114 - Add feature: Add Reddit as a new usufy platform
115 - Add feature: Add V7n as a new usufy platform
116 - Add feature: Add Viddler as a new usufy platform
117 - Add feature: Add Wikia as a new usufy platform
118 - Add feature: Add Bandcamp as a new usufy platform
119 - Add feature: Add Codementor as a new usufy platform
120 - Add feature: Add Colourlovers as a new usufy platform
121 - Add feature: Add Contently as a new usufy platform
122 - Add feature: Add Creativemarket as a new usufy platform
123 - Add feature: Add Crokes as a new usufy platform
124 - Add feature: Add Eightbitme as a new usufy platform
125 - Add feature: Add Ello as a new usufy platform
126 - Add feature: Add EyEem as a new usufy platform
127 - Add feature: Add F6s as a new usufy platform
128 - Add feature: Add Fiverr as a new usufy platform
129 - Add feature: Add Fotolog as a new usufy platform
130 - Add feature: Add Houzz as a new usufy platform
131 - Add feature: Add Mig as a new usufy platform
132 - Add feature: Add Miiverse as a new usufy platform
133 - Add feature: Add Openbugbounty as a new usufy platform
134 - Add feature: Add Papaly as a new usufy platform
135 - Add feature: Add Patreon as a new usufy platform
136 - Add feature: Add Paypal as a new usufy platform
137 - Add feature: Add Phishtank as a new usufy platform
138 - Add feature: Add Reverbnation as a new usufy platform
139 - Add feature: Add Seatwish as a new usufy platform
140 - Add feature: Add Soup as a new usufy platform
141 - Add feature: Add Technorati as a new usufy platform
142 - Add feature: Add Trakt as a new usufy platform
143 - Add feature: Add Venmo as a new usufy platform
144 - Add feature: Add Witty as a new usufy platform
145 - Add feature: Add Younow as a new usufy platform
146 - Add feature: Add Dzone as a new usufy platform
147 - Add feature: Add Dreamstime as a new usufy platform
148 - Add feature: Add Myfitnesspal as a new usufy platform
149 - Add feature: Add Datpiff as a new usufy platform
150 - Add new subdomains to domainfy in the category other
151 - Fix issue #224: Deal with arrays in an entity's value to create two entities of the same type
152
153
154 0.15.0, 2017/02/16 -- New major release. Add new wrappers to usufy, mailfy and domainfy. Fix important bugs.
155 - Add feature #206: Appropiately capturing Ctrl + C Exceptions to stop the execution feature
156 - Add feature #190: Add a new error message to angel.co
157 - Add feature #189: Add protonmail.ch as a new mailfy wrapper
158 - Add feature #186: Add translate.hola.org as a new usufy wrapper
159 - Add feature #185: Add meteor.com as a new platform
160 - Add feature #174: Add emoneyspace as a new platform
161 - Add feature #161: Making osrfconsole use config values in <OSRFrameworkHOME>/general.cfg
162 - Add feature #77: Add Blogmarks as a new platform
163 - Add feature #76: Add Smugmug as a new platform
164 - Add feature #75: Add Typepad as a new platform
165 - Add feature #17: Addition of Gravatar
166 - Add feature: Add exclude option via the command line to usufy, mailfy, domainfy, searchfy and phonefy
167 - Add feature: Add exclude option via the configuration file to usufy, mailfy, domainfy, searchfy and phonefy
168 - Add feature: Add other common subdomains to domainfy under the domains/other_subdomains.py
169 - Add feature: Add Buddypic wrapper
170 - Add feature: Add Carder wrapper
171 - Add feature: Add Csu wrapper
172 - Add feature: Add Realcarders wrapper
173 - Add feature: Add SingleTrackWorld wrapper
174 - Add feature: Add TranslateHola wrapper
175 - Add feature: Add Warrior wrapper
176 - Add feature: Add me.com, icloud.com and seznam.cz to mailfy
177 - Add feature: Add second level TLDs to domainfy for CCTLD *.nz, *.pe, *.py and *.uk
178 - Add feature: Custom errors for OSRFramework
179 - Add feature: Some new structures for the usufy fuzzer
180 - Add feature: Let users configure the connections to an HTTP and an HTTPS proxy
181 - Add feature: Let users see the list of tags that they can use to select the platforms.
182 - Fix issue #219: 0.15.0rc9 raises an exception if it has upgraded
183 - Fix issue #212: Badoo throws false positives
184 - Fix issue #210: Gsmspain throws false positives
185 - Fix issue #208: Web.tv throws false positives
186 - Fix issue #205: Return in each main file a Json with the results instead of nothing
187 - Fix issue #204: Fix error messages shown in domainfy.py
188 - Fix issue #200: Deactivate Youku usufy wrapper
189 - Fix issue #199: Deactivate Gytorrents usufy wrapper
190 - Fix issue #198: Change Web.tv error message
191 - Fix issue #197: Change Metacafe error message
192 - Fix issue #188: Capture exceptions when errors are found in the configuration files bug deployment
193 - Fix issue #182: Cannot install in virtualenv
194 - Fix issue #169: searchfy.py --maltego doesn't disable banner
195 - Fix issue #121 by urlencoding each and every parameter provided to usufy, searchfy and phonefy. Indirectly fixes issue #91
196 - Fix issue: Overwrite previous browser.cfg and general.cfg files
197 - Fix issue: Reactivate tag search in usufy
198 - Fix issue: Remove autoopen Skype client if it is not already opened
199 - Fix issue: Update user-agent to a more modern one
200 - Fix issue: Remove Nubelo wrapper
201 - Fix issue: Remove libero.it from mailfy as it is no longer working
202 - Fix issue: Deactivate false positives in mailfy for aaathats3as.com, cocaine.ninja, cock.lu, cock.email, firemail.cc, getbackinthe.kitchen, hitler.rocks, memeware.net and waifu.club from cock.li server as well as other false positives in mailfy for noob.com and wp.pl
203 - Fix issue: Remove default proxies for HTTP and HTTPS
204 - Patch issue #220: Hellboundhackers takes too much time to be processed (moved to pending)
205 - Patch issue #218: CSU throws false positives (moved to pending)
206 - Patch issue #217: Plancast takes too much time to be processed (moved to pending)
207 - Patch issue #216: Aporrealos takes too much time to be processed (moved to pending)
208 - Patch issue #215: Artbreak takes too much time to be processed (moved to pending)
209 - Patch issue #214: Gitorious takes too much time to be processed (moved to pending)
210 - Patch issue #213: Fanbitcoin takes too much time to be processed (moved to pending)
211 - Patch issue #211: Dailymail throws false positives (moved to pending)
212 - Patch issue #209: Espaciolinux throws false positives (moved to pending)
213 - Patch issue #207: forocompraventa throws false positives (moved to pending)
214
215 0.14.5, 2016/12/09 -- Add Zotero, Leakforums, CardingHispano, MercadoLibre, Angel, Forospyware, Bubok, etc. (up to 22 new wrappers).
216 - Add feature #148: Adding Inkonsky as a new platform.
217 - Add feature #142: Adding angel.co as a new usufy platform.
218 - Add feature #111: Adding Zotero as a new wrapper.
219 - Add feature #110: Adding Bitrated.me as a new platform.
220 - Add feature #109: Adding Spreaker as a new platform.
221 - Add feature #97: Adding ripenear.me as a new platform.
222 - Add feature #96: Adding warriorforum as a new platform with usufy.
223 - Add feature #94: Adding cartodb.com as a platform with usufy.
224 - Add feature #85: Add muetorrent as a new wrapper. Renamed as a gytorrents.
225 - Add feature: Add bubok wrapper.
226 - Add feature: Add cardingmx wrapper.
227 - Add feature: Add ccm wrapper.
228 - Add feature: Add espaciolinux wrapper.
229 - Add feature: Add forocompraventa wrapper.
230 - Add feature: Add foroptc wrapper.
231 - Add feature: Add foros24h wrapper.
232 - Add feature: Add forosspyware wrapper.
233 - Add feature: Add htcmania wrapper.
234 - Add feature: Add losviajeros wrapper.
235 - Add feature: Add leakforums wrapper.
236 - Add feature: Add cardinghispano wrapper.
237 - Add feature: Add mercadolibre wrapper.
238 - Add __author__ and __version__ to the wrappers template.
239 - Fix issue #183: Web.tv has changed its error.
240 - Fix issue #180: Artician wrapper is not working. Moved to pending.
241 - Put in quarantine: unsystem and forominecraft.
242 - Fix issue: Grab database error in anarchy101.py wrapper.
243 - Issue #181, required no action.
244
245 0.14.4, 2016/11/06 -- Fix issues #178 and #179 with connectingsingles.com.
246 - Fix issue #178: Mailfy not working on Windows.
247 - Fix issue #179: Connecting singles has changed its error.
248
249 0.14.3, 2016/11/04 -- Fix important issue when deploying on Windows after 0.14.0.
250 - Fix issue #177. Found an issue when installing on Windows 0.14.2.
251 - Removed temporary files from /tmp when thet are created.
252
253 0.14.2, 2016/10/21 -- Add features #106 and #107 and fix #176.
254 - Add feature #107: Add keybase.io as a new platform.
255 - Add feature #106: Add freekabcer as a new platform.
256 - Fix issue #176: Fix Fanpop error message.
257
258 0.14.1, 2016/10/15 -- Fix issues related to the installation procedure and adding some new platforms.
259 - Add feature #95: Nairaland forum has usufy.
260 - Add feature #108: Adding coinbase.com as a new platform.
261 - Fix issue #173: Setup.py requires being in the sudoers list even when installing for a single user.
262 - Patch issue #175: Moved Naver to pending.
263 - Patched an issue in usufy.py that may throw errors when None is returned by getPageWrapper (which should just not happen).
264
265 0.14.0, 2016/09/30 -- Added domainfy as a tool to verify the existence of domains and first release of osrfconsole, a console GUI similar to msfconsole.
266 - Add domainfy.py application to check the existence of several domains using socket.gethostbyname().
267 - Add osrfconsole script to control de utilities in the framework to address issue #158.
268 - Add general.cfg to address issue #92 and, indirectly, issue #156.
269 - Modify the shebang of alias_generator, domainfy, entify, enumeration, mailfy, osrfconsole, phonefy, searchfy and usufy to `#!/usr/bin/env python2`.
270 - Fix issue #172: Remove ummahforum platform.
271 - Fix issue #171: Dnspython module does not work in Windows.
272 - Add feature #170: Add OneName as a new usufy platform.
273 - Fix issue #166: The PLATFORMS variable in osrfconsole does not accept various entries.
274 - Fix issue #165: Osrfconsole back command exists instead of unloading.
275 - Add feature #163: Adding tip.me as a new platform.
276 - Add feature #159: Adding a Console UI to help beginners. Osrfconsole.py is released.
277 - Add feature #158: Complementing domain search using whois info in domain finder script.
278 - Add feature #157: Adding domain search in a new script.
279
280 0.13.2, 2016/07/23 -- Fixed issue #154: OSRFramework 0.13.1 is installed but throws an error when launching usufy.py.
281 - Evilzone and Thepiratebay wrappers have been moved to pending as they are conflicting with Skype.
282 - Some changes performed in the way in which Skype logs the messages in the console.
283
284 0.13.1, 2016/07/20 -- Fixed a deployment issue with versions which are older than 0.13.0.
285 - Relevant hotfix deployed to remove any trace of deprecated installations of the framework during the setup. New installs will not perceive the difference.
286
287 0.13.0, 2016/07/19 -- Added the possibility of dinamically adding user-defined modules under the configuration folder. Fixed issues #150, #151, #152, #153.
288 - Fixed issue #146. Letting the user create new usufy wrappers in its home folder.
289 - Fixed issue #147. Letting the user create new entify regexps in its home folder.
290 - Fixed issue #150. Ruby-forum.com has changed its base URL.
291 - Fixed issue #151. Foodspotting is returning false positives when the first character is a number bug usufy.
292 - Fixed issue #152. Bucketlistly is returning false positives when the first character is a number bug usufy.
293 - Fixed issue #153. Sample files (wrapper.py.sample and pattern.py.sample) are not copied during the installation. Added a recursive-include clause to MANIFEST.in to collect the sample files in the config/plugins.
294 - Addressed issue #149. Bookmarky.com seems not to be working (moved to pending).
295 - Updated the process of compiling the regular expressions to validate the usernames for each platform.
296 - Fixed a bug that was not capable of setting properly the api_keys.cfg.
297 - Modified the configuration file.
298 - Removed old wrappers which had been removed.
299 - Added a pending folder with wrappers which need to be fixed. They will not be imported.
300 - Implemented __eq__ for both wrappers and patterns.
301
302 0.12.1, 2016/07/07 -- Fixed issues in Favstar and mailfy.py.
303 - Fixed issue #145. Favstar platform returns false positives in usufy when looking for long usernames.
304 - Fixed issue #144. mailfy.py returns error with specific domains. The error seemed to be a problem when no mail was loaded.
305 - Fixed issue #130. Removing obsolete warning of not properly working in Windows mailfy.
306
307 0.12.0, 2016/06/12 -- Fixed issues in 8 platforms when making use of usernames with a ".". URL can be automatically opened in the current web browser. Added 3 new mailfy platforms.
308 - Important change in the way of validating the nicknames. Valid expressions are matched now as ".+".
309 - Addressed issue #129: Open found URL in the current webbrowser.
310 - Fixed issue #141: Btinternet.com as new mailfy platform.
311 - Fixed issue #140: Libero.it as new mailfy platform.
312 - Fixed issue #139: Ya.ru as new mailfy platform.
313 - Fixed issue #138: Causes platform does NOT accept the character "." in the username.
314 - Fixed issue #137: Nubelo platform does NOT accept the character "." in the username.
315 - Fixed issue #136: Bucketlistly platform does NOT accept the character "." in the username.
316 - Fixed issue #135: Burdastyle platform does NOT accept the character "." in the username.
317 - Fixed issue #134: Askfm platform does NOT accept the character "." in the username.
318 - Fixed issue #133: Gogobot platform does NOT accept the character "." in the username.
319 - Fixed issue #132: Rankia platform does NOT accept the character "." in the username.
320 - Fixed issue #131: Twitpic platform does NOT accept the character "." in the username.
321
322 0.11.7, 2016/06/03 -- Critical bug addressed in the installation process identified as #122. Other minor issues addressed too.
323 - Fixed issue #126: Periscope has changed its error message.
324
325 0.11.6, 2016/06/03 -- Critical bug addressed in the installation process identified as #122. Other minor issues addressed too.
326 - Fixed issue #125: Ibosocial has changed its error for non-existing websites... Changed the error message.
327 - Fixed issue #124: Freebase wrapper does not work...
328 - Fixed issue #123: Arto has closed its service... :(. Platform removed.
329 - Fixed issue with thepiratebay.mk. Added a new message to find platforms which are no longer available.
330 - Removed other non working platforms that were maintained unnecessarily.
331
332 0.11.5, 2016/05/15 -- Added 16 new email providers for mailfy.py.
333 - The following email providers have been whitelisted in mailfy.py: aaathats3as.com, cocaine.ninja, cock.lu, cock.email, firemail.cc, getbackinthe.kitchen, hitler.rocks, lycos.com, memeware.net, rediffmail.com, tuta.io, tutamail.com, tutanota.com, tutanota.de, waifu.club and zoho.com.
334 - Some updates done in the mailfy.py blacklists.
335 - Addressed isue #120: Xat.com platform has changed its usufy URL. The wrapper has been deactivated.
336
337 0.11.4, 2016/04/28 -- Corrected a fix #116 in mailfy.py after breaking a thing before committing...
338 - Fixed issue #116: Mailfy.py is now throwing an error message when the email does not exist.
339
340 0.11.3, 2016/04/28 -- Several fixes addressed (#116, #115, #114, #113, #112) regarding with obsolete platforms.
341 - Fixed issue #115: Worldcarfans is no longer working bug usufy. Removed.
342 - Fixed issue #114: Relatious.com platform is broken bug usufy. Removed.
343 - Fixed issue #113: Thecarcommunity platform is broken. Removed.
344 - Fixed issue #112: New error message in stumbleupon. Removed, the page is now entirely loaded usin javascript.
345 - Fixed other issues which were not identified originally: metacafe, youku.
346
347 0.11.2, 2016/04/01 -- Fixed issue #105: Error in mailfy, line 238.
348 - Fixed issue #105: Error en mailfy (linea 238) bug mailfy. There was a typo in mailfy.py that showed a wrongly modified variable. Removed the "2015" as stated by Pepepy did the trick.
349
350 0.11.1, 2016/03/25 -- Issues related to usufy.py platforms that were throwing false positives.
351 - Fixed issue #101: Changed the error for gsmspain forums. They had changed the error message.
352 - Fixed issue #102: Adtriboo is no longer a valid platform. Removed.
353 - Addressed issue #104: Evilzone has been deactivated until we find the new usufy structure.
354
355 0.11.0, 2016/03/14 -- Adding configuration files so as to let the user configure credentials and API keys, as well as making the Maltego transforms work with the current architecture.
356 - Fixed issue #51: settings for credentials, API keys and connectivity are now stored in the user's home.
357 - Fixed issue #65: add threading to mailfy.py to allow parallel queries.
358 - Fixed issue #84: fix Maltego installation using the content_scripts. The creation of the Maltego configuration file is currently done by the setup.py script.
359 - Fixed issue #88: ods, xls, xlsx are no longer appending results to previously found files. A change in the API now returns only an array of arrays if there is only one sheet.
360 - Fixed issue #90: added new documentation files as AUTHORS.md, INSTALL.md and HACKING.md.
361 - Fixed issue #93: Issue when installing in Windows v0.11.x. An exception has been added in the general.changePermissionsRecursively function to deal with os.chown issues when running on Windows.
362 - Fixed issue #98: Configuration files seem not to be copied correctly in the installation process. In Windows there was a problem with the direction of the slashes. Updated the configuration.py file to address it.
363 - Fixed issue #100: With the new installation procedure, networkx should be installed in the system. Added a osrframework/utils/configuration.py file.
364 - Transforms adjusted to use a copy of the scripts stored in the transforms folder inside the configuration directory to fix an issue when trying to run the scripts from Maltego, which seems not to be capable of launching them otherwise making calls in the "python usufy.py..." way in Windows systems.
365 - Added a MANIFEST.in file to include static files in the ./config folder and the configuration of the transforms.
366 - Commented logging text in usufy.py.
367 - Added the missing script config_api_keys.py which was previously ignored.
368 - Changed the maximum number of threads to be opened by OSRFramework transforms in Maltego as this could lead to problems with the applications.
369 - Fixed gsmspain.py wrapper for usufy which was not capable of returning a result properly.
370 - Deactivated identi.ca and couchsurfing because the platforms seems to be unstable.
371 - Added a browser.cfg to let the user configure OSRFramework browser settings such as the way in which it gets connected to the internet or the user agent.
372 - Added an api_keys.cfg file to the configuration file where all the API keys will be stored.
373 - Added three new dependencies pyopenssl, ndg-httpsclient, pyasn1 to deal with InsecurePlatformWarning when calling the Twitter API.
374 - Removed obsolete functions from osrframework/utils/general.py.
375 - Removed the logo.png references.
376
377 0.10.5, 2016/02/13 -- Fixed issue #86, Metacafe is returning false positives.
378 - Fixed issue #86: Metacafe was returning false positives and the error was updated.
379 - Updated a dependency for pyexcel_text package. OSRFramework now works with the latest version.
380
381 0.10.4, 2016/02/06 -- Some improvements in the alias generator to address issues #79, #80 and #81. Skype link error message defined as a warning now.
382 - Fixed issue #79: some new rules to be added to alias_generator.py.
383 - Fixed issue #80: moving the traditional profilesquatting changes to alias_generator.py. Removed the option from usufy.py.
384 - Fixed issue #81: all options inserted are now lowercased in alias_generator.
385 . Modified the Skype warning message to show what is happening and that a Skype session should be opened by the user.
386 - The interactive interface is now aligned and looks better.
387 - The birthyear is now the 4th option after the information about the profile.
388 - README.md brought back as README.md.
389
390 0.10.3, 2016/02/06 -- Fixes in mailfy and some searchfy platforms that got outdated.
391 - Fixed issue #83: alias_generator script is throwing an error related to where to find Python.
392 - Moved CHANGES.txt to CHANGES and README.md to README.
393 - Removed setup.cfg.
394
395 0.10.2, 2016/02/03 -- Fixes in mailfy and some searchfy platforms that got outdated.
396 - Fixed the searchfy search for the following platforms: facebook and youtube. The wrapper for twitter does NOT accept special characters such as the 'á', 'é', 'í', etc.
397 - Added more info to the output of the script to let the user know more info about what is happening.
398 - The number of domains to be searched is configurable now with the -d option.
399 - Added keemail.me to mailfy.py.
400 - Relaxing a requirement for a buggy version of pyexcel_text.
401
402 0.10.1, 2016/02/02 -- Two Bitcoin platforms added and a fix introduced to repair aporrealos.
403 - fanbitcoin and bitcointa have been added to the platform.
404 - A new error message has been added to aporrealos to avoid false positives when the platform throws errors.
405 - hotmail.com had to be deactivated from mailfy.py :(.
406
407 0.10.0, 2016/01/30 -- New release with several fixes.
408 - New platforms added to usufy: archive, ehow, gamesheep, hubpages, kanogames, newgrounds, nubelo, retailmenot, sidereel, thepiratebay, webtv, worldcarfans.
409 - Fixed issues linked to mailfy: #56, #57, #58 and #60.
410 - Fixed issue #53: adding tabulate dependency to the requirements.txt file.
411 - Fixed issue #52: fixed a crash when launching -p wikipedia only in usufy.py and some false positives associated to the platform.
412 - Fixed issue #64: foxmail.com has been removed from the list of secure domains.
413 - Fixed issue #67: infotelefonica.es has changed its error.
414 - Fixed issue #73: more convenient packaging solution with pip. Added osrframework scritps to path.
415 - Fixed issue #69: the new installation process has been detailed.
416 - Fixes for mailfy platforms which have been deactivated: outlook.com (#69) and sina.com (#70).
417 - Different fixes linked to issues #33 (jamiiforums), #43 (qq), #42 (buzznet) and #44 (pixls substitutes rawtherapee).
418 - Fixes for about, forosperu, hellboundhackers, ivoox and linkedin.
419 - Addressed issue #61: usufy.py --fuzz sample.txt now uses as separator either a '\t' or a ' '.
420 - A fix has been introduced in the --fuzz option of usufy.py so as not to stop when a matching pattern has been found.
421 - Added a new phonefy platform: kimatel (quienera.es).
422 - Removed unused files such as requirements.txt, utils/export.py, utils/timeout.py.
423 - Update in the README file.
424
425 0.9.14, 2016/01/21 -- Mitigation of several fixes.
426 - Fix to issues #46, #47, #48, #49. Mitigating #40, #42, #43, #44, 45.
427 - Modification of the Welcome banner for the different utilities. Back to normal.
428
429 0.9.13, 2015/11/26 -- Modifications for the Cybercamp.
430 - Modification of the Welcome banner for the different utilities.
431 - Changed the default extension to .xls as stated in the help.
432 - Added a new phonefy platform: infotelefonica.es.
433 - Modified the name of the listaspam platform from "listspam" to "listaspam".
434
435 0.9.12, 2015/11/18 -- Addition of Periscope.
436 - Addition of a wrapper for Periscope.
437 - Imported in the setup.py the local osrframework folder to grab the current version number.
438 - Fixed some errors in the messages displayed.
439
440 0.9.11, 2015/11/13 -- Addition of a new searchfy platform to look for PGP keys, as well as new platforms for mailfy.
441 - Added the search in the PGP public key repository by the MIT.
442 - Fixed a change in garage4hackers platform.
443 - Added new wikipediafr and wikipediapt user search.
444 - The platform thehoodup now waits for credentials.
445 - Added the sina.com email provider to mailfy.py.
446 - Added a message to urge the users to report any issue to <https://github.com/i3visio/osrframework/issues>.
447 - Added a message in mailfy.py when being run under Windows systems to let them know that the app. may behave unexpectedly.
448 - Corrected a mistake related to matplotlib.
449 - Added a banner text to each script of the framework showing the current version of the libraries.
450
451 0.9.10, 2015/10/26 -- Updated the error messages of burbuja.info in response to issue #32.
452 - Fixed in the burbuja platform which were confirmed to be working wrongly.
453 - Updated a new ebay error message just to try to confirm the reported malfunctioning by some users.
454 - Temporally deactivation of jamiiforums platform to try to fix this issue further.
455 - Throwing a Warning message when using Twitter API with old versions of ouath library.
456
457 0.9.9, 2015/10/18 -- Updated the number of email accounts that con be searched with mailfy.py.
458 - We have added a series of email providers in which the emailahoy library is also working: "yeah.net".
459 - Added badges to the README.md file.
460
461 0.9.8, 2015/10/15 -- Updated the number of email accounts that con be searched with mailfy.py.
462 - We have added a series of email providers in which the emailahoy library is also working: "126.com", "163.com", "189.cn", "foxmail.com", "qq.com", "yandex.com".
463
464 0.9.7, 2015/09/29 -- Updated the enumeration.py file and corrected the slashdot wrapper.
465 - Corrected the slashdot wrapper which was showing the existence of platforms which in fact didn't exist.
466 - Commented some references to an old logger in enumeration.py.
467
468 0.9.6, 2015/09/22 -- Corrected some installations misconfigurations.
469 - Fixed an issue when creating the twitter_api which now will try to grab the api_key in compilation time.
470 - A .csv file will be created by default now in usufy, entify, searchfy, mailfy and phonefy.
471 - Added a dependency for networkx in requirements.txt.
472 - Fixes in the installation instructions.
473
474 0.9.5, 2015/09/13 -- Corrected some errors in entify.py.
475 - Corrected some errors in entify.py when looking for entities in a folder.
476 - Corrected an error when looking for Spanish DNI.
477
478 0.9.4, 2015/09/12 -- API integration added to extract information, changes in the export files and added the Twitter API wrapper.
479 - Created a osrframework/api folder where all the wrappers to each platform will be included.
480 - Considered in platforms.py the chance of using the API if, both, a wrapper exists and the appropriate authentication methods have been provided.
481 - Added a Twitter API wrapping the credentials in config_api_credentials.py to make use of Tweepy API.
482 - Added networkx library to store the information in a graph format: png and gml have been added.
483 - A hack has been used to avoid encoding problems when exporting data.
484 - An issue has been detected: python-networkx and python-decorator in Debian-based OS is a problem because they are not up-to-date. Installation from pip is required.
485 - Changed the export modules to change the starting "@" in the attributes to a "_" and the "i3visio." headers to "i3visio_" for usability reasons when loading future versions of visualization apps.
486
487 0.9.3, 2015/08/28 -- Storing the information of mailfy, entify and phonefy files.
488 - Updating the export primitives of the entify, mailfy and phonefy files.
489 - Showing some extra text at the beginning of the applications.
490 - Fix in the extraction of the i3visio.fullname from Twitter.
491 - Fix in the URIs returned from searchfy (previously, '//' was used in twitter and github wrappers).
492
493 0.9.2, 2015/08/25 -- Dealing with export issues linked to localization.
494 - Dealing with an issue when printing unicode characters in the terminal (specially, in right-to-left languages). A message error will be displayed in the terminal though the information will be stored safely).
495 - Back to creation of .xls output files by default. An issue has been detected when creating .ods using Unicode characters. We will wait to test the utility.
496 - About.me platform temporally deactivated as it requires javascript.
497
498 0.9.1, 2015/08/20 -- Fixes in the export using experimental versions of pyexcel. Release version.
499 - Fix an issue linked to the export of Unicode characters in this library. It needs to install an experimental library though.
500 - Usufy will display now additional details when being launched: start and end messages as well as time consumed.
501
502 0.9.0rc5, 2015/08/19 -- Extraction of attributes reconfigured.
503 - Added youtube and github to searchfy.
504 - The searchfy file now operates using uri and parsing them.
505 - Added a new global variable to be able to apply different types of URLs for the profiles in a platform.
506 - Fix in the csv export that overwrote previous files.
507
508 0.9.0rc4, 2015/08/18 -- Extraction of attributes reconfigured.
509 - Fix in the extraction of Twitter fields.
510 - Fix in Twitter and Skype wrappers to return an i3visio.uri.homepage entity for the URIs found in the profiles. Previous approach overrode the profile's URI.
511
512 0.9.0rc3, 2015/08/18 -- Extraction of attributes reconfigured.
513 - The extraction of attributes from the profiles has been reincluded.
514 - The Twitter wrapper recovers now the i3visio.location of a user in usufy mode even when the profile is locked.
515 - Fixed the usufy launcher to show the icon.
516 - Fixed compatibiliy of the installer for Windows systems.
517
518 0.9.0rc2, 2015/08/16 -- Minor changes linked to redistribution.
519 - Updating the help texts to include the references to the official repository.
520 - The .desktop files do not include now a reference to pantheon-terminal.
521 - Updating the publication process.
522 - Modification of the regular expressions of the nicks for the following platforms: twitpic, tumblr, rankia, gogobot, buzznet, causes.
523 - Added about me wrapper to usufy (removed wefollow).
524
525 0.9.0rc1, 2015/08/13 -- First DEB, RPM, compiled version of 0.9.0.
526 - Updating setup.py to include some data files in /usr/bin/.
527 - Accomdation of the .mtz Maltego file.
528 - Creation of .deb, .rpm packages.
529 - Updating the README.
530 - Creation of .ods output files by default.
531 - Addition of icons and desktop launchers for Linux systems (.desktop files).
532
533 0.9.0b7, 2015/08/12 -- Fixes in the Maltego transforms.
534 - Added Maltego transform: searchfy on Twitter.
535 - Added Maltego transform: searchfy on Facebook.
536 - Added Maltego transform: searchfy on Skype.
537 - Modified Maltego transform: aliasToKnownMails is now operative.
538 - The i3visio.location.city entity is extracted correctly when calling ip-api.com API.
539 - If the number of entities returned are too many a message will be displayed in the Transform output tab.
540 - Debug windows are not shown in production thanks to a new utility included in configure_maltego.py.
541 - Fix in Skype wrapper to avoid showing errors messages that make Maltego crash.
542 - Remove PIP dependencies: only pip will be required. The other dependencies will be checked when installed and included to be manually installed by the user.
543 - Update on the version number from v0.9.0 to 0.9.0 format (without the 'v').
544
545 v0.9.0b6, 2015/07/15 -- Minor fix in hi5 that needs credentials right now.
546 - Hi5 wrapper has been modified to request credentials.
547
548 v0.9.0b5, 2015/07/15 -- Added searchfy platforms for skype, facebook and twitter.
549 - Added the searchfy functionality.
550 - Fixed the returned objects in usufy (now, it's always a list).
551 - Facesaerch and ahmia have been temporally deactivated.
552 - The generated output now does not override the file if it already exists. Instead, it reads the previous data and appends the new information.
553
554 v0.9.0b4, 2015/07/13 -- Fixed the output when too much information is displayed.
555 - The printed table appearing in the terminal will only show values linked to i3visio.alias, i3visio.platform, i3visio.uri and i3visio.fullname. The rest of the information will be printed to the output files.
556 - Minor change in the Skype entity previously returned as i3visio.person which now is returned as i3visio.fullname.
557
558 v0.9.0b3, 2015/07/13 -- Fixes in tuporno and fanpop.
559 - Fixed tupono, fanpop.
560 - Setting .csv files as default output extension for usufy.py.
561
562 v0.9.0b2, 2015/07/10 -- Notably improved the export capabilities.
563 - Fixed an error in the generation of the .csv for usufy.
564 - New export formats included in usufy: .ods, text, .xls, .xlsx.
565
566 v0.9.0b, 2015/06/24 -- Major restructuration of the internal tool. Addition of new platforms and links.
567 - Moved platforms to wrappers and changed platforms.py to utils.
568 - Inclusion of old darkfy searches to look for information in Tor platforms.
569 - Inclusion of regular expression rules to choose valid names.
570 - Inclusion of a new mailfy.py app that verifies whether an email is known as a valid email using emailahoy.
571 - Inclusion of a new searchfy.py app that recovers the URL of a search in different platforms.
572 - Generation of aliases from a person using alias_generator.py
573 - Inclusion of all the variables to include phonefy, usufy and searchfy search in all platforms.
574 - Inclusion of plain calls to the different third party API in the main folder.
575 - Removed phonefy and usufy folders for structural simplicity.
576 - Added a proof of concept option to access all the users of a given platform.
577 - Added a facesaerch.py module to look for images.
578 - Added an alias to IP platform that tries to resolve the location of a user in Skype.
579 - Added a uriToGoogleCacheUri transform.
580 - Changed usufy-launcher.py and phonefy-launcher.py to usufy.py and phonefy.py.
581 - Changed maltfy folder to transforms.
582 - Opening .onion URI using onion.cab service.
583 - Updated transforms to match the new distribution.
584 - Added BeautifulSoup as a needed llibrary for the installation.
585 - Fixed bladna, breakcom, twicsy, spotify, spoj.
586 - Deactivating friendsfeed, hellboundhackers and ukdebate (services unavailable for different reasons) and twitch.
587 - The Skype platform now returns an i3visio.platform entity as expected.
588
589 v0.8.3, 2015/04/09 -- Changed the structure of the returned csv files.
590 - Adding the possibility of creating a csv output file.
591
592 v0.8.2, 2015/04/08 -- Changed the structure of the returned json files.
593 - Fixed an issue that created up to n different json files.
594 - The returned json is a list of i3visio.objects and the list returned is now ordered and no longer linked to the nickname searched.
595
596 v0.8.1, 2015/04/08 -- Minor fixes on certain platforms which were not working.
597 - Fixed the self.notFoundText in: cafemom, pearltreesspoj.
598 - Added the self.foundText in: spoj.
599 - ResearchGate needs credential now.
600
601 v0.8.0, 2015/04/03 -- Improvements in the entity generation and an extensive ip-api.com support.
602 - Added Maltego transform: coordinatesToGoogleMapsBrowser.
603 - Added Maltego transform: coordinatesToTwitterBrowser.
604 - Added Maltego transform: domainToIp_ApiInfo.
605 - Added Maltego transform: ipToIp_ApiInfo.
606 - Added default fields to every Maltego Entity.
607 - Modified Maltego transform: aliasToAllProfiles.
608 - Modified Maltego transform: aliasToFamousPlatforms.
609 - Modified Maltego transform: aliasToSkypeAccounts.
610 - Modified Maltego transform: bitcoinAddressToBlockchainDetails.
611 - Modified Maltego transform: domainToGoogleSearchUriWithEmails.
612 - Modified Maltego transform: domainToTld.
613 - Modified Maltego transform: emailToAlias.
614 - Modified Maltego transform: emailToBreachAccounts.
615 - Modified Maltego transform: emailToDomain.
616 - Modified Maltego transform: emailToSkypeAccounts.
617 - Modified Maltego transform: expandPropertiesFromI3visioEntity.
618 - Modified Maltego transform: hashToMD5crackDotCom.
619 - Modified Maltego transform: ipToIp_ApiInformation.
620 - Modified Maltego transform: phoneToPerson.
621 - Modified Maltego transform: phoneToMoreInfo.
622 - Modified Maltego transform: textToGoogleSearchUri.
623 - Modified Maltego transform: textToEntities.
624 - Modified Maltego transform: uriToBrowser.
625 - Modified Maltego transform: uriToDomain.
626 - Modified Maltego transform: uriToEntities.
627 - Modified Maltego transform: uriToPort.
628 - Modified Maltego transform: uriToProtocol.
629 - Fixed errors in cafemom.com and activerain.trulia.com platforms.
630 - Requesting credentials for Pokerstrategy and Flixter platforms.
631 - Addition of a method to recursively extract the information of the fields and attributes, even when it exceeds the maximum number of queries performed for the free version.
632 - Change in the returnOutput methods of MaltegoEntity and MaltegoTransform to make use of an auxiliar getOutputText method.
633 - Creation of two new methods in maltfy.lib.maltego to create new entities.
634 - Reorganization of ip-api.com json objects returned by the API to display i3visio-like objects.
635 - Inclusion of thirdparties.pipl script to perform queries on usernames and emails.
636 - Appending a '/' to URL that do not have it when extracting domains or ports.
637 - Minor change in the way of grabbing md5crack.com API Key in config_api_keys.py.sample.
638 - Reorganization of network transforms onto i3visio.network set.
639 - Added new categories: i3visio.location.geo, i3visio.ipv4.
640 - Changed the i3visio.protocol icon and moved the i3visio.breach entity to i3visio.person group.
641 - Fixed some issues regarding the way of showing the License on each file.
642 - Various identation fixes from 't' to ' '.
643 - Fixed an error with Trulia platform. A missing pair of quoting marks.
644
645 v0.7.1, 2015/01/17 -- Release of v0.7.1.
646 - Fix in the domainToGoogleSearchUriWithEmails transform which was wrongly coded.
647
648 v0.7.0, 2015/01/17 -- Release of v0.7.0.
649 - Added Maltego transform: uriToBrowser.
650 - Added Maltego transform: uriToBitcoinAddressEntities.
651 - Added Maltego transform: uriToDniEntities.
652 - Added Maltego transform: uriToDogecoinAddressEntities.
653 - Added Maltego transform: uriToEmailEntities.
654 - Added Maltego transform: uriToIPv4Entities.
655 - Added Maltego transform: uriToLitecoinAddressEntities.
656 - Added Maltego transform: uriToMD5Entities.
657 - Added Maltego transform: uriToNamecoinAddressEntities.
658 - Added Maltego transform: uriToPeercoinAddressEntities.
659 - Added Maltego transform: uriToSHA1Entities.
660 - Added Maltego transform: uriToSHA256Entities.
661 - Added Maltego transform: uriToUriEntities.
662 - Added Maltego transform: textToBitcoinAddressEntities.
663 - Added Maltego transform: textToDniEntities.
664 - Added Maltego transform: textToDogecoinAddressEntities.
665 - Added Maltego transform: textToEmailEntities.
666 - Added Maltego transform: textToIPv4Entities.
667 - Added Maltego transform: textToLitecoinAddressEntities.
668 - Added Maltego transform: textToMD5Entities.
669 - Added Maltego transform: textToNamecoinAddressEntities.
670 - Added Maltego transform: textToPeercoinAddressEntities.
671 - Added Maltego transform: textToSHA1Entities.
672 - Added Maltego transform: textToSHA256Entities.
673 - Added Maltego transform: textToUriEntities.
674 - Added Maltego transform: domainToGoogleSearchUriWithEmails.
675 - Added Maltego transform: textToPhoneDetails.
676 - Removed Maltego transform: phoneToPerson.
677 - Reorganization of transforms in different thematic sets.
678 - Refactoring of uriToEntities.py and textToEntities.py python codes to accept a platform parameter in the transform.
679 - Changed the name of the Maltego Configuration folder to remove the version in the name.
680 - Fix the i3visio.surname2 which was wrongly referred as i3visio.surnme2.
681 - Added different entity categories such as: i3visio.hash, i3visio.location, i3visio.person, i3visio.phone, i3visio.web.
682
683 v0.6.1, 2015/01/15 -- Correction of a couple of issues in the entities.
684 - Added properties by default to i3visio.person.
685 - Corrected a reference to a i3visio.phone in infobel_com package (it was identified wrongly as i3visio.location.phone)
686
687 v0.6.0, 2015/01/14 -- Creation of Phonefy architecture.
688 - Added a Google Search wrapper based on Mario Vilas approach.
689 - Added Maltego transform: phoneToPerson.
690 - Added Maltego transform: textToGoogleSearchURI.
691 - Added Maltego transform: uriToProtocol.
692 - Added Maltego transform: uriToPort.
693 - Added Maltego transform: uriToDomain.
694 - Added Maltego transform: domainToTLD.
695 - Added tld, person, fullname, name, surname1, surname2, location.postalcode and location.address entities.
696 - Changed the main path for the configuration files
697
698 v0.5.0, 2015/01/13 -- Creation of Phonefy architecture.
699 - Added Maltego transform: phoneToMoreInfoListspam.
700 - Restructuration of phonefy package.
701 - Change in uriToEntities.py to use an i3visio Browser.
702 - Fix in i3visio.location.province icon.
703
704 v0.4.0, 2015/01/11 -- Added the usufy package onto OSRFramework.
705 - Added Maltego transform: aliasToAllProfiles.
706 - Added Maltego transform: aliasToFamousProfiles.
707 - Inclusion of i3visiotools global files as osrframework.utils.
708 - Change in old displaying format of usufy entities.
709 - Change inheritance of i3visio.uri to i3visio.text (rather than i3visio.object).
710 - Change icon of i3visio.platform.
711
712 v0.3.0, 2015/01/11 -- Added the extraction of regular expression with entify.
713 - Added Maltego transform: textToAllEntities.
714 - Added Maltego transform: uriToAllEntities.
715 - Added Maltego transform: emailToAlias.
716 - Added Maltego transform: emailToDomain.
717 - Inclusion of a --quiet option.
718 - Inclusion of transforms related to the extraction of entities.
719 - Minor changes in the name of entify transforms and i3visio.url has been moved to i3visio.uri.
720 - Changed the url.py module to uri.py. References changed everywhere.
721 - Added a simple transformation of foo[at]bar[dot]com mails to be [email protected].
722 - Fix on i3visio.object entity which was not being imported correctly.
723 - Edit configuration of configure_maltego to update also default paths for the transforms.
724
725 v0.2.0, 2015/01/07 -- Added Maltego transforms.
726 - Added Maltego transform: aliasToSkypeAccounts.
727 - Added Maltego transform: bitcoinAddressToBlockchainDetails.
728 - Added Maltego transform: emailToBreachedAccounts.
729 - Added Maltego transform: emailToSkypeAccounts.
730 - Added Maltego transform: hashToMD5crackDotCom.
731 - Added Maltego transform: expandPropertiesFromI3visioEntity.
732 - Added entities and logos for Peercoin and Namecoin addresses.
733 - Removed i3visio.bitcoin, i3visio.litecoin, i3visio.dogecoin entities, as the i3visio.bitcoin.address (et al.) will be used.
734 - Added entities for i3visio.port, i3visio.domain and i3visio.protocol.
735 - Changed icon for i3visio.dni.
736 - Added an autoconfiguration file for Maltego Transforms.
737
738 v0.1.0, 2014/12/31 -- Initial release.
739 - Added a third-party API wrapper for Skype: checkIPDetails.
740 - Added a third-party API wrapper for md5crack.com: checkIPDetails.
741 - Added a third-party API wrapper for ip-api.com: checkIPDetails.
742 - Added a third-party API wrapper for haveibeenpwned.com: checkIfEmailWasHacked.
743 - Added a third-party API wrapper for blockchain.info: getBitcoinAddressDetails.
744 - Initial release.
745
746
747 [TO-DO]
748 Long term:
749 - Usage of mashape.com API linked to email verification.
750 - Usage of mashape.com API linked to image verification.
751 - Inclusions of email verification transforms.
752 - Inclusion of a call to pipl.com API.
753 - Full normalization of fields.
754 - Create Facesaerch and Tor search transforms in Maltego.
755 - Recover the logging functions.
756
757 [Known issues]
758 - Text to deep web search is broken.
759 - Recursive expansion of attributes when the cap is reached in Maltego.
760 - There is an issue in Maltego Chlorine CE when exporting a transform with the transform.local.parameters popup marked as True: <Property name="transform.local.parameters" type="string" popup="true"></Property>. However, when importing the created .mtz file the popup attribute is not correctly updated not requesting the user who imported the transform the value unless he/she clicks on configure and manually update this value, something which may not be trivial for some users. This issue affects the transform aliasToSelectedPlatforms which will throw an error if not manually configured by the user instead of asking the user to insert the deliberately missing parameters. This is not an OSRFramework issue and has conveniently be notified to Paterva with date of 2015/08/12.
0 Using entify.py
1 ===============
2
3 TODO.
0 Contributing to OSRFramework
1 ============================
2
3 Reporting issues, bugs and fresh ideas
4 --------------------------------------
5
6 The way in which we track the issues regarding the software is by means of the issues page in Github's project site, which can be found here: <https://github.com/i3visio/osrframework/issues>.
7 Whether you have experimented problems with the installation, you have found a bug in a new platform or you feel that we can add a new functionality, you can find the place to report them there. The only "rule" is to notify one error per issue to be able to track the problems indepently, as well as trying to provide as much information as possible regarding the OS or version you are trying.
8
9 If you find that a transform in Maltego is not behaving as expected, we recommend you to set the debug mode as True. Go to Manage --> Manage Transforms, choose the transform and mark the "Set debug info" as True. Please, copy the information shown in the new tab in the issue so as to provide more information to debug it faster.
10
11 Extending OSRFramework
12 ----------------------
13
14 This section will provide information about how to extend the different tools found in the framework.
15
16 ### Creating new usufy.py wrappers as plugins
17
18 Since OSRFramework 0.13.0, we have added the possibility of creating new wrappers as plugins.
19
20 The basic things you should know in order to create a new wrapper are:
21 * The structure of the URL that links to the profile.
22 * The part of the HTML code that says that the user does NOT exist.
23 * A valid nickname that has an active profile in the website.
24
25 For the example, we are going to use an invented socialnetwork: `http://example.com/james` is the URL of a user called `james` in that figured platform. The error returned is `<title>404 not found</title>`.
26 Go to the `plugins/wrappers` folder in your home, copy and rename the `wrapper.py.sample` to `example.py`.
27 Thus you will have a template that you will be able to modify.
28
29 First, we'll change the name of the wrapper and the tags:
30 ```
31 class Example(Platform):
32 """
33 A <Platform> object for Example.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Example"
40 self.tags = ["test"]
41 ```
42
43 We'll tell the framework, that this platform has usufy-style profile pages by setting to True the corresponding variable:
44 ```
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52 ```
53
54 We will provide the URL patern:
55 ```
56 ######################################
57 # Search URL for the different modes #
58 ######################################
59 # Strings with the URL for each and every mode
60 self.url = {}
61 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
62 self.url["usufy"] = "https://example.com/" + "<usufy>"
63 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
64 ```
65
66 We will know tell if the platform needs credentials to work:
67 ```
68 ######################################
69 # Whether the user needs credentials #
70 ######################################
71 self.needsCredentials = {}
72 #self.needsCredentials["phonefy"] = False
73 self.needsCredentials["usufy"] = False
74 #self.needsCredentials["searchfy"] = False
75 ```
76
77 In some platforms, we may now that the usernames always match a given regular expression (for instance, Twitter does not allow '.' in a username). If this is the case, we can modify the `validQuery` attribute:
78 ```
79 #################
80 # Valid queries #
81 #################
82 # Strings that will imply that the query number is not appearing
83 self.validQuery = {}
84 # The regular expression '.+' will match any non-empty query.
85 #self.validQuery["phonefy"] = re.compile(".+")
86 self.validQuery["usufy"] = re.compile(".+")
87 #self.validQuery["searchfy"] = re.compile(".+")
88 ```
89
90 The last part, is telling the framework which is the message that appears when the user is not present. This is an array, so more than one message can be used here.
91 ```
92 ###################
93 # Not_found clues #
94 ###################
95 # Strings that will imply that the query number is not appearing
96 self.notFoundText = {}
97 #self.notFoundText["phonefy"] = []
98 self.notFoundText["usufy"] = ["<title>404 not found</title>"]
99 #self.notFoundText["searchfy"] = []
100 ```
101
102 And that's almost all. You can now test OSRFramework as usual. A new option will be available the next time you run the application.
103
104 Contributing code
105 -----------------
106
107 If you want us to include your own wrapper, you will be able to extend the whole framework. Think about the wrapper
108 Whether you want to add a new wrapper or fix a bug, the basic instructions to contribute and perform a pull request on Github are the following (we assume that you have installed Git by yourself, so please follow the instructions in the project's website to install it on your system <https://git-scm.com/downloads>). We will assume that the username for this test is `osrframework_contributor`.
109
110 First of all, logged in Github and fork the repository by pressing the corresponding button in <https://github.com/i3visio/osrframework>. This will create a copy of the repository under your profile (i. e.: `https://github.com/osrframework_contributor/osrframework`).
111
112 You can clone your forked repository now:
113 ```
114 # This is an example! Change "osrframework_contributor" for your nick!
115 git clone https://github.com/osrframework_contributor/osrframework
116 cd osrframework
117 ```
118
119 Then, you can modify any file you want, for example, adding the new wrapper that you have created in the previous case.
120 ```
121 # Copying the file to the wrappers folder
122 mv ~/.config/OSRFramework/plugins/wrappers/example.py ./osrframework/wrappers/
123 ```
124
125 Whenever you want, you can add the changes performed to the Git index to keep track of what you have changed and prepar it for the commit.
126 ```
127 # Add one file
128 git add ./osrframework/wrappers/example.py
129 # Or adding all the files modified... Just be a little bit more careful
130 # git add -A
131 ```
132
133 Once you are happy with the changes (and you have tested them!), you can commit the changes with a descriptive message.
134 ```
135 git commit -m "Adding a new wrapper as example.py."
136 ```
137
138 You have to push the changes to your Github project.
139 ```
140 git push origin
141 ```
142
143 You're almost there. You can now go to your project's website (`http://github.com/osrframework_contributor/osrframework`) and click in the `Pulls` tab or going directly to it by appending `pulls` to your forked URL, something similar to `https://github.com/osrframework_contributor/osrframework/pulls`. Then provide there as much detail as you can about the contents of the pull request and shortly we will evaluate the changes and pushed it upstream.
144
145 NOTE: a similar procedure can be performed to add new patterns to entify.py.
146
147 Style guide
148 -----------
149
150 Just a few things to be taken into account:
151 * Use four spaces ' ' instead of a tab for identing blocks.
152 * Provide useful and not trivial comments in English to the code you write.
153 * Classes should start with a capitalised initial letter.
154 * As a convention, wrappers inside the `platform_selection.py` should be in alphabetical order. Anyone wants to find things easily!
155
156 Licensing
157 ---------
158
159 The only thing we expect from other authors'code is to use a GPL-compatible license for their code, preferably GPLv3+ itself. We hope that anybody can use this tool for free (as in Free Software Foundation's four freedoms, not as in *free beer*), so help us to do it.
160
0 Installation Instructions
1 =========================
2
3 More detailed installation instructions can be found in this file. This will use the official package uploaded to pip, but if you prefer to use this with Docker check (this file)[USAGE_WITH_DOCKER.md].
4
5 1.- Verifying the Python and Pip Installation
6 ---------------------------------------------
7
8 First of all, on any system we should verify that we have a Python 2.7 installation and a Pip installation setup properly. Opening the terminal or the powershell, we can try the following to check your python installation:
9 ```
10 python --version
11 ```
12 If you get errors at this point or the Python version is not appeating, your system is not yet prepared. You will need to install Python 2.7 from the official website:
13 ```
14 https://www.python.org/downloads/
15 ```
16 Follow the installation steps for your system. Note that in one step of the Windows installation process you WILL NEED to manually add c:\Python27 and C:\Python27\scripts to the system. Try again after completing this task.
17
18 Now it's the turn of the package manager. Check that you have the pip version installed:
19 ```
20 pip --version
21 ```
22 If you get any errors at this point, you have several options:
23 * If your running Ubuntu or Debian-like systems, try `sudo apt-get install python-pip`.
24 * In any case you can always download <https://bootstrap.pypa.io/get-pip.py> and install it manually. In Windows-like systems, you do NOT need to type sudo.
25 ```
26 # Going to the downloads folder
27 python get-pip.py
28 ```
29 You can do it at a time in GNU/Linux and MacOS systems with a couple of commands:
30 ```
31 # Downloading
32 wget https://bootstrap.pypa.io/get-pip.py
33 # Installing as root
34 sudo python get-pip.py
35 ```
36 Try again and check if the new pip version is installed.
37
38
39 2 - Installing OSRFramework from Pip
40 ------------------------------------
41 When installing OSRFramework you have to know that several packages and dependencies will be managed by the installer. The instuctions on how to install this may vary depending on the system.
42
43 ### In (Most) GNU/Linux Systems and MacOS
44
45 The fast way to do it on almost any system is by installing it with:
46 ```
47 pip install osrframework --user
48 ```
49
50 You should be able to run `usufy.py`, `mailfy.py`, etc. from the terminal because these scripts have been added to the `~/.local/bin/` folder.
51
52 #### Known Possible Issues
53
54 If you are receiving an error saying that it cannot find `usufy.py: command not found`, check if the given folder is in the `PATH` with:
55 ```
56 echo $PATH
57 ```
58 If you cannot find the given folder in the previous output, you can always manually add this folder to your `PATH` by appending these two lines to your `.bashrc` as defined in <https://github.com/i3visio/osrframework/issues/187>.
59 ```
60 export PY_USER_BIN=$(python -c 'import site; print(site.USER_BASE + "/bin")')
61 export PATH=$PY_USER_BIN:$PATH
62 ```
63
64 You can also try to do it installing the framework as a superuser which would add the scripts to `/usr/local/bin/`.
65
66 ```
67 ```
68 However, note that both approaches may interfere with other libraries that you may have installed on your system. If you are worried about this issue, check the Virtual Environment section below.
69
70 ### In Windows Systems
71
72 If you have already tested that Python 2.7.x and Pip are installed, this is easy too:
73 ```
74 pip install osrframework
75 ```
76
77 ### Using VirtualEnv: Recommended for Devs and Advanced Users
78
79 The Python libraries we use in OSRFramework are all required to run different utils in the framework. However, and specially if you are a developer, the required packages may broke dependencies on your system. That's why we also recommend the installation using `virtualenv`, another Python package that tries to address this issue by downloading a copy of the needed packages in a virtualized environment.
80
81 To do so, you will need to install it with `virtualenv` so as to avoid problems with dependencies with other libraries. You can use Pip to do so:
82 ```
83 pip install virtualenv --user
84 ```
85 Afterwards, we are creating a virtual environment that we will arbitrarily call `osrframework-virtualenv`. Anyway, you can use the name you choose:
86 ```
87 virtualenv osrframework-virtualenv
88 ```
89 Now, if you want to enter the newly created virtual environment, you have to activate it. Note that this will change your prompt to indicate that you are now in a virtual environment:
90 ```
91 source osrframework-virtualenv/bin/activate
92 (osrframework-virtualenv)$
93 ```
94 Now in the new virtual environment you would be able to install osrframework easily and run the applications as usual:
95 ```
96 (osrframework-virtualenv)$ pip install osrframework
97 (osrframework-virtualenv)$ usufy.py -h
98 ```
99 Note that, we may have several virtual environments in the same system, but they should be activated before using them. Whenever we want to leave the virtual environment, we can type `deactivate`. This is useful to test different OSRFramework installations in the same system avoiding conflicts between them.
100 ```
101 (osrframework-virtualenv)$ pip install osrframework
102 ```
103
104 3 - Testing the installation
105 -------------------------
106
107 If everything went correctly (we hope so!), it's time for trying `usufy.py`, `mailfy.py` and so on. But we are they? They are installed in your path meaning that you can open a terminal anywhere and typing the name of the program (seems to be an improvement from previous installations...). Examples:
108 ```
109 usufy.py -n i3visio febrezo yrubiosec -p twitter facebook
110 searchfy.py -q "i3visio"
111 mailfy.py -n i3visio
112 ```
113
114 4 - Updating the framework
115 --------------------------
116
117 OSRFramework is a tool in development mantained by its [authors](AUTHORS.md) and, thus, we will fix bugs and add new platforms from time to time. To upgrade your local osrframework installation you can type the following:
118 ```
119 pip install osrframework --upgrade --user
120 ```
121 Depending on how you have installed the framework, you may need to do this as superuser:
122 ```
123 sudo pip install osrframework --upgrade
124 ```
125 This will manage all the dependencies for you and will try to download the latest *stable* version. If you want to try a prerelease version, you can try to upgrade or install it by appending `--pre` tag:
126 ```
127 sudo pip install osrframework --upgrade --pre
128 ```
129 Please, things can be unstable and lead to problems so do it under your responsibility. To minimize the effect of those strange things that may take place, you may think about installing them using `virtualenv`.
130
131 ### Known Possible Issues in OSRFramework <= 0.14.3 on Windows
132 If you had already installed 0.14.3 or earlier versions of the framework on Windows you may face some problems with `mailfy.py` and the libraries it uses. You *should* uninstall first `dnspython` and `pyDNS` before reinstalling `osrframework` again:
133 ```
134 # Uninstalling dnspython
135 pip uninstall dnspython
136 # Uninstalling pydns
137 pip uninstall pydns
138 # Reinstalling osrframework, upgrading to most recent version
139 pip install osrframework --upgrade
140 ```
141 Anyway, if you are facing any issues regarding the installation keep us posted at <https://github.com/i3visio/osrframework/issues/>.
0 Using mailfy.py
1 ===============
2
3 TODO.
0 Maltego Configuration Instructions
1 ==================================
2
3 OSRFramework was conceived to interact with third party applications. One of the
4 first approaches was to be compatible with Maltego.
5
6
7 Maltego Installation
8 --------------------
9
10 Maltego is a Java application developed by Paterva that tries to make OSINT
11 easier for the analyst. Although it is not a free software project, there is a
12 Community Version that can be used without commercial purposes. It can be
13 downloaded for your current OS directly from Paterva's website:
14 ```
15 http://www.paterva.com/web6/products/download2.php
16 ```
17 Follow the instructions there. Afterwards, you will be able to launch the app
18 and use the different tools developed by third parties.
19
20 Configuring Maltego to Work with OSRFramework Transforms and entities
21 ---------------------------------------------------------------------
22
23 Although others have opted for deploying transforms in the cloud in Maltego
24 transform hubs, OSRFramework transforms are deployed locally. They are Python
25 scripts that convert OSRFramework conventional output to a Maltego-like format
26 that can be interpreted by the client conveniently.
27
28 The entities and transforms created ad-hoc are shipped within the setup script.
29 It will create a .mtz file in the OSRFramework home and under the default folder
30 inside the application folder (just in case a disaster happends ;)).
31 ```
32 # Under Linux...
33 ~/osrframework-maltego-settings_<VERSION>.mtz
34 ~/.config/OSRFramework/default/osrframework-maltego-settings_<VERSION>.mtz
35 ```
36
37 Once you have located it, you will then have to import this file in Maltego by
38 clicking the `Menu --> Import --> Import configuration`. You might have to
39 manually check all the types in the installer assistant.
0 Introduction to OSRFConsole
1 ===========================
2
3 TODO.
0 Using the GUI
1 =============
2
3 TODO.
0 Using phonefy.py
1 ================
2
3 TODO.
0 Using searchfy.py
1 =================
2
3 TODO.
0 Using OSRFramework with Docker
1 ==============================
2
3 This file will explain how to use the Docker images for OSRFramework. This will let the reader use the tools easily in almost any platform. To do so, the user will have to install Docker on its computer, what should be enough in most systems.
4
5 1.- Verifying Your Docker Installation
6 --------------------------------------
7
8 Docker is available for Mac, Windows and Linux and can be installed easily in Azure or AWS. We strongly recommend to follow the official guides to install and run Docker in your system. Some good starting points can be found [here](https://docs.docker.com/engine/installation/).
9
10 2.- Downloading the Latest OSRFramework Version
11 -----------------------------------------------
12
13 To run the latest OSRFramework isntallation from Docker you can use the following command:
14 ```
15 > docker run -it i3visio/osrframework:latest
16 ```
17
18 It will download our latest official image. Then, you will be able to login into the Docker image to interact as usual without needing to redownload it again. E. g.:
19 ```
20 > docker run -it osrframework:latest
21 root@c79505f6b915:/# usufy.py -n i3visio -p twitter facebook github
22 ...
23 root@c79505f6b915:/# osrfconsole.py
24 ```
25
26 If you want to map the port opened by `osrframework_server.py` you will need to specify it when launching Docker to map the ports and make them accesible. In the following example, we are mapping the 30230 port of the container to port 8080 outside it.
27
28 ```
29 > docker run -it -p 8080:30230 i3visio/osrframework:latest
30 ```
31
32 Once launched `osrframework_server.py` we will be able to interact with the instance outside it using `curl`.
33
34 ```
35 > curl http://localhost:8080/info
36 ```
37
38 3.- Building Your Own Image Locally
39 -----------------------------------
40
41 As we also provide the Dockerfile, advanced users may opt to build the image themselves. This can be done by _cd-ing_ into the folder of a clones project and using:
42
43 ```
44 > docker build -t osrframework ./
45 ```
46
47 You will be able ro run the built image as usual:
48
49 ```
50 > docker run -it osrframework
51 ```
52
53 If by any circunstamce you prefer to rebuild the instance from scratch, you can always tell it to Docker:
54
55 ```
56 > docker build --no-cache=true -t osrframework ./
57 ```
58
59 ### Example of a New Build
60
61 As an example, generally we build and push the Docker images as follows:
62 ```
63 > docker login
64 > docker build -t osrframework:0.16.6 ./
65 > docker tag osrframework:0.16.6 i3visio/osrframework:latest
66 > docker push i3visio/osrframework:latest
67 > docker run -it i3visio/osrframework:latest
68 ```
69
70 We can always opt to launch a beta vesion:
71
72 ```
73 > docker login
74 > docker build -t osrframework:0.16.6 --build-arg VERSION=--pre ./
75 > docker tag osrframework:beta i3visio/osrframework:beta
76 > docker push i3visio/osrframework:beta
77 > docker run -it i3visio/osrframework:beta
78 ```
79
0 Using usufy.py
1 ==============
2
3 TODO.
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2014-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22
23 # Calling the logger when being imported
24 osrframework.utils.logger.setupLogger(loggerName="osrframework")
25 __version__="0.17.2"
0 #!/usr/bin/python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import json
34
35 import osrframework.utils.banner as banner
36 import osrframework.utils.general as general
37
38 # GLOBAL OPTIONS
39 SEPARATORS = ["_", ".", '']
40 COMMON_WORDS = ["666", "home", "mr", "news", "official", "real", "xxx"]
41 LOCALES = ["ar", "de", "en", "es", "fr", "ru"]
42 LEET_TRANSFORMS = {
43 "a" : ["4"],
44 "b" : ["8"],
45 "e" : ["3"],
46 "i" : ["1"],
47 "l" : ["l"],
48 "o" : ["0"],
49 "s" : ["5"],
50 "t" : ["7"],
51 "z" : ["2"]
52 }
53
54
55 def main(name=None, surname1=None, surname2=None, city=None, country=None, year=None, useNumbers=False, useCommonWords=False, useLeet=False, useLocales=False, extraWords=[]):
56 """
57 The main method that generates the given aliases.
58
59 It receives several parameters as parsed by this module's `getParser()`.
60
61 Args:
62 -----
63 name: String representing the known name of the investigated profile.
64 surname1: String representing the first surname of the investigated profile.
65 surname2: String representing the second surname of the investigated
66 profile.
67 city: String representing the city where the profile was born or works.
68 country: String representing the country.
69 year: String representing a year linked to the profile.
70 useNumbers: Boolean representing whether to use random numbers at the end.
71 useCommonWords: Boolean representing whether to use known commond words to
72 generate new nicknames.
73 useNumbers: Boolean representing whether to use random numbers at the end.
74 useLeet: Boolean representing whether to modify certain letters by numbers
75 using the leet (*133t*) codification.
76 extraWords: A list of strings with extra words to be appended to the
77 generatednicknames.
78
79 Returns
80 -------
81 list: An ordered list of the nicknames generated.
82 """
83 # Lowering all the info received
84 name = name.lower()
85 surname1 = surname1.lower()
86 surname2 = surname2.lower()
87 year = year.lower()
88 country = country.lower()
89 city = city.lower()
90
91 # Check if the value provided is a '' string
92 if name == '':
93 name = None
94 if surname1 == '':
95 surname1 = None
96 if surname2 == '':
97 surname2 = None
98 if year == '':
99 year = None
100 if city == '':
101 city = None
102 if country == '':
103 country = None
104
105 print("\nGenerating new aliases...")
106
107 lista = []
108
109 try:
110 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2
111 if tmp not in lista: lista.append(tmp)
112 except:
113 pass # An element is missing
114
115 try:
116 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name
117 if tmp not in lista: lista.append(tmp)
118 except:
119 pass # An element is missing
120
121 try:
122 tmp = name + "<SEPARATOR>" + surname1
123 if tmp not in lista: lista.append(tmp)
124 except:
125 pass # An element is missing
126
127 try:
128 tmp = surname1 + "<SEPARATOR>" + surname2
129 if tmp not in lista: lista.append(tmp)
130 except:
131 pass # An element is missing
132
133 try:
134 tmp = name + surname1[0] + surname2[0]
135 if tmp not in lista: lista.append(tmp)
136 except:
137 pass # An element is missing
138
139 try:
140 tmp = name + surname1[0] + surname2
141 if tmp not in lista: lista.append(tmp)
142 except:
143 pass # An element is missing
144
145 try:
146 tmp = name + surname1 + surname2[0]
147 if tmp not in lista: lista.append(tmp)
148 except:
149 pass # An element is missing
150
151 try:
152 tmp = name + surname1[0]
153 if tmp not in lista: lista.append(tmp)
154 except:
155 pass # An element is missing
156
157 try:
158 tmp = name[0] + surname1 + surname2
159 if tmp not in lista: lista.append(tmp)
160 except:
161 pass # An element is missing
162
163 try:
164 tmp = name[0] + surname1 + surname2[0]
165 if tmp not in lista: lista.append(tmp)
166 except:
167 pass # An element is missing
168
169 try:
170 tmp = name[0] + surname1 + surname2
171 if tmp not in lista: lista.append(tmp)
172 except:
173 pass # An element is missing
174
175 try:
176 tmp = name[0] + surname1[0] + surname2[0]
177 if tmp not in lista: lista.append(tmp)
178 except:
179 pass # An element is missing
180
181 try:
182 tmp = name[0] + surname1
183 if tmp not in lista: lista.append(tmp)
184 except:
185 pass # An element is missing
186
187 try:
188 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0]
189 if tmp not in lista: lista.append(tmp)
190 except:
191 pass # An element is missing
192
193 try:
194 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2
195 if tmp not in lista: lista.append(tmp)
196 except:
197 pass # An element is missing
198
199
200 try:
201 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0]
202 if tmp not in lista: lista.append(tmp)
203 except:
204 pass # An element is missing
205
206 try:
207 tmp = name + "<SEPARATOR>" + surname1[0]
208 if tmp not in lista: lista.append(tmp)
209 except:
210 pass # An element is missing
211
212 try:
213 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2
214 if tmp not in lista: lista.append(tmp)
215 except:
216 pass # An element is missing
217
218 try:
219 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0]
220 if tmp not in lista: lista.append(tmp)
221 except:
222 pass # An element is missing
223
224 try:
225 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2
226 if tmp not in lista: lista.append(tmp)
227 except:
228 pass # An element is missing
229
230 try:
231 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2
232 if tmp not in lista: lista.append(tmp)
233 except:
234 pass # An element is missing
235
236 try:
237 tmp = name[0] + "<SEPARATOR>" + surname1
238 if tmp not in lista: lista.append(tmp)
239 except:
240 pass # An element is missing
241
242 try:
243 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0]
244 if tmp not in lista: lista.append(tmp)
245 except:
246 pass # An element is missing
247
248 try:
249 tmp = name + surname1[0] + "<SEPARATOR>" + surname2[0]
250 if tmp not in lista: lista.append(tmp)
251 except:
252 pass # An element is missing
253
254 try:
255 tmp = name + "<SEPARATOR>" + surname1[0] + surname2[0]
256 if tmp not in lista: lista.append(tmp)
257 except:
258 pass # An element is missing
259
260 try:
261 tmp = name + "<SEPARATOR>" + surname1[0] + surname2
262 if tmp not in lista: lista.append(tmp)
263 except:
264 pass # An element is missing
265
266 try:
267 tmp = name + surname1[0] + "<SEPARATOR>" + surname2
268 if tmp not in lista: lista.append(tmp)
269 except:
270 pass # An element is missing
271
272 try:
273 tmp = name + "<SEPARATOR>" + surname1[0] + surname2
274 if tmp not in lista: lista.append(tmp)
275 except:
276 pass # An element is missing
277
278 try:
279 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0]
280 if tmp not in lista: lista.append(tmp)
281 except:
282 pass # An element is missing
283
284 try:
285 tmp = name + surname1 + "<SEPARATOR>" + surname2[0]
286 if tmp not in lista: lista.append(tmp)
287 except:
288 pass # An element is missing
289
290 try:
291 tmp = name + surname1 + "<SEPARATOR>" + surname2[0]
292 if tmp not in lista: lista.append(tmp)
293 except:
294 pass # An element is missing
295
296 try:
297 tmp = name + "<SEPARATOR>" + surname1 + surname2[0]
298 if tmp not in lista: lista.append(tmp)
299 except:
300 pass # An element is missing
301
302 try:
303 tmp = name + "<SEPARATOR>" + surname1[0]
304 if tmp not in lista: lista.append(tmp)
305 except:
306 pass # An element is missing
307
308 try:
309 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2
310 if tmp not in lista: lista.append(tmp)
311 except:
312 pass # An element is missing
313
314 try:
315 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2
316 if tmp not in lista: lista.append(tmp)
317 except:
318 pass # An element is missing
319
320 try:
321 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2
322 if tmp not in lista: lista.append(tmp)
323 except:
324 pass # An element is missing
325
326 try:
327 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0]
328 if tmp not in lista: lista.append(tmp)
329 except:
330 pass # An element is missing
331
332 try:
333 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2[0]
334 if tmp not in lista: lista.append(tmp)
335 except:
336 pass # An element is missing
337
338 try:
339 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2[0]
340 if tmp not in lista: lista.append(tmp)
341 except:
342 pass # An element is missing
343
344 try:
345 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2
346 if tmp not in lista: lista.append(tmp)
347 except:
348 pass # An element is missing
349
350 try:
351 tmp = name + surname1 + "<SEPARATOR>" + surname2
352 if tmp not in lista: lista.append(tmp)
353 except:
354 pass # An element is missing
355
356 try:
357 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2
358 if tmp not in lista: lista.append(tmp)
359 except:
360 pass # An element is missing
361
362 try:
363 tmp = name[0] + "<SEPARATOR>" + surname1
364 if tmp not in lista: lista.append(tmp)
365 except:
366 pass # An element is missing
367
368 try:
369 tmp = name + surname1 + surname2 + city
370 if tmp not in lista: lista.append(tmp)
371 except:
372 pass # An element is missing
373
374 try:
375 tmp = surname1 + surname2 + name + city
376 if tmp not in lista: lista.append(tmp)
377 except:
378 pass # An element is missing
379
380 try:
381 tmp = name + surname1 + city
382 if tmp not in lista: lista.append(tmp)
383 except:
384 pass # An element is missing
385
386 try:
387 tmp = surname1 + surname2 + city
388 if tmp not in lista: lista.append(tmp)
389 except:
390 pass # An element is missing
391
392 try:
393 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + city
394 if tmp not in lista: lista.append(tmp)
395 except:
396 pass # An element is missing
397
398 try:
399 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + city
400 if tmp not in lista: lista.append(tmp)
401 except:
402 pass # An element is missing
403
404 try:
405 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + city
406 if tmp not in lista: lista.append(tmp)
407 except:
408 pass # An element is missing
409
410 try:
411 tmp = name + surname1[0] + "<SEPARATOR>" + city
412 if tmp not in lista: lista.append(tmp)
413 except:
414 pass # An element is missing
415
416 try:
417 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + city
418 if tmp not in lista: lista.append(tmp)
419 except:
420 pass # An element is missing
421
422 try:
423 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + city
424 if tmp not in lista: lista.append(tmp)
425 except:
426 pass # An element is missing
427
428 try:
429 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + city
430 if tmp not in lista: lista.append(tmp)
431 except:
432 pass # An element is missing
433
434 try:
435 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + city
436 if tmp not in lista: lista.append(tmp)
437 except:
438 pass # An element is missing
439
440 try:
441 tmp = name[0] + surname1 + "<SEPARATOR>" + city
442 if tmp not in lista: lista.append(tmp)
443 except:
444 pass # An element is missing
445
446 try:
447 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
448 if tmp not in lista: lista.append(tmp)
449 except:
450 pass # An element is missing
451
452 try:
453 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + city
454 if tmp not in lista: lista.append(tmp)
455 except:
456 pass # An element is missing
457
458 try:
459 tmp = surname1 + "<SEPARATOR>" + surname2 + name + "<SEPARATOR>" + city
460 if tmp not in lista: lista.append(tmp)
461 except:
462 pass # An element is missing
463
464 try:
465 tmp = surname1 + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + city
466 if tmp not in lista: lista.append(tmp)
467 except:
468 pass # An element is missing
469
470 try:
471 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
472 if tmp not in lista: lista.append(tmp)
473 except:
474 pass # An element is missing
475
476 try:
477 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
478 if tmp not in lista: lista.append(tmp)
479 except:
480 pass # An element is missing
481
482 try:
483 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
484 if tmp not in lista: lista.append(tmp)
485 except:
486 pass # An element is missing
487
488 try:
489 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
490 if tmp not in lista: lista.append(tmp)
491 except:
492 pass # An element is missing
493
494 try:
495 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
496 if tmp not in lista: lista.append(tmp)
497 except:
498 pass # An element is missing
499
500 try:
501 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
502 if tmp not in lista: lista.append(tmp)
503 except:
504 pass # An element is missing
505
506 try:
507 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
508 if tmp not in lista: lista.append(tmp)
509 except:
510 pass # An element is missing
511
512 try:
513 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
514 if tmp not in lista: lista.append(tmp)
515 except:
516 pass # An element is missing
517
518 try:
519 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
520 if tmp not in lista: lista.append(tmp)
521 except:
522 pass # An element is missing
523
524 try:
525 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + city
526 if tmp not in lista: lista.append(tmp)
527 except:
528 pass # An element is missing
529
530 try:
531 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + city
532 if tmp not in lista: lista.append(tmp)
533 except:
534 pass # An element is missing
535
536 try:
537 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
538 if tmp not in lista: lista.append(tmp)
539 except:
540 pass # An element is missing
541
542 try:
543 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
544 if tmp not in lista: lista.append(tmp)
545 except:
546 pass # An element is missing
547
548 try:
549 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
550 if tmp not in lista: lista.append(tmp)
551 except:
552 pass # An element is missing
553
554 try:
555 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
556 if tmp not in lista: lista.append(tmp)
557 except:
558 pass # An element is missing
559
560 try:
561 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + city
562 if tmp not in lista: lista.append(tmp)
563 except:
564 pass # An element is missing
565
566 try:
567 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
568 if tmp not in lista: lista.append(tmp)
569 except:
570 pass # An element is missing
571
572 try:
573 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
574 if tmp not in lista: lista.append(tmp)
575 except:
576 pass # An element is missing
577
578 try:
579 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
580 if tmp not in lista: lista.append(tmp)
581 except:
582 pass # An element is missing
583
584 try:
585 tmp = name + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
586 if tmp not in lista: lista.append(tmp)
587 except:
588 pass # An element is missing
589
590 try:
591 tmp = name + "<SEPARATOR>" + surname1[0] + surname2[0] + "<SEPARATOR>" + city
592 if tmp not in lista: lista.append(tmp)
593 except:
594 pass # An element is missing
595
596 try:
597 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
598 if tmp not in lista: lista.append(tmp)
599 except:
600 pass # An element is missing
601
602 try:
603 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
604 if tmp not in lista: lista.append(tmp)
605 except:
606 pass # An element is missing
607
608 try:
609 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
610 if tmp not in lista: lista.append(tmp)
611 except:
612 pass # An element is missing
613
614 try:
615 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
616 if tmp not in lista: lista.append(tmp)
617 except:
618 pass # An element is missing
619
620 try:
621 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
622 if tmp not in lista: lista.append(tmp)
623 except:
624 pass # An element is missing
625
626 try:
627 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
628 if tmp not in lista: lista.append(tmp)
629 except:
630 pass # An element is missing
631
632 try:
633 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + city
634 if tmp not in lista: lista.append(tmp)
635 except:
636 pass # An element is missing
637
638 try:
639 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + city
640 if tmp not in lista: lista.append(tmp)
641 except:
642 pass # An element is missing
643
644 try:
645 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
646 if tmp not in lista: lista.append(tmp)
647 except:
648 pass # An element is missing
649
650 try:
651 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
652 if tmp not in lista: lista.append(tmp)
653 except:
654 pass # An element is missing
655
656 try:
657 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
658 if tmp not in lista: lista.append(tmp)
659 except:
660 pass # An element is missing
661
662 try:
663 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
664 if tmp not in lista: lista.append(tmp)
665 except:
666 pass # An element is missing
667
668 try:
669 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
670 if tmp not in lista: lista.append(tmp)
671 except:
672 pass # An element is missing
673
674 try:
675 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
676 if tmp not in lista: lista.append(tmp)
677 except:
678 pass # An element is missing
679
680 try:
681 tmp = name + surname1 + country
682 if tmp not in lista: lista.append(tmp)
683 except:
684 pass # An element is missing
685
686 try:
687 tmp = surname1 + surname2 + country
688 if tmp not in lista: lista.append(tmp)
689 except:
690 pass # An element is missing
691
692 try:
693 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + country
694 if tmp not in lista: lista.append(tmp)
695 except:
696 pass # An element is missing
697
698 try:
699 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + country
700 if tmp not in lista: lista.append(tmp)
701 except:
702 pass # An element is missing
703
704 try:
705 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + country
706 if tmp not in lista: lista.append(tmp)
707 except:
708 pass # An element is missing
709
710 try:
711 tmp = name + surname1[0] + "<SEPARATOR>" + country
712 if tmp not in lista: lista.append(tmp)
713 except:
714 pass # An element is missing
715
716 try:
717 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + country
718 if tmp not in lista: lista.append(tmp)
719 except:
720 pass # An element is missing
721
722 try:
723 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + country
724 if tmp not in lista: lista.append(tmp)
725 except:
726 pass # An element is missing
727
728 try:
729 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + country
730 if tmp not in lista: lista.append(tmp)
731 except:
732 pass # An element is missing
733
734 try:
735 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + country
736 if tmp not in lista: lista.append(tmp)
737 except:
738 pass # An element is missing
739
740 try:
741 tmp = name[0] + surname1 + "<SEPARATOR>" + country
742 if tmp not in lista: lista.append(tmp)
743 except:
744 pass # An element is missing
745
746 try:
747 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
748 if tmp not in lista: lista.append(tmp)
749 except:
750 pass # An element is missing
751
752 try:
753 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + country
754 if tmp not in lista: lista.append(tmp)
755 except:
756 pass # An element is missing
757
758 try:
759 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
760 if tmp not in lista: lista.append(tmp)
761 except:
762 pass # An element is missing
763
764 try:
765 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
766 if tmp not in lista: lista.append(tmp)
767 except:
768 pass # An element is missing
769
770 try:
771 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
772 if tmp not in lista: lista.append(tmp)
773 except:
774 pass # An element is missing
775
776 try:
777 tmp = name + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
778 if tmp not in lista: lista.append(tmp)
779 except:
780 pass # An element is missing
781
782 try:
783 tmp = name + "<SEPARATOR>" + surname1[0] + surname2[0] + "<SEPARATOR>" + country
784 if tmp not in lista: lista.append(tmp)
785 except:
786 pass # An element is missing
787
788 try:
789 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
790 if tmp not in lista: lista.append(tmp)
791 except:
792 pass # An element is missing
793
794 try:
795 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
796 if tmp not in lista: lista.append(tmp)
797 except:
798 pass # An element is missing
799
800 try:
801 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
802 if tmp not in lista: lista.append(tmp)
803 except:
804 pass # An element is missing
805
806 try:
807 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
808 if tmp not in lista: lista.append(tmp)
809 except:
810 pass # An element is missing
811
812 try:
813 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
814 if tmp not in lista: lista.append(tmp)
815 except:
816 pass # An element is missing
817
818 try:
819 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
820 if tmp not in lista: lista.append(tmp)
821 except:
822 pass # An element is missing
823
824 try:
825 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + country
826 if tmp not in lista: lista.append(tmp)
827 except:
828 pass # An element is missing
829
830 try:
831 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + country
832 if tmp not in lista: lista.append(tmp)
833 except:
834 pass # An element is missing
835
836 try:
837 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
838 if tmp not in lista: lista.append(tmp)
839 except:
840 pass # An element is missing
841
842 try:
843 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + country
844 if tmp not in lista: lista.append(tmp)
845 except:
846 pass # An element is missing
847
848 try:
849 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
850 if tmp not in lista: lista.append(tmp)
851 except:
852 pass # An element is missing
853
854 try:
855 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
856 if tmp not in lista: lista.append(tmp)
857 except:
858 pass # An element is missing
859
860 try:
861 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
862 if tmp not in lista: lista.append(tmp)
863 except:
864 pass # An element is missing
865
866 try:
867 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + country
868 if tmp not in lista: lista.append(tmp)
869 except:
870 pass # An element is missing
871
872 try:
873 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
874 if tmp not in lista: lista.append(tmp)
875 except:
876 pass # An element is missing
877
878 try:
879 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
880 if tmp not in lista: lista.append(tmp)
881 except:
882 pass # An element is missing
883
884 try:
885 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
886 if tmp not in lista: lista.append(tmp)
887 except:
888 pass # An element is missing
889
890 try:
891 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
892 if tmp not in lista: lista.append(tmp)
893 except:
894 pass # An element is missing
895
896 try:
897 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
898 if tmp not in lista: lista.append(tmp)
899 except:
900 pass # An element is missing
901
902 try:
903 tmp = name + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + country
904 if tmp not in lista: lista.append(tmp)
905 except:
906 pass # An element is missing
907
908 try:
909 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
910 if tmp not in lista: lista.append(tmp)
911 except:
912 pass # An element is missing
913
914 try:
915 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + country
916 if tmp not in lista: lista.append(tmp)
917 except:
918 pass # An element is missing
919
920 try:
921 tmp = surname1 + "<SEPARATOR>" + surname2 + name + "<SEPARATOR>" + country
922 if tmp not in lista: lista.append(tmp)
923 except:
924 pass # An element is missing
925
926 try:
927 tmp = surname1 + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + country
928 if tmp not in lista: lista.append(tmp)
929 except:
930 pass # An element is missing
931
932 try:
933 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
934 if tmp not in lista: lista.append(tmp)
935 except:
936 pass # An element is missing
937
938 try:
939 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
940 if tmp not in lista: lista.append(tmp)
941 except:
942 pass # An element is missing
943
944 try:
945 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
946 if tmp not in lista: lista.append(tmp)
947 except:
948 pass # An element is missing
949
950 try:
951 tmp = name + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
952 if tmp not in lista: lista.append(tmp)
953 except:
954 pass # An element is missing
955
956 try:
957 tmp = name + "<SEPARATOR>" + surname1[0] + surname2[0] + "<SEPARATOR>" + country
958 if tmp not in lista: lista.append(tmp)
959 except:
960 pass # An element is missing
961
962 try:
963 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
964 if tmp not in lista: lista.append(tmp)
965 except:
966 pass # An element is missing
967
968 try:
969 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
970 if tmp not in lista: lista.append(tmp)
971 except:
972 pass # An element is missing
973
974 try:
975 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
976 if tmp not in lista: lista.append(tmp)
977 except:
978 pass # An element is missing
979
980 try:
981 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
982 if tmp not in lista: lista.append(tmp)
983 except:
984 pass # An element is missing
985
986 try:
987 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
988 if tmp not in lista: lista.append(tmp)
989 except:
990 pass # An element is missing
991
992 try:
993 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
994 if tmp not in lista: lista.append(tmp)
995 except:
996 pass # An element is missing
997
998 try:
999 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + country
1000 if tmp not in lista: lista.append(tmp)
1001 except:
1002 pass # An element is missing
1003
1004 try:
1005 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + country
1006 if tmp not in lista: lista.append(tmp)
1007 except:
1008 pass # An element is missing
1009
1010 try:
1011 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
1012 if tmp not in lista: lista.append(tmp)
1013 except:
1014 pass # An element is missing
1015
1016 try:
1017 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + country
1018 if tmp not in lista: lista.append(tmp)
1019 except:
1020 pass # An element is missing
1021
1022 try:
1023 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
1024 if tmp not in lista: lista.append(tmp)
1025 except:
1026 pass # An element is missing
1027
1028 try:
1029 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
1030 if tmp not in lista: lista.append(tmp)
1031 except:
1032 pass # An element is missing
1033
1034 try:
1035 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
1036 if tmp not in lista: lista.append(tmp)
1037 except:
1038 pass # An element is missing
1039
1040 try:
1041 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + country
1042 if tmp not in lista: lista.append(tmp)
1043 except:
1044 pass # An element is missing
1045
1046 try:
1047 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
1048 if tmp not in lista: lista.append(tmp)
1049 except:
1050 pass # An element is missing
1051
1052 try:
1053 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
1054 if tmp not in lista: lista.append(tmp)
1055 except:
1056 pass # An element is missing
1057
1058 try:
1059 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
1060 if tmp not in lista: lista.append(tmp)
1061 except:
1062 pass # An element is missing
1063
1064 try:
1065 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
1066 if tmp not in lista: lista.append(tmp)
1067 except:
1068 pass # An element is missing
1069
1070 try:
1071 tmp = name + surname1 + surname2 + year
1072 if tmp not in lista: lista.append(tmp)
1073 except:
1074 pass # An element is missing
1075
1076 try:
1077 tmp = surname1 + surname2 + name + year
1078 if tmp not in lista: lista.append(tmp)
1079 except:
1080 pass # An element is missing
1081
1082 try:
1083 tmp = name + surname1 + year
1084 if tmp not in lista: lista.append(tmp)
1085 except:
1086 pass # An element is missing
1087
1088 try:
1089 tmp = surname1 + surname2 + year
1090 if tmp not in lista: lista.append(tmp)
1091 except:
1092 pass # An element is missing
1093
1094 try:
1095 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + year
1096 if tmp not in lista: lista.append(tmp)
1097 except:
1098 pass # An element is missing
1099
1100 try:
1101 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + year
1102 if tmp not in lista: lista.append(tmp)
1103 except:
1104 pass # An element is missing
1105
1106 try:
1107 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + year
1108 if tmp not in lista: lista.append(tmp)
1109 except:
1110 pass # An element is missing
1111
1112 try:
1113 tmp = name + surname1[0] + "<SEPARATOR>" + year
1114 if tmp not in lista: lista.append(tmp)
1115 except:
1116 pass # An element is missing
1117
1118 try:
1119 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year
1120 if tmp not in lista: lista.append(tmp)
1121 except:
1122 pass # An element is missing
1123
1124 try:
1125 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + year
1126 if tmp not in lista: lista.append(tmp)
1127 except:
1128 pass # An element is missing
1129
1130 try:
1131 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year
1132 if tmp not in lista: lista.append(tmp)
1133 except:
1134 pass # An element is missing
1135
1136 try:
1137 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + year
1138 if tmp not in lista: lista.append(tmp)
1139 except:
1140 pass # An element is missing
1141
1142 try:
1143 tmp = name[0] + surname1 + "<SEPARATOR>" + year
1144 if tmp not in lista: lista.append(tmp)
1145 except:
1146 pass # An element is missing
1147
1148 try:
1149 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1150 if tmp not in lista: lista.append(tmp)
1151 except:
1152 pass # An element is missing
1153
1154 try:
1155 tmp = name + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + year
1156 if tmp not in lista: lista.append(tmp)
1157 except:
1158 pass # An element is missing
1159
1160 try:
1161 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1162 if tmp not in lista: lista.append(tmp)
1163 except:
1164 pass # An element is missing
1165
1166 try:
1167 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year
1168 if tmp not in lista: lista.append(tmp)
1169 except:
1170 pass # An element is missing
1171
1172 try:
1173 tmp = surname1 + "<SEPARATOR>" + surname2 + name + "<SEPARATOR>" + year
1174 if tmp not in lista: lista.append(tmp)
1175 except:
1176 pass # An element is missing
1177
1178 try:
1179 tmp = surname1 + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year
1180 if tmp not in lista: lista.append(tmp)
1181 except:
1182 pass # An element is missing
1183
1184 try:
1185 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
1186 if tmp not in lista: lista.append(tmp)
1187 except:
1188 pass # An element is missing
1189
1190 try:
1191 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1192 if tmp not in lista: lista.append(tmp)
1193 except:
1194 pass # An element is missing
1195
1196 try:
1197 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1198 if tmp not in lista: lista.append(tmp)
1199 except:
1200 pass # An element is missing
1201
1202 try:
1203 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
1204 if tmp not in lista: lista.append(tmp)
1205 except:
1206 pass # An element is missing
1207
1208 try:
1209 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1210 if tmp not in lista: lista.append(tmp)
1211 except:
1212 pass # An element is missing
1213
1214 try:
1215 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
1216 if tmp not in lista: lista.append(tmp)
1217 except:
1218 pass # An element is missing
1219
1220 try:
1221 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1222 if tmp not in lista: lista.append(tmp)
1223 except:
1224 pass # An element is missing
1225
1226 try:
1227 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1228 if tmp not in lista: lista.append(tmp)
1229 except:
1230 pass # An element is missing
1231
1232 try:
1233 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1234 if tmp not in lista: lista.append(tmp)
1235 except:
1236 pass # An element is missing
1237
1238 try:
1239 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + year
1240 if tmp not in lista: lista.append(tmp)
1241 except:
1242 pass # An element is missing
1243
1244 try:
1245 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year
1246 if tmp not in lista: lista.append(tmp)
1247 except:
1248 pass # An element is missing
1249
1250 try:
1251 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1252 if tmp not in lista: lista.append(tmp)
1253 except:
1254 pass # An element is missing
1255
1256 try:
1257 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1258 if tmp not in lista: lista.append(tmp)
1259 except:
1260 pass # An element is missing
1261
1262 try:
1263 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1264 if tmp not in lista: lista.append(tmp)
1265 except:
1266 pass # An element is missing
1267
1268 try:
1269 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1270 if tmp not in lista: lista.append(tmp)
1271 except:
1272 pass # An element is missing
1273
1274 try:
1275 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
1276 if tmp not in lista: lista.append(tmp)
1277 except:
1278 pass # An element is missing
1279
1280 try:
1281 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
1282 if tmp not in lista: lista.append(tmp)
1283 except:
1284 pass # An element is missing
1285
1286 try:
1287 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1288 if tmp not in lista: lista.append(tmp)
1289 except:
1290 pass # An element is missing
1291
1292 try:
1293 tmp = name + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + year
1294 if tmp not in lista: lista.append(tmp)
1295 except:
1296 pass # An element is missing
1297
1298 try:
1299 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1300 if tmp not in lista: lista.append(tmp)
1301 except:
1302 pass # An element is missing
1303
1304 try:
1305 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year
1306 if tmp not in lista: lista.append(tmp)
1307 except:
1308 pass # An element is missing
1309
1310 try:
1311 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
1312 if tmp not in lista: lista.append(tmp)
1313 except:
1314 pass # An element is missing
1315
1316 try:
1317 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1318 if tmp not in lista: lista.append(tmp)
1319 except:
1320 pass # An element is missing
1321
1322 try:
1323 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1324 if tmp not in lista: lista.append(tmp)
1325 except:
1326 pass # An element is missing
1327
1328 try:
1329 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
1330 if tmp not in lista: lista.append(tmp)
1331 except:
1332 pass # An element is missing
1333
1334 try:
1335 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1336 if tmp not in lista: lista.append(tmp)
1337 except:
1338 pass # An element is missing
1339
1340 try:
1341 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
1342 if tmp not in lista: lista.append(tmp)
1343 except:
1344 pass # An element is missing
1345
1346 try:
1347 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1348 if tmp not in lista: lista.append(tmp)
1349 except:
1350 pass # An element is missing
1351
1352 try:
1353 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + year
1354 if tmp not in lista: lista.append(tmp)
1355 except:
1356 pass # An element is missing
1357
1358 try:
1359 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year
1360 if tmp not in lista: lista.append(tmp)
1361 except:
1362 pass # An element is missing
1363
1364 try:
1365 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1366 if tmp not in lista: lista.append(tmp)
1367 except:
1368 pass # An element is missing
1369
1370 try:
1371 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
1372 if tmp not in lista: lista.append(tmp)
1373 except:
1374 pass # An element is missing
1375
1376 try:
1377 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1378 if tmp not in lista: lista.append(tmp)
1379 except:
1380 pass # An element is missing
1381
1382 try:
1383 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
1384 if tmp not in lista: lista.append(tmp)
1385 except:
1386 pass # An element is missing
1387
1388 try:
1389 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
1390 if tmp not in lista: lista.append(tmp)
1391 except:
1392 pass # An element is missing
1393
1394 try:
1395 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
1396 if tmp not in lista: lista.append(tmp)
1397 except:
1398 pass # An element is missing
1399
1400 try:
1401 tmp = name + surname1 + surname2 + year[-2:]
1402 if tmp not in lista: lista.append(tmp)
1403 except:
1404 pass # An element is missing
1405
1406 try:
1407 tmp = surname1 + surname2 + name + year[-2:]
1408 if tmp not in lista: lista.append(tmp)
1409 except:
1410 pass # An element is missing
1411
1412 try:
1413 tmp = name + surname1 + year[-2:]
1414 if tmp not in lista: lista.append(tmp)
1415 except:
1416 pass # An element is missing
1417
1418 try:
1419 tmp = surname1 + surname2 + year[-2:]
1420 if tmp not in lista: lista.append(tmp)
1421 except:
1422 pass # An element is missing
1423
1424 try:
1425 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + year[-2:]
1426 if tmp not in lista: lista.append(tmp)
1427 except:
1428 pass # An element is missing
1429
1430 try:
1431 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
1432 if tmp not in lista: lista.append(tmp)
1433 except:
1434 pass # An element is missing
1435
1436 try:
1437 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
1438 if tmp not in lista: lista.append(tmp)
1439 except:
1440 pass # An element is missing
1441
1442 try:
1443 tmp = name + surname1[0] + "<SEPARATOR>" + year[-2:]
1444 if tmp not in lista: lista.append(tmp)
1445 except:
1446 pass # An element is missing
1447
1448 try:
1449 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
1450 if tmp not in lista: lista.append(tmp)
1451 except:
1452 pass # An element is missing
1453
1454 try:
1455 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
1456 if tmp not in lista: lista.append(tmp)
1457 except:
1458 pass # An element is missing
1459
1460 try:
1461 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
1462 if tmp not in lista: lista.append(tmp)
1463 except:
1464 pass # An element is missing
1465
1466 try:
1467 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + year[-2:]
1468 if tmp not in lista: lista.append(tmp)
1469 except:
1470 pass # An element is missing
1471
1472 try:
1473 tmp = name[0] + surname1 + "<SEPARATOR>" + year[-2:]
1474 if tmp not in lista: lista.append(tmp)
1475 except:
1476 pass # An element is missing
1477
1478 try:
1479 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1480 if tmp not in lista: lista.append(tmp)
1481 except:
1482 pass # An element is missing
1483
1484 try:
1485 tmp = name + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
1486 if tmp not in lista: lista.append(tmp)
1487 except:
1488 pass # An element is missing
1489
1490 try:
1491 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1492 if tmp not in lista: lista.append(tmp)
1493 except:
1494 pass # An element is missing
1495
1496 try:
1497 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year[-2:]
1498 if tmp not in lista: lista.append(tmp)
1499 except:
1500 pass # An element is missing
1501
1502 try:
1503 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
1504 if tmp not in lista: lista.append(tmp)
1505 except:
1506 pass # An element is missing
1507
1508 try:
1509 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1510 if tmp not in lista: lista.append(tmp)
1511 except:
1512 pass # An element is missing
1513
1514 try:
1515 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1516 if tmp not in lista: lista.append(tmp)
1517 except:
1518 pass # An element is missing
1519
1520 try:
1521 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
1522 if tmp not in lista: lista.append(tmp)
1523 except:
1524 pass # An element is missing
1525
1526 try:
1527 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1528 if tmp not in lista: lista.append(tmp)
1529 except:
1530 pass # An element is missing
1531
1532 try:
1533 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1534 if tmp not in lista: lista.append(tmp)
1535 except:
1536 pass # An element is missing
1537
1538 try:
1539 tmp = name + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1540 if tmp not in lista: lista.append(tmp)
1541 except:
1542 pass # An element is missing
1543
1544 try:
1545 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
1546 if tmp not in lista: lista.append(tmp)
1547 except:
1548 pass # An element is missing
1549
1550 try:
1551 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year[-2:]
1552 if tmp not in lista: lista.append(tmp)
1553 except:
1554 pass # An element is missing
1555
1556 try:
1557 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1558 if tmp not in lista: lista.append(tmp)
1559 except:
1560 pass # An element is missing
1561
1562 try:
1563 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1564 if tmp not in lista: lista.append(tmp)
1565 except:
1566 pass # An element is missing
1567
1568 try:
1569 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1570 if tmp not in lista: lista.append(tmp)
1571 except:
1572 pass # An element is missing
1573
1574 try:
1575 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1576 if tmp not in lista: lista.append(tmp)
1577 except:
1578 pass # An element is missing
1579
1580 try:
1581 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
1582 if tmp not in lista: lista.append(tmp)
1583 except:
1584 pass # An element is missing
1585
1586 try:
1587 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
1588 if tmp not in lista: lista.append(tmp)
1589 except:
1590 pass # An element is missing
1591
1592 try:
1593 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1594 if tmp not in lista: lista.append(tmp)
1595 except:
1596 pass # An element is missing
1597
1598 try:
1599 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year[-2:]
1600 if tmp not in lista: lista.append(tmp)
1601 except:
1602 pass # An element is missing
1603
1604 try:
1605 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
1606 if tmp not in lista: lista.append(tmp)
1607 except:
1608 pass # An element is missing
1609
1610 try:
1611 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1612 if tmp not in lista: lista.append(tmp)
1613 except:
1614 pass # An element is missing
1615
1616 try:
1617 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1618 if tmp not in lista: lista.append(tmp)
1619 except:
1620 pass # An element is missing
1621
1622 try:
1623 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
1624 if tmp not in lista: lista.append(tmp)
1625 except:
1626 pass # An element is missing
1627
1628 try:
1629 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1630 if tmp not in lista: lista.append(tmp)
1631 except:
1632 pass # An element is missing
1633
1634 try:
1635 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
1636 if tmp not in lista: lista.append(tmp)
1637 except:
1638 pass # An element is missing
1639
1640 try:
1641 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year[-2:]
1642 if tmp not in lista: lista.append(tmp)
1643 except:
1644 pass # An element is missing
1645
1646 try:
1647 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1648 if tmp not in lista: lista.append(tmp)
1649 except:
1650 pass # An element is missing
1651
1652 try:
1653 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
1654 if tmp not in lista: lista.append(tmp)
1655 except:
1656 pass # An element is missing
1657
1658 try:
1659 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1660 if tmp not in lista: lista.append(tmp)
1661 except:
1662 pass # An element is missing
1663
1664 try:
1665 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
1666 if tmp not in lista: lista.append(tmp)
1667 except:
1668 pass # An element is missing
1669
1670 try:
1671 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
1672 if tmp not in lista: lista.append(tmp)
1673 except:
1674 pass # An element is missing
1675
1676 try:
1677 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
1678 if tmp not in lista: lista.append(tmp)
1679 except:
1680 pass # An element is missing
1681
1682 try:
1683 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + city
1684 if tmp not in lista: lista.append(tmp)
1685 except:
1686 pass # An element is missing
1687
1688 try:
1689 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + city
1690 if tmp not in lista: lista.append(tmp)
1691 except:
1692 pass # An element is missing
1693
1694 try:
1695 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + city
1696 if tmp not in lista: lista.append(tmp)
1697 except:
1698 pass # An element is missing
1699
1700 try:
1701 tmp = name + surname1[0] + "<SEPARATOR>" + city
1702 if tmp not in lista: lista.append(tmp)
1703 except:
1704 pass # An element is missing
1705
1706 try:
1707 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + city
1708 if tmp not in lista: lista.append(tmp)
1709 except:
1710 pass # An element is missing
1711
1712 try:
1713 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + city
1714 if tmp not in lista: lista.append(tmp)
1715 except:
1716 pass # An element is missing
1717
1718 try:
1719 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + city
1720 if tmp not in lista: lista.append(tmp)
1721 except:
1722 pass # An element is missing
1723
1724 try:
1725 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + city
1726 if tmp not in lista: lista.append(tmp)
1727 except:
1728 pass # An element is missing
1729
1730 try:
1731 tmp = name[0] + surname1 + "<SEPARATOR>" + city
1732 if tmp not in lista: lista.append(tmp)
1733 except:
1734 pass # An element is missing
1735
1736 try:
1737 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1738 if tmp not in lista: lista.append(tmp)
1739 except:
1740 pass # An element is missing
1741
1742 try:
1743 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + city
1744 if tmp not in lista: lista.append(tmp)
1745 except:
1746 pass # An element is missing
1747
1748 try:
1749 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
1750 if tmp not in lista: lista.append(tmp)
1751 except:
1752 pass # An element is missing
1753
1754 try:
1755 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1756 if tmp not in lista: lista.append(tmp)
1757 except:
1758 pass # An element is missing
1759
1760 try:
1761 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
1762 if tmp not in lista: lista.append(tmp)
1763 except:
1764 pass # An element is missing
1765
1766 try:
1767 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
1768 if tmp not in lista: lista.append(tmp)
1769 except:
1770 pass # An element is missing
1771
1772 try:
1773 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1774 if tmp not in lista: lista.append(tmp)
1775 except:
1776 pass # An element is missing
1777
1778 try:
1779 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
1780 if tmp not in lista: lista.append(tmp)
1781 except:
1782 pass # An element is missing
1783
1784 try:
1785 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
1786 if tmp not in lista: lista.append(tmp)
1787 except:
1788 pass # An element is missing
1789
1790 try:
1791 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + city
1792 if tmp not in lista: lista.append(tmp)
1793 except:
1794 pass # An element is missing
1795
1796 try:
1797 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + city
1798 if tmp not in lista: lista.append(tmp)
1799 except:
1800 pass # An element is missing
1801
1802 try:
1803 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1804 if tmp not in lista: lista.append(tmp)
1805 except:
1806 pass # An element is missing
1807
1808 try:
1809 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
1810 if tmp not in lista: lista.append(tmp)
1811 except:
1812 pass # An element is missing
1813
1814 try:
1815 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1816 if tmp not in lista: lista.append(tmp)
1817 except:
1818 pass # An element is missing
1819
1820 try:
1821 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1822 if tmp not in lista: lista.append(tmp)
1823 except:
1824 pass # An element is missing
1825
1826 try:
1827 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
1828 if tmp not in lista: lista.append(tmp)
1829 except:
1830 pass # An element is missing
1831
1832 try:
1833 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
1834 if tmp not in lista: lista.append(tmp)
1835 except:
1836 pass # An element is missing
1837
1838 try:
1839 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1840 if tmp not in lista: lista.append(tmp)
1841 except:
1842 pass # An element is missing
1843
1844 try:
1845 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + city
1846 if tmp not in lista: lista.append(tmp)
1847 except:
1848 pass # An element is missing
1849
1850 try:
1851 tmp = surname1 + "<SEPARATOR>" + surname2 + name + "<SEPARATOR>" + city
1852 if tmp not in lista: lista.append(tmp)
1853 except:
1854 pass # An element is missing
1855
1856 try:
1857 tmp = surname1 + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + city
1858 if tmp not in lista: lista.append(tmp)
1859 except:
1860 pass # An element is missing
1861
1862 try:
1863 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
1864 if tmp not in lista: lista.append(tmp)
1865 except:
1866 pass # An element is missing
1867
1868 try:
1869 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1870 if tmp not in lista: lista.append(tmp)
1871 except:
1872 pass # An element is missing
1873
1874 try:
1875 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
1876 if tmp not in lista: lista.append(tmp)
1877 except:
1878 pass # An element is missing
1879
1880 try:
1881 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
1882 if tmp not in lista: lista.append(tmp)
1883 except:
1884 pass # An element is missing
1885
1886 try:
1887 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1888 if tmp not in lista: lista.append(tmp)
1889 except:
1890 pass # An element is missing
1891
1892 try:
1893 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
1894 if tmp not in lista: lista.append(tmp)
1895 except:
1896 pass # An element is missing
1897
1898 try:
1899 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
1900 if tmp not in lista: lista.append(tmp)
1901 except:
1902 pass # An element is missing
1903
1904 try:
1905 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + city
1906 if tmp not in lista: lista.append(tmp)
1907 except:
1908 pass # An element is missing
1909
1910 try:
1911 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + city
1912 if tmp not in lista: lista.append(tmp)
1913 except:
1914 pass # An element is missing
1915
1916 try:
1917 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1918 if tmp not in lista: lista.append(tmp)
1919 except:
1920 pass # An element is missing
1921
1922 try:
1923 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + city
1924 if tmp not in lista: lista.append(tmp)
1925 except:
1926 pass # An element is missing
1927
1928 try:
1929 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1930 if tmp not in lista: lista.append(tmp)
1931 except:
1932 pass # An element is missing
1933
1934 try:
1935 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + city
1936 if tmp not in lista: lista.append(tmp)
1937 except:
1938 pass # An element is missing
1939
1940 try:
1941 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + city
1942 if tmp not in lista: lista.append(tmp)
1943 except:
1944 pass # An element is missing
1945
1946 try:
1947 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + city
1948 if tmp not in lista: lista.append(tmp)
1949 except:
1950 pass # An element is missing
1951
1952 try:
1953 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + country
1954 if tmp not in lista: lista.append(tmp)
1955 except:
1956 pass # An element is missing
1957
1958 try:
1959 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + country
1960 if tmp not in lista: lista.append(tmp)
1961 except:
1962 pass # An element is missing
1963
1964 try:
1965 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + country
1966 if tmp not in lista: lista.append(tmp)
1967 except:
1968 pass # An element is missing
1969
1970 try:
1971 tmp = name + surname1[0] + "<SEPARATOR>" + country
1972 if tmp not in lista: lista.append(tmp)
1973 except:
1974 pass # An element is missing
1975
1976 try:
1977 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + country
1978 if tmp not in lista: lista.append(tmp)
1979 except:
1980 pass # An element is missing
1981
1982 try:
1983 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + country
1984 if tmp not in lista: lista.append(tmp)
1985 except:
1986 pass # An element is missing
1987
1988 try:
1989 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + country
1990 if tmp not in lista: lista.append(tmp)
1991 except:
1992 pass # An element is missing
1993
1994 try:
1995 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + country
1996 if tmp not in lista: lista.append(tmp)
1997 except:
1998 pass # An element is missing
1999
2000 try:
2001 tmp = name[0] + surname1 + "<SEPARATOR>" + country
2002 if tmp not in lista: lista.append(tmp)
2003 except:
2004 pass # An element is missing
2005
2006 try:
2007 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2008 if tmp not in lista: lista.append(tmp)
2009 except:
2010 pass # An element is missing
2011
2012 try:
2013 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + country
2014 if tmp not in lista: lista.append(tmp)
2015 except:
2016 pass # An element is missing
2017
2018 try:
2019 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
2020 if tmp not in lista: lista.append(tmp)
2021 except:
2022 pass # An element is missing
2023
2024 try:
2025 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2026 if tmp not in lista: lista.append(tmp)
2027 except:
2028 pass # An element is missing
2029
2030 try:
2031 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2032 if tmp not in lista: lista.append(tmp)
2033 except:
2034 pass # An element is missing
2035
2036 try:
2037 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
2038 if tmp not in lista: lista.append(tmp)
2039 except:
2040 pass # An element is missing
2041
2042 try:
2043 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2044 if tmp not in lista: lista.append(tmp)
2045 except:
2046 pass # An element is missing
2047
2048 try:
2049 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
2050 if tmp not in lista: lista.append(tmp)
2051 except:
2052 pass # An element is missing
2053
2054 try:
2055 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2056 if tmp not in lista: lista.append(tmp)
2057 except:
2058 pass # An element is missing
2059
2060 try:
2061 tmp = name + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + country
2062 if tmp not in lista: lista.append(tmp)
2063 except:
2064 pass # An element is missing
2065
2066 try:
2067 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + country
2068 if tmp not in lista: lista.append(tmp)
2069 except:
2070 pass # An element is missing
2071
2072 try:
2073 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2074 if tmp not in lista: lista.append(tmp)
2075 except:
2076 pass # An element is missing
2077
2078 try:
2079 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2080 if tmp not in lista: lista.append(tmp)
2081 except:
2082 pass # An element is missing
2083
2084 try:
2085 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2086 if tmp not in lista: lista.append(tmp)
2087 except:
2088 pass # An element is missing
2089
2090 try:
2091 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2092 if tmp not in lista: lista.append(tmp)
2093 except:
2094 pass # An element is missing
2095
2096 try:
2097 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
2098 if tmp not in lista: lista.append(tmp)
2099 except:
2100 pass # An element is missing
2101
2102 try:
2103 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
2104 if tmp not in lista: lista.append(tmp)
2105 except:
2106 pass # An element is missing
2107
2108 try:
2109 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2110 if tmp not in lista: lista.append(tmp)
2111 except:
2112 pass # An element is missing
2113
2114 try:
2115 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + country
2116 if tmp not in lista: lista.append(tmp)
2117 except:
2118 pass # An element is missing
2119
2120 try:
2121 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
2122 if tmp not in lista: lista.append(tmp)
2123 except:
2124 pass # An element is missing
2125
2126 try:
2127 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2128 if tmp not in lista: lista.append(tmp)
2129 except:
2130 pass # An element is missing
2131
2132 try:
2133 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2134 if tmp not in lista: lista.append(tmp)
2135 except:
2136 pass # An element is missing
2137
2138 try:
2139 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2140 if tmp not in lista: lista.append(tmp)
2141 except:
2142 pass # An element is missing
2143
2144 try:
2145 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + country
2146 if tmp not in lista: lista.append(tmp)
2147 except:
2148 pass # An element is missing
2149
2150 try:
2151 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2152 if tmp not in lista: lista.append(tmp)
2153 except:
2154 pass # An element is missing
2155
2156 try:
2157 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2158 if tmp not in lista: lista.append(tmp)
2159 except:
2160 pass # An element is missing
2161
2162 try:
2163 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + country
2164 if tmp not in lista: lista.append(tmp)
2165 except:
2166 pass # An element is missing
2167
2168 try:
2169 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + country
2170 if tmp not in lista: lista.append(tmp)
2171 except:
2172 pass # An element is missing
2173
2174 try:
2175 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2176 if tmp not in lista: lista.append(tmp)
2177 except:
2178 pass # An element is missing
2179
2180 try:
2181 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + country
2182 if tmp not in lista: lista.append(tmp)
2183 except:
2184 pass # An element is missing
2185
2186 try:
2187 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + country
2188 if tmp not in lista: lista.append(tmp)
2189 except:
2190 pass # An element is missing
2191
2192 try:
2193 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + country
2194 if tmp not in lista: lista.append(tmp)
2195 except:
2196 pass # An element is missing
2197
2198 try:
2199 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + year
2200 if tmp not in lista: lista.append(tmp)
2201 except:
2202 pass # An element is missing
2203
2204 try:
2205 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + year
2206 if tmp not in lista: lista.append(tmp)
2207 except:
2208 pass # An element is missing
2209
2210 try:
2211 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + year
2212 if tmp not in lista: lista.append(tmp)
2213 except:
2214 pass # An element is missing
2215
2216 try:
2217 tmp = name + surname1[0] + "<SEPARATOR>" + year
2218 if tmp not in lista: lista.append(tmp)
2219 except:
2220 pass # An element is missing
2221
2222 try:
2223 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year
2224 if tmp not in lista: lista.append(tmp)
2225 except:
2226 pass # An element is missing
2227
2228 try:
2229 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + year
2230 if tmp not in lista: lista.append(tmp)
2231 except:
2232 pass # An element is missing
2233
2234 try:
2235 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year
2236 if tmp not in lista: lista.append(tmp)
2237 except:
2238 pass # An element is missing
2239
2240 try:
2241 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + year
2242 if tmp not in lista: lista.append(tmp)
2243 except:
2244 pass # An element is missing
2245
2246 try:
2247 tmp = name[0] + surname1 + "<SEPARATOR>" + year
2248 if tmp not in lista: lista.append(tmp)
2249 except:
2250 pass # An element is missing
2251
2252 try:
2253 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2254 if tmp not in lista: lista.append(tmp)
2255 except:
2256 pass # An element is missing
2257
2258 try:
2259 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year
2260 if tmp not in lista: lista.append(tmp)
2261 except:
2262 pass # An element is missing
2263
2264 try:
2265 tmp = surname1 + "<SEPARATOR>" + surname2 + name + "<SEPARATOR>" + year
2266 if tmp not in lista: lista.append(tmp)
2267 except:
2268 pass # An element is missing
2269
2270 try:
2271 tmp = surname1 + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year
2272 if tmp not in lista: lista.append(tmp)
2273 except:
2274 pass # An element is missing
2275
2276 try:
2277 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
2278 if tmp not in lista: lista.append(tmp)
2279 except:
2280 pass # An element is missing
2281
2282 try:
2283 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2284 if tmp not in lista: lista.append(tmp)
2285 except:
2286 pass # An element is missing
2287
2288 try:
2289 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2290 if tmp not in lista: lista.append(tmp)
2291 except:
2292 pass # An element is missing
2293
2294 try:
2295 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
2296 if tmp not in lista: lista.append(tmp)
2297 except:
2298 pass # An element is missing
2299
2300 try:
2301 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year
2302 if tmp not in lista: lista.append(tmp)
2303 except:
2304 pass # An element is missing
2305
2306 try:
2307 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2308 if tmp not in lista: lista.append(tmp)
2309 except:
2310 pass # An element is missing
2311
2312 try:
2313 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
2314 if tmp not in lista: lista.append(tmp)
2315 except:
2316 pass # An element is missing
2317
2318 try:
2319 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2320 if tmp not in lista: lista.append(tmp)
2321 except:
2322 pass # An element is missing
2323
2324 try:
2325 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
2326 if tmp not in lista: lista.append(tmp)
2327 except:
2328 pass # An element is missing
2329
2330 try:
2331 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
2332 if tmp not in lista: lista.append(tmp)
2333 except:
2334 pass # An element is missing
2335
2336 try:
2337 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year
2338 if tmp not in lista: lista.append(tmp)
2339 except:
2340 pass # An element is missing
2341
2342 try:
2343 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2344 if tmp not in lista: lista.append(tmp)
2345 except:
2346 pass # An element is missing
2347
2348 try:
2349 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
2350 if tmp not in lista: lista.append(tmp)
2351 except:
2352 pass # An element is missing
2353
2354 try:
2355 tmp = name + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
2356 if tmp not in lista: lista.append(tmp)
2357 except:
2358 pass # An element is missing
2359
2360 try:
2361 tmp = name + "<SEPARATOR>" + surname1[0] + surname2[0] + "<SEPARATOR>" + year
2362 if tmp not in lista: lista.append(tmp)
2363 except:
2364 pass # An element is missing
2365
2366 try:
2367 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
2368 if tmp not in lista: lista.append(tmp)
2369 except:
2370 pass # An element is missing
2371
2372 try:
2373 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2374 if tmp not in lista: lista.append(tmp)
2375 except:
2376 pass # An element is missing
2377
2378 try:
2379 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
2380 if tmp not in lista: lista.append(tmp)
2381 except:
2382 pass # An element is missing
2383
2384 try:
2385 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year
2386 if tmp not in lista: lista.append(tmp)
2387 except:
2388 pass # An element is missing
2389
2390 try:
2391 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2392 if tmp not in lista: lista.append(tmp)
2393 except:
2394 pass # An element is missing
2395
2396 try:
2397 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + year
2398 if tmp not in lista: lista.append(tmp)
2399 except:
2400 pass # An element is missing
2401
2402 try:
2403 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2404 if tmp not in lista: lista.append(tmp)
2405 except:
2406 pass # An element is missing
2407
2408 try:
2409 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
2410 if tmp not in lista: lista.append(tmp)
2411 except:
2412 pass # An element is missing
2413
2414 try:
2415 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year
2416 if tmp not in lista: lista.append(tmp)
2417 except:
2418 pass # An element is missing
2419
2420 try:
2421 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + year
2422 if tmp not in lista: lista.append(tmp)
2423 except:
2424 pass # An element is missing
2425
2426 try:
2427 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year
2428 if tmp not in lista: lista.append(tmp)
2429 except:
2430 pass # An element is missing
2431
2432 try:
2433 tmp = name[0] + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year
2434 if tmp not in lista: lista.append(tmp)
2435 except:
2436 pass # An element is missing
2437
2438 try:
2439 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year
2440 if tmp not in lista: lista.append(tmp)
2441 except:
2442 pass # An element is missing
2443
2444 try:
2445 tmp = name + surname1[0] + surname2[0] + "<SEPARATOR>" + year[-2:]
2446 if tmp not in lista: lista.append(tmp)
2447 except:
2448 pass # An element is missing
2449
2450 try:
2451 tmp = name + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
2452 if tmp not in lista: lista.append(tmp)
2453 except:
2454 pass # An element is missing
2455
2456 try:
2457 tmp = name + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
2458 if tmp not in lista: lista.append(tmp)
2459 except:
2460 pass # An element is missing
2461
2462 try:
2463 tmp = name + surname1[0] + "<SEPARATOR>" + year[-2:]
2464 if tmp not in lista: lista.append(tmp)
2465 except:
2466 pass # An element is missing
2467
2468 try:
2469 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
2470 if tmp not in lista: lista.append(tmp)
2471 except:
2472 pass # An element is missing
2473
2474 try:
2475 tmp = name[0] + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
2476 if tmp not in lista: lista.append(tmp)
2477 except:
2478 pass # An element is missing
2479
2480 try:
2481 tmp = name[0] + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
2482 if tmp not in lista: lista.append(tmp)
2483 except:
2484 pass # An element is missing
2485
2486 try:
2487 tmp = name[0] + surname1[0] + surname2[0] + "<SEPARATOR>" + year[-2:]
2488 if tmp not in lista: lista.append(tmp)
2489 except:
2490 pass # An element is missing
2491
2492 try:
2493 tmp = name[0] + surname1 + "<SEPARATOR>" + year[-2:]
2494 if tmp not in lista: lista.append(tmp)
2495 except:
2496 pass # An element is missing
2497
2498 try:
2499 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2500 if tmp not in lista: lista.append(tmp)
2501 except:
2502 pass # An element is missing
2503
2504 try:
2505 tmp = name + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
2506 if tmp not in lista: lista.append(tmp)
2507 except:
2508 pass # An element is missing
2509
2510 try:
2511 tmp = name + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2512 if tmp not in lista: lista.append(tmp)
2513 except:
2514 pass # An element is missing
2515
2516 try:
2517 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year[-2:]
2518 if tmp not in lista: lista.append(tmp)
2519 except:
2520 pass # An element is missing
2521
2522 try:
2523 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
2524 if tmp not in lista: lista.append(tmp)
2525 except:
2526 pass # An element is missing
2527
2528 try:
2529 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2530 if tmp not in lista: lista.append(tmp)
2531 except:
2532 pass # An element is missing
2533
2534 try:
2535 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2536 if tmp not in lista: lista.append(tmp)
2537 except:
2538 pass # An element is missing
2539
2540 try:
2541 tmp = name + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2542 if tmp not in lista: lista.append(tmp)
2543 except:
2544 pass # An element is missing
2545
2546 try:
2547 tmp = name + "<SEPARATOR>" + surname1[0] + surname2[0] + "<SEPARATOR>" + year[-2:]
2548 if tmp not in lista: lista.append(tmp)
2549 except:
2550 pass # An element is missing
2551
2552 try:
2553 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
2554 if tmp not in lista: lista.append(tmp)
2555 except:
2556 pass # An element is missing
2557
2558 try:
2559 tmp = name + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2560 if tmp not in lista: lista.append(tmp)
2561 except:
2562 pass # An element is missing
2563
2564 try:
2565 tmp = name + "<SEPARATOR>" + surname1[0] + surname2 + "<SEPARATOR>" + year[-2:]
2566 if tmp not in lista: lista.append(tmp)
2567 except:
2568 pass # An element is missing
2569
2570 try:
2571 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2572 if tmp not in lista: lista.append(tmp)
2573 except:
2574 pass # An element is missing
2575
2576 try:
2577 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year[-2:]
2578 if tmp not in lista: lista.append(tmp)
2579 except:
2580 pass # An element is missing
2581
2582 try:
2583 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2584 if tmp not in lista: lista.append(tmp)
2585 except:
2586 pass # An element is missing
2587
2588 try:
2589 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2590 if tmp not in lista: lista.append(tmp)
2591 except:
2592 pass # An element is missing
2593
2594 try:
2595 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2596 if tmp not in lista: lista.append(tmp)
2597 except:
2598 pass # An element is missing
2599
2600 try:
2601 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2[0] + "<SEPARATOR>" + year[-2:]
2602 if tmp not in lista: lista.append(tmp)
2603 except:
2604 pass # An element is missing
2605
2606 try:
2607 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2608 if tmp not in lista: lista.append(tmp)
2609 except:
2610 pass # An element is missing
2611
2612 try:
2613 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
2614 if tmp not in lista: lista.append(tmp)
2615 except:
2616 pass # An element is missing
2617
2618 try:
2619 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2620 if tmp not in lista: lista.append(tmp)
2621 except:
2622 pass # An element is missing
2623
2624 try:
2625 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + name + "<SEPARATOR>" + year[-2:]
2626 if tmp not in lista: lista.append(tmp)
2627 except:
2628 pass # An element is missing
2629
2630 try:
2631 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
2632 if tmp not in lista: lista.append(tmp)
2633 except:
2634 pass # An element is missing
2635
2636 try:
2637 tmp = surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2638 if tmp not in lista: lista.append(tmp)
2639 except:
2640 pass # An element is missing
2641
2642 try:
2643 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2644 if tmp not in lista: lista.append(tmp)
2645 except:
2646 pass # An element is missing
2647
2648 try:
2649 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2650 if tmp not in lista: lista.append(tmp)
2651 except:
2652 pass # An element is missing
2653
2654 try:
2655 tmp = name + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2656 if tmp not in lista: lista.append(tmp)
2657 except:
2658 pass # An element is missing
2659
2660 try:
2661 tmp = name + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + year[-2:]
2662 if tmp not in lista: lista.append(tmp)
2663 except:
2664 pass # An element is missing
2665
2666 try:
2667 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2668 if tmp not in lista: lista.append(tmp)
2669 except:
2670 pass # An element is missing
2671
2672 try:
2673 tmp = name[0] + "<SEPARATOR>" + surname1 + surname2 + "<SEPARATOR>" + year[-2:]
2674 if tmp not in lista: lista.append(tmp)
2675 except:
2676 pass # An element is missing
2677
2678 try:
2679 tmp = name[0] + surname1 + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2680 if tmp not in lista: lista.append(tmp)
2681 except:
2682 pass # An element is missing
2683
2684 try:
2685 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + surname2[0] + "<SEPARATOR>" + year[-2:]
2686 if tmp not in lista: lista.append(tmp)
2687 except:
2688 pass # An element is missing
2689
2690 try:
2691 tmp = name[0] + "<SEPARATOR>" + surname1[0] + "<SEPARATOR>" + surname2 + "<SEPARATOR>" + year[-2:]
2692 if tmp not in lista: lista.append(tmp)
2693 except:
2694 pass # An element is missing
2695
2696 try:
2697 tmp = name[0] + "<SEPARATOR>" + surname1 + "<SEPARATOR>" + year[-2:]
2698 if tmp not in lista: lista.append(tmp)
2699 except:
2700 pass # An element is missing
2701
2702 try:
2703 tmp = name[0:1] + "<SEPARATOR>" + surname1
2704 if tmp not in lista: lista.append(tmp)
2705 except:
2706 pass # An element is missing
2707
2708 try:
2709 tmp = name[0:2] + "<SEPARATOR>" + surname1
2710 if tmp not in lista: lista.append(tmp)
2711 except:
2712 pass # An element is missing
2713
2714 try:
2715 tmp = name[0:3] + "<SEPARATOR>" + surname1
2716 if tmp not in lista: lista.append(tmp)
2717 except:
2718 pass # An element is missing
2719
2720 # AFTER THE CREATION, WE WILL PERFORM ADDITIONAL TRANSFORMATIONS
2721 # --------------------------------------------------------------
2722
2723 # Creating the output list
2724 listaAdditions = []
2725 listaAdditions += lista
2726
2727 # Adding common words
2728 if useCommonWords:
2729 for n in lista:
2730 for w in COMMON_WORDS:
2731 try:
2732 tmp = n + "<SEPARATOR>" + w
2733 if tmp not in listaAdditions: listaAdditions.append(tmp)
2734 except:
2735 pass # An element is missing
2736
2737 # Adding extra words provided by the user
2738 for n in lista:
2739 for w in extraWords:
2740 try:
2741 tmp = n + "<SEPARATOR>" + w
2742 if tmp not in listaAdditions: listaAdditions.append(tmp)
2743 except:
2744 pass # An element is missing
2745
2746 # Adding loales
2747 if useLocales:
2748 for n in lista:
2749 for l in LOCALES:
2750 try:
2751 tmp = n + "<SEPARATOR>" + l
2752 if tmp not in listaAdditions: listaAdditions.append(tmp)
2753 except:
2754 pass # An element is missing
2755
2756 # Appending Numbers to the nicks created
2757 if useNumbers:
2758 for n in lista:
2759 for i in range(100):
2760 try:
2761 tmp = n + "<SEPARATOR>" + str(i).rjust(2, "0")
2762 if tmp not in listaAdditions: listaAdditions.append(tmp)
2763 except:
2764 pass # An element is missing
2765
2766
2767
2768 # Appending Numbers to the nicks
2769 if useLeet:
2770 for n in lista:
2771 # This will store the variations of the nicks with all the possible combinations
2772 possibleChanges = []
2773 possibleChanges += [n]
2774 for k in LEET_TRANSFORMS.keys():
2775 try:
2776 # Iterating through the list of possible changes found in the array
2777 for change in LEET_TRANSFORMS[k]:
2778 # Replacing the option
2779 tmp = n.replace(k, change )
2780 if tmp not in listaAdditions: listaAdditions.append(tmp)
2781
2782 # Applying all the possible changes
2783 newAliases = []
2784 for f in possibleChanges:
2785 newAliases.append( f.replace(k, change ) )
2786
2787 # Adding the new changes
2788 possibleChanges += newAliases
2789
2790 except:
2791 pass # An element is missing
2792 # Appending the possible combinations which include ALL the possible leet options
2793 for changedAll in possibleChanges:
2794 if changedAll not in listaAdditions: listaAdditions.append(changedAll)
2795
2796 listaFinal = []
2797
2798 # REMOVING THE "<SEPARATOR>" TAGS TO GET THE FINAL NICKNAMES
2799 for s in SEPARATORS:
2800 for n in listaAdditions:
2801 try:
2802 tmp = n.replace("<SEPARATOR>", s)
2803 lastChar = tmp[-1:]
2804 # Verifying if the last char is or not one of the separators to remove it
2805 if not lastChar in SEPARATORS:
2806 if tmp not in listaFinal: listaFinal.append(tmp)
2807 except:
2808 pass # An element is missing
2809
2810
2811 # Sorting list
2812 listaFinal.sort()
2813 print("\nProcess finished.")
2814 print("\nGenerated nicks:\n")
2815 print(general.success(json.dumps(listaFinal, indent=2, sort_keys=True)))
2816 print("\nUp to " + general.emphasis(str(len(listaFinal))) + " nicks generated.\n")
2817 print("Writing the results onto the file:\n\t" + general.emphasis(args.outputFile))
2818
2819 oF=open(args.outputFile, "w")
2820 for l in listaFinal:
2821 oF.write(l+"\n")
2822 oF.close()
2823
2824 return listaFinal
2825
2826 if __name__ == "__main__":
2827 print(general.title(banner.text))
2828
2829 parser = argparse.ArgumentParser(description='alias_generator.py is a tool that tries to create possible aliases based on the inputs known from a person.', prog='alias_generator.py', epilog="", add_help=False)
2830
2831 # Adding the main options
2832 # Defining the mutually exclusive group for the main options
2833 #general = parser.add_mutually_exclusive_group(required=True)
2834 parser.add_argument('-n', '--name', metavar='<NAME>', default=None, action='store', help='Name of the person.', required=False)
2835 parser.add_argument('-s1', '--surname1', metavar='<SURNAME_1>', default=None, action='store', help='First surname.', required=False)
2836 parser.add_argument('-s2', '--surname2', metavar='<SURNAME_2>', default=None, action='store', help='Second surname.', required=False)
2837 parser.add_argument('-c', '--city', metavar='<CITY>', default=None, action='store', help='A city linked to the profile.', required=False)
2838 parser.add_argument('-C', '--country', metavar='<COUNTRY>', default=None, action='store', help='A country.', required=False)
2839 parser.add_argument('-y', '--year', metavar='<YEAR>', default=None, action='store', help='Birth year.', required=False)
2840 parser.add_argument('-o', '--outputFile', metavar='<path_to_output_file>', default="./output.txt", action='store', help='Path to the output file.', required=False)
2841
2842 # Other options
2843 groupSquatting = parser.add_argument_group('Profile squatting arguments', 'Showing additional configuration options for this program based on the original -s option in usufy.py.')
2844 groupSquatting.add_argument('--numbers', default=False, action='store_true', help='Adds numbers at the end of the nicknames.')
2845 groupSquatting.add_argument('--common_words', default=False, action='store_true', help='Adds some famous words at the end of the nicknames.')
2846 groupSquatting.add_argument('--leet', default=False, action='store_true', help='Adds the leet mode to change \'a\' by \'4\', \'e\' by \'3\', etc.')
2847 groupSquatting.add_argument('--locales', default=False, action='store_true', help='Adds ending linked to countries.')
2848 groupSquatting.add_argument('--extra_words', default=[], action='store', help='Adds new words to the nicknames provided by the user.')
2849
2850 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
2851 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
2852 groupAbout.add_argument('--version', action='version', version='%(prog)s '+__version__, help='shows the version of the program and exists.')
2853
2854 args = parser.parse_args()
2855
2856 extraWords = args.extra_words
2857
2858 if args.name == None and args.surname1 == None and args.surname2 == None and args.city == None and args.country == None and args.year == None:
2859 print("\nCollecting information about the profile")
2860 print("----------------------------------------\n")
2861
2862 args.name = raw_input(general.emphasis("Insert a name: ".ljust(35, " "))).replace(' ','')
2863 args.surname1 = raw_input(general.emphasis("Insert the first surname: ".ljust(35, " "))).replace(' ','')
2864 args.surname2 = raw_input(general.emphasis("Insert the second surname: ".ljust(35, " "))).replace(' ','')
2865 args.year = raw_input(general.emphasis("Insert a year (e. g.: birthyear): ".ljust(35, " "))).replace(' ','')
2866 args.city = raw_input(general.emphasis("Insert a city: ".ljust(35, " "))).replace(' ','')
2867 args.country = raw_input(general.emphasis("Insert a country: ".ljust(35, " "))).replace(' ','')
2868
2869 if args.extra_words == []:
2870 print("\nAdditional transformations to be added")
2871 print("--------------------------------------\n")
2872 inputText = raw_input(general.emphasis("Extra words to add (',' separated): ".ljust(35, " "))).replace(' ','')
2873 extraWords += inputText.lower().split(',')
2874
2875 lista=[]
2876
2877
2878 print("\nInput data:")
2879 print("-----------\n")
2880 if args.name != "":
2881 print("Name: ".ljust(20, " ") + args.name)
2882 if args.surname1 != "":
2883 print("First Surname: ".ljust(20, " ") + args.surname1)
2884 if args.surname2 != "":
2885 print("Second Surname: ".ljust(20, " ") + args.surname2)
2886 if args.year != "":
2887 print("Year: ".ljust(20, " ") + args.year)
2888 if args.city != "":
2889 print("City: ".ljust(20, " ") + args.city)
2890 if args.country != "":
2891 print("Country: ".ljust(20, " ") + args.country)
2892
2893 main(
2894 name=args.name,
2895 surname1=args.surname1,
2896 surname2=args.surname2,
2897 city=args.city,
2898 country=args.country,
2899 year=args.year,
2900 useNumbers=args.numbers,
2901 useCommonWords=args.common_words,
2902 useLeet=args.leet,
2903 useLocales=args.locales,
2904 extraWords=extraWords
2905 )
2906
2907 # Urging users to place an issue on Github...
2908 print(banner.footer)
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22
23 # Calling the logger when being imported
24 osrframework.utils.logger.setupLogger(loggerName="osrframework.api")
0 #!/usr/bin/env python
1 # encoding: utf-8
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import time
25 import tweepy #https://github.com/tweepy/tweepy
26 import csv
27
28 import osrframework.utils.config_api_keys as api_keys
29 from osrframework.utils.global_api import APIWrapper as APIWrapper
30
31 class TwitterAPIWrapper(APIWrapper):
32 '''
33 Twitter API wrapper using tweepy API.
34 '''
35
36 def __init__(self, api_data=None):
37 '''
38 :param api_data: dictionary containing the credentials for the given platform.
39 '''
40 if api_data == None:
41 api_data = api_keys.returnListOfAPIKeys()["twitter"]
42 # Processing the results received by parameter
43 self.consumer_key= api_data["consumer_key"]
44 self.consumer_secret= api_data["consumer_secret"]
45 self.access_key= api_data["access_key"]
46 self.access_secret = api_data["access_secret"]
47
48 # The platformName, a bit redundant
49 self.platformName = "Twitter"
50
51 def _connectToAPI(self):
52 '''
53 :return: A tweepy.API object that performs the queries
54 '''
55 #authorize twitter, initialize tweepy
56 auth = tweepy.OAuthHandler(self.consumer_key, self.consumer_secret)
57 auth.set_access_token(self.access_key, self.access_secret)
58 api = tweepy.API(auth)
59 return api
60
61 def _rate_limit_status(self, api=None, mode=None):
62 '''
63 Verifying the API limits
64 '''
65 if api == None:
66 api = self.connectToAPI()
67
68 if mode == None:
69 print json.dumps(api.rate_limit_status(), indent=2)
70 raw_input("<Press ENTER>")
71 else:
72 # Testing if we have enough queries
73 while True:
74 allLimits = api.rate_limit_status()
75 if mode == "get_user":
76 limit = allLimits["resources"]["users"]["/users/show/:id"]["limit"]
77 remaining = allLimits["resources"]["users"]["/users/show/:id"]["remaining"]
78 reset = allLimits["resources"]["users"]["/users/show/:id"]["reset"]
79 elif mode == "get_followers":
80 limit = allLimits["resources"]["followers"]["/followers/ids"]["limit"]
81 remaining = allLimits["resources"]["followers"]["/followers/ids"]["remaining"]
82 reset = allLimits["resources"]["followers"]["/followers/ids"]["reset"]
83 elif mode == "get_friends":
84 limit = allLimits["resources"]["friends"]["/friends/ids"]["limit"]
85 remaining = allLimits["resources"]["friends"]["/friends/ids"]["remaining"]
86 reset = allLimits["resources"]["friends"]["/friends/ids"]["reset"]
87 elif mode == "search_users":
88 limit = allLimits["resources"]["users"]["/users/search"]["limit"]
89 remaining = allLimits["resources"]["users"]["/users/search"]["remaining"]
90 reset = allLimits["resources"]["users"]["/users/search"]["reset"]
91 else:
92 remaining = 1
93 """elif mode == "get_all_docs":
94 limit = allLimits["resources"]REPLACEME["limit"]
95 remaining = allLimits["resources"]REPLACEME["remaining"]
96 reset = allLimits["resources"]REPLACEME["reset"]"""
97 """elif mode == "get_users":
98 limit = allLimits["resources"]REPLACEME["limit"]
99 remaining = allLimits["resources"]REPLACEME["remaining"]
100 reset = allLimits["resources"]REPLACEME["reset"] """
101 """else:
102 remaining = 1"""
103 # Checking if we have enough remaining queries
104 if remaining > 0:
105 #raw_input(str(remaining) + " queries yet...")
106 break
107 else:
108 waitTime = 60
109 print "No more queries remaining, sleeping for " + str(waitTime) +" seconds..."
110 time.sleep(waitTime)
111
112 return 0
113
114 def _processUser(self, jUser):
115 '''
116 Convert tweepy.User to a i3visio-like user. This will process the returned JSON object that the API returns to transform it to the i3visio-like format. A sample answer is copied now when testing it to the @i3visio user in Twitter.
117 {
118 "follow_request_sent": false,
119 "has_extended_profile": false,
120 "profile_use_background_image": true,
121 "profile_text_color": "333333",
122 "default_profile_image": false,
123 "id": 2594815981,
124 "profile_background_image_url_https": "https://abs.twimg.com/images/themes/theme1/bg.png",
125 "verified": false,
126 "profile_location": null,
127 "profile_image_url_https": "https://pbs.twimg.com/profile_images/491716630292881408/FBqYf9qv_normal.png",
128 "profile_sidebar_fill_color": "DDEEF6",
129 "entities": {
130 "url": {
131 "urls": [
132 {
133 "url": "http://t.co/Vus95W8ub6",
134 "indices": [
135 0,
136 22
137 ],
138 "expanded_url": "http://www.i3visio.com",
139 "display_url": "i3visio.com"
140 }
141 ]
142 },
143 "description": {
144 "urls": [
145 {
146 "url": "http://t.co/SGty7or6SQ",
147 "indices": [
148 30,
149 52
150 ],
151 "expanded_url": "http://github.com/i3visio/osrframework",
152 "display_url": "github.com/i3visio/osrfra\u2026"
153 }
154 ]
155 }
156 },
157 "followers_count": 21,
158 "profile_sidebar_border_color": "C0DEED",
159 "id_str": "2594815981",
160 "profile_background_color": "C0DEED",
161 "listed_count": 5,
162 "status": {
163 "lang": "es",
164 "favorited": false,
165 "entities": {
166 "symbols": [],
167 "user_mentions": [],
168 "hashtags": [],
169 "urls": []
170 },
171 "contributors": null,
172 "truncated": false,
173 "text": "Podemos confirmar que Alpify, aunque acabe en ...fy no es una aplicaci\u00f3n nuestra. ;) \u00a1A aprovechar lo que queda de domingo!",
174 "created_at": "Sun Aug 16 17:35:37 +0000 2015",
175 "retweeted": true,
176 "in_reply_to_status_id_str": null,
177 "coordinates": null,
178 "in_reply_to_user_id_str": null,
179 "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
180 "in_reply_to_status_id": null,
181 "in_reply_to_screen_name": null,
182 "id_str": "632968969662689280",
183 "place": null,
184 "retweet_count": 1,
185 "geo": null,
186 "id": 632968969662689280,
187 "favorite_count": 0,
188 "in_reply_to_user_id": null
189 },
190 "is_translation_enabled": false,
191 "utc_offset": null,
192 "statuses_count": 56,
193 "description": "Leading OSRFramework project (http://t.co/SGty7or6SQ) for researching in Open Sources. #security #osint #socialengineering",
194 "friends_count": 10,
195 "location": "Espa\u00f1a",
196 "profile_link_color": "0084B4",
197 "profile_image_url": "http://pbs.twimg.com/profile_images/491716630292881408/FBqYf9qv_normal.png",
198 "following": true,
199 "geo_enabled": false,
200 "profile_background_image_url": "http://abs.twimg.com/images/themes/theme1/bg.png",
201 "name": "i3visio",
202 "lang": "en",
203 "profile_background_tile": false,
204 "favourites_count": 6,
205 "screen_name": "i3visio",
206 "notifications": false,
207 "url": "http://t.co/Vus95W8ub6",
208 "created_at": "Sun Jun 29 13:27:20 +0000 2014",
209 "contributors_enabled": false,
210 "time_zone": null,
211 "protected": false,
212 "default_profile": true,
213 "is_translator": false
214 }
215
216 :param jUser: A Json representing the information of a profile as returned by the API.
217
218
219 :return: Dict in i3visio-like format.
220 '''
221 #raw_input(json.dumps(jUser, indent=2))
222 r = {}
223 r["type"] = "i3visio.profile"
224 r["value"] = self.platformName + " - " + jUser["screen_name"]
225 r["attributes"] = []
226
227 # Appending platform URI
228 """aux = {}
229 aux["type"] = "i3visio.uri"
230 aux["value"] = qURL
231 aux["attributes"] = []
232 r["attributes"].append(aux) """
233 # Appending the id
234 aux = {}
235 aux["type"] = "@twitter_id"
236 aux["value"] = jUser["id_str"]
237 aux["attributes"] = []
238 r["attributes"].append(aux)
239
240 # Appending the alias
241 aux = {}
242 aux["type"] = "i3visio.alias"
243 aux["value"] = jUser["screen_name"]
244 aux["attributes"] = []
245 r["attributes"].append(aux)
246 # Appending fullname
247 aux = {}
248 aux["type"] = "i3visio.fullname"
249 aux["value"] = jUser["name"]
250 aux["attributes"] = []
251 r["attributes"].append(aux)
252 # Appending description
253 aux = {}
254 aux["type"] = "i3visio.text"
255 aux["value"] = jUser["description"] if jUser["description"] != "" else "[N/A]"
256 aux["attributes"] = []
257 r["attributes"].append(aux)
258 # Appending platform name
259 aux = {}
260 aux["type"] = "i3visio.platform"
261 aux["value"] = self.platformName
262 aux["attributes"] = []
263 r["attributes"].append(aux)
264 # Appending location
265 aux = {}
266 aux["type"] = "i3visio.location"
267 aux["value"] = jUser["location"] if jUser["location"] != "" else "[N/A]"
268 aux["attributes"] = []
269 r["attributes"].append(aux)
270 # Appending profile_location
271 aux = {}
272 aux["type"] = "i3visio.location.current"
273 aux["value"] = jUser["profile_location"] if jUser["profile_location"] != None else "[N/A]"
274 aux["attributes"] = []
275 r["attributes"].append(aux)
276 # Appending uri homepage
277 try:
278 urls = jUser["entities" ]["url"]["urls"]
279 for url in urls:
280 aux = {}
281 aux["type"] = "i3visio.uri.homepage"
282 aux["value"] = url["expanded_url"] if url["expanded_url"] != None else "[N/A]"
283 aux["attributes"] = []
284 r["attributes"].append(aux)
285 except Exception as e:
286 #Something happenned when parsing the URLS
287 aux = {}
288 aux["type"] = "i3visio.uri.homepage"
289 aux["value"] = "[N/A]"
290 aux["attributes"] = []
291 r["attributes"].append(aux)
292 # Appending profile uri homepage
293 try:
294 aux = {}
295 aux["type"] = "i3visio.uri.image.profile"
296 aux["value"] = jUser["profile_image_url"] if jUser["profile_image_url"] != None else "[N/A]"
297 aux["attributes"] = []
298 r["attributes"].append(aux)
299 except Exception as e:
300 #Something happenned when parsing the Profile URL
301 aux = {}
302 aux["type"] = "i3visio.uri.image.profile"
303 aux["value"] = "[N/A]"
304 aux["attributes"] = []
305 r["attributes"].append(aux)
306 # Appending uri background
307 try:
308 aux = {}
309 aux["type"] = "i3visio.uri.image.background"
310 aux["value"] = jUser["profile_background_image_url"] if jUser["profile_background_image_url"] != None else "[N/A]"
311 aux["attributes"] = []
312 r["attributes"].append(aux)
313 except Exception as e:
314 #Something happenned when parsing the background URL
315 aux = {}
316 aux["type"] = "i3visio.uri.image.background"
317 aux["value"] = "[N/A]"
318 aux["attributes"] = []
319 r["attributes"].append(aux)
320 # Appending created_at
321 aux = {}
322 aux["type"] = "@created_at"
323 aux["value"] = jUser["created_at"]
324 aux["attributes"] = []
325 r["attributes"].append(aux)
326 # Appending friends_count
327 aux = {}
328 aux["type"] = "@friends_count"
329 aux["value"] = str(jUser["friends_count"])
330 aux["attributes"] = []
331 r["attributes"].append(aux)
332 # Appending followers_count
333 aux = {}
334 aux["type"] = "@followers_count"
335 aux["value"] = str(jUser["followers_count"])
336 aux["attributes"] = []
337 r["attributes"].append(aux)
338 # Appending protected
339 aux = {}
340 aux["type"] = "@protected"
341 aux["value"] = str(jUser["protected"]).lower()
342 aux["attributes"] = []
343 r["attributes"].append(aux)
344 # Appending geo_enabled
345 aux = {}
346 aux["type"] = "@geo_enabled"
347 aux["value"] = str(jUser["geo_enabled"]).lower()
348 aux["attributes"] = []
349 r["attributes"].append(aux)
350 # Appending language
351 aux = {}
352 aux["type"] = "@language"
353 aux["value"] = jUser["lang"]
354 aux["attributes"] = []
355 r["attributes"].append(aux)
356 # Appending time_zone
357 aux = {}
358 aux["type"] = "@time_zone"
359 aux["value"] = jUser["time_zone"] if jUser["time_zone"] != None else "[N/A]"
360 aux["attributes"] = []
361 r["attributes"].append(aux)
362 # Appending verified
363 aux = {}
364 aux["type"] = "@verified"
365 aux["value"] = str(jUser["verified"]).lower()
366 aux["attributes"] = []
367 r["attributes"].append(aux)
368 # Appending listed_count
369 aux = {}
370 aux["type"] = "@listed_count"
371 aux["value"] = str(jUser["listed_count"])
372 aux["attributes"] = []
373 r["attributes"].append(aux)
374 # Appending publications_count
375 aux = {}
376 aux["type"] = "@publications_count"
377 aux["value"] = str(jUser["statuses_count"])
378 aux["attributes"] = []
379 r["attributes"].append(aux)
380 # Appending favourites_count
381 aux = {}
382 aux["type"] = "@favourites_count"
383 aux["value"] = str(jUser["favourites_count"])
384 aux["attributes"] = []
385 r["attributes"].append(aux)
386 # Appending suspended
387 try:
388 aux = {}
389 aux["type"] = "@suspended"
390 aux["value"] = str(jUser["suspended"]).lower()
391 aux["attributes"] = []
392 r["attributes"].append(aux)
393 except:
394 pass
395 return r
396
397 def get_all_docs(self, screen_name):
398 '''
399 Method to get all the tweets emitted by a user.
400
401 :param screen_name: The Twitter username.
402
403 :return: List of tweets.
404 '''
405 def _getNewTweets(api, screen_name,count=200, oldest=None, waitTime=60):
406 '''
407 MEthod that recovers the new tweets or waits until the number of remaining calls has been freed.
408
409 :param api: A valid and connected api.
410 :param screen_name: screen_name of the user to monitor.
411 :param count: Number of tweets to grab per iteration.
412 :param oldes: Oldest tweet to grab in this iteration.
413 :param waitTime: Number of seconds to wait between tries.
414
415 :return: List of new_tweets
416 '''
417 # Verifying the limits of the API
418 #self._rate_limit_status(api=api, mode="get_all_docs")
419
420 waiting = True
421 while waiting == True:
422 try:
423 if oldest != None:
424 # We have to update the oldest id
425 new_tweets = api.user_timeline(screen_name=screen_name, count=count, max_id=oldest)
426 else:
427 new_tweets = api.user_timeline(screen_name=screen_name, count=count)
428 waiting = False
429 #save most recent tweets
430
431 except Exception as e:
432 # Error... We will have to wait
433 #waiting = True
434 print str(e)
435 #print(traceback.format_exc())
436 print "No more queries remaining, sleeping for " + str(waitTime) +" seconds..."
437 time.sleep(waitTime)
438
439 return new_tweets
440
441 # Connecting to the API
442 api = self._connectToAPI()
443
444 #initialize a list to hold all the tweepy Tweets
445 alltweets = []
446
447 #make initial request for most recent tweets (200 is the maximum allowed count)
448 """waiting = True
449 while waiting == True:
450 try:
451 new_tweets = api.user_timeline(screen_name = screen_name,count=200)
452 waiting = False
453 except:
454 # Error... We will have to wait
455 waiting = True
456 time.sleep(waitTime) """
457 new_tweets = _getNewTweets(api, screen_name)
458
459 alltweets.extend(new_tweets)
460 # Storing manually all the json representation for the tweets
461 jTweets = []
462 for n in new_tweets:
463 jTweets.append(n._json)
464 if len(alltweets) > 0:
465 #save the id of the oldest tweet less one
466 oldest = alltweets[-1].id - 1
467
468 #keep grabbing tweets until there are no tweets left to grab
469 while len(new_tweets) > 0:
470 print "Getting tweets before %s" % (oldest)
471
472 """ #all subsequent requests use the max_id param to prevent duplicates
473 waiting = True
474 while waiting == True:
475 try:
476 # We have to update the oldest id
477 new_tweets = api.user_timeline(screen_name = screen_name,count=200, max_id=oldest)
478 waiting = False
479 #save most recent tweets
480
481 except:
482 # Error... We will have to wait
483 waiting = True
484 print "No more queries remaining, sleeping for " + str(waitTime) +" seconds..."
485 time.sleep(waitTime) """
486
487 new_tweets = _getNewTweets(api, screen_name, oldest=oldest)
488
489 # Extending the list of tweets
490 alltweets.extend(new_tweets)
491
492 #update the id of the oldest tweet less one
493 oldest = alltweets[-1].id - 1
494 print "... %s tweets downloaded so far" % (len(alltweets))
495 # Storing manually all the json representation for the tweets
496 for n in new_tweets:
497 jTweets.append(n._json)
498 else:
499 # Verifying the limits of the API
500 print json.dumps(self._rate_limit_status(api=api, mode="get_all_docs"), indent =2)
501
502 #transform the tweepy tweets into a 2D array that will populate the csv
503 outtweets = []
504 # This is how it is represented
505 """
506 "status": {
507 "lang": "es",
508 "favorited": false,
509 "entities": {
510 "symbols": [],
511 "user_mentions": [],
512 "hashtags": [],
513 "urls": []
514 },
515 "contributors": null,
516 "truncated": false,
517 "text": "Podemos confirmar que Alpify, aunque acabe en ...fy no es una aplicaci\u00f3n nuestra. ;) \u00a1A aprovechar lo que queda de domingo!",
518 "created_at": "Sun Aug 16 17:35:37 +0000 2015",
519 "retweeted": true,
520 "in_reply_to_status_id_str": null,
521 "coordinates": null,
522 "in_reply_to_user_id_str": null,
523 "source": "<a href=\"http://twitter.com\" rel=\"nofollow\">Twitter Web Client</a>",
524 "in_reply_to_status_id": null,
525 "in_reply_to_screen_name": null,
526 "id_str": "632968969662689280",
527 "place": null,
528 "retweet_count": 1,
529 "geo": null,
530 "id": 632968969662689280,
531 "favorite_count": 0,
532 "in_reply_to_user_id": null
533 },
534 """
535 for tweet in jTweets:
536 row =[]
537 row.append(tweet["id_str"])
538 row.append(tweet["created_at"])
539 row.append(tweet["text"].encode("utf-8"))
540 row.append(tweet["source"])
541 row.append(tweet["coordinates"])
542 row.append(tweet["retweet_count"])
543 row.append(tweet["favorite_count"])
544 row.append(tweet["lang"])
545 row.append(tweet["place"])
546 row.append(tweet["geo"])
547 row.append(tweet["id"])
548 row.append(screen_name)
549
550 # URLS
551 urls = []
552 """
553 [
554 {
555 "url": "http://t.co/SGty7or6SQ",
556 "indices": [
557 30,
558 52
559 ],
560 "expanded_url": "http://github.com/i3visio/osrframework",
561 "display_url": "github.com/i3visio/osrfra\u2026"
562 }
563 ]
564 """
565 for u in tweet["entities"]["urls"]:
566 urls.append(u["expanded_url"])
567 # Creating the string value for the cell
568 str_urls =""
569 if len(urls) == 0:
570 str_urls = "[N/A]"
571 else:
572 for i, u in enumerate(urls):
573 str_urls += u
574 # Appending a separator
575 if i+1 <> len(urls):
576 str_urls+= "|"
577 row.append(str_urls.encode('utf-8'))
578
579 # TODO: Extract Mentions
580 #
581 mentions = []
582 """ "user_mentions": [
583 {
584 "id": 66345537,
585 "indices": [
586 0,
587 10
588 ],
589 "id_str": "66345537",
590 "screen_name": "muchotomy",
591 "name": "Tomy"
592 },
593 """
594 for a in tweet["entities"]["user_mentions"]:
595 mentions.append(a["screen_name"])
596 # Creating the string value for the cell
597 str_mentions =""
598 if len(mentions) == 0:
599 str_mentions = "[N/A]"
600 else:
601 for i, m in enumerate(mentions):
602 str_mentions += m
603 # Appending a separator
604 if i+1 <> len(mentions):
605 str_mentions+= "|"
606 row.append(str_mentions.encode('utf-8'))
607
608 # Appending the row to the output
609 outtweets.append(row)
610
611 # Writing the csv
612 with open('%s_tweets.csv' % screen_name, 'wb') as f:
613 writer = csv.writer(f)
614 # Writing the headers
615 writer.writerow([
616 "_tweet_id",
617 "_tweet_created_at",
618 "_tweet_text",
619 "_tweet_source",
620 "_tweet_coordinates",
621 "_tweet_retweet_count",
622 "_tweet_favourite_count",
623 "_tweet_lang",
624 "i3visio_location",
625 "_tweet_geo",
626 "_twitter_id",
627 "i3visio_alias",
628 "i3visio_uri",
629 "i3visio_alias_mentions",
630 ])
631 # Writing the rows
632 #writer.writerows(outtweets)
633 for o in outtweets:
634 try:
635 writer.writerow(o)
636 except:
637 print o
638
639 return jTweets
640
641 def get_followers(self, query):
642 '''
643 Method to get the followers of a user.
644
645 :param query: Query to be performed.
646
647 :return: List of ids.
648 '''
649 # Connecting to the API
650 api = self._connectToAPI()
651
652 # Verifying the limits of the API
653 self._rate_limit_status(api=api, mode="get_followers")
654
655 # Making the call to the API
656 try:
657 friends_ids = api.followers_ids(query)
658 except:
659 return []
660
661 """res = []
662 # Extracting the information from each profile
663 for a in aux:
664 us= self.getUser(a)
665 res.append(self._processUser(us))"""
666
667 return friends_ids
668
669 def get_friends(self, query):
670 '''
671 Method to get the friends of a user.
672
673 :param query: Query to be performed.
674
675 :return: List of users.
676 '''
677 # Connecting to the API
678 api = self._connectToAPI()
679
680 # Verifying the limits of the API
681 self._rate_limit_status(api=api, mode="get_friends")
682
683 # Making the call to the API
684 try:
685 friends_ids = api.friends_ids(query)
686 except:
687 return []
688
689 """res = []
690 # Extracting the information from each profile
691 for a in aux:
692 us= self.getUser(a)
693 res.append(self._processUser(us))"""
694
695 return friends_ids
696
697
698 def get_user(self, screen_name):
699 '''
700 Method to perform the usufy searches.
701
702 :param screen_name: nickname to be searched.
703
704 :return: User.
705 '''
706 # Connecting to the API
707 api = self._connectToAPI()
708
709 # Verifying the limits of the API
710 self._rate_limit_status(api=api, mode="get_user")
711
712 aux = []
713 try:
714 user = api.get_user(screen_name)
715 # Iterate through the results using user._json
716 aux.append(user._json)
717 except tweepy.error.TweepError as e:
718 pass
719
720 res = []
721 # Extracting the information from each profile
722 for a in aux:
723 res.append(self._processUser(a))
724 return res
725
726 def search_users(self, query, n=20, maxUsers=60):
727 '''
728 Method to perform the searchfy searches.
729
730 :param query: Query to be performed.
731 :param n: Number of results per query.
732 :param maxUsers: Max. number of users to be recovered.
733
734 :return: List of users
735 '''
736 # Connecting to the API
737 api = self._connectToAPI()
738
739 # Verifying the limits of the API
740 self._rate_limit_status(api=api, mode="search_users")
741
742 aux = []
743
744 page = 0
745
746 # print "Getting page %s of new users..." % page+1
747 # Making the call to the API
748 try:
749 newUsers = api.search_users(query, n, page)
750
751 for n in newUsers:
752 aux.append(n._json)
753
754 #keep grabbing tweets until there are no tweets left to grab
755 while len(aux) < maxUsers & len(newUsers)>0:
756 page+=1
757 print "Getting page %s of new users..." % page
758
759 # Grabbing new Users
760 newUsers = api.search_users(query, n, page)
761
762 # Save the users found
763 aux.extend(newUsers)
764 except:
765 pass
766
767 res = []
768 # Extracting the information from each profile
769 for a in aux:
770 res.append(self._processUser(a))
771
772 return res
773
774
775 def main(args):
776 '''
777 Query manager.
778 '''
779 # Creating the instance
780 tAW = TwitterAPIWrapper()
781
782 # Selecting the query to be launched
783 if args.type == "get_all_docs":
784 results = tAW.get_all_docs(args.query)
785
786 elif args.type == "get_user":
787 results = tAW.get_user(args.query)
788
789 elif args.type == "get_followers":
790 results = tAW.get_followers(args.query)
791
792 print "... %s followers downloaded... " % (len(results))
793 #write the csv
794 with open('%s_followers.csv' % args.query, 'wb') as f:
795 writer = csv.writer(f)
796 for r in results:
797 writer.writerow([args.query,str(r)])
798
799 elif args.type == "get_friends":
800 results = tAW.get_friends(args.query)
801 print "... %s friends downloaded... " % (len(results))
802 #write the csv
803 with open('%s_friends.csv' % args.query, 'wb') as f:
804 writer = csv.writer(f)
805 for r in results:
806 writer.writerow([args.query,str(r)])
807
808 elif args.type == "search_users":
809 results = tAW.search_users(args.query)
810
811 return results
812
813 if __name__ == '__main__':
814 parser = argparse.ArgumentParser(description='A library that wraps searches onto the Twitter API.', prog='twitter_api.py', epilog="NOTE: the API tokens will be searched in api_keys.cfg configuration file.", add_help=False)
815 # Adding the main options
816 # Defining the mutually exclusive group for the main options
817 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to the Twitter API.', required=True)
818 parser.add_argument('-t', '--type', action='store', choices=["get_all_docs", "get_user", "get_followers", "get_friends", "search_users"], help='Type of query to be performed.', required=True)
819
820 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
821 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
822 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
823
824 args = parser.parse_args()
825
826 results = main(args)
827
828 #print json.dumps(results, indent=2)
829 print len(results)
830
0 #!/usr/bin/env python
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio"
24 __copyright__ = "Copyright 2016-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import datetime as dt
34 import json
35 import os
36 import signal
37 import socket
38 import whois
39
40 # global issues for multiprocessing
41 from multiprocessing import Process, Queue, Pool
42
43 import osrframework.domains.gtld as gtld
44 import osrframework.domains.cctld as cctld
45 import osrframework.domains.generic_tld as generic_tld
46 import osrframework.domains.geographic_tld as geographic_tld
47 import osrframework.domains.brand_tld as brand_tld
48 import osrframework.domains.other_subdomains as other_subdomains
49
50 import osrframework.utils.banner as banner
51 import osrframework.utils.platform_selection as platform_selection
52 import osrframework.utils.configuration as configuration
53 import osrframework.utils.general as general
54
55 # Defining the TLD dictionary based on <https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains>
56 TLD = {}
57 # Global TLD
58 TLD["global"] = gtld.tld
59 # Country Code TLD
60 TLD["cc"] = cctld.tld
61 # Generic TLD
62 TLD["generic"] = generic_tld.tld
63 # Geographic TLD
64 TLD["geographic"] = geographic_tld.tld
65 # Brand TLD
66 TLD["brand"] = brand_tld.tld
67 # Brand TLD
68 TLD["other"] = other_subdomains.tld
69
70 def getNumberTLD():
71 """
72 Counting the total number of TLD being processed.
73 """
74 total = 0
75 for typeTld in TLD.keys():
76 total+= len(TLD[typeTld])
77 return total
78
79
80 def getWhoisInfo(domain):
81 """
82 Method that trie to recover the whois info from a domain.
83
84 Args:
85 -----
86 domain: The domain to verify.
87
88 Returns:
89 --------
90 dict: A dictionary containing the result as an i3visio entity with its
91 `value`, `type` and `attributes`.
92 """
93 new = []
94
95 # Grabbing the aliases
96 try:
97 emails = {}
98 emails["type"] = "i3visio.alias"
99 emails["value"] = str(domain.split(".")[0])
100 emails["attributes"] = []
101 new.append(emails)
102 except:
103 pass
104
105 info = whois.whois(domain)
106
107 if info.status == None:
108 raise Exception("UnknownDomainError: " + domain + " could not be resolved.")
109
110 # Grabbing the emails
111 try:
112 emails = {}
113 emails["type"] = "i3visio.email"
114 if type(info.emails) is not list:
115 aux = [info.emails]
116 emails["value"] = json.dumps(aux)
117 else:
118 emails["value"] = json.dumps(info.emails)
119 emails["attributes"] = []
120 new.append(emails)
121 except:
122 pass
123
124 # Grabbing the country
125 try:
126 tmp = {}
127 tmp["type"] = "i3visio.location.country"
128 tmp["value"] = str(info.country)
129 tmp["attributes"] = []
130 new.append(tmp)
131 except:
132 pass
133
134 # Grabbing the regitrar
135 try:
136 tmp = {}
137 tmp["type"] = "i3visio.registrar"
138 tmp["value"] = str(info.registrar)
139 tmp["attributes"] = []
140 new.append(tmp)
141 except:
142 pass
143
144 # Grabbing the regitrar
145 try:
146 tmp = {}
147 tmp["type"] = "i3visio.fullname"
148 try:
149 tmp["value"] = str(info.name)
150 except:
151 tmp["value"] = info.name
152 tmp["attributes"] = []
153 new.append(tmp)
154 except:
155 pass
156
157 return new
158
159
160 def createDomains(tlds, nicks=None, nicksFile=None):
161 """
162 Method that globally permits to generate the domains to be checked.
163
164 Args:
165 -----
166 tlds: List of tlds.
167 nicks: List of aliases.
168 nicksFile: The filepath to the aliases file.
169
170 Returns:
171 --------
172 list: list of domains to be checked.
173 """
174 domain_candidates = []
175 if nicks != None:
176 for n in nicks:
177 for t in tlds:
178 tmp = {
179 "domain" : n + t["tld"],
180 "type" : t["type"],
181 "tld": t["tld"]
182 }
183 domain_candidates.append(tmp)
184 elif nicksFile != None:
185 with open(nicksFile, "r") as iF:
186 nicks = iF.read().splitlines()
187 for n in nicks:
188 for t in tlds:
189 tmp = {
190 "domain" : n + t["tld"],
191 "type" : t["type"],
192 "tld": t["tld"]
193 }
194 domain_candidates.append(tmp)
195 return domain_candidates
196
197
198 def isBlackListed(ipv4):
199 """
200 Method that checks if an IPv4 is blackslited
201
202 There are some providers that resolve always. We have identified these IP
203 so we have to perform an additional chdeck to confirm that the returned
204 IPv4 is not a false positive.
205
206 Args:
207 -----
208 ipv4: The IP to be verified.
209
210 Returns:
211 --------
212 bool: It returns whether the IP is blacklisted.
213 """
214 BLACKLISTED = [
215 "45.79.222.138",
216 "88.198.29.97",
217 "91.144.20.76",
218 "127.0.0.1",
219 "127.0.0.2",
220 "127.0.53.53",
221 "141.8.226.58",
222 "144.76.162.245"
223 ]
224
225 if ipv4 in BLACKLISTED:
226 return True
227 else:
228 return False
229
230 def pool_function(domain):
231 """
232 Wrapper for being able to launch all the threads of getPageWrapper.
233
234 Args:
235 -----
236 domain: We receive the parameters as a dictionary.
237 ```
238 {
239 "domain" : ".com",
240 "type" : "global"
241 }
242 ```
243 Returns:
244 --------
245 dict: A dictionary containing the following values:
246 `{"platform" : str(domain), "status": "DONE", "data": aux}`
247 """
248 is_valid = True
249 try:
250 ipv4 = socket.gethostbyname(domain["domain"])
251
252 # Check if this ipv4 normally throws false positives
253 if isBlackListed(ipv4):
254 return {"platform" : str(domain), "status": "ERROR", "data": {}}
255
256 #If we arrive here... The domain exists!!
257 aux = {}
258 aux["type"] = "i3visio.result"
259 aux["value"] = "Domain Info - " + domain["domain"]
260 # Performing whois info
261 try:
262 aux["attributes"] = getWhoisInfo(domain["domain"])
263 except Exception as e:
264 # If something happened... Well, we'll return an empty attributes array.
265 aux["attributes"] = []
266
267 tmp = {}
268 tmp["type"] = "i3visio.domain"
269 tmp["value"] = domain["domain"]
270 tmp["attributes"] = []
271
272 aux["attributes"].append(tmp)
273
274 tmp = {}
275 tmp["type"] = "i3visio.tld_type"
276 tmp["value"] = domain["type"]
277 tmp["attributes"] = []
278
279 aux["attributes"].append(tmp)
280
281 tmp = {}
282 tmp["type"] = "i3visio.ipv4"
283 tmp["value"] = ipv4
284 tmp["attributes"] = []
285
286 aux["attributes"].append(tmp)
287
288 return {"platform" : str(domain), "status": "DONE", "data": aux}
289 except Exception as e:
290 return {"platform" : str(domain), "status": "ERROR", "data": {}}
291
292
293 def performSearch(domains=[], nThreads=16):
294 """
295 Method to perform the mail verification process.
296
297 Arguments
298 ---------
299 domains: List of domains to check.
300 nThreads: Number of threads to use.
301
302 Returns
303 -------
304 list: A list containing the results as i3visio entities.
305 """
306 results = []
307
308 # Using threads in a pool if we are not running the program in main
309 args = []
310
311 # Returning None if no valid domain has been returned
312 if len(domains) == 0:
313 return results
314
315 # If the process is executed by the current app, we use the Processes. It is faster than pools.
316 if nThreads <= 0 or nThreads > len(domains):
317 nThreads = len(domains)
318
319 # Launching the Pool
320 # ------------------
321 # Example catched from: https://stackoverflow.com/questions/11312525/catch-ctrlc-sigint-and-exit-multiprocesses-gracefully-in-python
322 try:
323 original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
324 pool = Pool(nThreads)
325 signal.signal(signal.SIGINT, original_sigint_handler)
326 except ValueError:
327 # To avoid: ValueError: signal only works in main thread
328 pool = Pool(nThreads)
329
330 poolResults = []
331 try:
332 def log_result(result):
333 # This is called whenever foo_pool(i) returns a result.
334 # result_list is modified only by the main process, not the pool workers.
335 poolResults.append(result)
336
337 for d in domains:
338 # We need to create all the arguments that will be needed
339 parameters = ( d, )
340 pool.apply_async (pool_function, args= parameters, callback = log_result )
341
342 # Waiting for results to be finished
343 while len(poolResults) < len(domains):
344 pass
345 # Closing normal termination
346 pool.close()
347 except KeyboardInterrupt:
348 print(general.warning("\nProcess manually stopped by the user. Terminating workers.\n"))
349 pool.terminate()
350 print(general.warning("The following domains were not processed:"))
351 pending_tld = ""
352 for d in domains:
353 processed = False
354 for processedDomain in poolResults:
355 if str(d) == processedDomain["platform"]:
356 processed = True
357 break
358 if not processed:
359 print(general.warning("\t- " + str(d["domain"])))
360 pending_tld += " " + str(d["tld"])
361 print(general.warning("[!] If you want to relaunch the app with these domains you can always run the command with: "))
362 print(general.warning("\t domainfy.py ... -t none -u " + pending_tld))
363 print(general.warning("[!] If you prefer to avoid these platforms you can manually evade them for whatever reason with: "))
364 print(general.warning("\t domainfy.py ... -x " + pending_tld))
365 pool.join()
366
367 # Processing the results
368 # ----------------------
369 for serArray in poolResults:
370 data = serArray["data"]
371 # We need to recover the results and check if they are not an empty json or None
372 if data != None and data != {}:
373 results.append(data)
374 return results
375
376 def main(args):
377 """
378 Main function to launch phonefy.
379
380 The function is created in this way so as to let other applications make
381 use of the full configuration capabilities of the application. The
382 parameters received are used as parsed by this modules `getParser()`.
383
384 Args:
385 -----
386 args: The parameters as processed by this modules `getParser()`.
387
388 Results:
389 --------
390 list: Returns a list with i3visio entities.
391 """
392 results = []
393 if not args.quiet:
394 print(general.title(banner.text))
395
396 sayingHello = """
397 domainfy.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2016-2017
398
399 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
400 are welcome to redistribute it under certain conditions. For additional info,
401 visit """ + general.LICENSE_URL + "\n"
402 print(general.title(sayingHello))
403
404 if args.license:
405 general.showLicense()
406 else:
407 # Processing the options returned to remove the "all" option
408 tlds = []
409 if "all" in args.tlds:
410 for typeTld in TLD.keys():
411 for tld in TLD[typeTld]:
412 if tld not in args.exclude:
413 tlds.append({ "tld" : tld, "type" : typeTld })
414 elif "none" in args.tlds:
415 pass
416 else:
417 for typeTld in TLD.keys():
418 if typeTld in args.tlds:
419 for tld in TLD[typeTld]:
420 if tld not in args.exclude:
421 tlds.append({ "tld" : tld, "type" : typeTld })
422
423 for new in args.user_defined:
424 if new not in args.exclude:
425 tlds.append( {"tld": new, "type": "user_defined"})
426
427 if args.nicks:
428 domains = createDomains(tlds, nicks = args.nicks)
429 else:
430 # nicks_file
431 domains = createDomains(tlds, nicksFile = args.nicks_file)
432
433 # Showing the execution time...
434 if not args.quiet:
435 startTime= dt.datetime.now()
436 print(str(startTime) + "\tTrying to identify the existence of " + general.emphasis(str(len(domains))) + " domain(s)... Relax!\n")
437 print(general.emphasis("\tPress <Ctrl + C> to stop...\n"))
438
439 # Perform searches, using different Threads
440 results = performSearch(domains, args.threads)
441
442 # Trying to store the information recovered
443 if args.output_folder != None:
444 if not os.path.exists(args.output_folder):
445 os.makedirs(args.output_folder)
446 # Grabbing the results
447 fileHeader = os.path.join(args.output_folder, args.file_header)
448 for ext in args.extension:
449 # Generating output files
450 general.exportUsufy(results, ext, fileHeader)
451
452 # Showing the information gathered if requested
453 if not args.quiet:
454 print("A summary of the results obtained are shown in the following table:\n")
455 try:
456 print(general.success(general.usufyToTextExport(results)))
457 except:
458 print(general.warning("\nSomething happened when exporting the results. The Json will be shown instead:\n"))
459 print(general.warning(json.dumps(results, indent=2)))
460
461 now = dt.datetime.now()
462 print("\n" + str(now) + "\tYou can find all the information collected in the following files:")
463 for ext in args.extension:
464 # Showing the output files
465 print("\t" + general.emphasis(fileHeader + "." + ext))
466
467 # Showing the execution time...
468 if not args.quiet:
469 # Showing the execution time...
470 endTime= dt.datetime.now()
471 print("\n" + str(endTime) +"\tFinishing execution...\n")
472 print("Total time used:\t" + general.emphasis(str(endTime-startTime)))
473 print("Average seconds/query:\t" + general.emphasis(str((endTime-startTime).total_seconds()/len(domains))) +" seconds\n")
474
475 # Urging users to place an issue on Github...
476 print(banner.footer)
477
478 return results
479
480 def getParser():
481 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("domainfy")
482 # Capturing errors just in case the option is not found in the configuration
483 try:
484 excludeList = [DEFAULT_VALUES["exclude_platforms"]]
485 except:
486 excludeList = []
487
488 parser = argparse.ArgumentParser(description='domainfy.py - Checking the existence of domains.', prog='domainfy.py', epilog='Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.', add_help=False)
489 parser._optionals.title = "Input options (one required)"
490
491 # Defining the mutually exclusive group for the main options
492 groupMainOptions = parser.add_mutually_exclusive_group(required=True)
493 # Adding the main options
494 groupMainOptions.add_argument('--license', required=False, action='store_true', default=False, help='shows the GPLv3+ license and exists.')
495 groupMainOptions.add_argument('-n', '--nicks', metavar='<nicks>', nargs='+', action='store', help = 'the list of nicks to be checked in the domains selected.')
496 groupMainOptions.add_argument('-N', '--nicks_file', metavar='<nicks_file>', action='store', help = 'the file with the list of nicks to be checked in the domains selected.')
497
498 # Configuring the processing options
499 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the way in which mailfy will process the identified profiles.')
500 #groupProcessing.add_argument('-L', '--logfolder', metavar='<path_to_log_folder', required=False, default = './logs', action='store', help='path to the log folder. If none was provided, ./logs is assumed.')
501 groupProcessing.add_argument('-e', '--extension', metavar='<sum_ext>', nargs='+', choices=['csv', 'gml', 'json', 'mtz', 'ods', 'png', 'txt', 'xls', 'xlsx' ], required=False, default=DEFAULT_VALUES["extension"], action='store', help='output extension for the summary files. Default: xls.')
502 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', required=False, default=DEFAULT_VALUES["output_folder"], action='store', help='output folder for the generated documents. While if the paths does not exist, usufy.py will try to create; if this argument is not provided, usufy will NOT write any down any data. Check permissions if something goes wrong.')
503 groupProcessing.add_argument('-t', '--tlds', metavar='<tld_type>', nargs='+', choices=["all", "none"] + TLD.keys(), action='store', help='List of tld types where the nick will be looked for.', required=False, default=DEFAULT_VALUES["tlds"])
504 groupProcessing.add_argument('-u', '--user_defined', metavar='<new_tld>', nargs='+', action='store', help='Additional TLD that will be searched.', required=False, default = DEFAULT_VALUES["user_defined"])
505 groupProcessing.add_argument('-x', '--exclude', metavar='<domain>', nargs='+', required=False, default=excludeList, action='store', help="select the domains to be avoided. The format should include the initial '.'.")
506
507 # Getting a sample header for the output files
508 groupProcessing.add_argument('-F', '--file_header', metavar='<alternative_header_file>', required=False, default=DEFAULT_VALUES["file_header"], action='store', help='Header for the output filenames to be generated. If None was provided the following will be used: profiles.<extension>.' )
509 groupProcessing.add_argument('-T', '--threads', metavar='<num_threads>', required=False, action='store', default= int(DEFAULT_VALUES["threads"]), type=int, help='write down the number of threads to be used (default 16). If 0, the maximum number possible will be used, which may make the system feel unstable.')
510 groupProcessing.add_argument('--quiet', required=False, action='store_true', default=False, help='tells the program not to show anything.')
511
512 # About options
513 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
514 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
515 #groupAbout.add_argument('-v', '--verbose', metavar='<verbosity>', choices=[0, 1, 2], required=False, action='store', default=1, help='select the verbosity level: 0 - none; 1 - normal (default); 2 - debug.', type=int)
516 groupAbout.add_argument('--version', action='version', version='%(prog)s ' +" " +__version__, help='shows the version of the program and exists.')
517
518 return parser
519
520 if __name__ == "__main__":
521 # Grabbing the parser
522 parser = getParser()
523
524 args = parser.parse_args()
525
526 # Calling the main function
527 main(args)
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 tld = {
21 ".allfinanz", # Allfinanz Deutsche Vermögensberatung Aktiengesellschaft
22 ".android", # Google (Android)
23 ".aquarelle", # Aquarelle_Group
24 ".axa", # AXA
25 ".barclays", # Barclays
26 ".barclaycard", # Barclays
27 ".bloomberg", # Bloomberg IP Holdings LLC
28 ".bmw", # BMW
29 ".bnl", # Banca Nazionale del Lavoro
30 ".bnpparibas", # BNP Paribas
31 ".cal", # Google (Google Calendar)
32 ".caravan", # Caravan International, Inc.
33 ".cern", # CERN
34 ".chrome", # Google (Google Chrome)
35 ".citic", # CITIC Group
36 ".crs", # Federated Co-operatives Limited
37 ".cuisinella", # Société Alsacienne de Meubles (Cuisinella)
38 ".dnp", # Dai Nippon Printing Co.
39 ".dvag", # Deutsche Vermögensberatung Aktiengesellschaft
40 ".emerck", # Merck KGaA
41 ".everbank", # EverBank
42 ".firmdale", # Firmdale Holdings
43 ".flsmidth", # FLSmidth A/S
44 ".frogans", # OP3FT
45 ".gbiz", # Google
46 ".gle", # Google
47 ".globo", # Grupo Globo
48 ".gmail", # Google (Gmail)
49 ".gmo", # GMO Internet
50 ".gmx", # 1&1 Mail & Media (Global Message Exchange)
51 ".google", # Google
52 ".hsbc", # HSBC
53 ".ibm", # IBM
54 ".kred", # KredTLD
55 ".lacaixa", # Caixa d’Estalvis i Pensions de Barcelona
56 ".latrobe", # La Trobe University
57 ".lds", # The Church of Jesus Christ of Latter-day Saints (LDS Church)[184]
58 ".mango", # MANGO
59 ".mini", # BMW (Mini)
60 ".monash", # Monash University
61 ".mormon", # The Church of Jesus Christ of Latter-day Saints (LDS Church)[184]
62 ".neustar", # Neustar
63 ".nexus", # Google (Google Nexus)
64 ".nhk", # NHK
65 ".nico", # Dwango Co., Ltd. (Niconico)
66 ".nra", # National Rifle Association
67 ".otsuka", # Otsuka Holdings
68 ".ovh", # OVH
69 ".piaget", # Piaget SA
70 ".pohl", # Deutsche Vermögensberatung Aktiengesellschaft
71 ".praxi", # Praxi
72 ".prod", # Google (products)
73 ".pwc", # PwC
74 ".sandvikcoromant", # Sandvik Coromant
75 ".sca", # Svenska Cellulosa Aktiebolaget
76 ".scb", # Siam Commercial Bank
77 ".schmidt", # Société Alsacienne de Meubles (Cuisines Schmidt)
78 ".seek", # Seek Limited
79 ".sohu", # Sohu
80 ".spiegel", # Spiegel-Verlag
81 ".suzuki", # Suzuki Motor Corporation
82 ".tui", # TUI AG
83 ".uol", # Universo Online
84 ".williamhill", # William Hill
85 ".wme", # William Morris Endeavor Entertainment
86 ".wtc", # World Trade Centers Association
87 ".yandex", # Yandex
88 ".youtube", # Google (YouTube)
89 ".xn--fiq64b", # .中信
90 ".xn--vermgensberater-ctb", # .vermögensberater
91 ".xn--vermgensberatung-pwb", # .vermögensberatung
92 ".xn--qcka1pmc", # .グーグル
93 ".xn--flw351e", # .谷歌
94 ".xn--cg4bki", # .삼성
95 }
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 tld = {
21 ".ac", # Ascension Island
22 ".ad", # Andorra
23 ".ae", # United Arab Emirates
24 ".af", # Afghanistan
25 ".ag", # Antigua and Barbuda
26 ".ai", # Anguilla
27 ".al", # Albania
28 ".am", # Armenia
29 ".an", # Netherlands Antilles
30 ".ao", # Angola
31 ".aq", # Antarctica
32 ".ar", # Argentina
33 ".as", # American Samoa
34 ".at", # Austria
35 ".au", # Australia
36 ".aw", # Aruba
37 ".ax", # Åland
38 ".az", # Azerbaijan
39 ".ba", # Bosnia and Herzegovina
40 ".bb", # Barbados
41 ".bd", # Bangladesh
42 ".be", # Belgium
43 ".bf", # Burkina Faso
44 ".bg", # Bulgaria
45 ".bh", # Bahrain
46 ".bi", # Burundi
47 ".bj", # Benin
48 ".bm", # Bermuda
49 ".bn", # Brunei
50 ".bo", # Bolivia
51 ".bq", # Bonaire
52 ".br", # Brazil
53 ".bs", # Bahamas
54 ".bt", # Bhutan
55 ".bv", # Bouvet Island
56 ".bw", # Botswana
57 ".by", # Belarus
58 ".bz", # Belize
59 ".ca", # Canada
60 ".cc", # Cocos (Keeling) Islands
61 ".cd", # Democratic Republic of the Congo
62 ".cf", # Central African Republic
63 ".cg", # Republic of the Congo
64 ".ch", # Switzerland
65 ".ci", # Côte d'Ivoire
66 ".ck", # Cook Islands
67 ".cl", # Chile
68 ".cm", # Cameroon
69 ".cn", # People's Republic of China
70 ".co", # Colombia
71 ".cr", # Costa Rica
72 ".cu", # Cuba
73 ".cv", # Cape Verde
74 ".cw", # Curaçao
75 ".cx", # Christmas Island
76 ".cy", # Cyprus
77 ".cz", # Czech Republic
78 ".de", # Germany
79 ".dj", # Djibouti
80 ".dk", # Denmark
81 ".dm", # Dominica
82 ".do", # Dominican Republic
83 ".dz", # Algeria
84 ".ec", # Ecuador
85 ".ee", # Estonia
86 ".eg", # Egypt
87 ".eh", # Western Sahara
88 ".er", # Eritrea
89 ".es", # Spain
90 ".et", # Ethiopia
91 ".eu", # European Union
92 ".fi", # Finland
93 ".fj", # Fiji
94 ".fk", # Falkland Islands
95 ".fm", # Federated States of Micronesia
96 ".fo", # Faroe Islands
97 ".fr", # France
98 ".ga", # Gabon
99 ".gb", # United Kingdom
100 ".gd", # Grenada
101 ".ge", # Georgia
102 ".gf", # French Guiana
103 ".gg", # Guernsey
104 ".gh", # Ghana
105 ".gi", # Gibraltar
106 ".gl", # Greenland
107 ".gm", # The Gambia
108 ".gn", # Guinea
109 ".gp", # Guadeloupe
110 ".gq", # Equatorial Guinea
111 ".gr", # Greece
112 ".gs", # South Georgia and the South Sandwich Islands
113 ".gt", # Guatemala
114 ".gu", # Guam
115 ".gw", # Guinea-Bissau
116 ".gy", # Guyana
117 ".hk", # Hong Kong
118 ".hm", # Heard Island and McDonald Islands
119 ".hn", # Honduras
120 ".hr", # Croatia
121 ".ht", # Haiti
122 ".hu", # Hungary
123 ".id", # Indonesia
124 ".ie", # Ireland
125 ".il", # Israel
126 ".im", # Isle of Man
127 ".in", # India
128 ".io", # British Indian Ocean Territory
129 ".iq", # Iraq
130 ".ir", # Iran
131 ".is", # Iceland
132 ".it", # Italy
133 ".je", # Jersey
134 ".jm", # Jamaica
135 ".jo", # Jordan
136 ".jp", # Japan
137 ".ke", # Kenya
138 ".kg", # Kyrgyzstan
139 ".kh", # Cambodia
140 ".ki", # Kiribati
141 ".km", # Comoros
142 ".kn", # Saint Kitts and Nevis
143 ".kp", # Democratic People's Republic of Korea
144 ".kr", # Republic of Korea
145 ".kw", # Kuwait
146 ".ky", # Cayman Islands
147 ".kz", # Kazakhstan
148 ".la", # Laos
149 ".lb", # Lebanon
150 ".lc", # Saint Lucia
151 ".li", # Liechtenstein
152 ".lk", # Sri Lanka
153 ".lr", # Liberia
154 ".ls", # Lesotho
155 ".lt", # Lithuania
156 ".lu", # Luxembourg
157 ".lv", # Latvia
158 ".ly", # Libya
159 ".ma", # Morocco
160 ".mc", # Monaco
161 ".md", # Moldova
162 ".me", # Montenegro
163 ".mg", # Madagascar
164 ".mh", # Marshall Islands
165 ".mk", # Macedonia
166 ".ml", # Mali
167 ".mm", # Myanmar
168 ".mn", # Mongolia
169 ".mo", # Macau
170 ".mp", # Northern Mariana Islands
171 ".mq", # Martinique
172 ".mr", # Mauritania
173 ".ms", # Montserrat
174 ".mt", # Malta
175 ".mu", # Mauritius
176 ".mv", # Maldives
177 ".mw", # Malawi
178 ".mx", # Mexico
179 ".my", # Malaysia
180 ".mz", # Mozambique
181 ".na", # Namibia
182 ".nc", # New Caledonia
183 ".ne", # Niger
184 ".nf", # Norfolk Island
185 ".ng", # Nigeria
186 ".ni", # Nicaragua
187 ".nl", # Netherlands
188 ".no", # Norway
189 ".np", # Nepal
190 ".nr", # Nauru
191 ".nu", # Niue
192 ".nz", # New Zealand
193 ".ac.nz", # New Zealand
194 ".co.nz", # New Zealand
195 ".geek.nz", # New Zealand
196 ".gen.nz", # New Zealand
197 ".kiwi.nz", # New Zealand
198 ".maori.nz", # New Zealand
199 ".net.nz", # New Zealand
200 ".org.nz", # New Zealand
201 ".school.nz", # New Zealand
202 ".om", # Oman
203 ".pa", # Panama
204 ".pe", # Peru
205 ".com.pe", # Peru
206 ".edu.pe", # Peru
207 ".net.pe", # Peru
208 ".nom.pe", # Peru
209 ".org.pe", # Peru
210 ".pf", # French Polynesia
211 ".pg", # Papua New Guinea
212 ".ph", # Philippines
213 ".pk", # Pakistan
214 ".pl", # Poland
215 ".pm", # Saint-Pierre and Miquelon
216 ".pn", # Pitcairn Islands
217 ".pr", # Puerto Rico
218 ".ps", # Palestine[27]
219 ".pt", # Portugal
220 ".pw", # Palau
221 ".com.py", # Paraguay
222 ".coop.py", # Paraguay
223 ".edu.py", # Paraguay
224 ".net.py", # Paraguay
225 ".org.py", # Paraguay
226 ".qa", # Qatar
227 ".re", # Réunion
228 ".ro", # Romania
229 ".rs", # Serbia
230 ".ru", # Russia
231 ".rw", # Rwanda
232 ".sa", # Saudi Arabia
233 ".sb", # Solomon Islands
234 ".sc", # Seychelles
235 ".sd", # Sudan
236 ".se", # Sweden
237 ".sg", # Singapore
238 ".sh", # Saint Helena
239 ".si", # Slovenia
240 ".sj", # Svalbard and Jan Mayen Islands
241 ".sk", # Slovakia
242 ".sl", # Sierra Leone
243 ".sm", # San Marino
244 ".sn", # Senegal
245 ".so", # Somalia
246 ".sr", # Suriname
247 ".ss", # South Sudan
248 ".st", # São Tomé and Príncipe
249 ".su", # Soviet Union
250 ".sv", # El Salvador
251 ".sx", # Sint Maarten
252 ".sy", # Syria
253 ".sz", # Swaziland
254 ".tc", # Turks and Caicos Islands
255 ".td", # Chad
256 ".tf", # French Southern and Antarctic Lands
257 ".tg", # Togo
258 ".th", # Thailand
259 ".tj", # Tajikistan
260 ".tk", # Tokelau
261 ".tl", # East Timor
262 ".tm", # Turkmenistan
263 ".tn", # Tunisia
264 ".to", # Tonga
265 ".tp", # East Timor
266 ".tr", # Turkey
267 ".tt", # Trinidad and Tobago
268 ".tv", # Tuvalu
269 ".tw", # Taiwan
270 ".tz", # Tanzania
271 ".ua", # Ukraine
272 ".ug", # Uganda
273 ".ac.uk", # United Kingdom
274 ".ltd.uk", # United Kingdom
275 ".me.uk", # United Kingdom
276 ".net.uk", # United Kingdom
277 ".nhs.uk", # United Kingdom
278 ".org.uk", # United Kingdom
279 ".plc.uk", # United Kingdom
280 ".sch.uk", # United Kingdom
281 ".us", # United States of America
282 ".uy", # Uruguay
283 ".uz", # Uzbekistan
284 ".va", # Vatican City
285 ".vc", # Saint Vincent and the Grenadines
286 ".ve", # Venezuela
287 ".vg", # British Virgin Islands
288 ".vi", # United States Virgin Islands
289 ".vn", # Vietnam
290 ".vu", # Vanuatu
291 ".wf", # Wallis and Futuna
292 # Needs extra processing to avoid false positives
293 #".ws", # Samoa
294 ".ye", # Yemen
295 ".yt", # Mayotte
296 ".za", # South Africa
297 ".zm", # Zambia
298 ".zw", # Zimbabwe
299 ".xn--lgbbat1ad8j", # الجزائر.
300 ".xn--y9a3aq", # .հայ
301 ".xn--54b7fta0cc", # .বাংলা
302 ".xn--90ais", # .бел
303 ".xn--90ae", # .бг[38]
304 # Needs extra processing to avoid false positives
305 #".xn--fiqs8s", # .中国
306 # Needs extra processing to avoid false positives
307 #".xn--fiqz9s", # .中國
308 ".xn--wgbh1c", # مصر.
309 ".xn--e1a4c", # .ею
310 ".xn--node", # .გე
311 ".xn--qxam", # .ελ[38]
312 ".xn--j6w193g", # .香港
313 ".xn--h2brj9c", # .भारत
314 ".xn--mgbbh1a71e", # بھارت.
315 ".xn--fpcrj9c3d", # .భారత్
316 ".xn--gecrj9c", # .ભારત
317 ".xn--s9brj9c", # .ਭਾਰਤ
318 ".xn--xkc2dl3a5ee0h", # .இந்தியா
319 ".xn--45brj9c", # .ভারত
320 #".ಭಾರತ", # India
321 #".ഭാരതം", # India
322 #".ভাৰত", # India
323 #".ଭାରତ", # India
324 ".xn--mgba3a4f16a", # ایران.
325 ".xn--mgbtx2b", # عراق.
326 ".xn--mgbayh7gpa", # الاردن.
327 ".xn--80ao21a", # .қаз
328 ".xn--mix082f", # .澳门
329 ".xn--mix891f", # .澳門
330 ".xn--d1alf", # .мкд
331 ".xn--mgbx4cd0ab", # مليسيا.
332 ".xn--l1acc", # .мон
333 ".xn--mgbc0a9azcg", # المغرب.
334 ".xn--mgb9awbf", # عمان.
335 ".xn--mgbai9azgqp6j", # پاکستان.
336 ".xn--ygbi2ammx", # فلسطين.
337 ".xn--wgbl6a", # قطر.
338 ".xn--p1ai", # .рф
339 ".xn--mgberp4a5d4ar", # السعودية.
340 ".xn--90a3ac", # .срб
341 ".xn--yfro4i67o", # .新加坡
342 ".xn--clchc0ea0b2g2a9gcd", # .சிங்கப்பூர்
343 ".xn--3e0b707e", # .한국
344 ".xn--fzc2c9e2c", # .ලංකා
345 ".xn--xkc2al3hye2a", # .இலங்கை
346 ".xn--mgbpl2fh", # سودان.
347 ".xn--ogbpf8fl", # سورية.
348 ".xn--kprw13d", # .台湾
349 ".xn--kpry57d", # .台灣
350 ".xn--o3cw4h", # .ไทย
351 ".xn--pgbs0dh", # تونس.
352 ".xn--j1amh", # .укр
353 ".xn--mgbaam7a8h", # امارات.
354 ".xn--mgb2ddes", # اليمن.
355 }
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 tld = {
21 ".academy", # academic institutes
22 ".accountant", # accountants and accounting firms
23 ".accountants", # accountants and accounting firms
24 ".active", # general
25 ".actor", # actors
26 ".adult", # adult entertainment (pornography)
27 ".aero", # air-transport industry
28 ".agency", # business associations
29 ".airforce", # defense contractors
30 ".apartments", # apartments
31 ".app", # Phone apps
32 ".archi", # architects and architect firms[42]
33 ".army", # defense contractors
34 ".associates", # business associations
35 ".attorney", # attorneys and legal organizations
36 ".auction", #
37 ".audio", # stereo/sound systems, music
38 ".autos", #
39 ".band", #
40 ".bar", # Bars and related industry
41 ".bargains", # coupons and online sellers
42 ".beer", # breweries and beer aficionados
43 ".best", #
44 ".bid", # auctions
45 ".bike", # bicycles
46 ".bingo", # bingo
47 ".bio", # biodiversity, biographies
48 ".biz", # business
49 ".black", # those who like the color black[47]
50 ".blackfriday", # Black Friday, retail
51 ".blog", # Blogs
52 ".blue", # those who like the color blue[49]
53 ".boo", # ghosts and spooky business
54 ".boutique", # specialized businesses
55 ".build", # construction industry
56 ".builders", # construction workers
57 ".business", # businesses
58 ".buzz", # marketing and social networking
59 ".cab", # cabs and taxi companies
60 ".camera", # camera-related businesses
61 ".camp", # camps and camping
62 ".cancerresearch", # Organizations, research institutes and individuals interested in ending cancer through research [51]
63 ".capital", # financial firms
64 ".cards", # general
65 ".care", # healthcare industry
66 ".career", #
67 ".careers", # Employment
68 ".cash", # financial
69 ".casino", # casinos
70 ".catering", # Food service
71 ".center", # general
72 ".ceo", # CEOs
73 ".channel", #
74 ".chat", # online chat
75 ".cheap", # Resellers
76 ".christmas", # Christmas
77 ".church", # churches
78 ".city", # general
79 ".claims", # retail, auctions
80 ".cleaning", # Cleaning services
81 ".click", #
82 ".clinic", # healthcare clinics
83 ".clothing", # Apparel
84 ".cloud", #
85 ".club", # groups, organizations, assemblies, communities, general
86 ".coach", # travel (flights and motor coaches)
87 ".codes", # computer and/or encryption code enthusiasts
88 ".coffee", # cafés and coffee aficionados
89 ".college", # Educational
90 ".community", # social groups, neighborhoods
91 ".company", # business associations
92 ".computer", # Technology
93 ".condos", # Real estate
94 ".construction", # Construction industry
95 ".consulting", # hired advisors
96 ".contractors", # Remodeling and independent businesses
97 ".cooking", # sharing recipes
98 ".cool", # General interests
99 ".coop", # cooperatives
100 ".country", # general
101 ".coupons", # coupons
102 ".credit", # Financial institutions
103 ".creditcard", # Financial institutions
104 ".cricket", # cricket
105 ".cruises", # cruise businesses and travel
106 ".dad", # families
107 ".dance", # Dance studios and companies
108 ".date", # online dating
109 ".dating", # online dating
110 ".day", # general
111 ".deals", # online shopping and couponing
112 ".degree", # general
113 ".delivery", # general
114 ".democrat", # Democratic Party politics
115 ".dental", # dentists
116 ".dentist", # dentists
117 ".design", # graphic art and fashion
118 ".diamonds", # diamond and jewelry industry
119 ".diet", #
120 ".digital", # general
121 ".direct", # general
122 ".directory", # general directory
123 ".discount", # general
124 ".dog", # dog stores and owners
125 ".domains", # domain registries
126 ".download", # technology
127 ".eat", # restaurants and foodies
128 ".education", # educational institutes
129 ".email", # email
130 ".energy", # energy industry and marketing
131 ".engineer", # engineers and engineering firms
132 ".engineering", # engineering firms
133 ".equipment", # equipment-related businesses
134 ".esq", # lawyers, law firms, legal professionals
135 ".estate", # real estate businesses
136 ".events", # happenings
137 ".exchange", # generic trade
138 ".expert", # generic expertise
139 ".exposed", # general interest
140 ".express", # shipping
141 ".fail", # general
142 ".faith", # religion and churches
143 ".family", # families
144 ".fans", # general
145 ".farm", # farms and agriculture
146 ".fashion", # clothing industry
147 ".feedback", #
148 ".finance", # financial
149 ".financial", # financial
150 ".fish", # fishing businesses, sports, and interests
151 ".fishing", # fishing businesses, sports, and interests
152 ".fit", # Fitness and exercise
153 ".fitness", # Fitness and exercise
154 ".flights", # airline businesses and travel
155 ".florist", # florists
156 ".flowers", # florists and gardens
157 ".fly", # travel
158 ".foo", # web development
159 ".football", # soccer and American football
160 ".forsale", # online retail
161 ".foundation", # charitable organizations
162 ".fund", # financial
163 ".furniture", # furniture businesses
164 ".fyi", # "for your information"
165 ".gallery", # photo and art galleries
166 ".garden", # gardening
167 ".gift", # gift-giving
168 ".gifts", # gift-giving
169 ".gives", # charities and gift-giving
170 ".glass", # window sales and repairs
171 ".global", # general
172 ".gold", # gold and luxury
173 ".golf", # golf
174 ".gop", # Republican Party politics
175 ".graphics", # graphics
176 ".green", # the environmentally-focused
177 ".gripe", # opinion sites
178 ".guide", # help sites
179 ".guitars", # Guitars
180 ".guru", # generic expertise
181 ".healthcare", # healthcare industry
182 ".help", # help sites
183 ".here", # generic geographic
184 ".hiphop", # Hip hop culture
185 ".hiv", # AIDS and HIV
186 ".hockey", # hockey
187 ".holdings", # real estate or financial business
188 ".holiday", # holiday gift industry
189 ".homes", # individuals interested in real estate and home improvement
190 ".horse", # horse-related businesses and interest
191 ".host", # network companies
192 ".hosting", #
193 ".house", # real estate and construction businesses
194 ".how", # how-to guides
195 ".info", # information
196 ".ing", # Verbal suffix: e.g., "jump.ing".
197 ".ink", # creative printing or tattooing[61]
198 ".institute[62]", #
199 ".insure", # Insurance companies
200 ".international", # international entities
201 ".investments", # financial
202 ".jewelry", # jewelry stores
203 ".jobs", # Employment
204 ".kim", # people named Kim (given name)
205 ".kitchen",
206 ".land", # real estate
207 ".lawyer", # lawyers and legal organizations
208 ".lease", # financing
209 ".legal", # lawyers and legal organizations
210 ".lgbt", # the lesbian, gay, bisexual and transgender community
211 ".life", # general
212 ".lighting", # lighting
213 ".limited", # general
214 ".limo", # limousine businesses
215 ".link", # connecting to information[65]
216 ".loan", # banks and lenders
217 ".loans", # banks and lenders
218 ".lol", # LOL: laughing out loud
219 ".lotto", #
220 ".love", # dating sites
221 ".luxe", #
222 ".luxury", # businesses catering to the wealthy
223 ".management", # business management
224 ".market", # marketing services and retailers
225 ".marketing", # marketing services
226 ".markets", # financial and stock markets
227 ".mba", # Masters in Business Administration
228 ".media", # general media interests
229 ".meet", # social gatherings, meeting new people
230 ".meme", # Internet memes
231 ".memorial", # memorial sites
232 ".men", # men
233 ".menu", # restaurants
234 ".mobi", # mobile devices
235 ".moe", # Japanese otaku culture
236 ".money",
237 ".mortgage", # mortgage lenders
238 ".motorcycles", # motorcycles
239 ".mov", # Digital video
240 ".movie", # movies and cinemas
241 ".museum", # museums
242 ".name", # individuals, by name
243 ".navy", # defense contractors
244 ".network", # general
245 ".new", # general
246 ".news", # news sites
247 ".ngo", # Non-governmental organizations.
248 ".ninja",
249 ".one", # general
250 ".ong", # Non-governmental organizations.
251 ".onl",
252 ".online", # generic
253 ".ooo", # general
254 ".organic", # organic gardeners, farmers, foods, etc.
255 ".partners", # businesses
256 ".parts", # manufacturing and consumer auto
257 ".party", # nightclubs and social gatherings
258 ".pharmacy", # pharmacies
259 ".photo", # photography and photo-sharing
260 ".photography", # photography and photo-sharing
261 ".photos", # photography and photo-sharing
262 ".physio", # physical therapists
263 ".pics", # photography and photo-sharing
264 ".pictures", # photography and photo-sharing
265 ".pid", #
266 ".pink", # those who like the color pink
267 ".pizza", # pizza parlors
268 ".place", # general
269 ".plumbing", # plumbing businesses
270 ".plus", # generic
271 ".poker", # Poker players and sites
272 ".porn", # adult entertainment (pornography)
273 ".post", # postal services
274 ".press", # publishing and journalism
275 ".pro", # professions/professionals
276 ".productions", # studio/art businesses
277 ".prof", # Professors, teachers and learning
278 ".properties", # real estate
279 ".property", # real estate
280 ".qpon", # coupons
281 ".racing", # racing
282 ".recipes", # recipes and cooking
283 ".red", # those who like the color red[74]
284 ".rehab",
285 ".ren", # Renren users
286 ".rent",
287 ".rentals", # short-term ownership
288 ".repair", # general repair/maintenance businesses
289 ".report", # business services
290 ".republican", # Republican Party politics
291 ".rest", # Restaurants and related industry
292 ".review", # public reviews
293 ".reviews", # public reviews
294 ".rich", # businesses catering to the wealthy
295 ".rip", # memorial sites[76]
296 ".rocks", # general
297 ".rodeo", # Rodeo interest
298 ".rsvp", # Invitations and replies
299 ".run", # running and jogging
300 ".sale", # retail
301 ".school", # schools
302 ".science", # science-related sites
303 ".services", # business services
304 ".sex", # adult entertainment (pornography)
305 ".sexy", # adult entertainment
306 ".shoes", # shoes
307 ".show", # entertainment and vlogs
308 ".singles", # online dating
309 ".site", # general
310 ".soccer", # soccer
311 ".social", # general interest
312 ".software", # computer software
313 ".solar", # solar-power
314 ".solutions", # business services
315 ".space", # as a creative space
316 ".studio", # art, fitness, & entertainment
317 ".style", # fashion
318 ".sucks", # gripe sites
319 ".supplies", # manufacturing industries
320 ".supply", # manufacturing industries
321 ".support", # help pages
322 ".surf", # surfing
323 ".surgery", # healthcare industry
324 ".systems", # technology
325 ".tattoo", # tattoo aficionados
326 ".tax", # financial
327 ".taxi", # taxi services
328 ".team", # team sports
329 ".tech", # technology
330 ".technology", # technology
331 ".tel", # Internet communication services
332 ".tennis", # tennis
333 ".theater", # theaters and cinemas
334 ".tips", # general help topics
335 ".tires", # tire manufacturers
336 ".today", # general
337 ".tools", # manufacturing industries
338 ".top", # general
339 ".tours", # tourism
340 ".town", # generic geographic
341 ".toys", # toy businesses
342 ".trade", # businesses
343 ".training", # training and how-tos
344 ".travel", # travel and tourism industry related sites
345 ".university", # young adults, university life
346 ".vacations", # travel
347 ".vet", # veterans and veterinarians
348 ".video", # video sharing
349 ".villas", # real estate and/or travel businesses
350 ".vision", # eye-care businesses
351 ".vodka", # Vodka-related businesses and interest
352 ".vote", # democratic elections and campaign websites
353 ".voting", # polling sites
354 ".voyage", # travel
355 ".wang", # general
356 ".watch",
357 ".webcam", # Web cam shows and video sharing
358 ".website", # general
359 ".wed", # engaged couples and wedding-oriented businesses
360 ".wedding", # wedding-oriented businesses
361 ".whoswho", # general
362 ".wiki", # wikis
363 ".win", # games, Microsoft Windows
364 ".wine", # Wine
365 ".work", # general
366 ".works", # general
367 ".world", # general
368 ".wtf", # general
369 ".xxx", # adult entertainment (pornography)
370 ".xyz", # general
371 ".yoga", # yoga
372 ".zone", # general
373 ".maison", # "house"
374 ".abogado", # "lawyer"
375 ".gratis", # "free"
376 ".futbol", # soccer
377 ".juegos", # "games"
378 ".soy", # "I am"
379 ".tienda",
380 ".uno", # "one", for websites targeting Spanish speaking consumers
381 ".viajes", # "travel"
382 ".haus", # "house"
383 ".immobilien", # "real estate"
384 ".jetzt", # "now"
385 ".kaufen", # "buy"
386 ".reise", # "travel"
387 ".reisen", # "traveling"
388 ".schule", # "school"
389 ".versicherung", # "insurance"
390 ".desi", # Hindi for the peoples and cultures of South Asia
391 ".shiksha",
392 ".casa", # "house"
393 ".cafe", # "café", "coffee shop", "coffee"
394 ".immo", # French, German, Dutch[citation needed], and Italian abbreviation for "real estate"
395 ".moda", # "fashion"
396 ".voto", # "vote", for election and campaign websites
397 ".bar", # bars and pubs
398 ".bank", # banks
399 ".coop", # cooperatives
400 ".enterprises", # business associations
401 ".industries", # industrial businesses
402 ".institute", # established business associations
403 ".ltda", # companies in South America
404 ".pub", # bars and pubs
405 ".realtor", # realtors
406 ".reit", # real estate investment trusts
407 ".rest", # restaurants
408 ".restaurant", # restaurants
409 ".sarl", # Société à responsabilité limitée, Francophone Limited liability company
410 ".ventures", # funding for start-ups
411 ".xn--4gbrim", # موقع.
412 ".xn--ngbc5azd", # شبكة.
413 ".xn--mgbab2bd", # بازار.
414 ".xn--q9jyb4c", # .みんな
415 ".xn--3ds443g", # .在线
416 ".xn--fiq228c5hs",
417 ".xn--6frz82g",
418 ".xn--ses554g", # .网址
419 ".xn--io0a7i", # .网络
420 ".xn--55qx5d", # .公司
421 ".xn--czru2d", # .商城
422 ".xn--nqv7f", # .机构
423 ".xn--6qq986b3xl", # .我爱你
424 ".xn--czr694b", # .商标
425 ".xn--rhqv96g", # .世界
426 ".xn--3bst00m", # .集团
427 ".xn--d1acj3b", # .дети
428 ".xn--80asehdb", # .онлайн
429 ".xn--c1avg", # .орг
430 ".xn--80aswg", # .сайт
431 ".xn--i1b6b1a6a2e", # .संगठन
432 }
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 tld = {
21 ".capetown", # Cape Town, South Africa
22 ".durban", # Durban, South Africa
23 ".joburg", # Johannesburg, South Africa
24 ".asia", # Asia-Pacific region
25 ".krd", # Kurdistan
26 ".nagoya", # Nagoya, Japan
27 ".okinawa", # Okinawa, Japan
28 ".ryukyu", # Ryukyu Islands, Japan
29 ".taipei", # Taipei, Taiwan
30 ".tatar", # Tatar peoples and places
31 ".tokyo", # Tokyo, Japan
32 ".yokohama", # Yokohama, Japan
33 ".alsace", # Alsace, France
34 ".amsterdam", # Amsterdam, The Netherlands
35 ".barcelona", # Barcelona, Spain
36 ".bayern", # Bavaria, Germany
37 ".berlin", # Berlin, Germany
38 ".brussels", # Brussels, Belgium
39 ".budapest", # Budapest, Hungary
40 ".bzh", # Brittany, France
41 ".cat", # Catalonia; Catalan language and culture
42 ".cologne", # Cologne, Germany
43 ".corsica", # Corsica, France
44 ".cymru", # Wales
45 ".eus", # Basque, Spain and France
46 ".frl", # Friesland
47 ".gal", # Galiza, Spain
48 ".gent", # Ghent, Belgium
49 ".hamburg", # Hamburg, Germany
50 ".irish", # Ireland; global Irish community
51 ".koeln", # Cologne, Germany
52 ".london", # London, United Kingdom
53 ".madrid", # Madrid, Spain
54 ".moscow", # Moscow, Russia
55 ".nrw", # North Rhine-Westphalia, Germany
56 ".paris", # Paris, France
57 ".ruhr", # Ruhr, Germany
58 ".saarland", # Saarland, Germany
59 ".scot", # Scotland
60 ".tirol", # Tyrol, now split between Austria and Italy
61 ".vlaanderen", # Flanders, Belgium
62 ".wales", # Wales
63 ".wien", # Vienna, Austria
64 ".zuerich", # Zurich, Switzerland
65 ".miami", # Miami, USA
66 ".nyc", # New York City, USA
67 ".quebec", # Québec, Canada
68 ".vegas", # Las Vegas, NV, USA
69 ".kiwi", # New Zealanders (a.k.a. kiwis)
70 ".melbourne", # Melbourne, Australia
71 ".sydney", # Sydney, Australia
72 ".lat", # Latin America
73 ".rio", # Rio de Janeiro, Brazil
74 ".xn--1qqw23a",
75 ".xn--80adxhks", # .москва
76 }
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 tld = {
21 ".com",
22 ".org",
23 ".net",
24 ".int",
25 ".edu",
26 ".gov",
27 ".mil",
28 ".arpa",
29 }
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 tld = {
21 ".h4ck.me",
22 # A sample from: https://freedns.afraid.org/domain/registry/
23 ".0x.no",
24 ".100mountain.com",
25 ".10x.es",
26 ".120v.ac",
27 ".1337.cx",
28 ".150watt.ru",
29 ".24-7.ro",
30 ".2fine.de",
31 ".2ku.ru",
32 ".2p.fm",
33 ".3c4d.net",
34 ".3dxtras.com",
35 ".3n.cc",
36 ".3trust.com",
37 ".404.mn",
38 ".4040.idv.tw",
39 ".49b.uk",
40 ".4twenty.us",
41 ".688.org",
42 ".69.mu",
43 ".7s.com.tr",
44 ".8634.su",
45 ".a01.ca",
46 ".abuser.eu",
47 ".ac2.ac",
48 ".adagio.tw",
49 ".agila.com.br",
50 ".agropeople.ru",
51 ".aintno.info",
52 ".airlinemeals.net",
53 ".ais-salzburg.at",
54 ".ajctm.ac",
55 ".alagrupa.com",
56 ".albertn.ru",
57 ".alexlan.org",
58 ".all.my",
59 ".allez.la",
60 ".allisons.org",
61 ".allowed.org",
62 ".alveaelectric.com",
63 ".americajhon.com.pe",
64 ".americhip.ru",
65 ".amurt.org.uk",
66 ".anal-slavery.com",
67 ".ananda.net.ve",
68 ".aneisa.com",
69 ".annaffiare.org",
70 ".anonymous.lv",
71 ".antongorbunov.com",
72 ".antrak.org.tr",
73 ".apsis.ch",
74 ".arcprojects.ru",
75 ".art-works.ro",
76 ".asenov.ru",
77 ".asianfreshproduce.com",
78 ".ask2ask.com",
79 #".aspserver.net",
80 ".astrabus.ru",
81 ".asu.mx",
82 ".auraria.org",
83 ".australia.ai",
84 ".austria-escort.at",
85 ".awiki.org",
86 ".ax.it",
87 ".ax.lt",
88 ".b33r.us",
89 ".babypos.hk",
90 ".bad.mn",
91 ".bagus.org",
92 ".bakli.ru",
93 ".baltijalv.lv",
94 ".bandweite.de",
95 ".barge-online.com",
96 ".beerprojects.com",
97 ".benjamin.it",
98 ".bep.co.id",
99 ".bertmillernatureclub.org",
100 ".bestforever.com",
101 ".bgdsupport.com",
102 ".bhms.com",
103 ".bigbox.info",
104 ".bil-nasalab.com",
105 ".bine.me",
106 ".biotx.biz",
107 ".birdriver.org",
108 ".biz.tm",
109 ".blinklab.com",
110 ".blizzie.net",
111 ".blogs.or.id",
112 ".bloom.us",
113 ".blue-jade.net",
114 ".bluemoon.com.vn",
115 ".bmvl.ru",
116 ".bnaz.org",
117 ".bnpt.go.id",
118 ".bot.nu",
119 ".bouncers4rent.com",
120 ".boxathome.net",
121 ".brawlcustommusic.com",
122 ".byte4byte.com",
123 ".bzpo.ru",
124 ".caledonianlab.com",
125 ".catsy.org",
126 ".caturelang.co.id",
127 ".cc.net.br",
128 ".ccc.org.mx",
129 ".ccmissoula.com",
130 ".ccode.ml",
131 ".cda.md",
132 ".cdvi.ro",
133 ".celebsplay.com",
134 ".chebicon.ru",
135 ".chickenkiller.com",
136 ".chipmeup.com",
137 ".clink.biz",
138 ".cloudwatch.net",
139 ".cnr.com.pk",
140 ".cnstefancelmare.ro",
141 ".coalnet.ru",
142 ".colegiotamandare.g12.br",
143 ".colegiotorrevilano.es",
144 ".compuinter.com",
145 ".computersforpeace.net",
146 ".compy.ca",
147 ".continent.kz",
148 ".coreytech.com",
149 ".cpct.com",
150 ".cpia.org.ar",
151 ".cr.rs",
152 ".crabdance.com",
153 ".crackedsidewalks.com",
154 ".crazycat.ro",
155 ".cspro.biz",
156 ".csproject.org",
157 ".custom-gaming.net",
158 ".cut3.name",
159 ".cw03.ru",
160 ".cys.ru",
161 ".dagz.ru",
162 ".dalk.ru",
163 ".dark-byte.net",
164 ".darknigger.com",
165 ".darkworlds.org",
166 ".datasource.ro",
167 ".ddanciu.ro",
168 ".ddos.im",
169 ".dearabba.org",
170 ".death-by-monkeys.com",
171 ".dellsale.ru",
172 ".deusexmachina.org",
173 ".dhm.ro",
174 ".digitalgroupe.com",
175 ".diipl.com",
176 ".diipl.in",
177 ".divakeramika.com",
178 ".dmtr.ru",
179 ".dnet.hu",
180 ".d-n-s.name",
181 ".d-n-s.org.uk",
182 ".dob.jp",
183 ".donkeyhot.net",
184 ".doomstuff.com",
185 ".doskapozora.com",
186 ".dp76.com",
187 ".dream.org.il",
188 ".drunkensailor.org",
189 ".dyn.ch",
190 ".dyn.mk",
191 ".dynet.com",
192 ".e.co.za",
193 ".echoparklake.com",
194 ".e-data.com.tr",
195 ".edsonide.med.br",
196 ".e-education.hk",
197 ".elchemi.com",
198 ".elitter.net",
199 ".e-m-a-i-l.org",
200 ".emakc.ru",
201 ".embeddedonline.org",
202 ".empresastaylor.com",
203 ".encontronapracinha.com.br",
204 ".endlessmovie.com",
205 ".enemyterritory.org",
206 ".entermypicks.com",
207 ".eolicatalinay.cl",
208 ".epbsoft.com",
209 ".epicgamer.org",
210 ".erke.biz.tr",
211 ".erki.net",
212 ".e-sluts.net",
213 ".essexregional.org",
214 ".etgr.ru",
215 ".eurotank.ro",
216 ".eva.hk",
217 ".everton.com",
218 ".evilrouter.com",
219 ".evils.in",
220 ".evs.net.br",
221 ".eye.rs",
222 ".ezfill.com",
223 ".ezmangaforums.com",
224 ".ezxdev.org",
225 ".fairuse.org",
226 ".falcongreen.com",
227 ".farted.net",
228 ".fasl.info",
229 ".fatdiary.org",
230 ".fearpenguins.com",
231 ".fedea.com.ar",
232 ".fin-tech.com",
233 #".fisierulmeu.ro",
234 ".fivepals.com",
235 ".flat4free.com",
236 ".flazzard.com",
237 ".floripalondon.com",
238 ".fol.cl",
239 ".forss.to",
240 #".fr.to",
241 ".freebookspot.es",
242 ".freesa.org",
243 ".ftp.sh",
244 ".fuck-off-o.org",
245 ".funkar.nu",
246 ".galipan.net.ve",
247 ".gally.jp",
248 ".ganino.com",
249 ".garmanage.com",
250 ".gayhotelsgreece.com",
251 ".gayuser.info",
252 ".gebish.org",
253 ".gerastar.ru",
254 ".ghostnation.org",
255 ".gigaportal.pl",
256 ".giveawaylisting.com",
257 ".givemefish.com",
258 ".god.jp",
259 ".golf-club.ro",
260 ".good.one.pl",
261 ".good-newz.org",
262 ".gorila.ro",
263 ".gparente.net.br",
264 ".grandmasgossip.com",
265 ".gtk.cl",
266 ".guardz.ru",
267 ".guild-site.com",
268 ".gurcanozturk.com",
269 ".gw.lt",
270 ".h0stname.net",
271 ".h4ck.me",
272 ".hacked.jp",
273 ".hackquest.com",
274 ".hackrz.org",
275 ".haki.hk",
276 ".hamradioonline.net",
277 ".hamshack.info",
278 ".handfolding.com",
279 ".hanisch.com",
280 ".happyforever.com",
281 ".happyminecraft.com",
282 ".happyminecraft.net",
283 ".hashcube.com",
284 ".hayeshelp.com",
285 ".hbmc.net",
286 ".heroinewarrior.com",
287 ".hiddencorner.org",
288 ".hijaxdesigns.com",
289 ".hin.tw",
290 ".hiprinter.com",
291 ".hitremixes.com",
292 ".hmail.us",
293 ".hmao.pro",
294 ".holylandshop.ru",
295 ".home.kg",
296 ".homelinuxserver.org",
297 ".homenet.org",
298 ".h-o-s-t.name",
299 ".host2go.net",
300 ".hpc.tw",
301 ".hs.vc",
302 ".hulichicken.com",
303 ".hunnur.com",
304 ".iantaylor.com",
305 ".iceblaze.com",
306 ".icfar.com",
307 ".icx.ro",
308 ".id.web.id",
309 ".id-fb.fm",
310 ".ig42.org",
311 ".ignorelist.com",
312 ".iiiii.info",
313 ".ilgizvalinurov.ru",
314 #".ilkor.com",
315 ".imagespost.com",
316 ".imagetemplate.com",
317 ".imagetemplate.net",
318 ".iminecraft.se",
319 #".imly.org",
320 ".india.sh",
321 ".inedelya.ru",
322 ".inet2.org",
323 ".inflict.us",
324 ".info.gf",
325 ".info.tm",
326 ".innograph.co.id",
327 ".intec.es",
328 ".ionexusa.com",
329 ".ipv6.la",
330 ".ircr.info",
331 ".isltest.net",
332 ".ismoke.hk",
333 ".istanbulsafak.com",
334 ".i-t.me",
335 ".it-share.ro",
336 ".iu4ever.org",
337 ".ivc.cc",
338 ".ivc.org.ar",
339 ".ivi.pl",
340 ".ixx.io",
341 ".iz.rs",
342 ".javafaq.nu",
343 ".jcor.ca",
344 ".jedimasters.net",
345 ".jerkface.net",
346 ".jesus.si",
347 ".jobvolume.bg",
348 ".joe.dj",
349 ".joiavip.com.br",
350 ".jpfiles.eu",
351 ".juliacake.com.vn",
352 ".jumpingcrab.com",
353 ".jundy.org",
354 ".k.vu",
355 ".k22.su",
356 ".kadirpolat.net.tr",
357 ".kalbas.com.vn",
358 ".kaleebso.com",
359 ".kanda.ru",
360 ".kaohsiung.tv",
361 ".kawa-kun.com",
362 ".kck-saratov.ru",
363 ".kein.hk",
364 ".kiani.com",
365 ".kidgame.ru",
366 ".kir22.ru",
367 ".ko.tl",
368 ".kompaniet.nu",
369 ".kopi.co.id",
370 ".krash.net",
371 ".ksk-saratov.ru",
372 ".kyrgyzstan.kg",
373 ".l5.ca",
374 ".lanas.cl",
375 ".lazydalmatian.com",
376 ".lee.mx",
377 ".leecantu.com",
378 ".legalmusicsearch.com",
379 ".leitud.ee",
380 ".leonardocastano.com.ar",
381 ".lex.mn",
382 ".linkin.tw",
383 ".linux70.ru",
384 ".livewave.ru",
385 ".logisoft-cy.com",
386 ".logos.g12.br",
387 ".lolk.org",
388 ".lovethosetrains.com",
389 #".loyo.biz",
390 ".luckyweaving.com",
391 ".lwts.ru",
392 ".macrofox.org",
393 ".macsauto-indonesia.com",
394 ".madhacker.biz",
395 ".maersoft.com.ar",
396 ".make.com.ar",
397 ".makny.us",
398 ".malam.or.id",
399 ".maluwilz.lv",
400 ".marieblazek.com",
401 ".mashyk.ru",
402 ".mcemerald.ro",
403 ".mcsoft.org",
404 ".medicost.org",
405 ".megamovs.com",
406 ".megatele.ru",
407 ".menpera.go.id",
408 ".mett.ru",
409 ".mikata.ru",
410 ".mindhackers.org",
411 ".mine.bz",
412 ".minecraftnoob.com",
413 ".minecraftr.us",
414 ".m-kopa.net",
415 ".mm.my",
416 ".moo.com",
417 ".moonangel.com",
418 ".mooo.com",
419 ".mooo.info",
420 ".morganisageek.org",
421 ".movdivx.com",
422 ".move2nz.com",
423 ".movister.ru",
424 ".mp3real.ru",
425 ".mtrstore.com",
426 ".multicop.com.ar",
427 ".musterihizmetleri.com",
428 ".mwop.net",
429 ".my.to",
430 ".mybrewbuddies.com",
431 ".mychild.ug",
432 ".mycloud.bz",
433 ".mylogisoft.com",
434 ".mysaol.com",
435 ".myxop.com",
436 ".nard.ca",
437 ".naru.to",
438 #".nashvillerollergirls.com",
439 ".nav.co.id",
440 ".nedvighimost-sochi.ru",
441 ".neogene.ru",
442 ".n-e-t.name",
443 ".netlord.de",
444 ".netmask.ca",
445 ".nevalain.ru",
446 ".nevskayaratusha.ru",
447 ".newca.org",
448 ".nhance.com",
449 ".nlpd.net.au",
450 ".nnc.ro",
451 ".nonze.ro",
452 ".notici.as",
453 ".novgaz-rzn.ru",
454 ".now.im",
455 ".nrp.com.np",
456 ".ns22.ru",
457 ".nx.tc",
458 ".oganilirkab.go.id",
459 ".ohbah.com",
460 ".ohi.tw",
461 ".okzk.com",
462 ".oldrussianmagic.com",
463 ".olelukoie.ru",
464 ".olife.org",
465 ".oneindonesia.co.id",
466 ".oo.fi",
467 #".openoffcampus.com",
468 ".opensrc.mx",
469 ".opris.at",
470 ".optimas.co.id",
471 ".orenznakomstva.ru",
472 ".ormy.ru",
473 ".orskkino.ru",
474 ".packetflood.net",
475 ".packeting.eu",
476 ".parikh.net",
477 ".pass.fm",
478 ".patelmortgage.com",
479 ".pce-cihazlari.com.tr",
480 ".pckf.com",
481 ".peachyweb.com",
482 ".pedie.info",
483 ".philipkingsleyshop.ru",
484 ".photo-cult.com",
485 ".photo-frame.com",
486 ".php-dev.net",
487 ".pics.mu",
488 ".pii.at",
489 ".piki.si",
490 ".pixelfucker.com",
491 ".play.ai",
492 ".playfv.com",
493 #".playop.net",
494 ".plnntt.co.id",
495 ".plwgroup.com",
496 ".pntl.tl",
497 ".pogramkran.net",
498 ".polissya.eu",
499 ".porngo.at",
500 ".port0.org",
501 ".portalindustries.org",
502 ".possessed.us",
503 ".priamaakcia.sk",
504 ".privatedns.org",
505 ".privateimport.jp",
506 ".procare.co.id",
507 ".profinet.ro",
508 ".progr.am",
509 ".propharma.co.id",
510 ".prostore.ru",
511 ".psp-moscow.com",
512 ".psybnc.org",
513 #".publicserviceclub.com",
514 ".punked.us",
515 ".pwnz.org",
516 ".qc.to",
517 ".qlbv.vn",
518 ".qualirede.com.br",
519 ".quannhacvang.com",
520 ".queerline.de",
521 ".radioamator.ro",
522 ".radiogirl.fm",
523 ".raspberryip.com",
524 ".raspberryip.org",
525 ".rbb.org",
526 ".rcrcc.ca",
527 ".reason.org.nz",
528 ".recyclesolutionsllc.com",
529 ".remoteaccess.me",
530 ".richlorenz.com",
531 ".rilhas.com",
532 ".rlstuff.net",
533 ".rltk.org",
534 ".rm6.org",
535 ".rninvest.ru",
536 ".ro.it",
537 ".ro.lt",
538 ".robinhud.com",
539 ".robot-armies.com",
540 ".rockingwranchinc.com",
541 ".rock-n-roll.ru",
542 ".romaliver.com",
543 ".r-o-o-t.net",
544 ".root.sx",
545 ".roth.ca",
546 ".routemehome.com",
547 ".rpz.su",
548 ".rukodelka.ru",
549 ".ruok.org",
550 ".russkoeumea.com",
551 ".rwbcode.com",
552 ".sadayuki.jp",
553 ".sandmeiers.ch",
554 ".sannon-stamm.com",
555 ".sarah-lai.com",
556 ".savage.nu",
557 ".scay.net",
558 ".sci123.com",
559 ".scottlewisonline.com",
560 ".scrapitsoftware.com",
561 ".sdp-mos.ru",
562 ".SEARCH",
563 ".sektori.org",
564 ".sen.org.nz",
565 ".seo.id.lv",
566 ".servernux.com",
567 ".serverpit.com",
568 ".sexmistrz.pl",
569 ".sextube.ro",
570 ".sheepindonesia.org",
571 ".shen.cl",
572 ".shitcunt.info",
573 ".shogun.ca",
574 ".shop.tm",
575 ".shopper360.com.my",
576 ".shoppingexpress.com.au",
577 ".showmyhomes.com",
578 ".silksky.com",
579 ".sino.tw",
580 ".skc.su",
581 ".skies.tw",
582 ".sky-cinema.ru",
583 ".sly.io",
584 ".smbb.ws",
585 ".smelly.cc",
586 ".smirt.ch",
587 ".sne.jp",
588 ".solfa.org",
589 ".solidmation.com",
590 ".solopos.co.id",
591 ".soon.it",
592 ".Sorted by: Popularity",
593 ".spacescape.in",
594 ".spacetechnology.net",
595 ".spelar.se",
596 ".spstali.ru",
597 ".ssitech.bg",
598 ".stalker.fi",
599 #".stan.cn",
600 ".star.is",
601 ".starkom.ru",
602 #".statescasinos.com",
603 ".stes.fi",
604 ".stfu-kthx.net",
605 ".stocktester.ru",
606 ".stoupin.ru",
607 ".strangled.net",
608 ".streame.tv",
609 ".stroyexpert.org",
610 ".stuns.org",
611 ".suka.se",
612 ".sumibi.org",
613 ".surak.kz",
614 ".surfnet.ca",
615 ".sweetriders.com",
616 ".swsc.org.np",
617 ".sxn.us",
618 ".syntereo.com",
619 ".t28.net",
620 ".t31.org",
621 ".tacowolf.com",
622 #".tagan-rog.info",
623 ".taivas.biz",
624 ".taiwans.tw",
625 ".takeshi.cnt.br",
626 #".tanah-aina.com",
627 ".teakwondo.one.pl",
628 ".techkriti.org",
629 ".techniice.ro",
630 ".technopagans.com",
631 ".tecnova.com.br",
632 ".tedx.ee",
633 ".teh-server.com",
634 ".tetuku.com",
635 ".thc.lv",
636 ".thcgirls.com",
637 ".the-button.com",
638 ".thegmc.com",
639 ".thejordaans.com",
640 ".thenme.net",
641 ".thevaughts.net",
642 ".thevirus.ro",
643 ".threecanoes.com",
644 ".tintira.com",
645 ".tn.my",
646 ".topdanang.com",
647 ".tragazorras.com",
648 ".tristancartledge.com",
649 ".tru.io",
650 ".trumgame.net",
651 ".tth.cl",
652 ".tuck.tw",
653 ".tv-l.ru",
654 ".tvlinux.com",
655 ".twilightparadox.com",
656 ".tzafrir.org.il",
657 ".u888.cn",
658 ".ucvradio.cl",
659 ".ufodns.com",
660 ".ugo.si",
661 ".uk.ms",
662 ".uk.to",
663 ".ultimatedecision.lv",
664 ".undo.it",
665 ".unibutton.com",
666 ".uplink.li",
667 ".urca.tv",
668 ".urist93.ru",
669 ".us.to",
670 ".uzhi.ru",
671 ".uzid.com",
672 ".vagfans.info",
673 ".vankin.de",
674 ".vctel.com",
675 ".ve3.info",
676 ".verymad.net",
677 ".vietnam.ro",
678 ".violates.me",
679 ".violates.us",
680 ".vistnet.net",
681 ".vivat-consult.ru",
682 ".vkagent.ru",
683 ".voles35.ru",
684 ".vomuan.com",
685 ".vos.io",
686 ".vpnx.nl",
687 ".vr.lt",
688 ".vxe6.net",
689 ".wakingmoon.com",
690 ".warmkessel.com",
691 ".webs.vc",
692 ".whyboner.com",
693 ".wiki.gd",
694 ".wikihotels.ru",
695 ".wild1.net",
696 ".wildsurf.net",
697 ".winkel.com.ar",
698 ".winnity.ro",
699 ".with.mirkforce.de",
700 ".wojb.org",
701 ".wolmerica.com",
702 ".womenclothingtoday.com",
703 ".xpresit.net",
704 ".xxxxx.tw",
705 ".yao.cl",
706 ".yngling.com",
707 ".youpc.ro",
708 ".your.my.id",
709 ".yourspecialtee.com",
710 ".z0d.eu",
711 ".z86.ru",
712 ".zaibar.ro",
713 ".zanity.net",
714 ".zee.ac",
715 ".zgbi100.ru",
716 ".zhilcontrol.ru",
717 ".zonet.us",
718 ".zsh.jp",
719 ".zverovich.net",
720 ".zvezdaringa.ru",
721 ".zyix.com",
722 # From subdomain.com: http://www.subdomain.com/
723 ".asia.gp",
724 ".biz.uz",
725 ".co.gp",
726 ".com.nu",
727 ".eu.nu",
728 ".mobi.ps",
729 ".name.vu",
730 ".online.gp",
731 ".pro.vg",
732 ".tv.gg",
733 ".us.nf",
734 ".web.gg",
735 ".info.nu",
736 # Other subdomains.
737 ".ax.it",
738 ".ro.it",
739 }
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import json
34 import logging
35 import os
36 from os import listdir
37 from os.path import isfile, join, isdir
38 import requests
39 import urllib2
40
41 import osrframework.utils.banner as banner
42 from osrframework.utils.regexp import RegexpObject
43 import osrframework.utils.general as general
44 import osrframework.utils.logger as logSet
45 import osrframework.utils.regexp_selection as regexp_selection
46
47
48 def getEntitiesByRegexp(data = None, listRegexp = None, verbosity=1, logFolder="./logs"):
49 """
50 Method to obtain entities by Regexp.
51
52 Args:
53 -----
54 data: text where the entities will be looked for.
55 listRegexp: list of selected regular expressions to be looked for. If
56 None was provided, all the available will be chosen instead.
57 verbosity: the verbosity level.
58 logFolder: the folder to store the logs.
59
60 Returns:
61 --------
62 list: available objects containing the expressions found in the provided
63 data.
64 [
65 {
66 "attributes": [],
67 "type": "i3visio.email",
68 "value": "[email protected]"
69 },
70 {
71 "attributes": [],
72 "type": "i3visio.email",
73 "value": "[email protected]"
74 ]
75 """
76 logSet.setupLogger(loggerName="osrframework.entify", verbosity=verbosity, logFolder=logFolder)
77 logInstance = logging.getLogger("osrframework.entify")
78 if listRegexp == None:
79 listRegexp = regexp_selection.getAllRegexp()
80
81 foundExpr = []
82
83 for r in listRegexp:
84 foundExpr += r.findExp(data)
85
86 return foundExpr
87
88
89 def scanFolderForRegexp(folder = None, listRegexp = None, recursive = False, verbosity=1, logFolder= "./logs", quiet=False):
90 """
91 [Optionally] recursive method to scan the files in a given folder.
92
93 Args:
94 -----
95 folder: the folder to be scanned.
96 listRegexp: listRegexp is an array of <RegexpObject>.
97 recursive: when True, it performs a recursive search on the subfolders.
98
99 Returns:
100 --------
101 list: Available objects containing the expressions found in the
102 provided data. An example of the returned data is as follows:
103
104 ```
105 [
106 {
107 "attributes": [],
108 "type": "i3visio.email",
109 "value": "[email protected]"
110 },
111 {
112 "attributes": [],
113 "type": "i3visio.email",
114 "value": "[email protected]"
115 }
116 ]
117 ```
118 """
119 logSet.setupLogger(loggerName="osrframework.entify", verbosity=verbosity, logFolder=logFolder)
120 logger = logging.getLogger("osrframework.entify")
121
122 logger.info("Scanning the folder: " + folder)
123 results = []
124
125 #onlyfiles = []
126 #for f in listdir(args.input_folder):
127 # if isfile(join(args.input_folder, f)):
128 # onlyfiles.append(f)
129 onlyfiles = [ f for f in listdir(folder) if isfile(join(folder,f)) ]
130
131 for i, f in enumerate(onlyfiles):
132 filePath = join(folder,f)
133 logger.debug("Looking for regular expressions in: " + filePath)
134 if not quiet:
135 print(str(i) + "/" + str(len(onlyfiles)) + "\tLooking for regular expressions in: " + filePath)
136 with open(filePath, "r") as tempF:
137 # reading data
138 foundExpr = getEntitiesByRegexp(data = tempF.read(), listRegexp = listRegexp)
139 logger.debug("Updating the " + str(len(foundExpr)) + " results found on: " + filePath)
140 aux = {}
141 aux["type"] = "i3visio.uri"
142 aux["value"] = filePath
143 aux["attributes"] = foundExpr
144 results.append(aux)
145
146 if recursive:
147 onlyfolders = [ f for f in listdir(folder) if isdir(join(folder,f)) ]
148 for f in onlyfolders:
149 folderPath = join(folder, f)
150 logger.debug("Looking for additional in the folder: "+ folderPath)
151 results.update(scanFolderForRegexp(folder = folderPath,listRegexp = listRegexp, recursive = recursive))
152
153 # Printing the information if not in quiet mode
154 if not quiet:
155 print(general.success(json.dumps(results, indent=2)))
156
157 return results
158
159
160 def scanResource(uri = None, listRegexp = None, verbosity=1, logFolder= "./logs"):
161 """
162 [Optionally] recursive method to scan the files in a given folder.
163
164 Args:
165 -----
166 uri: the URI to be scanned.
167 listRegexp: listRegexp is an array of <RegexpObject>.
168
169 Returns:
170 -------
171 dict: the key is the name of the file.
172 """
173 logSet.setupLogger(loggerName="osrframework.entify", verbosity=verbosity, logFolder=logFolder)
174 logger = logging.getLogger("osrframework.entify")
175
176 results = []
177 logger.debug("Looking for regular expressions in: " + uri)
178
179 data = urllib2.urlopen(uri).read()
180 foundExpr = getEntitiesByRegexp(data = data, listRegexp = listRegexp)
181
182 logger.debug("Updating the " + str(len(foundExpr)) + " results found on: " + uri)
183
184 # Creating the output structure
185 for f in foundExpr:
186 aux = {}
187
188 aux={}
189 aux["type"] = "i3visio.search"
190 aux["value"] = "URI - " +f["value"]
191 aux["attributes"] = []
192 for a in f["attributes"]:
193 aux["attributes"].append(a)
194
195 #Appending the entity itself
196 entity={}
197 entity["type"] = f["type"]
198 entity["value"] = f["value"]
199 entity["attributes"] = []
200 aux["attributes"].append(entity)
201
202 #Appending the uri
203 entity={}
204 entity["type"] = "i3visio.uri"
205 entity["value"] = uri
206 entity["attributes"] = []
207 aux["attributes"].append(entity)
208
209 results.append(aux)
210
211 return results
212
213
214 def main(args):
215 """
216 Main function to launch phonefy.
217
218 The function is created in this way so as to let other applications make
219 use of the full configuration capabilities of the application. The
220 parameters received are used as parsed by this modules `getParser()`.
221
222 Args:
223 -----
224 args: The parameters as processed by this modules `getParser()`.
225
226 Results:
227 --------
228 Returns a list with i3visio entities.
229 """
230 results = []
231
232 # Recovering the logger
233 # Calling the logger when being imported
234 logSet.setupLogger(loggerName="osrframework.entify", verbosity=args.verbose, logFolder=args.logfolder)
235 # From now on, the logger can be recovered like this:
236 logger = logging.getLogger("osrframework.entify")
237
238 logger.info("Selecting the regular expressions to be analysed...")
239
240 if not args.quiet:
241 print(general.title(banner.text))
242
243 sayingHello = """
244 entify.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2015-2017
245
246 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
247 are welcome to redistribute it under certain conditions. For additional info,
248 visit """ + general.LICENSE_URL + "\n"
249 print(general.info(sayingHello))
250
251 if args.license:
252 general.showLicense()
253 else:
254 listRegexp = []
255 if args.regexp:
256 listRegexp = regexp_selection.getRegexpsByName(args.regexp)
257 elif args.new_regexp:
258 for i, r in enumerate(args.new_regexp):
259 listRegexp.append(RegexpObject(name = "NewRegexp"+str(i), reg_exp = args.new_regexp))
260
261 if not args.web:
262 results = scanFolderForRegexp(folder = args.input_folder, listRegexp= listRegexp, recursive = args.recursive, verbosity=args.verbose, logFolder= args.logfolder, quiet=args.quiet)
263 else:
264 results = scanResource(uri = args.web, listRegexp= listRegexp, verbosity=args.verbose, logFolder= args.logfolder)
265 logger.info("Logging the results:\n" + json.dumps(results, indent=2, sort_keys=True))
266
267 # Trying to store the information recovered
268 if args.output_folder != None:
269 # Verifying an output folder was selected
270 logger.debug("Preparing the output folder...")
271 if not os.path.exists(args.output_folder):
272 logger.warning("The output folder \'" + args.output_folder + "\' does not exist. The system will try to create it.")
273 os.makedirs(args.output_folder)
274
275 # Grabbing the results
276 fileHeader = os.path.join(args.output_folder, args.file_header)
277 for ext in args.extension:
278 # Generating output files
279 general.exportUsufy(results, ext, fileHeader)
280
281 # Showing the information gathered if requested
282 if not args.quiet:
283 print(str(now) + "\tA summary of the results obtained are shown in the following table:\n")
284 print(general.success(general.usufyToTextExport(results)))
285
286 now = dt.datetime.now()
287 print(str(now) + "\tYou can find all the information collected in the following files:")
288 for ext in args.extension:
289 # Showing the output files
290 print("\t-" + general.emphasis(fileHeader + "." + ext))
291
292 # Urging users to place an issue on Github...
293 print(banner.footer)
294
295 return results
296
297
298 def getParser():
299 import osrframework.utils.configuration as configuration
300 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("entify")
301
302 parser = argparse.ArgumentParser(description='entify.py - entify.py is a program designed to extract using regular expressions all the entities from the files on a given folder. This software also provides an interface to look for these entities in any given text.', prog='entify.py', epilog="Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.", add_help=False)
303 parser._optionals.title = "Input options (one required)"
304
305 # Adding the main options
306 # Defining the mutually exclusive group for the main options
307 groupMainOptions = parser.add_mutually_exclusive_group(required=True)
308 listAll = regexp_selection.getAllRegexpNames()
309 groupMainOptions.add_argument('-r', '--regexp', metavar='<name>', choices=listAll, action='store', nargs='+', help='select the regular expressions to be looked for amongst the following: ' + str(listAll))
310 groupMainOptions.add_argument('-R', '--new_regexp', metavar='<regular_expression>', action='store', help='add a new regular expression, for example, for testing purposes.')
311
312 # Adding the main options
313 # Defining the mutually exclusive group for the main options
314 groupInput = parser.add_mutually_exclusive_group(required=True)
315 groupInput.add_argument('-i', '--input_folder', metavar='<path_to_input_folder>', default=None, action='store', help='path to the folder to analyse.')
316 groupInput.add_argument('-w', '--web', metavar='<url>', action='store', default=None, help='URI to be recovered and analysed.')
317
318 # adding the option
319 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the processing parameters.')
320 groupProcessing.add_argument('-e', '--extension', metavar='<sum_ext>', nargs='+', choices=['csv', 'gml', 'json', 'mtz', 'ods', 'png', 'txt', 'xls', 'xlsx' ], required=False, default = DEFAULT_VALUES["extension"], action='store', help='output extension for the summary files. Default: xls.')
321 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', required=False, default = DEFAULT_VALUES["output_folder"], action='store', help='output folder for the generated documents. While if the paths does not exist, usufy.py will try to create; if this argument is not provided, usufy will NOT write any down any data. Check permissions if something goes wrong.')
322 groupProcessing.add_argument('-v', '--verbose', metavar='<verbosity>', choices=[0, 1, 2], required=False, action='store', default=1, help='select the verbosity level: 0 - none; 1 - normal (default); 2 - debug.', type=int)
323 # Getting a sample header for the output files
324 groupProcessing.add_argument('-F', '--file_header', metavar='<alternative_header_file>', required=False, default = DEFAULT_VALUES["file_header"], action='store', help='Header for the output filenames to be generated. If None was provided the following will be used: profiles.<extension>.' )
325 groupProcessing.add_argument('-q', '--quiet', required=False, action='store_true', default=False, help='Asking the program not to show any output.')
326 groupProcessing.add_argument('-L', '--logfolder', metavar='<path_to_log_folder', required=False, default = './logs', action='store', help='path to the log folder. If none was provided, ./logs is assumed.')
327 groupProcessing.add_argument('--recursive', action='store_true', default=False, required=False, help='Variable to tell the system to perform a recursive search on the folder tree.')
328
329 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
330 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
331 groupAbout.add_argument('--version', action='version', version='%(prog)s '+" " +__version__, help='shows the version of the program and exists.')
332
333 return parser
334
335
336 if __name__ == "__main__":
337 # Grabbing the parser
338 parser = getParser()
339
340 args = parser.parse_args()
341
342 # Recovering the logger
343 # Calling the logger when being imported
344 logSet.setupLogger(loggerName="osrframework", verbosity=args.verbose, logFolder=args.logfolder)
345 # From now on, the logger can be recovered like this:
346 logger = logging.getLogger("osrframework")
347
348 main(args)
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import os
34 import os.path
35 import osrframework.utils.banner as banner
36 import osrframework.utils.browser as browser
37 import osrframework.utils.general as general
38 import re
39
40
41 def enumerateURL(urlDict, outputFolder, startIndex= 0, maxErrors = 100):
42 """
43 Function that performs the enumeration itself.
44 """
45
46 for i, url in enumerate(urlDict.keys()):
47 # Grabbing domain name:
48 domain = re.findall("://(.*)/", url)[0]
49
50 # Defining the starting index
51 index = startIndex
52
53 # The app will stop when this value reaches maxErrors
54 consecutiveErrors = 0
55
56 i3Browser = browser.Browser()
57
58 # Main loop that checks if the maximum number of errors has been reached
59 while consecutiveErrors <= maxErrors:
60 # creating the new URL to download
61 newQuery = url.replace("<INDEX>", str(index))
62 print(newQuery)
63 # Downloading the file
64 try:
65 data = i3Browser.recoverURL(newQuery)
66
67 filename = domain.replace("/", "|") + "_" + "-profile_" + str(index).rjust(10, "0") +".html"
68
69 if urlDict[url] != None:
70 if urlDict[url] in data:
71 print(general.info("Storing resource as:\t" + filename + "..."))
72 # The profile was found so we will store it:
73 with open( outputFolder + "/" + filename, "w") as oF:
74 oF.write(data)
75 else:
76 # The profile was found so we will store it:
77 print(general.info("Storing resource as:\t" + filename + "...")
78 with open( outputFolder + "/" + filename, "w") as oF:
79 oF.write(data)
80 except:
81 pass
82 #logger.error("The resource could not be downloaded.")
83
84 index+=1
85
86
87 def enumeration_main(args):
88 """
89 Main loop for the enumeration
90 """
91 print(general.title(banner.text))
92
93 sayingHello = """
94 enumeration.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2016-2017
95
96 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
97 are welcome to redistribute it under certain conditions. For additional info,
98 visit """ + general.LICENSE_URL + "\n"
99 print(general.info(sayingHello))
100
101 # Loading URL
102 urlDict = {}
103 if args.url !=None:
104 urlDict[str(args.url)] = None
105 elif args.platforms != None:
106 for p in args.platforms:
107 with open(args.config, "r") as iF:
108 lines = iF.read().splitlines()
109 for l in lines:
110 platform = l.split('\t')[0]
111 url = l.split('\t')[1]
112 notFound = l.split('\t')[2]
113 if p == platform:
114 urlDict[url] = notFound
115 else:
116 return
117 if not os.path.exists(args.output_folder):
118 os.makedirs(args.output_folder)
119
120 # Making the call
121 enumerateURL(urlDict, args.output_folder, startIndex = args.start_index, maxErrors = args.max_errors)
122
123
124 if __name__ == "__main__":
125 parser = argparse.ArgumentParser(description='enumeration.py - Checking the existence of a possible enumeration.', prog='enumeration.py', epilog='Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.', add_help=False)
126 parser._optionals.title = "Input options (one required)"
127
128 # Defining the mutually exclusive group for the main options
129 general = parser.add_mutually_exclusive_group(required=True)
130 # Adding the main options
131 general.add_argument('-u', '--url', metavar='<URL>', action='store', help = 'the URL address to test. The place where the index will be updated should be indicated as <INDEX> in the URL. For example: http://example.com/user/<INDEX> would match "http://example.com/user/1", "http://example.com/user/2", etc. Only those platforms receiving a valid response will be loaded, so NO filter by not-found-tags is permitted in this mode.')
132 general.add_argument('-p', '--platforms', metavar='<platform>', nargs='+', action='store', help = 'Selection of a domain found in the configuration file.')
133
134 # Configuring the processing options
135 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the way in which mailfy will process the identified profiles.')
136 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', action='store', help='path to the output folder where the results will be stored in raw. The name of the files will be their index.', required=False, default = "./results")
137 groupProcessing.add_argument('--config', metavar='<url>', action='store', default="./utils/enumeration_config.txt", help = 'the file with the list of URL to test. The format should be: "platform_name\\thttp://example.com/user/<INDEX>\\tNOT_FOUND_TEXT".')
138 groupProcessing.add_argument('--max_errors', metavar='<max_errors>', action='store', help='maximum number of consecutive errors tolerated until finishing the crawling process.', required=False, default = 100, type = int)
139 groupProcessing.add_argument('--start_index', metavar='<start_index>', action='store', help='starting user index for the crawling process.', required=False, default = 0, type = int)
140
141 # About options
142 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
143 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
144 groupAbout.add_argument('--version', action='version', version='%(prog)s'+" " + __version__ , help='shows the version of the program and exists.')
145
146 args = parser.parse_args()
147
148 # Calling the main function
149 enumeration_main(args)
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio"
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import datetime as dt
34 import time
35 import json
36 # global issues for multiprocessing
37 from multiprocessing import Process, Queue, Pool
38 import os
39 import signal
40 import sys
41
42 # Email verification libraries
43 import emailahoy
44 import validate_email
45
46 import osrframework.thirdparties.haveibeenpwned_com.hibp as hibp
47 import osrframework.utils.banner as banner
48 import osrframework.utils.platform_selection as platform_selection
49 import osrframework.utils.configuration as configuration
50 import osrframework.utils.general as general
51
52 # Pending
53 #188.com", "21cn.cn", "popo.163.com", "vip.126.com", "vip.163.com", "vip.188.com"
54
55 EMAIL_DOMAINS = [
56 "126.com",
57 "163.com",
58 "189.cn",
59 #"aaathats3as.com",
60 "btinternet.com",
61 #"cocaine.ninja",
62 #"cock.lu",
63 #"cock.email",
64 #"firemail.cc",
65 #"getbackinthe.kitchen",
66 "gmail.com",
67 #"hitler.rocks",
68 "hushmail.com",
69 "icloud.com",
70 "keemail.me",
71 "lycos.com",
72 "me.com",
73 #"memeware.net",
74 #"noob.com",
75 "protonmail.ch",
76 "protonmail.com",
77 "rediffmail.com",
78 "seznam.cz",
79 "tuta.io",
80 "tutamail.com",
81 "tutanota.com",
82 "tutanota.de",
83 #"waifu.club",
84 #"wp.pl",
85 "ya.ru",
86 "yandex.com",
87 "yeah.net",
88 "zoho.com"
89 ]
90
91 LEAKED_DOMAINS = [
92 "126.com",
93 "163.com",
94 "189.cn",
95 "aol.com",
96 "bk.ru",
97 "breakthru.com",
98 #"aaathats3as.com",
99 "btinternet.com",
100 #"cocaine.ninja",
101 #"cock.lu",
102 #"cock.email",
103 #"firemail.cc",
104 #"getbackinthe.kitchen",
105 "gmail.com",
106 "gmx.com",
107 "gmx.de",
108 #"hitler.rocks",
109 "hotmail.com",
110 "hushmail.com",
111 "icloud.com",
112 "inbox.com",
113 "keemail.me",
114 "latinmail.com",
115 "libero.it",
116 "lycos.com",
117 "me.com",
118 "mail.ru",
119 "mail2tor.com",
120 #"memeware.net",
121 #"noob.com",
122 "outlook.com",
123 "protonmail.ch",
124 "protonmail.com",
125 "rambler.ru",
126 "rocketmail.com",
127 "rediffmail.com",
128 "seznam.cz",
129 "starmedia.com",
130 "tuta.io",
131 "tutamail.com",
132 "tutanota.com",
133 "tutanota.de",
134 "ukr.net",
135 #"waifu.club",
136 #"wp.pl",
137 "ya.ru",
138 "yahoo.com",
139 "yandex.com",
140 "yandex.ru",
141 "yeah.net",
142 "zoho.com"
143 ]
144
145
146 def getMoreInfo(e):
147 """
148 Method that calls different third party API.
149
150 Args:
151 -----
152 e: Email to verify.
153
154 Returns:
155 --------
156 Three different values: email, alias and domain.
157 """
158 # Grabbing the email
159 email = {}
160 email["type"] = "i3visio.email"
161 email["value"] = e
162 email["attributes"] = []
163
164 # Grabbing the alias
165 alias = {}
166 alias["type"] = "i3visio.alias"
167 alias["value"] = e.split("@")[0]
168 alias["attributes"] = []
169
170 # Grabbing the domain
171 domain= {}
172 domain["type"] = "i3visio.domain"
173 domain["value"] = e.split("@")[1]
174 domain["attributes"] = []
175
176 return email, alias, domain
177
178
179 def weCanCheckTheseDomains(email):
180 """
181 Method that verifies if a domain can be safely verified.
182
183 Args:
184 -----
185 email: the email whose domain will be verified.
186
187 Returns:
188 --------
189 bool: it represents whether the domain can be verified.
190 """
191 # Known platform not to be working...
192 notWorking = [
193 "@aol.com",
194 "@bk.ru",
195 "@breakthru.com",
196 "@gmx.",
197 "@hotmail.co",
198 "@inbox.com",
199 "@latinmail.com",
200 "@libero.it",
201 "@mail.ru",
202 "@mail2tor.com",
203 "@outlook.com",
204 "@rambler.ru",
205 "@rocketmail.com",
206 "@starmedia.com",
207 "@ukr.net"
208 "@yahoo.",
209 "@ymail."
210 ]
211
212 #notWorking = []
213 for n in notWorking:
214 if n in email:
215 print(general.warning("WARNING: the domain of '" + email + "' has been blacklisted by mailfy.py as it CANNOT BE VERIFIED."))
216 return False
217
218 emailDomains = EMAIL_DOMAINS
219 safe = False
220
221 for e in emailDomains:
222 if e in email:
223 safe = True
224 break
225
226 if not safe:
227 print(general.warning("WARNING: the domain of '" + email + "' will not be safely verified."))
228 return True
229
230
231 def grabEmails(emails=None, emailsFile=None, nicks=None, nicksFile=None, domains = EMAIL_DOMAINS, excludeDomains = []):
232 """
233 Method that generates a list of emails.
234
235 Args:
236 -----
237 emails: Any premade list of emails.
238 emailsFile: Filepath to the emails file (one per line).
239 nicks: A list of aliases.
240 nicksFile: Filepath to the aliases file (one per line).
241 domains: Domains where the aliases will be tested.
242 excludeDomains: Domains to be excluded from the created list.
243
244 Returns:
245 --------
246 list: the list of emails that will be verified.
247 """
248 email_candidates = []
249
250 if emails != None:
251 email_candidates = emails
252 elif emailsFile != None:
253 # Reading the emails file
254 with open(emailsFile, "r") as iF:
255 email_candidates = iF.read().splitlines()
256 elif nicks != None:
257 # Iterating the list of nicks
258 for n in nicks:
259 # Iterating the list of possible domains to build the emails
260 for d in domains:
261 if d not in excludeDomains:
262 email_candidates.append(n+"@"+d)
263 elif nicksFile != None:
264 # Reading the list of nicks
265 with open(nicksFile, "r") as iF:
266 nicks = iF.read().splitlines()
267 # Iterating the list of nicks
268 for n in nicks:
269 # Iterating the list of possible domains to build the emails
270 for d in domains:
271 if d not in excludeDomains:
272 email_candidates.append(n+"@"+d)
273 return email_candidates
274
275
276 def pool_function(args):
277 """
278 A wrapper for being able to launch all the threads.
279
280 We will use python-emailahoy library for the verification in non-Windows
281 systems as it is faster than validate_email. In Windows systems the latter
282 is preferred.
283
284 Args:
285 -----
286 args: reception of the parameters for getPageWrapper as a tuple.
287
288 Returns:
289 --------
290 A dictionary representing whether the verification was ended
291 successfully. The format is as follows:
292 ```
293 {"platform": "str(domain["value"])", "status": "DONE", "data": aux}
294 ```
295 """
296 is_valid = True
297
298 try:
299 if sys.platform == 'win32':
300 is_valid = validate_email.validate_email(args, verify=True)
301 else:
302 is_valid = emailahoy.verify_email_address(args)
303 except Exception, e:
304 print(general.warning("WARNING. An error was found when performing the search. You can omit this message.\n" + str(e)))
305 is_valid = False
306
307 if is_valid:
308 email, alias, domain = getMoreInfo(args)
309 aux = {}
310 aux["type"] = "i3visio.profile"
311 aux["value"] = domain["value"] + " - " + alias["value"]
312 aux["attributes"] = []
313 aux["attributes"].append(email)
314 aux["attributes"].append(alias)
315 aux["attributes"].append(domain)
316
317 return {"platform": str(domain["value"]), "status": "DONE", "data": aux}
318 else:
319 return {"platform": str(domain["value"]), "status": "DONE", "data": {}}
320
321
322 def performSearch(emails=[], nThreads=16, secondsBeforeTimeout=5):
323 """
324 Method to perform the mail verification process.
325
326 Args:
327 -----
328 emails: list of emails to be verified.
329 nThreads: the number of threads to be used. Default: 16 threads.
330 secondsBeforeTimeout: number of seconds to wait before raising a
331 timeout. Default: 5 seconds.
332
333 Returns:
334 --------
335 TODO.
336 """
337 # Getting starting time
338 _startTime = time.time()
339
340 def hasRunOutOfTime(oldEpoch):
341 """
342 Function that checks if a given time has passed.
343
344 It verifies whether the oldEpoch has passed or not by checking if the
345 seconds passed are greater.
346
347 Arguments
348 ---------
349 oldepoch: Seconds passed since 1970 as returned by `time.time()`.
350
351 Returns
352 -------
353 A boolean representing whether it has run out of time.
354 """
355 now = time.time()
356 return now - oldEpoch >= secondsBeforeTimeout
357
358 results = []
359 args = []
360
361 # Grabbing all the emails that would be validated
362 for e in emails:
363 if weCanCheckTheseDomains(e):
364 args.append((e))
365
366 # Returning None if no valid domain has been returned
367 if len(args) == 0:
368 return results
369
370 # If the process is executed by the current app, we use the Processes. It is faster than pools.
371 if nThreads <= 0 or nThreads > len(args):
372 nThreads = len(args)
373
374 # Launching the Pool
375 # ------------------
376 # Example catched from: https://stackoverflow.com/questions/11312525/catch-ctrlc-sigint-and-exit-multiprocesses-gracefully-in-python
377 try:
378 original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
379 pool = Pool(nThreads)
380 signal.signal(signal.SIGINT, original_sigint_handler)
381 except ValueError:
382 # To avoid: ValueError: signal only works in main thread
383 pool = Pool(nThreads)
384
385 poolResults = []
386 try:
387 def log_result(result):
388 # This is called whenever foo_pool(i) returns a result.
389 # result_list is modified only by the main process, not the pool workers.
390 poolResults.append(result)
391
392 for m in emails:
393 # We need to create all the arguments that will be needed
394 parameters = ( m, )
395 pool.apply_async (pool_function, args= parameters, callback = log_result )
396
397 # Waiting for results to be finished or time to pass
398 while len(poolResults) < len(emails) and not hasRunOutOfTime(_startTime):
399 pass
400
401 # Closing normal termination
402 pool.close()
403 except KeyboardInterrupt:
404 print(general.warning("\n[!] Process manually stopped by the user. Terminating workers.\n"))
405 pool.terminate()
406
407 pending = ""
408
409 print(general.warning("[!] The following platforms were not processed:"))
410 for m in emails:
411 processed = False
412 for result in poolResults:
413 if str(m) in json.dumps(result["data"]):
414 processed = True
415 break
416 if not processed:
417 print("\t- " + str(p))
418 pending += " " + str(m)
419
420 print("\n")
421 print(general.warning("If you want to relaunch the app with these platforms you can always run the command with: "))
422 print("\t mailfy.py ... -p " + general.emphasis(pending))
423 print("\n")
424 print(general.warning("If you prefer to avoid these platforms you can manually evade them for whatever reason with: "))
425 print("\t mailfy.py ... -x " + general.emphasis(pending))
426 print("\n")
427 pool.join()
428
429 # Processing the results
430 # ----------------------
431 for serArray in poolResults:
432 data = serArray["data"]
433 # We need to recover the results and check if they are not an empty json or None
434 if data != None and data != {}:
435 results.append(data)
436
437 pool.close()
438
439 return results
440
441
442 def main(args):
443 """
444 Main function to launch phonefy.
445
446 The function is created in this way so as to let other applications make
447 use of the full configuration capabilities of the application. The
448 parameters received are used as parsed by this modules `getParser()`.
449
450 Args:
451 -----
452 args: The parameters as processed by this modules `getParser()`.
453
454 Results:
455 --------
456 Returns a list with i3visio entities.
457 """
458 results = []
459
460 if not args.quiet:
461 print(general.title(banner.text))
462
463 sayingHello = """
464 mailfy.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2016-2017
465
466 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
467 are welcome to redistribute it under certain conditions. For additional info,
468 visit """ + general.LICENSE_URL + "\n"
469 print(general.title(sayingHello))
470
471 # Displaying a warning if this is being run in a windows system
472 if sys.platform == 'win32':
473 print(general.warning("""OSRFramework has detected that you are running mailfy.py in a Windows system.
474 As the "emailahoy" library is NOT working properly there, "validate_email" will
475 be used instead. Verification may be slower though."""))
476
477 if args.license:
478 general.showLicense()
479 else:
480 # Grabbing the list of global domains
481 if args.is_leaked:
482 domains = LEAKED_DOMAINS
483 # Processing the options returned to remove the "all" option
484 elif "all" in args.domains:
485 domains = EMAIL_DOMAINS
486 else:
487 # processing only the given domains and excluding the ones provided
488 domains = []
489 for d in args.domains:
490 if d not in args.exclude:
491 domains.append(d)
492
493 if args.create_emails:
494 emails = grabEmails(nicksFile=args.create_emails, domains=domains, excludeDomains=args.exclude)
495 else:
496 emails = grabEmails(emails=args.emails, emailsFile=args.emails_file, nicks=args.nicks, nicksFile=args.nicks_file, domains=domains, excludeDomains=args.exclude)
497
498 startTime= dt.datetime.now()
499
500 if not args.is_leaked:
501 # Showing the execution time...
502 if not args.quiet:
503 print(str(startTime) +"\tStarting search in " + general.emphasis(str(len(emails))) + " different emails:\n"+ json.dumps(emails, indent=2, sort_keys=True) + "\n")
504 print(general.emphasis("\tPress <Ctrl + C> to stop...\n"))
505 # Perform searches, using different Threads
506 tmp = performSearch(emails, args.threads)
507
508 # We make a strict copy of the object
509 results = list(tmp)
510
511 if not args.quiet:
512 now = dt.datetime.now()
513 print(str(now) +"\tMailfy has found " + general.emphasis(str(len(results))) + " existing email(s). Has it been leaked somewhere?")
514
515 # Verify the existence of the mails found as leaked emails.
516 for r in tmp:
517 # We assume that the first attribute is always the email
518 query = r["attributes"][0]["value"]
519 leaks = hibp.checkIfEmailWasHacked(query)
520 if len(leaks) > 0:
521 if not args.quiet:
522 print(general.success("\t" + query + " has been found in at least " + str(len(leaks)) + " different leaks."))
523 email, alias, domain = getMoreInfo(query)
524
525 for leak in leaks:
526 # Creating a new full entity from scratch
527 new = {}
528 new["type"] = "i3visio.profile"
529 new["value"] = leak["value"] + " - " + alias["value"]
530 new["attributes"] = []
531 new["attributes"].append(email)
532 new["attributes"].append(alias)
533 new["attributes"].append(domain)
534
535 # leak contains a i3visio.platform built by HIBP
536 new["attributes"].append(leak)
537 results.append(new)
538 else:
539 if not args.quiet:
540 print(general.warning("\t" + query + " has NOT been found on any leak yet."))
541 else:
542 if not args.quiet:
543 print("\n" + str(startTime) +"\tStarting search of " + general.emphasis(str(len(emails))) + " different emails in leaked databases.\nNote that this will take between 1 and 2 seconds per query due to HIBP API restrictions:\n"+ json.dumps(emails, indent=2, sort_keys=True) + "\n")
544 print(general.emphasis("\tPress <Ctrl + C> to stop...\n"))
545
546 # Perform is_leaked function
547 results = []
548 for i, e in enumerate(emails):
549 if not args.quiet:
550 print("\t" + str(i+1) + "/" + str(len(emails)) + " - Searching if " + e + " has been leaked somewhere...")
551 leaks = hibp.checkIfEmailWasHacked(e)
552
553 if len(leaks) > 0:
554 if not args.quiet:
555 print(general.success("\t" + e + " has been found in at least " + str(len(leaks)) + " different leaks."))
556
557 email, alias, domain = getMoreInfo(e)
558 for leak in leaks:
559 # Creating a new full entity from scratch
560 new = {}
561 new["type"] = "i3visio.profile"
562 new["value"] = leak["value"] + " - " + alias["value"]
563 new["attributes"] = []
564 new["attributes"].append(email)
565 new["attributes"].append(alias)
566 new["attributes"].append(domain)
567
568 # leak contains a i3visio.platform built by HIBP
569 new["attributes"].append(leak)
570 results.append(new)
571
572 # Trying to store the information recovered
573 if args.output_folder != None:
574 if not os.path.exists(args.output_folder):
575 os.makedirs(args.output_folder)
576 # Grabbing the results
577 fileHeader = os.path.join(args.output_folder, args.file_header)
578 for ext in args.extension:
579 # Generating output files
580 general.exportUsufy(results, ext, fileHeader)
581
582 # Showing the information gathered if requested
583 if not args.quiet:
584 now = dt.datetime.now()
585 print("\n" + str(now) + "\tA summary of the results obtained are shown in the following table:\n")
586 print(general.success(general.usufyToTextExport(results)))
587
588 now = dt.datetime.now()
589 print("\n" + str(now) + "\tYou can find all the information collected in the following files:")
590 for ext in args.extension:
591 # Showing the output files
592 print(general.emphasis("\t" + fileHeader + "." + ext))
593
594 # Showing the execution time...
595 if not args.quiet:
596 endTime= dt.datetime.now()
597 print("\n" + str(endTime) +"\tFinishing execution...\n")
598 print("Total time used:\t" + general.emphasis(str(endTime-startTime)))
599 print("Average seconds/query:\t" + general.emphasis(str((endTime-startTime).total_seconds()/len(emails))) +" seconds\n")
600
601 if not args.quiet:
602 # Urging users to place an issue on Github...
603 print(banner.footer)
604
605 return results
606
607
608 def getParser():
609 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("mailfy")
610 # Capturing errors just in case the option is not found in the configuration
611 try:
612 excludeList = [DEFAULT_VALUES["exclude_domains"]]
613 except:
614 excludeList = []
615
616 parser = argparse.ArgumentParser(description='mailfy.py - Checking the existence of a given mail.', prog='mailfy.py', epilog='Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.', add_help=False)
617 parser._optionals.title = "Input options (one required)"
618
619 # Defining the mutually exclusive group for the main options
620 groupMainOptions = parser.add_mutually_exclusive_group(required=True)
621 # Adding the main options
622 groupMainOptions.add_argument('--license', required=False, action='store_true', default=False, help='shows the GPLv3+ license and exists.')
623 groupMainOptions.add_argument('-m', '--emails', metavar='<emails>', nargs='+', action='store', help = 'the list of emails to be checked.')
624 groupMainOptions.add_argument('-M', '--emails_file', metavar='<emails_file>', action='store', help = 'the file with the list of emails.')
625 groupMainOptions.add_argument('-n', '--nicks', metavar='<nicks>', nargs='+', action='store', help = 'the list of nicks to be checked in the domains selected.')
626 groupMainOptions.add_argument('-N', '--nicks_file', metavar='<nicks_file>', action='store', help = 'the file with the list of nicks to be checked in the domains selected.')
627 groupMainOptions.add_argument('--create_emails', metavar='<nicks_file>', action='store', help = 'the file with the list of nicks to be created in the domains selected.')
628
629 # Configuring the processing options
630 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the way in which mailfy will process the identified profiles.')
631 #groupProcessing.add_argument('-L', '--logfolder', metavar='<path_to_log_folder', required=False, default = './logs', action='store', help='path to the log folder. If none was provided, ./logs is assumed.')
632 groupProcessing.add_argument('-e', '--extension', metavar='<sum_ext>', nargs='+', choices=['csv', 'gml', 'json', 'mtz', 'ods', 'png', 'txt', 'xls', 'xlsx' ], required=False, default=DEFAULT_VALUES["extension"], action='store', help='output extension for the summary files. Default: xls.')
633 groupProcessing.add_argument('-d', '--domains', metavar='<candidate_domains>', nargs='+', choices=['all'] + EMAIL_DOMAINS, action='store', help='list of domains where the nick will be looked for.', required=False, default=DEFAULT_VALUES["domains"])
634 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', required=False, default=DEFAULT_VALUES["output_folder"], action='store', help='output folder for the generated documents. While if the paths does not exist, usufy.py will try to create; if this argument is not provided, usufy will NOT write any down any data. Check permissions if something goes wrong.')
635 groupProcessing.add_argument('-x', '--exclude', metavar='<domain>', choices=EMAIL_DOMAINS, nargs='+', required=False, default=excludeList, action='store', help="select the domains to be excluded from the search.")
636 # Getting a sample header for the output files
637 groupProcessing.add_argument('-F', '--file_header', metavar='<alternative_header_file>', required=False, default=DEFAULT_VALUES["file_header"], action='store', help='Header for the output filenames to be generated. If None was provided the following will be used: profiles.<extension>.' )
638 groupProcessing.add_argument('-T', '--threads', metavar='<num_threads>', required=False, action='store', default = int(DEFAULT_VALUES["threads"]), type=int, help='write down the number of threads to be used (default 16). If 0, the maximum number possible will be used, which may make the system feel unstable.')
639 groupProcessing.add_argument('--is_leaked', required=False, default=False, action='store_true', help='Defines whether mailfy.py should search for leaked emails instead of verifying them.')
640 groupProcessing.add_argument('--quiet', required=False, action='store_true', default=False, help='tells the program not to show anything.')
641
642 # About options
643 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
644 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
645 #groupAbout.add_argument('-v', '--verbose', metavar='<verbosity>', choices=[0, 1, 2], required=False, action='store', default=1, help='select the verbosity level: 0 - none; 1 - normal (default); 2 - debug.', type=int)
646 groupAbout.add_argument('--version', action='version', version='%(prog)s ' +" " +__version__, help='shows the version of the program and exists.')
647
648 return parser
649
650 if __name__ == "__main__":
651 # Grabbing the parser
652 parser = getParser()
653
654 args = parser.parse_args()
655
656 # Calling the main function
657 main(args)
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2016-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import cmd as cmd
34 import json
35 import os
36 import sys
37
38 import osrframework.utils.configuration as configuration
39 import osrframework.utils.banner as banner
40 import osrframework.utils.general as general
41 import osrframework.utils.platform_selection as platform_selection
42 import osrframework.utils.regexp_selection as regexp_selection
43
44 import osrframework.domainfy as domainfy
45 import osrframework.entify as entify
46 import osrframework.mailfy as mailfy
47 import osrframework.phonefy as phonefy
48 import osrframework.searchfy as searchfy
49 import osrframework.usufy as usufy
50
51 UTILS = [
52 "domainfy",
53 "entify", #: regexp_selection.getAllRegexpNames(),
54 "mailfy", # mailfy.EMAIL_DOMAINS,
55 "phonefy",
56 "searchfy",
57 "usufy", # platform_selection.getAllPlatformNames("usufy"),
58 ]
59
60 ################################################################################
61 # Defining the abstract class of the utils that will be managed #
62 ################################################################################
63
64 class OSRFConsoleUtil(cmd.Cmd):
65 """Simple class from which of a Metasploit-like interactive interface."""
66 # Setting up the name of the module
67 UNAME = "Abstract Util"
68
69 intro = ""
70 # Defining the prompt
71 prompt = 'osrf (' + UNAME + ') > '
72 # Defining the character to create hyphens
73 ruler = '-'
74
75 # Defining the configuration for this module
76 CONFIG = {}
77 CONFIG["OPTION"] = {
78 "DESCRIPTION" : "An example of option.",
79 "CURRENT_VALUE" : "Hello",
80 "DEFAULT_VALUE" : "Hello",
81 "REQUIRED" : False,
82 "OPTIONS" : ["world", "people"]
83 }
84 CONFIG["OUTPUT"] = {
85 "DESCRIPTION" : "The path to the output folder where the files will be created.",
86 "CURRENT_VALUE" : "./",
87 "DEFAULT_VALUE" : "./",
88 "REQUIRED" : False,
89 "OPTIONS" : []
90 }
91 CONFIG["EXTENSION"] = {
92 "DESCRIPTION" : "The default extension of the files to be written.",
93 "CURRENT_VALUE" : "csv",
94 "DEFAULT_VALUE" : "csv",
95 "REQUIRED" : False,
96 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
97 }
98
99 def _checkIfRequiredAreSet(self):
100 """Internal function to check if the required parameters have been set."""
101 details = ""
102 for key in self.CONFIG.keys():
103 if self.CONFIG[key]["REQUIRED"] and self.CONFIG[key]["CURRENT_VALUE"] == None:
104 return False
105 return True
106
107 def _getOptionsDescription(self):
108 """Internal function to collect the description of each and every parameter"""
109 details = ""
110 for key in self.CONFIG.keys():
111 details += "\t- " + key + ". " + self.CONFIG[key]["DESCRIPTION"] + "\n"
112 return details
113
114 def _getParams(self):
115 """Function that creates the array with the params that will work with this function."""
116 # Creating the parameters as if they were created using the command line
117 params = ["-h"]
118 return params
119
120 def do_set(self, line):
121 """Setting the variables defined in CONFIG. You can check their values at any time by typing 'show options'."""
122 try:
123 parameter, value = line.split(" ", 1)
124 # Setting the parameter
125 if parameter in self.CONFIG.keys():
126 # Verifying if the parameter is in the options
127 if len(self.CONFIG[parameter]["OPTIONS"]) > 0:
128 splittedValues = value.split(" ")
129
130 for s in splittedValues:
131 if s not in self.CONFIG[parameter]["OPTIONS"]:
132 raise Exception("ERROR: the value provided is not valid.")
133 # Setting the value
134 self.CONFIG[parameter]["CURRENT_VALUE"] = value
135 print(general.info(parameter + "=" + str(value)))
136 else:
137 raise Exception("ERROR: parameter not valid.")
138 except Exception as e:
139 print(general.error("[!] ERROR: Not enough parameters provided. Usage: set OPTION VALUE."))
140 print(general.error(str(e)))
141
142 def complete_set(self, text, line, begidx, endidx):
143 # First, we will try to get the available parameters
144 if len(line.split(" ")) == 2:
145 if not text:
146 completions = self.CONFIG.keys()
147 else:
148 completions = [ f
149 for f in self.CONFIG.keys()
150 if f.startswith(text.upper())
151 ]
152 # We are setting the value
153 elif len(line.split(" ")) >= 3:
154 # First, we get the given parameter
155 parameter = line.split(" ")[1]
156 if not text:
157 completions = self.CONFIG[parameter]["OPTIONS"]
158 else:
159 completions = [ f
160 for f in self.CONFIG[parameter]["OPTIONS"]
161 if f.startswith(text.lower())
162 ]
163 return completions
164
165 def do_unset(self, line):
166 """Unsetting the variables defined in CONFIG. You can check their values at any time by typing 'show options' and unsetting all the options at once by typing 'unset all'"."""
167 try:
168 parameter = line.split(" ")[0]
169 # Getting the parameter
170 if parameter in self.CONFIG.keys():
171 # Unsetting the value
172 self.CONFIG[parameter]["CURRENT_VALUE"] = self.CONFIG[parameter]["DEFAULT_VALUE"]
173 print(general.info(parameter + " reseted to '" + str(self.CONFIG[parameter]["DEFAULT_VALUE"]) + "'."))
174 elif parameter == "all":
175 for p in self.CONFIG.keys():
176 # Unsetting all the values
177 self.CONFIG[p]["CURRENT_VALUE"] = self.CONFIG[p]["DEFAULT_VALUE"]
178 print(general.info("All parameters reseted to their default values."))
179 else:
180 raise Exception("ERROR: parameter not valid.")
181 except Exception as e:
182 print(gemeral.error("[!] ERROR: Not enough parameters provided. Usage: unset OPTION"))
183 print(general.error("Traceback: " + str(e)))
184
185 def complete_unset(self, text, line, begidx, endidx):
186 # First, we will try to get the available parameters
187 unsettingOptions = ["all"] + self.CONFIG.keys()
188
189 if len(line.split(" ")) == 2:
190 if not text:
191 completions = unsettingOptions
192 else:
193 completions = [ f
194 for f in unsettingOptions
195 if f.startswith(text.upper())
196 ]
197 return completions
198
199 def do_run(self, line):
200 """Command that send the order to the framework to launch the current utility."""
201 if self._checkIfRequiredAreSet():
202 print(general.info("Launching the util..."))
203 else:
204 print(general.error("There are required parameters which have not been set."))
205 self.do_show("options")
206
207 def do_show(self, line):
208 """Showing the information about the module. The things to show are: 'options' and 'command'.
209 - ' options' will show the current values of each and every parameter.
210 - 'command' will show the command needed to launch the module as is using the cli applications."""
211 if line.lower() == "options":
212 print(general.info("Defining the different options for util " + self.UNAME + "..."))
213 for key in self.CONFIG.keys():
214 print(general.info("\t- " + (key + (" (*)." if self.CONFIG[key]["REQUIRED"] else ".") ).ljust(14) + "" + self.CONFIG[key]["DESCRIPTION"]))
215
216 print(general.info("Showing the current state of the options for util " + self.UNAME + "..."))
217 for key in self.CONFIG.keys():
218 print(general.info("\t- " + (key + (" (*)" if self.CONFIG[key]["REQUIRED"] else "") + ": ").ljust(14) + ("" if self.CONFIG[key]["CURRENT_VALUE"] == None else str(self.CONFIG[key]["CURRENT_VALUE"]))))
219 elif line.lower() == "command":
220 print(general.info("Equivalent command to be launched to imitate the current configuration:\n\t$ ") + general.title(self.createCommandLine()) + "\n")
221
222 def complete_show(self, text, line, begidx, endidx):
223 # First, we will try to get the available parameters
224 showOptions = ["options", "command"]
225
226 if len(line.split(" ")) == 2:
227 if not text:
228 completions = showOptions
229 else:
230 completions = [ f
231 for f in showOptions
232 if f.startswith(text.lower())
233 ]
234 return completions
235
236 def createCommandLine(self):
237 """Method to build the commandline that should execute the same actions as defined in the console."""
238 if self._checkIfRequiredAreSet():
239 command = self.UNAME
240 # Getting the params
241 params = self._getParams()
242 for p in params:
243 command += " " +p
244 # Returning the command
245 return command
246 else:
247 return self.UNAME + " -h # NOTE: all the required parameters are not set. Option '-h' is being shown."
248
249 def do_info(self, line):
250 """This command shows all the information available about the module."""
251 print(general.info("Displaying module information."))
252 self.do_show("options")
253 self.do_show("command")
254
255 def do_back(self, line):
256 """
257 This command unloads the current util and returns back to the main console.
258 """
259 return True
260
261 def do_exit(self, line):
262 """This command will exit the osrfconsole normally."""
263 print(general.info("Exiting the program..."))
264 sys.exit()
265
266 """
267 _ _ __
268 __| | ___ _ __ ___ __ _(_)_ __ / _|_ _
269 / _` |/ _ \| '_ ` _ \ / _` | | '_ \| |_| | | |
270 | (_| | (_) | | | | | | (_| | | | | | _| |_| |
271 \__,_|\___/|_| |_| |_|\__,_|_|_| |_|_| \__, |
272 |___/
273 """
274
275
276 ################################################################################
277 # Defining the class that will create the calls to the domainfy util. #
278 ################################################################################
279
280 class OSRFConsoleDomainfy(OSRFConsoleUtil):
281 """Class that controls an interactive domainfy program."""
282 # Setting up the name of the module
283 UNAME = "domainfy.py"
284
285 intro = ""
286 # Defining the prompt
287 prompt = general.emphasis('osrf (' + UNAME.split('.')[0] + ') > ')
288 # Defining the character to create hyphens
289 ruler = '-'
290
291 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("domainfy")
292
293 # Defining the configuration for this module
294 CONFIG = {}
295 CONFIG["NICK"] = {
296 "DESCRIPTION" : "Nick to be verified.",
297 "CURRENT_VALUE" : None,
298 "DEFAULT_VALUE" : None,
299 "REQUIRED" : True,
300 "OPTIONS" : []
301 }
302 CONFIG["TLD"] = {
303 "DESCRIPTION" : "Types of TLD to be verified",
304 "CURRENT_VALUE" : DEFAULT_VALUES["tlds"],
305 "DEFAULT_VALUE" : DEFAULT_VALUES["tlds"],
306 "REQUIRED" : False,
307 "OPTIONS" : domainfy.TLD.keys(),
308 }
309 CONFIG["THREADS"] = {
310 "DESCRIPTION" : "Number of threads to use.",
311 "CURRENT_VALUE" : DEFAULT_VALUES["threads"],
312 "DEFAULT_VALUE" : DEFAULT_VALUES["threads"],
313 "REQUIRED" : False,
314 "OPTIONS" : []
315 }
316 CONFIG["OUTPUT"] = {
317 "DESCRIPTION" : "The path to the output folder where the files will be created.",
318 "CURRENT_VALUE" : DEFAULT_VALUES["output_folder"],
319 "DEFAULT_VALUE" : DEFAULT_VALUES["output_folder"],
320 "REQUIRED" : False,
321 "OPTIONS" : []
322 }
323 CONFIG["EXTENSION"] = {
324 "DESCRIPTION" : "The default extension of the files to be written.",
325 "CURRENT_VALUE" : DEFAULT_VALUES["extension"],
326 "DEFAULT_VALUE" : DEFAULT_VALUES["extension"],
327 "REQUIRED" : False,
328 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
329 }
330 CONFIG["USER_DEFINED"] = {
331 "DESCRIPTION" : "Other TLD to be verified. Note that it should start with a '.'.",
332 "CURRENT_VALUE" : None,
333 "DEFAULT_VALUE" : None,
334 "REQUIRED" : False,
335 "OPTIONS" : [],
336 }
337
338 def _getParams(self):
339 """ Function that creates the array with the params that will work with this function"""
340 # Creating the parameters as if they were created using the command line
341 params = [
342 "-n" ] + self.CONFIG["NICK"]["CURRENT_VALUE"].split() + [
343 "-t" ] + self.CONFIG["TLD"]["CURRENT_VALUE"].split() + [
344 "-T", str(self.CONFIG["THREADS"]["CURRENT_VALUE"]),
345 "-o", self.CONFIG["OUTPUT"]["CURRENT_VALUE"],
346 "-e" ] + self.CONFIG["EXTENSION"]["CURRENT_VALUE"].split()
347
348 # Appending new tlds if provided
349 if self.CONFIG["USER_DEFINED"]["CURRENT_VALUE"] != None:
350 params += [ "-u", self.CONFIG["USER_DEFINED"]["CURRENT_VALUE"] ]
351 return params
352
353 def do_run(self, line):
354 """Running the current application. This method should be redefined for each util."""
355 print
356 # Checking if all the required parameters have been set
357 if self._checkIfRequiredAreSet():
358 print(general.info("Collecting the options set by the user..."))
359 # Getting the parser...
360 parser = domainfy.getParser()
361
362 # Generating the parameters
363 params = self._getParams()
364
365 args = parser.parse_args(params)
366
367 print(general.info("Launching " + self.UNAME + " with the following parameters: ") + general.emphashis(str(params)))
368
369 try:
370 usufy.main(args)
371 except Exception as e:
372 print(gemeral.error("[!] ERROR. Something happenned when launching the utility. Type 'show options' to check the parameters. "))
373 print(general.error("Traceback: " + str(e)))
374 else:
375 print(general.error("[!] ERROR. There are required parameters which have not been set."))
376 self.do_show("options")
377 print(general.success("Execution ended successfully."))
378
379 """
380 ================================================================================
381 _ _ __
382 ___ _ __ | |_(_)/ _|_ _
383 / _ \ '_ \| __| | |_| | | |
384 | __/ | | | |_| | _| |_| |
385 \___|_| |_|\__|_|_| \__, |
386 |___/
387 ================================================================================
388 """
389
390 ################################################################################
391 # Defining the class that will create the calls to the entify util. #
392 ################################################################################
393
394 class OSRFConsoleEntify(OSRFConsoleUtil):
395 """Class that controls an interactive entify program."""
396 # Setting up the name of the module
397 UNAME = "entify.py"
398
399 intro = ""
400 # Defining the prompt
401 prompt = 'osrf (' + UNAME.split('.')[0] + ') > '
402 # Defining the character to create hyphens
403 ruler = '-'
404
405 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("entify")
406
407 # Defining the configuration for this module
408 CONFIG = {}
409 CONFIG["URL"] = {
410 "DESCRIPTION" : "The URL to be checked.",
411 "CURRENT_VALUE" : None,
412 "DEFAULT_VALUE" : None,
413 "REQUIRED" : True,
414 "OPTIONS" : []
415 }
416 CONFIG["REGEXP"] = {
417 "DESCRIPTION" : "The regular expressions to be checked.",
418 "CURRENT_VALUE" : "all",
419 "DEFAULT_VALUE" : "all",
420 "REQUIRED" : False,
421 "OPTIONS" : regexp_selection.getAllRegexpNames(),
422 }
423 CONFIG["OUTPUT"] = {
424 "DESCRIPTION" : "The path to the output folder where the files will be created.",
425 "CURRENT_VALUE" : DEFAULT_VALUES["output_folder"],
426 "DEFAULT_VALUE" : DEFAULT_VALUES["output_folder"],
427 "REQUIRED" : False,
428 "OPTIONS" : []
429 }
430 CONFIG["EXTENSION"] = {
431 "DESCRIPTION" : "The default extension of the files to be written.",
432 "CURRENT_VALUE" : DEFAULT_VALUES["extension"],
433 "DEFAULT_VALUE" : DEFAULT_VALUES["extension"],
434 "REQUIRED" : False,
435 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
436 }
437
438 def _getParams(self):
439 """ Function that creates the array with the params that will work with this function"""
440 # Creating the parameters as if they were created using the command line
441 params = [
442 "-u", self.CONFIG["URL"]["CURRENT_VALUE"],
443 "-r" ] + self.CONFIG["REGEXP"]["CURRENT_VALUE"].split() + [
444 "-o", self.CONFIG["OUTPUT"]["CURRENT_VALUE"],
445 "-e" ] + self.CONFIG["EXTENSION"]["CURRENT_VALUE"].split()
446
447 return params
448
449 def do_run(self, line):
450 """Running the current application. This method should be redefined for each util."""
451 print
452 # Checking if all the required parameters have been set
453 if self._checkIfRequiredAreSet():
454 print(general.info("Collecting the options set by the user..."))
455 # Getting the parser...
456 parser = entify.getParser()
457
458 # Generating the parameters
459 params = self._getParams()
460
461 args = parser.parse_args(params)
462
463 print(general.info("Launching " + self.UNAME + " with the following parameters: ") + general.emphashis(str(params)))
464
465 try:
466 usufy.main(args)
467 except Exception as e:
468 print(gemeral.error("[!] ERROR. Something happened when launching the utility. Type 'show options' to check the parameters. "))
469 print(general.error("Traceback: " + str(e)))
470 else:
471 print(general.error("[!] ERROR. There are required parameters which have not been set."))
472 self.do_show("options")
473 print(general.success("Execution ended successfully."))
474
475 """
476 ================================================================================
477 _ _ __
478 _ __ ___ __ _(_) |/ _|_ _
479 | '_ ` _ \ / _` | | | |_| | | |
480 | | | | | | (_| | | | _| |_| |
481 |_| |_| |_|\__,_|_|_|_| \__, |
482 |___/
483 ================================================================================
484 """
485
486 ################################################################################
487 # Defining the class that will create the calls to the mailfy util. #
488 ################################################################################
489
490 class OSRFConsoleMailfy(OSRFConsoleUtil):
491 """Class that controls an interactive mailfy program."""
492 # Setting up the name of the module
493 UNAME = "mailfy.py"
494
495 intro = ""
496 # Defining the prompt
497 prompt = 'osrf (' + UNAME.split('.')[0] + ') > '
498 # Defining the character to create hyphens
499 ruler = '-'
500
501 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("mailfy")
502
503 # Defining the configuration for this module
504 CONFIG = {}
505 CONFIG["NICK"] = {
506 "DESCRIPTION" : "Alias to be verified.",
507 "CURRENT_VALUE" : None,
508 "DEFAULT_VALUE" : None,
509 "REQUIRED" : True,
510 "OPTIONS" : []
511 }
512 CONFIG["PLATFORMS"] = {
513 "DESCRIPTION" : "Platforms to be checked.",
514 "CURRENT_VALUE" : DEFAULT_VALUES["domains"],
515 "DEFAULT_VALUE" : DEFAULT_VALUES["domains"],
516 "REQUIRED" : False,
517 "OPTIONS" : mailfy.EMAIL_DOMAINS,
518 }
519 CONFIG["THREADS"] = {
520 "DESCRIPTION" : "Number of threads to use.",
521 "CURRENT_VALUE" : DEFAULT_VALUES["threads"],
522 "DEFAULT_VALUE" : DEFAULT_VALUES["threads"],
523 "REQUIRED" : False,
524 "OPTIONS" : []
525 }
526 CONFIG["OUTPUT"] = {
527 "DESCRIPTION" : "The path to the output folder where the files will be created.",
528 "CURRENT_VALUE" : DEFAULT_VALUES["output_folder"],
529 "DEFAULT_VALUE" : DEFAULT_VALUES["output_folder"],
530 "REQUIRED" : False,
531 "OPTIONS" : []
532 }
533 CONFIG["EXTENSION"] = {
534 "DESCRIPTION" : "The default extension of the files to be written.",
535 "CURRENT_VALUE" : DEFAULT_VALUES["extension"],
536 "DEFAULT_VALUE" : DEFAULT_VALUES["extension"],
537 "REQUIRED" : False,
538 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
539 }
540
541 def _getParams(self):
542 """ Function that creates the array with the params that will work with this function"""
543 # Creating the parameters as if they were created using the command line
544 params = [
545 "-n" ] + self.CONFIG["NICK"]["CURRENT_VALUE"].split() + [
546 "-p" ] + self.CONFIG["PLATFORMS"]["CURRENT_VALUE"].split() + [
547 "-T", str(self.CONFIG["THREADS"]["CURRENT_VALUE"]),
548 "-o", self.CONFIG["OUTPUT"]["CURRENT_VALUE"],
549 "-e" ] + self.CONFIG["EXTENSION"]["CURRENT_VALUE"].split()
550
551 return params
552
553 def do_run(self, line):
554 """Running the current application. This method should be redefined for each util."""
555 print
556 # Checking if all the required parameters have been set
557 if self._checkIfRequiredAreSet():
558 print(general.info("Collecting the options set by the user..."))
559 # Getting the parser...
560 parser = mailfy.getParser()
561
562 # Generating the parameters
563 params = self._getParams()
564
565 args = parser.parse_args(params)
566
567 print(general.info("Launching " + self.UNAME + " with the following parameters: ") + general.emphashis(str(params)))
568
569 try:
570 usufy.main(args)
571 except Exception as e:
572 print(gemeral.error("[!] ERROR. Something happenned when launching the utility. Type 'show options' to check the parameters. "))
573 print(general.error("Traceback: " + str(e)))
574 else:
575 print(general.error("[!] ERROR. There are required parameters which have not been set."))
576 self.do_show("options")
577 print(general.success("Execution ended successfully."))
578
579 """
580 ================================================================================
581 _ __
582 _ __ | |__ ___ _ __ ___ / _|_ _
583 | '_ \| '_ \ / _ \| '_ \ / _ \ |_| | | |
584 | |_) | | | | (_) | | | | __/ _| |_| |
585 | .__/|_| |_|\___/|_| |_|\___|_| \__, |
586 |_| |___/
587 ================================================================================
588 """
589
590 ################################################################################
591 # Defining the class that will create the calls to the phonefy util. #
592 ################################################################################
593
594 class OSRFConsolePhonefy(OSRFConsoleUtil):
595 """Class that controls an interactive phonefy program."""
596 # Setting up the name of the module
597 UNAME = "phonefy.py"
598
599 intro = ""
600 # Defining the prompt
601 prompt = 'osrf (' + UNAME.split('.')[0] + ') > '
602 # Defining the character to create hyphens
603 ruler = '-'
604
605 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("phonefy")
606
607 # Defining the configuration for this module
608 CONFIG = {}
609 CONFIG["NUMBER"] = {
610 "DESCRIPTION" : "Numbers to be verified.",
611 "CURRENT_VALUE" : None,
612 "DEFAULT_VALUE" : None,
613 "REQUIRED" : True,
614 "OPTIONS" : []
615 }
616 CONFIG["PLATFORMS"] = {
617 "DESCRIPTION" : "Platforms to be checked.",
618 "CURRENT_VALUE" : DEFAULT_VALUES["platforms"],
619 "DEFAULT_VALUE" : DEFAULT_VALUES["platforms"],
620 "REQUIRED" : False,
621 "OPTIONS" : platform_selection.getAllPlatformNames("phonefy"),
622 }
623 CONFIG["OUTPUT"] = {
624 "DESCRIPTION" : "The path to the output folder where the files will be created.",
625 "CURRENT_VALUE" : DEFAULT_VALUES["output_folder"],
626 "DEFAULT_VALUE" : DEFAULT_VALUES["output_folder"],
627 "REQUIRED" : False,
628 "OPTIONS" : []
629 }
630 CONFIG["EXTENSION"] = {
631 "DESCRIPTION" : "The default extension of the files to be written.",
632 "CURRENT_VALUE" : DEFAULT_VALUES["extension"],
633 "DEFAULT_VALUE" : DEFAULT_VALUES["extension"],
634 "REQUIRED" : False,
635 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
636 }
637
638 def _getParams(self):
639 """ Function that creates the array with the params that will work with this function"""
640 # Creating the parameters as if they were created using the command line
641 params = [
642 "-n" ] + self.CONFIG["NICK"]["CURRENT_VALUE"].split() + [
643 "-p" ] + self.CONFIG["PLATFORMS"]["CURRENT_VALUE"].split() + [
644 "-o", self.CONFIG["OUTPUT"]["CURRENT_VALUE"],
645 "-e" ] + self.CONFIG["EXTENSION"]["CURRENT_VALUE"].split()
646
647 return params
648
649 def do_run(self, line):
650 """
651 Running the current application. This method should be redefined for each util.
652 """
653 print
654 # Checking if all the required parameters have been set
655 if self._checkIfRequiredAreSet():
656 print(general.info("Collecting the options set by the user..."))
657 # Getting the parser...
658 parser = phonefy.getParser()
659
660 # Generating the parameters
661 params = self._getParams()
662
663 args = parser.parse_args(params)
664
665 print(general.info("Launching " + self.UNAME + " with the following parameters: ") + general.emphashis(str(params)))
666
667 try:
668 usufy.main(args)
669 except Exception as e:
670 print(gemeral.error("[!] ERROR. Something happenned when launching the utility. Type 'show options' to check the parameters. "))
671 print(general.error("Traceback: " + str(e)))
672 else:
673 print(general.error("[!] ERROR. There are required parameters which have not been set."))
674 self.do_show("options")
675 print(general.success("Execution ended successfully."))
676
677 """
678 ================================================================================
679 _ __
680 ___ ___ __ _ _ __ ___| |__ / _|_ _
681 / __|/ _ \/ _` | '__/ __| '_ \| |_| | | |
682 \__ \ __/ (_| | | | (__| | | | _| |_| |
683 |___/\___|\__,_|_| \___|_| |_|_| \__, |
684 |___/
685 ================================================================================
686 """
687
688 ################################################################################
689 # Defining the class that will create the calls to the searchfy util. #
690 ################################################################################
691
692 class OSRFConsoleSearchfy(OSRFConsoleUtil):
693 """Class that controls an interactive searchfy program"""
694 # Setting up the name of the module
695 UNAME = "searchfy.py"
696
697 intro = ""
698 # Defining the prompt
699 prompt = 'osrf (' + UNAME.split('.')[0] + ') > '
700 # Defining the character to create hyphens
701 ruler = '-'
702
703 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("searchfy")
704
705 # Defining the configuration for this module
706 CONFIG = {}
707 CONFIG["QUERY"] = {
708 "DESCRIPTION" : "Query to be verified. Escape \" and \'.",
709 "CURRENT_VALUE" : None,
710 "DEFAULT_VALUE" : None,
711 "REQUIRED" : True,
712 "OPTIONS" : []
713 }
714 CONFIG["PLATFORMS"] = {
715 "DESCRIPTION" : "Platforms to be checked.",
716 "CURRENT_VALUE" : DEFAULT_VALUES["platforms"],
717 "DEFAULT_VALUE" : DEFAULT_VALUES["platforms"],
718 "REQUIRED" : False,
719 "OPTIONS" : platform_selection.getAllPlatformNames("searchfy"),
720 }
721 CONFIG["OUTPUT"] = {
722 "DESCRIPTION" : "The path to the output folder where the files will be created.",
723 "CURRENT_VALUE" : DEFAULT_VALUES["output_folder"],
724 "DEFAULT_VALUE" : DEFAULT_VALUES["output_folder"],
725 "REQUIRED" : False,
726 "OPTIONS" : []
727 }
728 CONFIG["EXTENSION"] = {
729 "DESCRIPTION" : "The default extension of the files to be written.",
730 "CURRENT_VALUE" : DEFAULT_VALUES["extension"],
731 "DEFAULT_VALUE" : DEFAULT_VALUES["extension"],
732 "REQUIRED" : False,
733 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
734 }
735
736 def _getParams(self):
737 """ Function that creates the array with the params that will work with this function"""
738 # Creating the parameters as if they were created using the command line
739 params = [
740 "-q" ] + self.CONFIG["QUERY"]["CURRENT_VALUE"].split() + [
741 "-p" ] + self.CONFIG["PLATFORMS"]["CURRENT_VALUE"].split() + [
742 "-o", self.CONFIG["OUTPUT"]["CURRENT_VALUE"],
743 "-e" ] + self.CONFIG["EXTENSION"]["CURRENT_VALUE"].split()
744
745 return params
746
747 def do_run(self, line):
748 """Running the current application. This method should be redefined for each util.
749 """
750 print
751 # Checking if all the required parameters have been set
752 if self._checkIfRequiredAreSet():
753 print(general.info("Collecting the options set by the user..."))
754 # Getting the parser...
755 parser = searchfy.getParser()
756
757 # Generating the parameters
758 params = self._getParams()
759
760 args = parser.parse_args(params)
761
762 print(general.info("Launching " + self.UNAME + " with the following parameters: ") + general.emphashis(str(params)))
763
764 try:
765 usufy.main(args)
766 except Exception as e:
767 print(gemeral.error("[!] ERROR. Something happenned when launching the utility. Type 'show options' to check the parameters. "))
768 print(general.error("Traceback: " + str(e)))
769 else:
770 print(general.error("[!] ERROR. There are required parameters which have not been set."))
771 self.do_show("options")
772 print(general.success("Execution ended successfully."))
773
774 """
775 ================================================================================
776 __
777 _ _ ___ _ _ / _|_ _
778 | | | / __| | | | |_| | | |
779 | |_| \__ \ |_| | _| |_| |
780 \__,_|___/\__,_|_| \__, |
781 |___/
782 ================================================================================
783 """
784
785 ################################################################################
786 # Defining the class that will create the calls to the usufy util. #
787 ################################################################################
788
789 class OSRFConsoleUsufy(OSRFConsoleUtil):
790 """Class that controls an interactive usufy program"""
791 # Setting up the name of the module
792 UNAME = "usufy.py"
793
794 intro = ""
795 # Defining the prompt
796 prompt = general.emphasis('osrf (' + UNAME.split('.')[0] + ') > ')
797 # Defining the character to create hyphens
798 ruler = '-'
799
800 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("usufy")
801
802 # Defining the configuration for this module
803 CONFIG = {}
804 CONFIG["NICK"] = {
805 "DESCRIPTION" : "Alias to be verified.",
806 "CURRENT_VALUE" : None,
807 "DEFAULT_VALUE" : None,
808 "REQUIRED" : True,
809 "OPTIONS" : []
810 }
811 CONFIG["PLATFORMS"] = {
812 "DESCRIPTION" : "Platforms to be checked.",
813 "CURRENT_VALUE" : DEFAULT_VALUES["platforms"],
814 "DEFAULT_VALUE" : DEFAULT_VALUES["platforms"],
815 "REQUIRED" : False,
816 "OPTIONS" : platform_selection.getAllPlatformNames("usufy"),
817 }
818 CONFIG["THREADS"] = {
819 "DESCRIPTION" : "Number of threads to use.",
820 "CURRENT_VALUE" : DEFAULT_VALUES["threads"],
821 "DEFAULT_VALUE" : DEFAULT_VALUES["threads"],
822 "REQUIRED" : False,
823 "OPTIONS" : []
824 }
825 CONFIG["OUTPUT"] = {
826 "DESCRIPTION" : "The path to the output folder where the files will be created.",
827 "CURRENT_VALUE" : DEFAULT_VALUES["output_folder"],
828 "DEFAULT_VALUE" : DEFAULT_VALUES["output_folder"],
829 "REQUIRED" : False,
830 "OPTIONS" : []
831 }
832 CONFIG["EXTENSION"] = {
833 "DESCRIPTION" : "The default extension of the files to be written.",
834 "CURRENT_VALUE" : DEFAULT_VALUES["extension"],
835 "DEFAULT_VALUE" : DEFAULT_VALUES["extension"],
836 "REQUIRED" : False,
837 "OPTIONS" : ['csv', 'xls', 'xlsx', 'json', 'gml']
838 }
839
840 def _getParams(self):
841 """Function that creates the array with the params that will work with this function."""
842 # Creating the parameters as if they were created using the command line
843 params = [
844 "-n" ] + self.CONFIG["NICK"]["CURRENT_VALUE"].split() + [
845 "-p" ] + self.CONFIG["PLATFORMS"]["CURRENT_VALUE"].split() + [
846 "-T", str(self.CONFIG["THREADS"]["CURRENT_VALUE"]),
847 "-o", self.CONFIG["OUTPUT"]["CURRENT_VALUE"],
848 "-e" ] + self.CONFIG["EXTENSION"]["CURRENT_VALUE"].split()
849
850 return params
851
852 def do_run(self, line):
853 """Running the current application. This method should be redefined for each util."""
854 print
855 # Checking if all the required parameters have been set
856 if self._checkIfRequiredAreSet():
857 print(general.info("Collecting the options set by the user..."))
858 # Getting the parser...
859 parser = usufy.getParser()
860
861 # Generating the parameters
862 params = self._getParams()
863
864 args = parser.parse_args(params)
865
866 print(general.info("Launching " + self.UNAME + " with the following parameters: ") + general.emphashis(str(params)))
867
868 try:
869 usufy.main(args)
870 except Exception as e:
871 print(gemeral.error("[!] ERROR. Something happenned when launching the utility. Type 'show options' to check the parameters. "))
872 print(general.error("Traceback: " + str(e)))
873 else:
874 print(general.error("[!] ERROR. There are required parameters which have not been set."))
875 self.do_show("options")
876 print(general.success("Execution ended successfully."))
877
878
879 """
880 ================================================================================
881 __ _
882 ___ ___ _ __ / _| ___ ___ _ __ ___ ___ | | ___
883 / _ \/ __| '__| |_ / __/ _ \| '_ \/ __|/ _ \| |/ _ \
884 | (_) \__ \ | | _| (_| (_) | | | \__ \ (_) | | __/
885 \___/|___/_| |_| \___\___/|_| |_|___/\___/|_|\___|
886
887 ================================================================================
888 """
889 ################################################################################
890 # Main osrfconsole wrapper. It will control the rest of the utils. #
891 ################################################################################
892
893 class OSRFConsoleMain(cmd.Cmd):
894 """
895 OSRFramework console application to control the different framework utils.
896
897 Type 'help' to find the commands.
898 """
899
900 DISCLAIMER = '''\tOSRFConsole ''' + __version__ + ''' - Copyright (C) F. Brezo and Y. Rubio (i3visio) 2016-2017
901
902 This program comes with ABSOLUTELY NO WARRANTY.
903 This is free software, and you are welcome to redistribute it under certain conditions. For additional info, visit to <http://www.gnu.org/licenses/gpl-3.0.txt>.'''
904
905 intro = banner.text + "\n" + DISCLAIMER
906
907 info = "\n General information"
908 info += "\n ==================="
909 info += "\n OSRFramework stands for Open Sources Research Framework. It includes a set of tools that help the analyst in the task of user profiling making use of different OSINT tools. To get additional information about the available commands type 'help'."
910 info += "\n"
911 info += "\n Modules available:"
912 info += "\n ------------------"
913 info += "\n\t- usufy --> the Jewel of the Chrown. A tool that verifies if a username exists in " + str(len(platform_selection.getAllPlatformNames("usufy"))) + " platforms."
914 info += "\n\t- mailfy --> a tool to check if a username has been registered in up to " + str(len(mailfy.EMAIL_DOMAINS )) + " email providers."
915 info += "\n\t- searchfy --> a tool to look for profiles using full names and other info in " + str(len(platform_selection.getAllPlatformNames("searchfy"))) + " platforms."
916 info += "\n\t- domainfy --> a tool to check the existence of a given domain in up to " + str(domainfy.getNumberTLD()) + " different TLD."
917 info += "\n\t- phonefy --> a tool that checks if a phone number has been linked to spam practices in " + str(len(platform_selection.getAllPlatformNames("phonefy"))) + " platforms."
918 info += "\n\t- entify --> a util to look for regular expressions using " + str(len(regexp_selection.getAllRegexpNames())) + " patterns."
919 info += "\n"
920
921 # Appending the self.info data to the headers...
922 intro += info
923
924 # Defining the prompt
925 prompt = general.emphasis('osrf > ')
926
927 ruler = '='
928
929 def do_info(self, line):
930 """
931 Command that shows again the general information about the application.
932 """
933 configInfo = "\n Additional configuration files:"
934 configInfo += "\n -------------------------------"
935 configInfo += "\n You will be able to find more configuration options in the following files in your system. The relevant paths are the ones that follows:"
936
937 # Get the configuration folders in each system
938 paths = configuration.getConfigPath()
939
940 configInfo += "\n\t- '" + os.path.join(paths["appPath"], "accounts.cfg") + "' -> Configuration details about the login credentials already configured in the framework."
941 configInfo += "\n\t- '" + os.path.join(paths["appPath"], "api_keys.cfg") + "' -> Configuration details about the API credentials already configured."
942 configInfo += "\n\t- '" + os.path.join(paths["appPath"], "browser.cfg") + "' -> Connection configuration about how the browsers will be connected."
943 configInfo += "\n\t- '" + os.path.join(paths["appPath"], "general.cfg") + "' -> General configuration of the different utils containing the default options."
944 configInfo += "\n\t- '" + paths["appPathDefaults"] + "/' -> Directory containing default files as a backup."
945 configInfo += "\n\t- '" + paths["appPathPlugins"] + "/' -> Directory containing the details of the user defined plugins."
946 configInfo += "\n\t- '" + paths["appPathPatterns"] + "/' -> Directory containing the user-defined patterns for entify.py."
947 configInfo += "\n\t- '" + paths["appPathWrappers"] + "/' -> Directory containing the user-defined wrappers for usufy, searchfy and phonefy platforms."
948 configInfo += "\n"
949 print(general.title(self.info) + general.info(configInfo))
950
951 def do_use(self, line):
952 """
953 This command will define which of the framework's utilities will be loaded.
954
955 The available options are the following:
956 - domainfy
957 - entify
958 - mailfy
959 - phonefy
960 - searchfy
961 - usufy
962 For example, type 'use usufy' to load the usufy util. You can always use
963 the <TAB> to be helped using the autocomplete options.
964 """
965 if line not in UTILS:
966 print(general.warning("[!] Util is not correct. Try 'help use' to check the available options."))
967 return False
968 elif line == "domainfy":
969 OSRFConsoleDomainfy().cmdloop()
970 elif line == "entify":
971 OSRFConsoleEntify().cmdloop()
972 elif line == "mailfy":
973 OSRFConsoleMailfy().cmdloop()
974 elif line == "phonefy":
975 OSRFConsolePhonefy().cmdloop()
976 elif line == "searchfy":
977 OSRFConsoleSearchfy().cmdloop()
978 elif line == "usufy":
979 OSRFConsoleUsufy().cmdloop()
980 else:
981 print(general.warning("[!] Not implemented yet. Try 'help use' to check the available options."))
982
983 def complete_use(self, text, line, begidx, endidx):
984 if not text:
985 completions = UTILS
986 else:
987 completions = [ f
988 for f in UTILS
989 if f.startswith(text.lower())
990 ]
991 return completions
992
993 def do_exit(self, line):
994 """
995 This command will exit osrfconsole normally.
996 """
997 print(info("Exiting..."))
998 sys.exit()
999
1000
1001 if __name__ == '__main__':
1002 OSRFConsoleMain().cmdloop()
0 #!/usr/bin/env python
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 #
8 # This program is part of OSRFramework. You can redistribute it and/or modify
9 # it under the terms of the GNU Affero General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU Affero General Public License for more details.
17 #
18 # You should have received a copy of the GNU Affero General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #
21 ################################################################################
22
23 __author__ = "Felix Brezo y Yaiza Rubio "
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import json
34 import os
35 import shlex
36 import sys
37 import time
38
39 # Server code
40 import flask
41 from flask import Flask
42 from flask import abort, redirect, url_for
43 from flask import request
44 from flask import render_template
45 from flask import send_file
46
47 from werkzeug.utils import secure_filename
48
49 # OSRFramework libraries
50 import osrframework
51 import osrframework.domainfy as domainfy
52 import osrframework.entify as entify
53 import osrframework.mailfy as mailfy
54 import osrframework.phonefy as phonefy
55 import osrframework.searchfy as searchfy
56 import osrframework.usufy as usufy
57
58 import osrframework.utils.configuration as configuration
59 import osrframework.utils.platform_selection as platform_selection
60 import osrframework.utils.updates as updates
61 import osrframework.utils.general as general
62 from osrframework.utils.general import error, warning, success, info, title, emphasis
63
64
65 # GLOBAL VARIABLES
66 # -----------------
67 # Important notice: this configuration makes STRONGLY UNADVISABLE to deploy this
68 # server in a different place to localhost for security reasons.
69 # Creating the SECRET TOKEN
70 SECRET_TOKEN = ""
71 # Temporal data. A dictionary of extensions.
72 loaded_data = {}
73 # Data folder
74 configurationPaths = configuration.getConfigPath()
75 DATA_FOLDER = configurationPaths["appPathData"]
76 STATIC_FOLDER = os.path.join(configurationPaths["appPathServer"], "static")
77 TEMPLATES_FOLDER = os.path.join(configurationPaths["appPathServer"], "templates")
78 # Header filename
79 HEADER = "profiles"
80
81 # Starting the app
82 app = Flask(
83 __name__,
84 static_url_path='',
85 static_folder=STATIC_FOLDER,
86 template_folder=TEMPLATES_FOLDER
87 )
88
89 @app.route("/")
90 def index():
91 # Getting the status of the current OSRFramework installation
92 try:
93 hasUpdates, version = updates.hasUpdatesOnPypi("osrframework")
94 if hasUpdates:
95 notice = {
96 "icon": "warning",
97 "message": "OSRFramework's version is " + version + ", but there is a new release on Pypi (" + version + "). We encourage you to upgrade soon!" ,
98 "type": "warning"
99 }
100 else:
101 notice = {
102 "icon": "thumbs-up",
103 "message": "OSRFramework is updated to the latest version (" + version + ").",
104 "type": "success"
105 }
106 except:
107 notice = {
108 "icon": "close",
109 "message": "OSRFramework Server could not get connected to Pypi to find new versions. Current version is: " + str(osrframework.__version__) + ".",
110 "type": "error"
111 }
112 return render_template('home.html', mt_home='class=current', notice=notice)
113
114
115 @app.route("/info")
116 def getInfo():
117 info = {
118 "__version__": "OSRFramework " + osrframework.__version__,
119 "license": "AGPLv3",
120 "server_time": _getServerTime()[1],
121 "source_code": "https://github.com/i3visio/osrframework",
122 }
123 return flask.Response(
124 json.dumps(
125 info,
126 indent=2,
127 sort_keys=True
128 ),
129 status=200,
130 mimetype="application/json"
131 )
132
133
134 @app.route("/research")
135 @app.route("/research/<program>")
136 def research(program=None):
137 """Prepare research UI for the main tools in the framework.
138 """
139 platOptions = platform_selection.getAllPlatformNames(program)
140
141 if not program:
142 return render_template('research.html', mt_research='class=current', mr_main='class=current')
143 else:
144 params = request.args.get('query_text')
145
146 if params != None:
147 # We perform an additional check to see if we are receiving an array
148 if params[0] == "[":
149 # TODO: make it more flexible. This is a workaround to process whois results
150 params = params.replace("u'", "")
151 params = params.replace("'", "")
152 params = params.replace(",", "")
153 params = params.replace("[", "")
154 params = params.replace("]", "")
155 return render_template('research-' + program + '.html', mt_research='class=current', query_text=params, plat_options=platOptions)
156 else:
157 return render_template('research-' + program + '.html', mt_research='class=current', plat_options=platOptions)
158
159
160 def buildCommandFromParams(program, params):
161 strCommand = program + ".py "
162
163 for p in params:
164 strCommand += p + " "
165
166 return strCommand
167
168 @app.route('/research/<program>', methods=['POST'])
169 def run(program):
170 """Loading OSRFramework output...
171 """
172 platOptions = platform_selection.getAllPlatformNames(program)
173
174 # Loading the stored global data
175 global loaded_data
176 global DATA_FOLDER
177 output_folder = DATA_FOLDER
178
179 answer = []
180
181 form = request.form
182
183 if "terminal-form" in form.keys():
184 strParams = request.form['tex_command']
185
186 # Splitting the query
187 params = shlex.split(strParams)
188
189 # Manually adding the data folder if NOT provided
190 if "-o " not in strParams:
191 params += ["-o", output_folder]
192
193 elif "windowed-form" in form.keys():
194 # Manually building params
195 params = []
196
197 # Iterating through all the attributes. We will use its name to identify them
198 for key in form.keys():
199 if key == "tex_query":
200 # Adding the queries from the first text file
201 if program != "searchfy":
202 params += ["-n"]
203 else:
204 params += ["-q"]
205
206 # Splitting the query
207 splittedQuery = shlex.split(request.form[key])
208
209 # Adding the parameters
210 params += splittedQuery
211
212 elif key == "select_platforms":
213 # Adding the parameter depending on the platform
214 if program == "domainfy":
215 params += ["-t"]
216 elif program == "mailfy":
217 params += ["-d"]
218 else:
219 params += ["-p"]
220
221 # This is a MultiDict. We have to ad an iteration
222 for pName in form.getlist(key):
223 params += [pName]
224
225 elif "export_" in key:
226 params += ["-e"]
227 params += [key.split("_")[1]]
228
229 elif key == "open_url":
230 params += ["-w"]
231
232 elif key == "tex_filename":
233 params += ["-F"]
234 params += [request.form[key]]
235
236 params += ["-o", DATA_FOLDER]
237
238 # Selecting the appropriate program
239 if program == "domainfy":
240 args = domainfy.getParser().parse_args(params)
241 elif program == "entify":
242 args = entify.getParser().parse_args(params)
243 elif program == "mailfy":
244 args = mailfy.getParser().parse_args(params)
245 elif program == "phonefy":
246 args = phonefy.getParser().parse_args(params)
247 elif program == "searchfy":
248 args = searchfy.getParser().parse_args(params)
249 elif program == "usufy":
250 args = usufy.getParser().parse_args(params)
251
252 # Return output. text/html is required for most browsers to show the text
253 try:
254 answer = runQuery(program=program, args=args)
255 except:
256 abort(400)
257
258 # Reading CSV
259 try:
260 with open(os.path.join(args.output_folder, args.file_header + ".csv")) as iF:
261 everything = iF.read().splitlines()
262 loaded_data["csv"] = ""
263 for i, line in enumerate(everything):
264 loaded_data["csv"] += line
265 # Checking if it is the last line. This is done to avoid extra lines.
266 if i+1 != len (everything):
267 loaded_data["csv"] += "\n"
268 except:
269 pass
270
271 return render_template(
272 'research-' + program + '.html',
273 mt_research='class=current',
274 plat_options=platOptions,
275 text_results=general.usufyToTextExport(answer),
276 command=buildCommandFromParams(program, params)
277 )
278
279
280 def allowed_file(filename):
281 ALLOWED_EXTENSIONS = set(['csv'])
282 return '.' in filename and \
283 filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
284
285
286 @app.route("/explore", methods=['GET', 'POST'])
287 def explore():
288 # Based on http://flask.pocoo.org/docs/0.12/patterns/fileuploads/
289 global loaded_data
290
291 if request.method == 'POST':
292 # check if the post request has the file part
293 if 'file' not in request.files:
294 flash('No file part')
295 return redirect(request.url)
296 file = request.files['file']
297
298 # if user does not select file, browser also
299 # submit a empty part without filename
300 if file.filename == '':
301 notice = {
302 "icon": "warning",
303 "message": "No file was selected." ,
304 "type": "warning"
305 }
306 return render_template('explore.html', mt_explore='class=current', alert=notice)
307
308 # Checking if the file name is permitted
309 if file and allowed_file(file.filename):
310 filename = secure_filename(file.filename)
311
312 # TODO: pretty unsafe as it is now
313 # Recovering the loaded_data: !
314 loaded_data["csv"] = ""
315 everything = file.stream.read().splitlines()
316 for i, line in enumerate(everything):
317 loaded_data["csv"] += line
318 # Checking if it is the last line. This is done to avoid extra lines.
319 if i+1 != len (everything):
320 loaded_data["csv"] += "\n"
321 return render_template('explore.html', mt_explore='class=current', csvData=loaded_data["csv"].decode('utf-8'))
322 else:
323 notice = {
324 "icon": "close",
325 "message": "This is not a valid extension. We only support CSV files.",
326 "type": "error"
327 }
328 return render_template('explore.html', mt_explore='class=current', alert=notice)
329 else:
330 try:
331 csvData=loaded_data["csv"].decode('utf-8')
332 return render_template(
333 'explore.html',
334 mt_explore='class=current',
335 csvData=csvData
336 )
337 except:
338 return render_template(
339 'explore.html',
340 mt_explore='class=current'
341 )
342
343
344 @app.route("/get_temporal_data/<fileName>")
345 def get_temporal_data(fileName):
346 global loaded_data
347 extension = fileName.split('.')[-1]
348 if extension in loaded_data.keys():
349 return loaded_data[extension]
350 else:
351 return "No data found."
352
353
354 def runQuery(program, args=[]):
355 """Function that wraps the queries.
356 """
357 # Selecting the appropriate program
358 if program == "domainfy":
359 answer = domainfy.main(args)
360 elif program == "entify":
361 answer = entify.main(args)
362 elif program == "mailfy":
363 answer = mailfy.main(args)
364 elif program == "phonefy":
365 answer = phonefy.main(args)
366 elif program == "searchfy":
367 answer = searchfy.main(args)
368 elif program == "usufy":
369 answer = usufy.main(args)
370
371 # Returning the output
372 return answer
373
374
375 # --------------
376 # API Management
377 # --------------
378
379
380 @app.route('/api/v1/<command>/<query>')
381 def api_v1(command, query):
382 """Loading API v1.0 executions...
383 :param command: the command to be launched.
384 :param query: the user name to be searched.
385
386 This application can received a random number set by the administrator
387 that may allow the one who performs the query to run code. Use it with
388 caution.
389 """
390 # Splitting the query
391 splittedQuery = shlex.split(query)
392
393 # Get info froo OSRFramework configuration files
394 if SECRET_TOKEN and SECRET_TOKEN == request.args.get('secret_token'):
395 params = splittedQuery
396 else:
397 params = [splittedQuery[0]]
398
399 # Selecting the appropriate program
400 if command == "domainfy":
401 args = domainfy.getParser().parse_args(['-n'] + params)
402 elif command == "entify":
403 args = entify.getParser().parse_args(['-w'] + params)
404 elif command == "mailfy":
405 args = mailfy.getParser().parse_args(['-n'] + params)
406 elif command == "phonefy":
407 args = phonefy.getParser().parse_args(['-n'] + params)
408 elif command == "searchfy":
409 args = searchfy.getParser().parse_args(['-q'] + params)
410 elif command == "usufy":
411 args = usufy.getParser().parse_args(['-n'] + params)
412
413 answer = runQuery(command, args)
414 # Grabbing current Time
415 osrfTimestamp, osrfDate = _getServerTime()
416
417 if answer != None:
418 return flask.Response(
419 json.dumps({
420 "code": 200,
421 "content": answer,
422 'date': osrfDate,
423 "description": "200 OK. The response contains an entity corresponding to the requested resource.",
424 'timestamp': osrfTimestamp
425 },
426 indent=2,
427 sort_keys=True
428 ),
429 status=200,
430 mimetype="application/json"
431 )
432 else:
433 abort(400)
434
435
436 def _getServerTime():
437 """Get current time and date.
438 """
439 t = time.time()
440 d = time.ctime(int(time.time()))
441 return t, d
442
443
444 # ----------------
445 # Error Management
446 # ----------------
447
448
449 @app.errorhandler(400)
450 def general_error(error):
451 """400 Bad Request. The server cannot or will not process the request due to an apparent client error (e.g., malformed request syntax, too large size, invalid request message framing, or deceptive request routing).
452 """
453 return render_template(
454 'error.html',
455 errorCode='400',
456 errorDescription="Client Error: 400 Bad Request. The server cannot or will not process the request due to something that is perceived to be a client error (e.g., malformed request syntax, invalid request message framing, or deceptive request routing)."
457 ), 400
458
459
460 @app.errorhandler(403)
461 def not_found_error(error):
462 """403 Forbidden. The request was a valid request, but the server is refusing to respond to it. The user might be logged in but does not have the necessary permissions for the resource.
463 """
464 return render_template(
465 'error.html',
466 errorCode='403',
467 errorDescription='Client Error: 403 Forbidden. The request was a valid request, but the server is refusing to respond to it.'
468 ), 403
469
470
471 @app.errorhandler(404)
472 def not_found_error(error):
473 """404 Not Found. Thee requested resource could not be found but may be available in the future. Subsequent requests by the client are permissible.
474 """
475 return render_template(
476 'error.html',
477 errorCode='404',
478 errorDescription='Client Error: 404 Not Found. The requested resource could not be found but may be available again in the future. Subsequent requests by the client are permissible.',
479 ), 404
480
481
482 # --------------
483 # Launching code
484 # --------------
485
486
487 if __name__ == "__main__":
488 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("osrframework-server")
489
490 try:
491 SECRET_TOKEN = DEFAULT_VALUES["secret_token"]
492 except:
493 SECRET_TOKEN = None
494
495 try:
496 # Get file path from
497 app.config['UPLOAD_FOLDER'] = DEFAULT_VALUES["upload_folder"]
498 except:
499 app.config['UPLOAD_FOLDER'] = "/tmp/"
500
501 # Loading the server parser
502 parser = argparse.ArgumentParser(
503 description='OSRFramework Server - The tool that will start a local server.',
504 prog='./osrframework-server.py',
505 epilog="Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.",
506 add_help=False
507 )
508
509 # adding the option
510 groupServerConfiguration = parser.add_argument_group('Configuration arguments', 'Configuring the processing parameters.')
511 groupServerConfiguration.add_argument('--host', metavar='<IP>', required=False, default=DEFAULT_VALUES["host"], action='store', help='choose the host in which the server will be accesible. If "0.0.0.0" is choosen, the server will be accesible by any remote machine. Use this carefully. Default: localhost.')
512 groupServerConfiguration.add_argument('--port', metavar='<PORT>', required=False, default=DEFAULT_VALUES["port"], type=int, action='store', help='choose the port in which the server will be accesible. Use this carefully.')
513 groupServerConfiguration.add_argument('--debug', required=False, default=DEFAULT_VALUES["debug"], action='store_true', help='choose whether error messages will be deployed. Do NOT use this for production.')
514
515 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
516 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
517 groupAbout.add_argument('--version', action='version', version='%(prog)s ' + " " + osrframework.__version__, help='shows the version of the program and exists.')
518
519 # Parse args
520 args = parser.parse_args()
521
522 print(general.title(osrframework.utils.banner.text))
523 # Starting the server
524 print(general.info("[*] Server started at " + "http://" + args.host + ":" + str(args.port) + "... You can access it in your browser."))
525 print(general.info("[*] Press <Ctrl + C> at any time to stop the server."))
526
527 app.run(
528 debug=args.debug,
529 host=args.host,
530 port=args.port
531 )
532
533 print(general.info("\n[*] OSRFramework server exited normally."))
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22
23 # Calling the logger when being imported
24 osrframework.utils.logger.setupLogger(loggerName="osrframework.patterns")
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class BitcoinAddress(RegexpObject):
25 '''
26 <BitcoinAddress> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.bitcoin.address"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "([13][a-km-zA-HJ-NP-Z1-9]{26,33})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class DNI(RegexpObject):
25 '''
26 <DNI> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.dni"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z1-9]" + "[0-9]{7,8}[\-\ ]?[a-zA-Z]" +"[^a-zA-Z1-9]"]
40
41 def isValidExp(self, exp):
42 '''
43 Method to verify if a given expression is correct just in case the used regular expression needs additional processing to verify this fact.$
44 This method will be overwritten when necessary.
45
46 :param exp: Expression to verify.
47
48 :return: True | False
49 '''
50 # order of the letters depending on which is the mod of the number
51 # 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
52 order = ['T', 'R', 'W', 'A', 'G', 'M', 'Y', 'F', 'P', 'D', 'X', 'B', 'N', 'J', 'Z', 'S', 'Q', 'V', 'H', 'L', 'C', 'K', 'E', 'T']
53
54 #print exp
55 l = exp[len(exp)-1]
56
57 try:
58 # verifying if it is an 8-length number
59 number = int(exp[0:7])
60 if l == order[number%23]:
61 return True
62 except:
63 try:
64 # verifying if it is a 7-length number
65 number = int(exp[0:6])
66 if l == order[number%23]:
67 return True
68 except:
69 # not a valid number
70 return False
71 return False
72
73
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class DogecoinAddress(RegexpObject):
25 '''
26 <DogecoinAddress> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.dogecoin.address"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "(D[a-km-zA-HJ-NP-Z1-9]{33})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class Email(RegexpObject):
25 '''
26 <Email> class. It identifies emails that include:
27 [email protected]
28 foo[at]bar[dot]com
29 foo[arroba]bar[punto]com
30 foo [at] bar [dot] com
31 '''
32 def __init__(self):
33 '''
34 Constructor without parameters.
35 Most of the times, this will be the ONLY method needed to be overwritten.
36
37 :param name: string containing the name of the regular expression.
38 :param reg_exp: string containing the regular expresion.
39 '''
40 # This is the tag of the regexp
41 self.name = "i3visio.email"
42 # This is the string containing the reg_exp to be seeked
43 self.reg_exp = ["([a-zA-Z0-9\.\-_]+(?:@| ?\[(?:arroba|at)\] ?)[a-zA-Z0-9\.\-]+(?:\.| ?\[(?:punto|dot)\] ?)[a-zA-Z]+)"]
44
45 # This will be the expression to be processed. This variable only exists in this class:
46 self.substitutionValues= {}
47 self.substitutionValues["@"]= [' at ',' arroba ', '[at]', '[arroba]', ' [at] ', ' [arroba] ']
48 self.substitutionValues["."]= [' dot ', ' punto ', '[dot]', '[punto]', ' [dot] ', ' [punto] ']
49
50 def getAttributes(self, found = None):
51 '''
52 Method to extract additional attributes from a given expression (i. e.: domains and ports from URL and so on). This method may be overwritten in certain child classes.
53 :param found: expression to be processed.
54 :return: The output format will be like:
55 [{"type" : "i3visio.email", "value": "[email protected]", "attributes": [] }, {"type" : "i3visio.domain", "value": "foo.com", "attributes": [] }]
56 '''
57 # List of attributes
58 results = []
59
60 if not '@' in found:
61 # character may be '@' or '.'
62 for character in self.substitutionValues.keys():
63 for value in self.substitutionValues[character]:
64 # replacing '[at]' for '@'...
65 found=found.replace(value, character)
66
67 # Building the auxiliar email
68 aux = {}
69 aux["type"] = "i3visio.email"
70 aux["value"] = found
71 aux["attributes"] = []
72 results.append(aux)
73 else:
74 # Getting the information of the alias:
75 aux = {}
76 aux["type"] = "i3visio.alias"
77 aux["value"] = found.split('@')[0]
78 aux["attributes"] = []
79 results.append(aux)
80
81 # Getting the information of the domain:
82 aux = {}
83 aux["type"] = "i3visio.domain"
84 aux["value"] = found.split('@')[1]
85 aux["attributes"] = []
86 results.append(aux)
87
88 return results
89
90 def getEntityType(self, found = None):
91 '''
92 Method to recover the value of the entity in case it may vary.
93 :param found: The expression to be analysed.
94 :return: The entity type returned will be an s'i3visio.email' for [email protected] and an 'i3visio.text' for foo[at]bar[dot]com.
95 '''
96 # character may be '@' or '.'
97 for character in self.substitutionValues.keys():
98 for value in self.substitutionValues[character]:
99 if value in found:
100 return "i3visio.text"
101 # If none of the values were found... Returning as usual the 'i3visio.email' string.
102 return self.name
103
104
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class IPv4(RegexpObject):
25 '''
26 <IPv4> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.ipv4"
38 # This is the string containing the reg_exp to be seeked
39 #self.reg_exp = ["[^a-zA-Z0-9](25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d){3})[^a-zA-Z0-9]"]
40 self.reg_exp = ["[^a-zA-Z0-9]" + "([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})" + "[^a-zA-Z0-9]"]
41
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class LitecoinAddress(RegexpObject):
25 '''
26 <LitecoinAddress> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.litecoin.address"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "(L[a-km-zA-HJ-NP-Z1-9]{32})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class MD5(RegexpObject):
25 '''
26 <MD5> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.md5"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "([a-z0-9]{32}|[A-Z0-9]{32})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class NamecoinAddress(RegexpObject):
25 '''
26 <NamecoinAddress> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.namecoin.address"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "([N][a-km-zA-HJ-NP-Z1-9]{26,33})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class PeercoinAddress(RegexpObject):
25 '''
26 <PeercoinAddress> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.peercoin.address"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "(P[a-km-zA-HJ-NP-Z1-9]{33})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class SHA1(RegexpObject):
25 '''
26 <SHA1> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.sha1"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "([a-z0-9]{40}|[A-Z0-9]{40})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 from osrframework.utils.regexp import RegexpObject
23
24 class SHA256(RegexpObject):
25 '''
26 <SHA256> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.sha256"
38 # This is the string containing the reg_exp to be seeked
39 self.reg_exp = ["[^a-zA-Z0-9]" + "([a-z0-9]{64}|[A-Z0-9]{64})" + "[^a-zA-Z0-9]"]
40
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import re
22 from osrframework.utils.regexp import RegexpObject
23
24 class URI(RegexpObject):
25 '''
26 <URI> class.
27 '''
28 def __init__(self):
29 '''
30 Constructor without parameters.
31 Most of the times, this will be the ONLY method needed to be overwritten.
32
33 :param name: string containing the name of the regular expression.
34 :param reg_exp: string containing the regular expresion.
35 '''
36 # This is the tag of the regexp
37 self.name = "i3visio.uri"
38 # This is the string containing the reg_exp to be seeked. The former and latter characters are not needed.
39 #self.reg_exp = ["((?:https?|s?ftp|file)://[a-zA-Z0-9\_\.\-]+(?:\:[0-9]{1,5})(?:/[a-zA-Z0-9\_\.\-/=\?&]+))"]
40 self.reg_exp = ["((?:https?|s?ftp|file)://[a-zA-Z0-9\_\.\-]+(?:\:[0-9]{1,5}|)(?:/[a-zA-Z0-9\_\.\-/=\?&]+|))"]
41 #self.reg_exp = ["((?:https?|s?ftp|file)://[a-zA-Z0-9\_\.\-]+(?:/[a-zA-Z0-9\_\.\-/=\?&%]+))"]
42
43 def getAttributes(self, foundExp):
44 '''
45 Method to extract additional attributes from a given expression (i. e.: domains and ports from URL and so on). This method may be overwritten in certain child classes.
46 :param found_exp: expression to be processed.
47 :return: The output format will be like:
48 [{"type" : "i3visio.domain", "value": "twitter.com", "attributes": [] }, {"type" : "i3visio.protocol", "value": "http", "attributes": [] }]
49 '''
50 # Defining a dictionary
51 attributes = []
52
53 protocolRegExp = "((?:https?|s?ftp|file))://"
54 foundProtocol = re.findall(protocolRegExp, foundExp)
55 if len(foundProtocol) > 0:
56 # Defining a protocol element
57 aux = {}
58 aux["type"] = "i3visio.protocol"
59 # Defining the regular expression to extract the protocol from a URL
60 aux["value"] = foundProtocol[0]
61 # Each attributes will be swept
62 aux["attributes"] = []
63 attributes.append(aux)
64
65 domainRegExp = "(?:https?|s?ftp)://([a-zA-Z0-9\_\.\-]+)(?:\:|/)"
66 foundDomain = re.findall(domainRegExp, foundExp)
67 if len(foundDomain) > 0:
68 # Defining a domain element
69 aux = {}
70 aux["type"] = "i3visio.domain"
71 # Inserting the found domain
72 aux["value"] = foundDomain[0]
73 # Each attributes will be swept
74 aux["attributes"] = []
75 attributes.append(aux)
76
77 portRegExp = "(?:https?|s?ftp)://[a-zA-Z0-9\_\.\-]+:([0-9]{1,5})/"
78 foundPort = re.findall(portRegExp, foundExp)
79 if len(foundPort) > 0:
80 # Defining a domain element
81 aux = {}
82 aux["type"] = "i3visio.port"
83 # Inserting the found domain
84 aux["value"] = foundPort[0]
85 # Each attributes will be swept
86 aux["attributes"] = []
87 attributes.append(aux)
88
89 return attributes
90
91
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import datetime as dt
34 import json
35 import os
36
37 import osrframework.utils.banner as banner
38 import osrframework.utils.platform_selection as platform_selection
39 import osrframework.utils.configuration as configuration
40 import osrframework.utils.general as general
41
42 from osrframework.utils.general import error, warning, success, info, title, emphasis
43
44
45 def processPhoneList(platformNames=[], numbers=[], excludePlatformNames=[]):
46 """
47 Method to perform the phone list.
48
49 :param platformNames: List of names fr the platforms.
50 :param numbers: List of numbers to be queried.
51
52 :return:
53 """
54 # Grabbing the <Platform> objects
55 platforms = platform_selection.getPlatformsByName(platformNames, mode="phonefy", excludePlatformNames=excludePlatformNames)
56
57 results = []
58 for num in numbers:
59 for pla in platforms:
60 # This returns a json.txt!
61 entities = pla.getInfo(query=num, process = True, mode="phonefy")
62 if entities != {}:
63 results+=json.loads(entities)
64 return results
65
66 def main(args):
67 """
68 Main function to launch phonefy.
69
70 The function is created in this way so as to let other applications make
71 use of the full configuration capabilities of the application. The
72 parameters received are used as parsed by this modules `getParser()`.
73
74 Args:
75 -----
76 args: The parameters as processed by this modules `getParser()`.
77
78 Results:
79 --------
80 Returns a list with i3visio entities.
81 """
82 results = []
83
84 if not args.quiet:
85 print(general.title(banner.text))
86
87 sayingHello = """
88 phonefy.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2014-2017
89
90 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
91 are welcome to redistribute it under certain conditions. For additional info,
92 visit """ + general.LICENSE_URL + "\n"
93 print(general.title(sayingHello))
94
95 if args.license:
96 general.showLicense()
97 else:
98 # Showing the execution time...
99 startTime= dt.datetime.now()
100 #TODO: Get the number searchable platforms in this context
101 print(str(startTime) + "\tStarting search in different platform(s)... Relax!\n")
102 print(general.emphasis("\tPress <Ctrl + C> to stop...\n"))
103 try:
104 results = processPhoneList(platformNames=args.platforms, numbers=args.numbers, excludePlatformNames=args.exclude)
105 except KeyboardInterrupt:
106 print(general.error("\n[!] Process manually stopped by the user. Workers terminated without providing any result.\n"))
107
108 # Trying to store the information recovered
109 if args.output_folder != None:
110 # Verifying an output folder was selected
111 if not os.path.exists(args.output_folder):
112 os.makedirs(args.output_folder)
113 # Grabbing the results
114 fileHeader = os.path.join(args.output_folder, args.file_header)
115 for ext in args.extension:
116 # Generating output files
117 general.exportUsufy(results, ext, fileHeader)
118
119 # Showing the information gathered if requested
120 if not args.quiet:
121 now = dt.datetime.now()
122 print(str(now) + "\tA summary of the results obtained are shown in the following table:\n")
123 print(general.success(general.usufyToTextExport(results)))
124
125 if args.web_browser:
126 general.openResultsInBrowser(results)
127
128 now = dt.datetime.now()
129 print("\n" + str(now) + "\tYou can find all the information collected in the following files:")
130 for ext in args.extension:
131 # Showing the output files
132 print("\t" + general.emphasis(fileHeader + "." + ext))
133
134 # Showing the execution time...
135 endTime= dt.datetime.now()
136 print("\n" + str(endTime) +"\tFinishing execution...\n")
137 print("Total time consumed:\t" + general.emphasis(str(endTime-startTime)) + "\n")
138 #TODO: Get the number searchable platforms in this context
139 #print("Average seconds/query:\t" + general.emphasis(str((endTime-startTime).total_seconds()/len(listPlatforms))) +" seconds\n")
140
141 # Urging users to place an issue on Github...
142 print(banner.footer)
143
144 return results
145
146
147 def getParser():
148 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("phonefy")
149 # Capturing errors just in case the option is not found in the configuration
150 try:
151 excludeList = [DEFAULT_VALUES["exclude_platforms"]]
152 except:
153 excludeList = []
154
155 parser = argparse.ArgumentParser(description='phonefy.py - Piece of software that checks the existence of a given series of phones in a bunch of phone number lists associated to malicious activities.', prog='phonefy.py', epilog='Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.', add_help=False)
156 parser._optionals.title = "Input options (one required)"
157
158 # Defining the mutually exclusive group for the main options
159 groupMainOptions = parser.add_mutually_exclusive_group(required=True)
160 # Adding the main options
161 groupMainOptions.add_argument('--license', required=False, action='store_true', default=False, help='shows the GPLv3+ license and exists.')
162 groupMainOptions.add_argument('-n', '--numbers', metavar='<phones>', nargs='+', action='store', help = 'the list of phones to process (at least one is required).')
163
164 listAll = platform_selection.getAllPlatformNames("phonefy")
165
166 # Configuring the processing options
167 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the way in which usufy will process the identified profiles.')
168 #groupProcessing.add_argument('-L', '--logfolder', metavar='<path_to_log_folder', required=False, default = './logs', action='store', help='path to the log folder. If none was provided, ./logs is assumed.')
169 groupProcessing.add_argument('-e', '--extension', metavar='<sum_ext>', nargs='+', choices=['csv', 'gml', 'json', 'mtz', 'ods', 'png', 'txt', 'xls', 'xlsx' ], required=False, default=DEFAULT_VALUES["extension"], action='store', help='output extension for the summary files. Default: xls.')
170 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', required=False, default=DEFAULT_VALUES["output_folder"], action='store', help='output folder for the generated documents. While if the paths does not exist, usufy.py will try to create; if this argument is not provided, usufy will NOT write any down any data. Check permissions if something goes wrong.')
171 groupProcessing.add_argument('-p', '--platforms', metavar='<platform>', choices=listAll, nargs='+', required=False, default=DEFAULT_VALUES["platforms"] ,action='store', help='select the platforms where you want to perform the search amongst the following: ' + str(listAll) + '. More than one option can be selected.')
172 # Getting a sample header for the output files
173 groupProcessing.add_argument('-F', '--file_header', metavar='<alternative_header_file>', required=False, default=DEFAULT_VALUES["file_header"], action='store', help='Header for the output filenames to be generated. If None was provided the following will be used: profiles.<extension>.' )
174 groupProcessing.add_argument('--quiet', required=False, action='store_true', default=False, help='tells the program not to show anything.')
175 groupProcessing.add_argument('-w', '--web_browser', required=False, action='store_true', help='opening the URIs returned in the default web browser.')
176 groupProcessing.add_argument('-x', '--exclude', metavar='<platform>', choices=listAll, nargs='+', required=False, default=excludeList, action='store', help='select the platforms that you want to exclude from the processing.')
177
178
179 # About options
180 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
181 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
182 #groupAbout.add_argument('-v', '--verbose', metavar='<verbosity>', choices=[0, 1, 2], required=False, action='store', default=1, help='select the verbosity level: 0 - none; 1 - normal (default); 2 - debug.', type=int)
183 groupAbout.add_argument('--version', action='version', version='%(prog)s ' +" " +__version__, help='shows the version of the program and exists.')
184
185 return parser
186
187 if __name__ == "__main__":
188 # Grabbing the parser
189 parser = getParser()
190
191 args = parser.parse_args()
192
193 # Calling the main function
194 main(args)
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # OSRFramework is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ##################################################################################
18
19 import osrframework.utils.logger as logger
20
21 # Calling the logger when being imported
22 logger.setupLogger(loggerName="osrframework.searchengines")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 __all__ = ['search']
21
22 import argparse
23 import json
24 import os
25 import sys
26 import time
27
28 if sys.version_info[0] > 2:
29 from http.cookiejar import LWPCookieJar
30 from urllib.request import Request, urlopen
31 from urllib.parse import quote_plus, urlparse, parse_qs
32 else:
33 from cookielib import LWPCookieJar
34 from urllib import quote_plus
35 from urllib2 import Request, urlopen
36 from urlparse import urlparse, parse_qs
37
38 # Lazy import of BeautifulSoup.
39 BeautifulSoup = None
40
41 # URL templates to make Google searches.
42 url_home = "http://www.google.%(tld)s/"
43 url_search = "http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&btnG=Google+Search&inurl=https"
44 url_next_page = "http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&start=%(start)d&inurl=https"
45 url_search_num = "http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&num=%(num)d&btnG=Google+Search&inurl=https"
46 url_next_page_num = "http://www.google.%(tld)s/search?hl=%(lang)s&q=%(query)s&num=%(num)d&start=%(start)d&inurl=https"
47
48 # Cookie jar. Stored at the user's home folder.
49 home_folder = os.getenv('HOME')
50 if not home_folder:
51 home_folder = os.getenv('USERHOME')
52 if not home_folder:
53 home_folder = '.' # Use the current folder on error.
54 cookie_jar = LWPCookieJar(os.path.join(home_folder, '.google-cookie'))
55 try:
56 cookie_jar.load()
57 except Exception:
58 pass
59
60 # Request the given URL and return the response page, using the cookie jar.
61 def get_page(url):
62 """
63 Request the given URL and return the response page, using the cookie jar.
64
65 @type url: str
66 @param url: URL to retrieve.
67
68 @rtype: str
69 @return: Web page retrieved for the given URL.
70
71 @raise IOError: An exception is raised on error.
72 @raise urllib2.URLError: An exception is raised on error.
73 @raise urllib2.HTTPError: An exception is raised on error.
74 """
75 request = Request(url)
76 request.add_header('User-Agent',
77 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)')
78 cookie_jar.add_cookie_header(request)
79 response = urlopen(request)
80 cookie_jar.extract_cookies(response, request)
81 html = response.read()
82 response.close()
83 cookie_jar.save()
84 return html
85
86 # Filter links found in the Google result pages HTML code.
87 # Returns None if the link doesn't yield a valid result.
88 def filter_result(link):
89 try:
90
91 # Valid results are absolute URLs not pointing to a Google domain
92 # like images.google.com or googleusercontent.com
93 o = urlparse(link, 'http')
94 if o.netloc and 'google' not in o.netloc:
95 return link
96
97 # Decode hidden URLs.
98 if link.startswith('/url?'):
99 link = parse_qs(o.query)['q'][0]
100
101 # Valid results are absolute URLs not pointing to a Google domain
102 # like images.google.com or googleusercontent.com
103 o = urlparse(link, 'http')
104 if o.netloc and 'google' not in o.netloc:
105 return link
106
107 # Otherwise, or on error, return None.
108 except Exception:
109 pass
110 return None
111
112 # Returns a generator that yields URLs.
113 def search(query, tld='com', lang='en', num=10, start=0, stop=None, pause=2.0,
114 only_standard=False):
115 """
116 Search the given query string using Google.
117
118 @type query: str
119 @param query: Query string. Must NOT be url-encoded.
120
121 @type tld: str
122 @param tld: Top level domain.
123
124 @type lang: str
125 @param lang: Languaje.
126
127 @type num: int
128 @param num: Number of results per page.
129
130 @type start: int
131 @param start: First result to retrieve.
132
133 @type stop: int
134 @param stop: Last result to retrieve.
135 Use C{None} to keep searching forever.
136
137 @type pause: float
138 @param pause: Lapse to wait between HTTP requests.
139 A lapse too long will make the search slow, but a lapse too short may
140 cause Google to block your IP. Your mileage may vary!
141
142 @type only_standard: bool
143 @param only_standard: If C{True}, only returns the standard results from
144 each page. If C{False}, it returns every possible link from each page,
145 except for those that point back to Google itself. Defaults to C{False}
146 for backwards compatibility with older versions of this module.
147
148 @rtype: generator
149 @return: Generator (iterator) that yields found URLs. If the C{stop}
150 parameter is C{None} the iterator will loop forever.
151 """
152
153 # Lazy import of BeautifulSoup.
154 # Try to use BeautifulSoup 4 if available, fall back to 3 otherwise.
155 global BeautifulSoup
156 if BeautifulSoup is None:
157 try:
158 from bs4 import BeautifulSoup
159 except ImportError:
160 from BeautifulSoup import BeautifulSoup
161
162 # Set of hashes for the results found.
163 # This is used to avoid repeated results.
164 hashes = set()
165
166 # Prepare the search string.
167 query = quote_plus(query)
168
169 # Grab the cookie from the home page.
170 get_page(url_home % vars())
171
172 # Prepare the URL of the first request.
173 if start:
174 if num == 10:
175 url = url_next_page % vars()
176 else:
177 url = url_next_page_num % vars()
178 else:
179 if num == 10:
180 url = url_search % vars()
181 else:
182 url = url_search_num % vars()
183
184 # Loop until we reach the maximum result, if any (otherwise, loop forever).
185 while not stop or start < stop:
186
187 # Sleep between requests.
188 time.sleep(pause)
189
190 # Request the Google Search results page.
191 html = get_page(url)
192
193 # Parse the response and process every anchored URL.
194 soup = BeautifulSoup(html)
195 anchors = soup.find(id='search').findAll('a')
196 for a in anchors:
197
198 # Leave only the "standard" results if requested.
199 # Otherwise grab all possible links.
200 if only_standard and (
201 not a.parent or a.parent.name.lower() != "h3"):
202 continue
203
204 # Get the URL from the anchor tag.
205 try:
206 link = a['href']
207 except KeyError:
208 continue
209
210 # Filter invalid links and links pointing to Google itself.
211 link = filter_result(link)
212 if not link:
213 continue
214
215 # Discard repeated results.
216 h = hash(link)
217 if h in hashes:
218 continue
219 hashes.add(h)
220
221 # Yield the result.
222 yield link
223
224 # End if there are no more results.
225 if not soup.find(id='nav'):
226 break
227
228 # Prepare the URL for the next request.
229 start += num
230 if num == 10:
231 url = url_next_page % vars()
232 else:
233 url = url_next_page_num % vars()
234
235 # Returns a generator that yields URLs.
236 def processSearch(query, tld='com', lang='en', num=10, start=0, stop=50, pause=2.0, only_standard=False):
237 '''
238 Method that recovers the URI for a search returning an i3visio-compliant json object.
239
240 :return: A json-like object.
241
242 '''
243 uriList = search(query, tld=tld, lang=lang, num=int(num), start=int(start), stop=int(stop), pause=float(pause),only_standard=only_standard)
244
245 # Dictionary containing the URI objects
246 results = []
247
248 # Building the objects
249 for uri in uriList:
250 aux = {}
251 aux["type"] = "i3visio.uri"
252 aux["value"] = uri
253 aux["attributes"] = []
254 results.append(aux)
255
256 return results
257
258 # When run as a script...
259 if __name__ == "__main__":
260 parser = argparse.ArgumentParser(description='A package that allows the execution of searches in Google.', prog='google.py', add_help=False)
261 parser.add_argument("-q", "--query", metavar="<QUERY>", required = True, help="Query to be performed.")
262 parser.add_argument("--tld", metavar="TLD", default="com", help="top level domain to use [default: com]")
263 parser.add_argument("--lang", metavar="LANGUAGE", default="en",help="produce results in the given language [default: en]")
264 parser.add_argument("--num", metavar="NUMBER", type=int, default=10,help="number of results per page [default: 10]")
265 parser.add_argument("--start", metavar="NUMBER", type=int, default=0, help="first result to retrieve [default: 0]")
266 parser.add_argument("--stop", metavar="NUMBER", type=int, default=50, help="last result to retrieve [default: 100]")
267 parser.add_argument("--pause", metavar="SECONDS", type=float, default=2.0, help="pause between HTTP requests [default: 2.0]")
268 parser.add_argument("--all", dest="only_standard", action="store_false", default=True, help="grab all possible links from result pages")
269
270 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
271 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
272 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
273 args = parser.parse_args()
274
275 print "Searching..."
276
277 results = processSearch(args.query, tld=args.tld, lang=args.lang, num=int(args.num), start=int(args.start), stop=int(args.stop), pause=float(args.pause),only_standard=args.only_standard)
278
279 print json.dumps(results, indent=2)
280
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2015-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import datetime as dt
34 import json
35 import os
36
37 import osrframework.utils.banner as banner
38 import osrframework.utils.platform_selection as platform_selection
39 import osrframework.utils.configuration as configuration
40 import osrframework.utils.general as general
41
42 from osrframework.utils.general import error, warning, success, info, title, emphasis
43
44
45 def performSearch(platformNames=[], queries=[], process=False, excludePlatformNames=[]):
46 """
47 Method to perform the search itself on the different platforms.
48
49 Args:
50 -----
51 platforms: List of <Platform> objects.
52 queries: List of queries to be performed.
53 process: Whether to process all the profiles... SLOW!
54
55 Returns:
56 --------
57 A list with the entities collected.
58 """
59 # Grabbing the <Platform> objects
60 platforms = platform_selection.getPlatformsByName(platformNames, mode="searchfy", excludePlatformNames=excludePlatformNames)
61 results = []
62 for q in queries:
63 for pla in platforms:
64 # This returns a json.txt!
65 entities = pla.getInfo(query=q, process = process, mode="searchfy")
66 if entities != "[]":
67 results += json.loads(entities)
68 return results
69
70
71 def main(args):
72 """
73 Main function to launch usufy.
74
75 The function is created in this way so as to let other applications make
76 use of the full configuration capabilities of the application. The
77 parameters received are used as parsed by this modules `getParser()`.
78
79 Args:
80 -----
81 args: Arguments received in the command line.
82
83 Returns:
84 --------
85 A list of i3visio entities.
86 """
87 results = []
88
89 if not args.maltego:
90 print(general.title(banner.text))
91
92 sayingHello = """
93 searchfy.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2014-2017
94
95 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
96 are welcome to redistribute it under certain conditions. For additional info,
97 visit """ + general.LICENSE_URL + "\n"
98 print(general.title(sayingHello))
99
100 if args.license:
101 general.showLicense()
102 else:
103 # Showing the execution time...
104 startTime= dt.datetime.now()
105 print(str(startTime) + "\tStarting search in different platform(s)... Relax!\n")
106 print(general.emphasis("\tPress <Ctrl + C> to stop...\n"))
107 # Performing the search
108 try:
109 results = performSearch(platformNames=args.platforms, queries=args.queries, process=args.process, excludePlatformNames=args.exclude)
110 except KeyboardInterrupt:
111 print(general.error("\n[!] Process manually stopped by the user. Workers terminated without providing any result.\n"))
112 results = []
113
114 # Generating summary files for each ...
115 if args.extension:
116 # Storing the file...
117 if not args.maltego:
118 # Verifying if the outputPath exists
119 if not os.path.exists (args.output_folder):
120 os.makedirs(args.output_folder)
121
122 # Grabbing the results
123 fileHeader = os.path.join(args.output_folder, args.file_header)
124
125 if not args.maltego:
126 # Iterating through the given extensions to print its values
127 for ext in args.extension:
128 # Generating output files
129 general.exportUsufy(results, ext, fileHeader)
130
131 # Generating the Maltego output
132 if args.maltego:
133 general.listToMaltego(results)
134
135 # Printing the results if requested
136 if not args.maltego:
137 now = dt.datetime.now()
138 print(str(now) + "\tA summary of the results obtained are listed in the following table:\n")
139 print(general.success(general.usufyToTextExport(results)))
140
141 if args.web_browser:
142 general.openResultsInBrowser(results)
143
144 now = dt.datetime.now()
145 print("\n" + str(now) + "\tYou can find all the information collected in the following files:")
146 for ext in args.extension:
147 # Showing the output files
148 print("\t" + general.emphasis(fileHeader + "." + ext))
149
150 # Showing the execution time...
151 endTime= dt.datetime.now()
152 print("\n" + str(endTime) +"\tFinishing execution...\n")
153 print("Total time used:\t" + general.emphasis(str(endTime-startTime)))
154 print("Average seconds/query:\t" + general.emphasis(str((endTime-startTime).total_seconds()/len(args.platforms))) +" seconds\n")
155
156 # Urging users to place an issue on Github...
157 print(banner.footer)
158
159 return results
160
161
162 def getParser():
163 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("searchfy")
164 # Capturing errors just in case the option is not found in the configuration
165 try:
166 excludeList = [DEFAULT_VALUES["exclude_platforms"]]
167 except:
168 excludeList = []
169
170 parser = argparse.ArgumentParser(description='searchfy.py - Piece of software that performs a query on the platforms in OSRFramework.', prog='searchfy.py', epilog='Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.', add_help=False)
171 parser._optionals.title = "Input options (one required)"
172
173 # Defining the mutually exclusive group for the main options
174 groupMain = parser.add_mutually_exclusive_group(required=True)
175 # Adding the main options
176 groupMain.add_argument('--license', required=False, action='store_true', default=False, help='shows the GPLv3+ license and exists.')
177 groupMain.add_argument('-q', '--queries', metavar='<searches>', nargs='+', action='store', help = 'the list of queries to be performed).')
178
179 listAll = platform_selection.getAllPlatformNames("searchfy")
180
181 # Configuring the processing options
182 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the way in which searchfy will process the identified profiles.')
183 #groupProcessing.add_argument('-L', '--logfolder', metavar='<path_to_log_folder', required=False, default = './logs', action='store', help='path to the log folder. If none was provided, ./logs is assumed.')
184 # Getting a sample header for the output files
185
186 groupProcessing.add_argument('-e', '--extension', metavar='<sum_ext>', nargs='+', choices=['csv', 'gml', 'json', 'mtz', 'ods', 'png', 'txt', 'xls', 'xlsx' ], required=False, default=DEFAULT_VALUES["extension"], action='store', help='output extension for the summary files. Default: xls.')
187 groupProcessing.add_argument('-F', '--file_header', metavar='<alternative_header_file>', required=False, default=DEFAULT_VALUES["file_header"], action='store', help='Header for the output filenames to be generated. If None was provided the following will be used: profiles.<extension>' )
188 groupProcessing.add_argument('-m', '--maltego', required=False, action='store_true', help='Parameter specified to let usufy.py know that he has been launched by a Maltego Transform.')
189 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', required=False, default=DEFAULT_VALUES["output_folder"], action='store', help='output folder for the generated documents. While if the paths does not exist, usufy.py will try to create; if this argument is not provided, usufy will NOT write any down any data. Check permissions if something goes wrong.')
190 groupProcessing.add_argument('-p', '--platforms', metavar='<platform>', choices=listAll, nargs='+', required=False, default=DEFAULT_VALUES["platforms"] ,action='store', help='select the platforms where you want to perform the search amongst the following: ' + str(listAll) + '. More than one option can be selected.')
191 groupProcessing.add_argument('--process', required=False, default =False ,action='store_true', help='whether to process the info in the profiles recovered. NOTE: this would be much slower.')
192 groupProcessing.add_argument('-w', '--web_browser', required=False, action='store_true', help='opening the URIs returned in the default web browser.')
193 groupProcessing.add_argument('-x', '--exclude', metavar='<platform>', choices=listAll, nargs='+', required=False, default=excludeList, action='store', help='select the platforms that you want to exclude from the processing.')
194
195 # About options
196 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
197 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
198 #groupAbout.add_argument('-v', '--verbose', metavar='<verbosity>', choices=[0, 1, 2], required=False, action='store', default=1, help='select the verbosity level: 0 - none; 1 - normal (default); 2 - debug.', type=int)
199 groupAbout.add_argument('--version', action='version', version='%(prog)s ' +" " +__version__, help='shows the version of the program and exists.')
200
201 return parser
202
203 if __name__ == "__main__":
204 # Grabbing the parser
205 parser = getParser()
206
207 args = parser.parse_args()
208
209 # Calling the main function
210 main(args)
0 # HTML KickStart #
1 by Joshua Gatcke
2 http://www.99lime.com
3 Version: 0.94
4
5 ## What is HTML KickStart? ##
6
7 HTML KickStart is an ultra–lean set of HTML5, CSS, and jQuery (javascript) files, layouts, and elements designed to give you a headstart and save you 10's of hours on your next web project.
8
9 HTML KickStart includes everything you need to rapidly create website layouts – things like slideshows, menus, flexible grids, image placeholders, buttons, and more – saving you a ton of time so you can produce faster and make more money.
10
11 Bonus! All HTML KickStart Elements are fully Browser tested, they even gracefully degrade ;)
12
13 ## Perfect for Wireframing in HTML ##
14
15 HTML KickStart has everything you need to rapidly create HTML Page Layouts, perfect for Wireframing in HTML.
16 Layouts that used to take hours now take minutes.
17
18 ## Getting Started ##
19
20 1. Download HTML KickStart
21 2. Open blank.html in your favorite text editor
22 3. Start adding KickStart Elements to blank.html: (http://www.99lime.com/elements/)
23 4. Save blank.html and open in your favorite Web Browser
24 5. Have fun!
25
26
27 ## HTML KickStart is FREE and Open Source. ##
28 ### Release Under the MIT Open Source License. ###
29
30 Copyright © 2011-2012 Joshua Gatcke http://www.99lime.com | HTML KickStart
31
32 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
33
34 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
35
36 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0 {
1 "name": "99lime/html-kickstart",
2 "license": "MIT",
3 "description": "Ultra–Lean HTML Building Blocks for Rapid Website Production",
4 "minimum-stability": "dev",
5 "authors": [
6 {
7 "name": "Joshua Gatcke",
8 "email": "[email protected]"
9 }
10 ]
11 }
0 /*##################################################################################
1 #
2 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
3 #
4 # This program is part of OSRFramework. You can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ##################################################################################*/
18
19 /* The main explorer */
20 #chart_div {
21 height: 800px;
22 width: 100%;
23 min-width: 700px;
24 }
25
26 body {
27 height: 100%;
28 background-color: #ddd;
29 }
30
31 h4 {
32 text-align: center;
33 }
34
35 h5 {
36 text-align: center;
37 }
38
39 .tabConfiguration {
40 background-color: #def;
41 }
42
43 div#loading {
44 width: 35px;
45 height: 35px;
46 display: none;
47 background: url(/static/img/loading.gif) no-repeat;
48 cursor: wait;
49 }
50
51 /* The fonts for attributes */
52 .attrib .fa{
53 width: 15px;
54 text-align: center;
55 }
56
57 .listItem{
58 width: 130px;
59 }
60 .content{
61 padding: 3px;
62 text-align: center;
63 }
64
65 .regTitle{
66 font-weight: 700;
67 font-size: 0.8em;
68 }
69
70 .regSubtitle{
71 font-size: 0.6em;
72 }
73
74 .attributeText{
75 font-size: 0.5em;
76 }
0 /*!
1 * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
2 * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
3 */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}
0 /*!
1 * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
2 * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
3 */
4 /* FONT PATH
5 * -------------------------- */
6 @font-face {
7 font-family: 'FontAwesome';
8 src: url('../fonts/fontawesome-webfont.eot?v=4.2.0');
9 src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'), url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'), url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'), url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');
10 font-weight: normal;
11 font-style: normal;
12 }
13 .fa {
14 display: inline-block;
15 font: normal normal normal 14px/1 FontAwesome;
16 font-size: inherit;
17 text-rendering: auto;
18 -webkit-font-smoothing: antialiased;
19 -moz-osx-font-smoothing: grayscale;
20 }
21 /* makes the font 33% larger relative to the icon container */
22 .fa-lg {
23 font-size: 1.33333333em;
24 line-height: 0.75em;
25 vertical-align: -15%;
26 }
27 .fa-2x {
28 font-size: 2em;
29 }
30 .fa-3x {
31 font-size: 3em;
32 }
33 .fa-4x {
34 font-size: 4em;
35 }
36 .fa-5x {
37 font-size: 5em;
38 }
39 .fa-fw {
40 width: 1.28571429em;
41 text-align: center;
42 }
43 .fa-ul {
44 padding-left: 0;
45 margin-left: 2.14285714em;
46 list-style-type: none;
47 }
48 .fa-ul > li {
49 position: relative;
50 }
51 .fa-li {
52 position: absolute;
53 left: -2.14285714em;
54 width: 2.14285714em;
55 top: 0.14285714em;
56 text-align: center;
57 }
58 .fa-li.fa-lg {
59 left: -1.85714286em;
60 }
61 .fa-border {
62 padding: .2em .25em .15em;
63 border: solid 0.08em #eeeeee;
64 border-radius: .1em;
65 }
66 .pull-right {
67 float: right;
68 }
69 .pull-left {
70 float: left;
71 }
72 .fa.pull-left {
73 margin-right: .3em;
74 }
75 .fa.pull-right {
76 margin-left: .3em;
77 }
78 .fa-spin {
79 -webkit-animation: fa-spin 2s infinite linear;
80 animation: fa-spin 2s infinite linear;
81 }
82 @-webkit-keyframes fa-spin {
83 0% {
84 -webkit-transform: rotate(0deg);
85 transform: rotate(0deg);
86 }
87 100% {
88 -webkit-transform: rotate(359deg);
89 transform: rotate(359deg);
90 }
91 }
92 @keyframes fa-spin {
93 0% {
94 -webkit-transform: rotate(0deg);
95 transform: rotate(0deg);
96 }
97 100% {
98 -webkit-transform: rotate(359deg);
99 transform: rotate(359deg);
100 }
101 }
102 .fa-rotate-90 {
103 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=1);
104 -webkit-transform: rotate(90deg);
105 -ms-transform: rotate(90deg);
106 transform: rotate(90deg);
107 }
108 .fa-rotate-180 {
109 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
110 -webkit-transform: rotate(180deg);
111 -ms-transform: rotate(180deg);
112 transform: rotate(180deg);
113 }
114 .fa-rotate-270 {
115 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
116 -webkit-transform: rotate(270deg);
117 -ms-transform: rotate(270deg);
118 transform: rotate(270deg);
119 }
120 .fa-flip-horizontal {
121 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);
122 -webkit-transform: scale(-1, 1);
123 -ms-transform: scale(-1, 1);
124 transform: scale(-1, 1);
125 }
126 .fa-flip-vertical {
127 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);
128 -webkit-transform: scale(1, -1);
129 -ms-transform: scale(1, -1);
130 transform: scale(1, -1);
131 }
132 :root .fa-rotate-90,
133 :root .fa-rotate-180,
134 :root .fa-rotate-270,
135 :root .fa-flip-horizontal,
136 :root .fa-flip-vertical {
137 filter: none;
138 }
139 .fa-stack {
140 position: relative;
141 display: inline-block;
142 width: 2em;
143 height: 2em;
144 line-height: 2em;
145 vertical-align: middle;
146 }
147 .fa-stack-1x,
148 .fa-stack-2x {
149 position: absolute;
150 left: 0;
151 width: 100%;
152 text-align: center;
153 }
154 .fa-stack-1x {
155 line-height: inherit;
156 }
157 .fa-stack-2x {
158 font-size: 2em;
159 }
160 .fa-inverse {
161 color: #ffffff;
162 }
163 /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
164 readers do not read off random characters that represent icons */
165 .fa-glass:before {
166 content: "\f000";
167 }
168 .fa-music:before {
169 content: "\f001";
170 }
171 .fa-search:before {
172 content: "\f002";
173 }
174 .fa-envelope-o:before {
175 content: "\f003";
176 }
177 .fa-heart:before {
178 content: "\f004";
179 }
180 .fa-star:before {
181 content: "\f005";
182 }
183 .fa-star-o:before {
184 content: "\f006";
185 }
186 .fa-user:before {
187 content: "\f007";
188 }
189 .fa-film:before {
190 content: "\f008";
191 }
192 .fa-th-large:before {
193 content: "\f009";
194 }
195 .fa-th:before {
196 content: "\f00a";
197 }
198 .fa-th-list:before {
199 content: "\f00b";
200 }
201 .fa-check:before {
202 content: "\f00c";
203 }
204 .fa-remove:before,
205 .fa-close:before,
206 .fa-times:before {
207 content: "\f00d";
208 }
209 .fa-search-plus:before {
210 content: "\f00e";
211 }
212 .fa-search-minus:before {
213 content: "\f010";
214 }
215 .fa-power-off:before {
216 content: "\f011";
217 }
218 .fa-signal:before {
219 content: "\f012";
220 }
221 .fa-gear:before,
222 .fa-cog:before {
223 content: "\f013";
224 }
225 .fa-trash-o:before {
226 content: "\f014";
227 }
228 .fa-home:before {
229 content: "\f015";
230 }
231 .fa-file-o:before {
232 content: "\f016";
233 }
234 .fa-clock-o:before {
235 content: "\f017";
236 }
237 .fa-road:before {
238 content: "\f018";
239 }
240 .fa-download:before {
241 content: "\f019";
242 }
243 .fa-arrow-circle-o-down:before {
244 content: "\f01a";
245 }
246 .fa-arrow-circle-o-up:before {
247 content: "\f01b";
248 }
249 .fa-inbox:before {
250 content: "\f01c";
251 }
252 .fa-play-circle-o:before {
253 content: "\f01d";
254 }
255 .fa-rotate-right:before,
256 .fa-repeat:before {
257 content: "\f01e";
258 }
259 .fa-refresh:before {
260 content: "\f021";
261 }
262 .fa-list-alt:before {
263 content: "\f022";
264 }
265 .fa-lock:before {
266 content: "\f023";
267 }
268 .fa-flag:before {
269 content: "\f024";
270 }
271 .fa-headphones:before {
272 content: "\f025";
273 }
274 .fa-volume-off:before {
275 content: "\f026";
276 }
277 .fa-volume-down:before {
278 content: "\f027";
279 }
280 .fa-volume-up:before {
281 content: "\f028";
282 }
283 .fa-qrcode:before {
284 content: "\f029";
285 }
286 .fa-barcode:before {
287 content: "\f02a";
288 }
289 .fa-tag:before {
290 content: "\f02b";
291 }
292 .fa-tags:before {
293 content: "\f02c";
294 }
295 .fa-book:before {
296 content: "\f02d";
297 }
298 .fa-bookmark:before {
299 content: "\f02e";
300 }
301 .fa-print:before {
302 content: "\f02f";
303 }
304 .fa-camera:before {
305 content: "\f030";
306 }
307 .fa-font:before {
308 content: "\f031";
309 }
310 .fa-bold:before {
311 content: "\f032";
312 }
313 .fa-italic:before {
314 content: "\f033";
315 }
316 .fa-text-height:before {
317 content: "\f034";
318 }
319 .fa-text-width:before {
320 content: "\f035";
321 }
322 .fa-align-left:before {
323 content: "\f036";
324 }
325 .fa-align-center:before {
326 content: "\f037";
327 }
328 .fa-align-right:before {
329 content: "\f038";
330 }
331 .fa-align-justify:before {
332 content: "\f039";
333 }
334 .fa-list:before {
335 content: "\f03a";
336 }
337 .fa-dedent:before,
338 .fa-outdent:before {
339 content: "\f03b";
340 }
341 .fa-indent:before {
342 content: "\f03c";
343 }
344 .fa-video-camera:before {
345 content: "\f03d";
346 }
347 .fa-photo:before,
348 .fa-image:before,
349 .fa-picture-o:before {
350 content: "\f03e";
351 }
352 .fa-pencil:before {
353 content: "\f040";
354 }
355 .fa-map-marker:before {
356 content: "\f041";
357 }
358 .fa-adjust:before {
359 content: "\f042";
360 }
361 .fa-tint:before {
362 content: "\f043";
363 }
364 .fa-edit:before,
365 .fa-pencil-square-o:before {
366 content: "\f044";
367 }
368 .fa-share-square-o:before {
369 content: "\f045";
370 }
371 .fa-check-square-o:before {
372 content: "\f046";
373 }
374 .fa-arrows:before {
375 content: "\f047";
376 }
377 .fa-step-backward:before {
378 content: "\f048";
379 }
380 .fa-fast-backward:before {
381 content: "\f049";
382 }
383 .fa-backward:before {
384 content: "\f04a";
385 }
386 .fa-play:before {
387 content: "\f04b";
388 }
389 .fa-pause:before {
390 content: "\f04c";
391 }
392 .fa-stop:before {
393 content: "\f04d";
394 }
395 .fa-forward:before {
396 content: "\f04e";
397 }
398 .fa-fast-forward:before {
399 content: "\f050";
400 }
401 .fa-step-forward:before {
402 content: "\f051";
403 }
404 .fa-eject:before {
405 content: "\f052";
406 }
407 .fa-chevron-left:before {
408 content: "\f053";
409 }
410 .fa-chevron-right:before {
411 content: "\f054";
412 }
413 .fa-plus-circle:before {
414 content: "\f055";
415 }
416 .fa-minus-circle:before {
417 content: "\f056";
418 }
419 .fa-times-circle:before {
420 content: "\f057";
421 }
422 .fa-check-circle:before {
423 content: "\f058";
424 }
425 .fa-question-circle:before {
426 content: "\f059";
427 }
428 .fa-info-circle:before {
429 content: "\f05a";
430 }
431 .fa-crosshairs:before {
432 content: "\f05b";
433 }
434 .fa-times-circle-o:before {
435 content: "\f05c";
436 }
437 .fa-check-circle-o:before {
438 content: "\f05d";
439 }
440 .fa-ban:before {
441 content: "\f05e";
442 }
443 .fa-arrow-left:before {
444 content: "\f060";
445 }
446 .fa-arrow-right:before {
447 content: "\f061";
448 }
449 .fa-arrow-up:before {
450 content: "\f062";
451 }
452 .fa-arrow-down:before {
453 content: "\f063";
454 }
455 .fa-mail-forward:before,
456 .fa-share:before {
457 content: "\f064";
458 }
459 .fa-expand:before {
460 content: "\f065";
461 }
462 .fa-compress:before {
463 content: "\f066";
464 }
465 .fa-plus:before {
466 content: "\f067";
467 }
468 .fa-minus:before {
469 content: "\f068";
470 }
471 .fa-asterisk:before {
472 content: "\f069";
473 }
474 .fa-exclamation-circle:before {
475 content: "\f06a";
476 }
477 .fa-gift:before {
478 content: "\f06b";
479 }
480 .fa-leaf:before {
481 content: "\f06c";
482 }
483 .fa-fire:before {
484 content: "\f06d";
485 }
486 .fa-eye:before {
487 content: "\f06e";
488 }
489 .fa-eye-slash:before {
490 content: "\f070";
491 }
492 .fa-warning:before,
493 .fa-exclamation-triangle:before {
494 content: "\f071";
495 }
496 .fa-plane:before {
497 content: "\f072";
498 }
499 .fa-calendar:before {
500 content: "\f073";
501 }
502 .fa-random:before {
503 content: "\f074";
504 }
505 .fa-comment:before {
506 content: "\f075";
507 }
508 .fa-magnet:before {
509 content: "\f076";
510 }
511 .fa-chevron-up:before {
512 content: "\f077";
513 }
514 .fa-chevron-down:before {
515 content: "\f078";
516 }
517 .fa-retweet:before {
518 content: "\f079";
519 }
520 .fa-shopping-cart:before {
521 content: "\f07a";
522 }
523 .fa-folder:before {
524 content: "\f07b";
525 }
526 .fa-folder-open:before {
527 content: "\f07c";
528 }
529 .fa-arrows-v:before {
530 content: "\f07d";
531 }
532 .fa-arrows-h:before {
533 content: "\f07e";
534 }
535 .fa-bar-chart-o:before,
536 .fa-bar-chart:before {
537 content: "\f080";
538 }
539 .fa-twitter-square:before {
540 content: "\f081";
541 }
542 .fa-facebook-square:before {
543 content: "\f082";
544 }
545 .fa-camera-retro:before {
546 content: "\f083";
547 }
548 .fa-key:before {
549 content: "\f084";
550 }
551 .fa-gears:before,
552 .fa-cogs:before {
553 content: "\f085";
554 }
555 .fa-comments:before {
556 content: "\f086";
557 }
558 .fa-thumbs-o-up:before {
559 content: "\f087";
560 }
561 .fa-thumbs-o-down:before {
562 content: "\f088";
563 }
564 .fa-star-half:before {
565 content: "\f089";
566 }
567 .fa-heart-o:before {
568 content: "\f08a";
569 }
570 .fa-sign-out:before {
571 content: "\f08b";
572 }
573 .fa-linkedin-square:before {
574 content: "\f08c";
575 }
576 .fa-thumb-tack:before {
577 content: "\f08d";
578 }
579 .fa-external-link:before {
580 content: "\f08e";
581 }
582 .fa-sign-in:before {
583 content: "\f090";
584 }
585 .fa-trophy:before {
586 content: "\f091";
587 }
588 .fa-github-square:before {
589 content: "\f092";
590 }
591 .fa-upload:before {
592 content: "\f093";
593 }
594 .fa-lemon-o:before {
595 content: "\f094";
596 }
597 .fa-phone:before {
598 content: "\f095";
599 }
600 .fa-square-o:before {
601 content: "\f096";
602 }
603 .fa-bookmark-o:before {
604 content: "\f097";
605 }
606 .fa-phone-square:before {
607 content: "\f098";
608 }
609 .fa-twitter:before {
610 content: "\f099";
611 }
612 .fa-facebook:before {
613 content: "\f09a";
614 }
615 .fa-github:before {
616 content: "\f09b";
617 }
618 .fa-unlock:before {
619 content: "\f09c";
620 }
621 .fa-credit-card:before {
622 content: "\f09d";
623 }
624 .fa-rss:before {
625 content: "\f09e";
626 }
627 .fa-hdd-o:before {
628 content: "\f0a0";
629 }
630 .fa-bullhorn:before {
631 content: "\f0a1";
632 }
633 .fa-bell:before {
634 content: "\f0f3";
635 }
636 .fa-certificate:before {
637 content: "\f0a3";
638 }
639 .fa-hand-o-right:before {
640 content: "\f0a4";
641 }
642 .fa-hand-o-left:before {
643 content: "\f0a5";
644 }
645 .fa-hand-o-up:before {
646 content: "\f0a6";
647 }
648 .fa-hand-o-down:before {
649 content: "\f0a7";
650 }
651 .fa-arrow-circle-left:before {
652 content: "\f0a8";
653 }
654 .fa-arrow-circle-right:before {
655 content: "\f0a9";
656 }
657 .fa-arrow-circle-up:before {
658 content: "\f0aa";
659 }
660 .fa-arrow-circle-down:before {
661 content: "\f0ab";
662 }
663 .fa-globe:before {
664 content: "\f0ac";
665 }
666 .fa-wrench:before {
667 content: "\f0ad";
668 }
669 .fa-tasks:before {
670 content: "\f0ae";
671 }
672 .fa-filter:before {
673 content: "\f0b0";
674 }
675 .fa-briefcase:before {
676 content: "\f0b1";
677 }
678 .fa-arrows-alt:before {
679 content: "\f0b2";
680 }
681 .fa-group:before,
682 .fa-users:before {
683 content: "\f0c0";
684 }
685 .fa-chain:before,
686 .fa-link:before {
687 content: "\f0c1";
688 }
689 .fa-cloud:before {
690 content: "\f0c2";
691 }
692 .fa-flask:before {
693 content: "\f0c3";
694 }
695 .fa-cut:before,
696 .fa-scissors:before {
697 content: "\f0c4";
698 }
699 .fa-copy:before,
700 .fa-files-o:before {
701 content: "\f0c5";
702 }
703 .fa-paperclip:before {
704 content: "\f0c6";
705 }
706 .fa-save:before,
707 .fa-floppy-o:before {
708 content: "\f0c7";
709 }
710 .fa-square:before {
711 content: "\f0c8";
712 }
713 .fa-navicon:before,
714 .fa-reorder:before,
715 .fa-bars:before {
716 content: "\f0c9";
717 }
718 .fa-list-ul:before {
719 content: "\f0ca";
720 }
721 .fa-list-ol:before {
722 content: "\f0cb";
723 }
724 .fa-strikethrough:before {
725 content: "\f0cc";
726 }
727 .fa-underline:before {
728 content: "\f0cd";
729 }
730 .fa-table:before {
731 content: "\f0ce";
732 }
733 .fa-magic:before {
734 content: "\f0d0";
735 }
736 .fa-truck:before {
737 content: "\f0d1";
738 }
739 .fa-pinterest:before {
740 content: "\f0d2";
741 }
742 .fa-pinterest-square:before {
743 content: "\f0d3";
744 }
745 .fa-google-plus-square:before {
746 content: "\f0d4";
747 }
748 .fa-google-plus:before {
749 content: "\f0d5";
750 }
751 .fa-money:before {
752 content: "\f0d6";
753 }
754 .fa-caret-down:before {
755 content: "\f0d7";
756 }
757 .fa-caret-up:before {
758 content: "\f0d8";
759 }
760 .fa-caret-left:before {
761 content: "\f0d9";
762 }
763 .fa-caret-right:before {
764 content: "\f0da";
765 }
766 .fa-columns:before {
767 content: "\f0db";
768 }
769 .fa-unsorted:before,
770 .fa-sort:before {
771 content: "\f0dc";
772 }
773 .fa-sort-down:before,
774 .fa-sort-desc:before {
775 content: "\f0dd";
776 }
777 .fa-sort-up:before,
778 .fa-sort-asc:before {
779 content: "\f0de";
780 }
781 .fa-envelope:before {
782 content: "\f0e0";
783 }
784 .fa-linkedin:before {
785 content: "\f0e1";
786 }
787 .fa-rotate-left:before,
788 .fa-undo:before {
789 content: "\f0e2";
790 }
791 .fa-legal:before,
792 .fa-gavel:before {
793 content: "\f0e3";
794 }
795 .fa-dashboard:before,
796 .fa-tachometer:before {
797 content: "\f0e4";
798 }
799 .fa-comment-o:before {
800 content: "\f0e5";
801 }
802 .fa-comments-o:before {
803 content: "\f0e6";
804 }
805 .fa-flash:before,
806 .fa-bolt:before {
807 content: "\f0e7";
808 }
809 .fa-sitemap:before {
810 content: "\f0e8";
811 }
812 .fa-umbrella:before {
813 content: "\f0e9";
814 }
815 .fa-paste:before,
816 .fa-clipboard:before {
817 content: "\f0ea";
818 }
819 .fa-lightbulb-o:before {
820 content: "\f0eb";
821 }
822 .fa-exchange:before {
823 content: "\f0ec";
824 }
825 .fa-cloud-download:before {
826 content: "\f0ed";
827 }
828 .fa-cloud-upload:before {
829 content: "\f0ee";
830 }
831 .fa-user-md:before {
832 content: "\f0f0";
833 }
834 .fa-stethoscope:before {
835 content: "\f0f1";
836 }
837 .fa-suitcase:before {
838 content: "\f0f2";
839 }
840 .fa-bell-o:before {
841 content: "\f0a2";
842 }
843 .fa-coffee:before {
844 content: "\f0f4";
845 }
846 .fa-cutlery:before {
847 content: "\f0f5";
848 }
849 .fa-file-text-o:before {
850 content: "\f0f6";
851 }
852 .fa-building-o:before {
853 content: "\f0f7";
854 }
855 .fa-hospital-o:before {
856 content: "\f0f8";
857 }
858 .fa-ambulance:before {
859 content: "\f0f9";
860 }
861 .fa-medkit:before {
862 content: "\f0fa";
863 }
864 .fa-fighter-jet:before {
865 content: "\f0fb";
866 }
867 .fa-beer:before {
868 content: "\f0fc";
869 }
870 .fa-h-square:before {
871 content: "\f0fd";
872 }
873 .fa-plus-square:before {
874 content: "\f0fe";
875 }
876 .fa-angle-double-left:before {
877 content: "\f100";
878 }
879 .fa-angle-double-right:before {
880 content: "\f101";
881 }
882 .fa-angle-double-up:before {
883 content: "\f102";
884 }
885 .fa-angle-double-down:before {
886 content: "\f103";
887 }
888 .fa-angle-left:before {
889 content: "\f104";
890 }
891 .fa-angle-right:before {
892 content: "\f105";
893 }
894 .fa-angle-up:before {
895 content: "\f106";
896 }
897 .fa-angle-down:before {
898 content: "\f107";
899 }
900 .fa-desktop:before {
901 content: "\f108";
902 }
903 .fa-laptop:before {
904 content: "\f109";
905 }
906 .fa-tablet:before {
907 content: "\f10a";
908 }
909 .fa-mobile-phone:before,
910 .fa-mobile:before {
911 content: "\f10b";
912 }
913 .fa-circle-o:before {
914 content: "\f10c";
915 }
916 .fa-quote-left:before {
917 content: "\f10d";
918 }
919 .fa-quote-right:before {
920 content: "\f10e";
921 }
922 .fa-spinner:before {
923 content: "\f110";
924 }
925 .fa-circle:before {
926 content: "\f111";
927 }
928 .fa-mail-reply:before,
929 .fa-reply:before {
930 content: "\f112";
931 }
932 .fa-github-alt:before {
933 content: "\f113";
934 }
935 .fa-folder-o:before {
936 content: "\f114";
937 }
938 .fa-folder-open-o:before {
939 content: "\f115";
940 }
941 .fa-smile-o:before {
942 content: "\f118";
943 }
944 .fa-frown-o:before {
945 content: "\f119";
946 }
947 .fa-meh-o:before {
948 content: "\f11a";
949 }
950 .fa-gamepad:before {
951 content: "\f11b";
952 }
953 .fa-keyboard-o:before {
954 content: "\f11c";
955 }
956 .fa-flag-o:before {
957 content: "\f11d";
958 }
959 .fa-flag-checkered:before {
960 content: "\f11e";
961 }
962 .fa-terminal:before {
963 content: "\f120";
964 }
965 .fa-code:before {
966 content: "\f121";
967 }
968 .fa-mail-reply-all:before,
969 .fa-reply-all:before {
970 content: "\f122";
971 }
972 .fa-star-half-empty:before,
973 .fa-star-half-full:before,
974 .fa-star-half-o:before {
975 content: "\f123";
976 }
977 .fa-location-arrow:before {
978 content: "\f124";
979 }
980 .fa-crop:before {
981 content: "\f125";
982 }
983 .fa-code-fork:before {
984 content: "\f126";
985 }
986 .fa-unlink:before,
987 .fa-chain-broken:before {
988 content: "\f127";
989 }
990 .fa-question:before {
991 content: "\f128";
992 }
993 .fa-info:before {
994 content: "\f129";
995 }
996 .fa-exclamation:before {
997 content: "\f12a";
998 }
999 .fa-superscript:before {
1000 content: "\f12b";
1001 }
1002 .fa-subscript:before {
1003 content: "\f12c";
1004 }
1005 .fa-eraser:before {
1006 content: "\f12d";
1007 }
1008 .fa-puzzle-piece:before {
1009 content: "\f12e";
1010 }
1011 .fa-microphone:before {
1012 content: "\f130";
1013 }
1014 .fa-microphone-slash:before {
1015 content: "\f131";
1016 }
1017 .fa-shield:before {
1018 content: "\f132";
1019 }
1020 .fa-calendar-o:before {
1021 content: "\f133";
1022 }
1023 .fa-fire-extinguisher:before {
1024 content: "\f134";
1025 }
1026 .fa-rocket:before {
1027 content: "\f135";
1028 }
1029 .fa-maxcdn:before {
1030 content: "\f136";
1031 }
1032 .fa-chevron-circle-left:before {
1033 content: "\f137";
1034 }
1035 .fa-chevron-circle-right:before {
1036 content: "\f138";
1037 }
1038 .fa-chevron-circle-up:before {
1039 content: "\f139";
1040 }
1041 .fa-chevron-circle-down:before {
1042 content: "\f13a";
1043 }
1044 .fa-html5:before {
1045 content: "\f13b";
1046 }
1047 .fa-css3:before {
1048 content: "\f13c";
1049 }
1050 .fa-anchor:before {
1051 content: "\f13d";
1052 }
1053 .fa-unlock-alt:before {
1054 content: "\f13e";
1055 }
1056 .fa-bullseye:before {
1057 content: "\f140";
1058 }
1059 .fa-ellipsis-h:before {
1060 content: "\f141";
1061 }
1062 .fa-ellipsis-v:before {
1063 content: "\f142";
1064 }
1065 .fa-rss-square:before {
1066 content: "\f143";
1067 }
1068 .fa-play-circle:before {
1069 content: "\f144";
1070 }
1071 .fa-ticket:before {
1072 content: "\f145";
1073 }
1074 .fa-minus-square:before {
1075 content: "\f146";
1076 }
1077 .fa-minus-square-o:before {
1078 content: "\f147";
1079 }
1080 .fa-level-up:before {
1081 content: "\f148";
1082 }
1083 .fa-level-down:before {
1084 content: "\f149";
1085 }
1086 .fa-check-square:before {
1087 content: "\f14a";
1088 }
1089 .fa-pencil-square:before {
1090 content: "\f14b";
1091 }
1092 .fa-external-link-square:before {
1093 content: "\f14c";
1094 }
1095 .fa-share-square:before {
1096 content: "\f14d";
1097 }
1098 .fa-compass:before {
1099 content: "\f14e";
1100 }
1101 .fa-toggle-down:before,
1102 .fa-caret-square-o-down:before {
1103 content: "\f150";
1104 }
1105 .fa-toggle-up:before,
1106 .fa-caret-square-o-up:before {
1107 content: "\f151";
1108 }
1109 .fa-toggle-right:before,
1110 .fa-caret-square-o-right:before {
1111 content: "\f152";
1112 }
1113 .fa-euro:before,
1114 .fa-eur:before {
1115 content: "\f153";
1116 }
1117 .fa-gbp:before {
1118 content: "\f154";
1119 }
1120 .fa-dollar:before,
1121 .fa-usd:before {
1122 content: "\f155";
1123 }
1124 .fa-rupee:before,
1125 .fa-inr:before {
1126 content: "\f156";
1127 }
1128 .fa-cny:before,
1129 .fa-rmb:before,
1130 .fa-yen:before,
1131 .fa-jpy:before {
1132 content: "\f157";
1133 }
1134 .fa-ruble:before,
1135 .fa-rouble:before,
1136 .fa-rub:before {
1137 content: "\f158";
1138 }
1139 .fa-won:before,
1140 .fa-krw:before {
1141 content: "\f159";
1142 }
1143 .fa-bitcoin:before,
1144 .fa-btc:before {
1145 content: "\f15a";
1146 }
1147 .fa-file:before {
1148 content: "\f15b";
1149 }
1150 .fa-file-text:before {
1151 content: "\f15c";
1152 }
1153 .fa-sort-alpha-asc:before {
1154 content: "\f15d";
1155 }
1156 .fa-sort-alpha-desc:before {
1157 content: "\f15e";
1158 }
1159 .fa-sort-amount-asc:before {
1160 content: "\f160";
1161 }
1162 .fa-sort-amount-desc:before {
1163 content: "\f161";
1164 }
1165 .fa-sort-numeric-asc:before {
1166 content: "\f162";
1167 }
1168 .fa-sort-numeric-desc:before {
1169 content: "\f163";
1170 }
1171 .fa-thumbs-up:before {
1172 content: "\f164";
1173 }
1174 .fa-thumbs-down:before {
1175 content: "\f165";
1176 }
1177 .fa-youtube-square:before {
1178 content: "\f166";
1179 }
1180 .fa-youtube:before {
1181 content: "\f167";
1182 }
1183 .fa-xing:before {
1184 content: "\f168";
1185 }
1186 .fa-xing-square:before {
1187 content: "\f169";
1188 }
1189 .fa-youtube-play:before {
1190 content: "\f16a";
1191 }
1192 .fa-dropbox:before {
1193 content: "\f16b";
1194 }
1195 .fa-stack-overflow:before {
1196 content: "\f16c";
1197 }
1198 .fa-instagram:before {
1199 content: "\f16d";
1200 }
1201 .fa-flickr:before {
1202 content: "\f16e";
1203 }
1204 .fa-adn:before {
1205 content: "\f170";
1206 }
1207 .fa-bitbucket:before {
1208 content: "\f171";
1209 }
1210 .fa-bitbucket-square:before {
1211 content: "\f172";
1212 }
1213 .fa-tumblr:before {
1214 content: "\f173";
1215 }
1216 .fa-tumblr-square:before {
1217 content: "\f174";
1218 }
1219 .fa-long-arrow-down:before {
1220 content: "\f175";
1221 }
1222 .fa-long-arrow-up:before {
1223 content: "\f176";
1224 }
1225 .fa-long-arrow-left:before {
1226 content: "\f177";
1227 }
1228 .fa-long-arrow-right:before {
1229 content: "\f178";
1230 }
1231 .fa-apple:before {
1232 content: "\f179";
1233 }
1234 .fa-windows:before {
1235 content: "\f17a";
1236 }
1237 .fa-android:before {
1238 content: "\f17b";
1239 }
1240 .fa-linux:before {
1241 content: "\f17c";
1242 }
1243 .fa-dribbble:before {
1244 content: "\f17d";
1245 }
1246 .fa-skype:before {
1247 content: "\f17e";
1248 }
1249 .fa-foursquare:before {
1250 content: "\f180";
1251 }
1252 .fa-trello:before {
1253 content: "\f181";
1254 }
1255 .fa-female:before {
1256 content: "\f182";
1257 }
1258 .fa-male:before {
1259 content: "\f183";
1260 }
1261 .fa-gittip:before {
1262 content: "\f184";
1263 }
1264 .fa-sun-o:before {
1265 content: "\f185";
1266 }
1267 .fa-moon-o:before {
1268 content: "\f186";
1269 }
1270 .fa-archive:before {
1271 content: "\f187";
1272 }
1273 .fa-bug:before {
1274 content: "\f188";
1275 }
1276 .fa-vk:before {
1277 content: "\f189";
1278 }
1279 .fa-weibo:before {
1280 content: "\f18a";
1281 }
1282 .fa-renren:before {
1283 content: "\f18b";
1284 }
1285 .fa-pagelines:before {
1286 content: "\f18c";
1287 }
1288 .fa-stack-exchange:before {
1289 content: "\f18d";
1290 }
1291 .fa-arrow-circle-o-right:before {
1292 content: "\f18e";
1293 }
1294 .fa-arrow-circle-o-left:before {
1295 content: "\f190";
1296 }
1297 .fa-toggle-left:before,
1298 .fa-caret-square-o-left:before {
1299 content: "\f191";
1300 }
1301 .fa-dot-circle-o:before {
1302 content: "\f192";
1303 }
1304 .fa-wheelchair:before {
1305 content: "\f193";
1306 }
1307 .fa-vimeo-square:before {
1308 content: "\f194";
1309 }
1310 .fa-turkish-lira:before,
1311 .fa-try:before {
1312 content: "\f195";
1313 }
1314 .fa-plus-square-o:before {
1315 content: "\f196";
1316 }
1317 .fa-space-shuttle:before {
1318 content: "\f197";
1319 }
1320 .fa-slack:before {
1321 content: "\f198";
1322 }
1323 .fa-envelope-square:before {
1324 content: "\f199";
1325 }
1326 .fa-wordpress:before {
1327 content: "\f19a";
1328 }
1329 .fa-openid:before {
1330 content: "\f19b";
1331 }
1332 .fa-institution:before,
1333 .fa-bank:before,
1334 .fa-university:before {
1335 content: "\f19c";
1336 }
1337 .fa-mortar-board:before,
1338 .fa-graduation-cap:before {
1339 content: "\f19d";
1340 }
1341 .fa-yahoo:before {
1342 content: "\f19e";
1343 }
1344 .fa-google:before {
1345 content: "\f1a0";
1346 }
1347 .fa-reddit:before {
1348 content: "\f1a1";
1349 }
1350 .fa-reddit-square:before {
1351 content: "\f1a2";
1352 }
1353 .fa-stumbleupon-circle:before {
1354 content: "\f1a3";
1355 }
1356 .fa-stumbleupon:before {
1357 content: "\f1a4";
1358 }
1359 .fa-delicious:before {
1360 content: "\f1a5";
1361 }
1362 .fa-digg:before {
1363 content: "\f1a6";
1364 }
1365 .fa-pied-piper:before {
1366 content: "\f1a7";
1367 }
1368 .fa-pied-piper-alt:before {
1369 content: "\f1a8";
1370 }
1371 .fa-drupal:before {
1372 content: "\f1a9";
1373 }
1374 .fa-joomla:before {
1375 content: "\f1aa";
1376 }
1377 .fa-language:before {
1378 content: "\f1ab";
1379 }
1380 .fa-fax:before {
1381 content: "\f1ac";
1382 }
1383 .fa-building:before {
1384 content: "\f1ad";
1385 }
1386 .fa-child:before {
1387 content: "\f1ae";
1388 }
1389 .fa-paw:before {
1390 content: "\f1b0";
1391 }
1392 .fa-spoon:before {
1393 content: "\f1b1";
1394 }
1395 .fa-cube:before {
1396 content: "\f1b2";
1397 }
1398 .fa-cubes:before {
1399 content: "\f1b3";
1400 }
1401 .fa-behance:before {
1402 content: "\f1b4";
1403 }
1404 .fa-behance-square:before {
1405 content: "\f1b5";
1406 }
1407 .fa-steam:before {
1408 content: "\f1b6";
1409 }
1410 .fa-steam-square:before {
1411 content: "\f1b7";
1412 }
1413 .fa-recycle:before {
1414 content: "\f1b8";
1415 }
1416 .fa-automobile:before,
1417 .fa-car:before {
1418 content: "\f1b9";
1419 }
1420 .fa-cab:before,
1421 .fa-taxi:before {
1422 content: "\f1ba";
1423 }
1424 .fa-tree:before {
1425 content: "\f1bb";
1426 }
1427 .fa-spotify:before {
1428 content: "\f1bc";
1429 }
1430 .fa-deviantart:before {
1431 content: "\f1bd";
1432 }
1433 .fa-soundcloud:before {
1434 content: "\f1be";
1435 }
1436 .fa-database:before {
1437 content: "\f1c0";
1438 }
1439 .fa-file-pdf-o:before {
1440 content: "\f1c1";
1441 }
1442 .fa-file-word-o:before {
1443 content: "\f1c2";
1444 }
1445 .fa-file-excel-o:before {
1446 content: "\f1c3";
1447 }
1448 .fa-file-powerpoint-o:before {
1449 content: "\f1c4";
1450 }
1451 .fa-file-photo-o:before,
1452 .fa-file-picture-o:before,
1453 .fa-file-image-o:before {
1454 content: "\f1c5";
1455 }
1456 .fa-file-zip-o:before,
1457 .fa-file-archive-o:before {
1458 content: "\f1c6";
1459 }
1460 .fa-file-sound-o:before,
1461 .fa-file-audio-o:before {
1462 content: "\f1c7";
1463 }
1464 .fa-file-movie-o:before,
1465 .fa-file-video-o:before {
1466 content: "\f1c8";
1467 }
1468 .fa-file-code-o:before {
1469 content: "\f1c9";
1470 }
1471 .fa-vine:before {
1472 content: "\f1ca";
1473 }
1474 .fa-codepen:before {
1475 content: "\f1cb";
1476 }
1477 .fa-jsfiddle:before {
1478 content: "\f1cc";
1479 }
1480 .fa-life-bouy:before,
1481 .fa-life-buoy:before,
1482 .fa-life-saver:before,
1483 .fa-support:before,
1484 .fa-life-ring:before {
1485 content: "\f1cd";
1486 }
1487 .fa-circle-o-notch:before {
1488 content: "\f1ce";
1489 }
1490 .fa-ra:before,
1491 .fa-rebel:before {
1492 content: "\f1d0";
1493 }
1494 .fa-ge:before,
1495 .fa-empire:before {
1496 content: "\f1d1";
1497 }
1498 .fa-git-square:before {
1499 content: "\f1d2";
1500 }
1501 .fa-git:before {
1502 content: "\f1d3";
1503 }
1504 .fa-hacker-news:before {
1505 content: "\f1d4";
1506 }
1507 .fa-tencent-weibo:before {
1508 content: "\f1d5";
1509 }
1510 .fa-qq:before {
1511 content: "\f1d6";
1512 }
1513 .fa-wechat:before,
1514 .fa-weixin:before {
1515 content: "\f1d7";
1516 }
1517 .fa-send:before,
1518 .fa-paper-plane:before {
1519 content: "\f1d8";
1520 }
1521 .fa-send-o:before,
1522 .fa-paper-plane-o:before {
1523 content: "\f1d9";
1524 }
1525 .fa-history:before {
1526 content: "\f1da";
1527 }
1528 .fa-circle-thin:before {
1529 content: "\f1db";
1530 }
1531 .fa-header:before {
1532 content: "\f1dc";
1533 }
1534 .fa-paragraph:before {
1535 content: "\f1dd";
1536 }
1537 .fa-sliders:before {
1538 content: "\f1de";
1539 }
1540 .fa-share-alt:before {
1541 content: "\f1e0";
1542 }
1543 .fa-share-alt-square:before {
1544 content: "\f1e1";
1545 }
1546 .fa-bomb:before {
1547 content: "\f1e2";
1548 }
1549 .fa-soccer-ball-o:before,
1550 .fa-futbol-o:before {
1551 content: "\f1e3";
1552 }
1553 .fa-tty:before {
1554 content: "\f1e4";
1555 }
1556 .fa-binoculars:before {
1557 content: "\f1e5";
1558 }
1559 .fa-plug:before {
1560 content: "\f1e6";
1561 }
1562 .fa-slideshare:before {
1563 content: "\f1e7";
1564 }
1565 .fa-twitch:before {
1566 content: "\f1e8";
1567 }
1568 .fa-yelp:before {
1569 content: "\f1e9";
1570 }
1571 .fa-newspaper-o:before {
1572 content: "\f1ea";
1573 }
1574 .fa-wifi:before {
1575 content: "\f1eb";
1576 }
1577 .fa-calculator:before {
1578 content: "\f1ec";
1579 }
1580 .fa-paypal:before {
1581 content: "\f1ed";
1582 }
1583 .fa-google-wallet:before {
1584 content: "\f1ee";
1585 }
1586 .fa-cc-visa:before {
1587 content: "\f1f0";
1588 }
1589 .fa-cc-mastercard:before {
1590 content: "\f1f1";
1591 }
1592 .fa-cc-discover:before {
1593 content: "\f1f2";
1594 }
1595 .fa-cc-amex:before {
1596 content: "\f1f3";
1597 }
1598 .fa-cc-paypal:before {
1599 content: "\f1f4";
1600 }
1601 .fa-cc-stripe:before {
1602 content: "\f1f5";
1603 }
1604 .fa-bell-slash:before {
1605 content: "\f1f6";
1606 }
1607 .fa-bell-slash-o:before {
1608 content: "\f1f7";
1609 }
1610 .fa-trash:before {
1611 content: "\f1f8";
1612 }
1613 .fa-copyright:before {
1614 content: "\f1f9";
1615 }
1616 .fa-at:before {
1617 content: "\f1fa";
1618 }
1619 .fa-eyedropper:before {
1620 content: "\f1fb";
1621 }
1622 .fa-paint-brush:before {
1623 content: "\f1fc";
1624 }
1625 .fa-birthday-cake:before {
1626 content: "\f1fd";
1627 }
1628 .fa-area-chart:before {
1629 content: "\f1fe";
1630 }
1631 .fa-pie-chart:before {
1632 content: "\f200";
1633 }
1634 .fa-line-chart:before {
1635 content: "\f201";
1636 }
1637 .fa-lastfm:before {
1638 content: "\f202";
1639 }
1640 .fa-lastfm-square:before {
1641 content: "\f203";
1642 }
1643 .fa-toggle-off:before {
1644 content: "\f204";
1645 }
1646 .fa-toggle-on:before {
1647 content: "\f205";
1648 }
1649 .fa-bicycle:before {
1650 content: "\f206";
1651 }
1652 .fa-bus:before {
1653 content: "\f207";
1654 }
1655 .fa-ioxhost:before {
1656 content: "\f208";
1657 }
1658 .fa-angellist:before {
1659 content: "\f209";
1660 }
1661 .fa-cc:before {
1662 content: "\f20a";
1663 }
1664 .fa-shekel:before,
1665 .fa-sheqel:before,
1666 .fa-ils:before {
1667 content: "\f20b";
1668 }
1669 .fa-meanpath:before {
1670 content: "\f20c";
1671 }
0 /*!
1 * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
2 * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
3 */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.2.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.2.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff?v=4.2.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.2.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.2.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}
0 <?xml version="1.0" standalone="no"?>
1 <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
2 <svg xmlns="http://www.w3.org/2000/svg">
3 <metadata></metadata>
4 <defs>
5 <font id="fontawesomeregular" horiz-adv-x="1536" >
6 <font-face units-per-em="1792" ascent="1536" descent="-256" />
7 <missing-glyph horiz-adv-x="448" />
8 <glyph unicode=" " horiz-adv-x="448" />
9 <glyph unicode="&#x09;" horiz-adv-x="448" />
10 <glyph unicode="&#xa0;" horiz-adv-x="448" />
11 <glyph unicode="&#xa8;" horiz-adv-x="1792" />
12 <glyph unicode="&#xa9;" horiz-adv-x="1792" />
13 <glyph unicode="&#xae;" horiz-adv-x="1792" />
14 <glyph unicode="&#xb4;" horiz-adv-x="1792" />
15 <glyph unicode="&#xc6;" horiz-adv-x="1792" />
16 <glyph unicode="&#xd8;" horiz-adv-x="1792" />
17 <glyph unicode="&#x2000;" horiz-adv-x="768" />
18 <glyph unicode="&#x2001;" horiz-adv-x="1537" />
19 <glyph unicode="&#x2002;" horiz-adv-x="768" />
20 <glyph unicode="&#x2003;" horiz-adv-x="1537" />
21 <glyph unicode="&#x2004;" horiz-adv-x="512" />
22 <glyph unicode="&#x2005;" horiz-adv-x="384" />
23 <glyph unicode="&#x2006;" horiz-adv-x="256" />
24 <glyph unicode="&#x2007;" horiz-adv-x="256" />
25 <glyph unicode="&#x2008;" horiz-adv-x="192" />
26 <glyph unicode="&#x2009;" horiz-adv-x="307" />
27 <glyph unicode="&#x200a;" horiz-adv-x="85" />
28 <glyph unicode="&#x202f;" horiz-adv-x="307" />
29 <glyph unicode="&#x205f;" horiz-adv-x="384" />
30 <glyph unicode="&#x2122;" horiz-adv-x="1792" />
31 <glyph unicode="&#x221e;" horiz-adv-x="1792" />
32 <glyph unicode="&#x2260;" horiz-adv-x="1792" />
33 <glyph unicode="&#x25fc;" horiz-adv-x="500" d="M0 0z" />
34 <glyph unicode="&#xf000;" horiz-adv-x="1792" d="M1699 1350q0 -35 -43 -78l-632 -632v-768h320q26 0 45 -19t19 -45t-19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45t45 19h320v768l-632 632q-43 43 -43 78q0 23 18 36.5t38 17.5t43 4h1408q23 0 43 -4t38 -17.5t18 -36.5z" />
35 <glyph unicode="&#xf001;" d="M1536 1312v-1120q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v537l-768 -237v-709q0 -50 -34 -89t-86 -60.5t-103.5 -32t-96.5 -10.5t-96.5 10.5t-103.5 32t-86 60.5t-34 89 t34 89t86 60.5t103.5 32t96.5 10.5q105 0 192 -39v967q0 31 19 56.5t49 35.5l832 256q12 4 28 4q40 0 68 -28t28 -68z" />
36 <glyph unicode="&#xf002;" horiz-adv-x="1664" d="M1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -52 -38 -90t-90 -38q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5 t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
37 <glyph unicode="&#xf003;" horiz-adv-x="1792" d="M1664 32v768q-32 -36 -69 -66q-268 -206 -426 -338q-51 -43 -83 -67t-86.5 -48.5t-102.5 -24.5h-1h-1q-48 0 -102.5 24.5t-86.5 48.5t-83 67q-158 132 -426 338q-37 30 -69 66v-768q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1664 1083v11v13.5t-0.5 13 t-3 12.5t-5.5 9t-9 7.5t-14 2.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5q0 -168 147 -284q193 -152 401 -317q6 -5 35 -29.5t46 -37.5t44.5 -31.5t50.5 -27.5t43 -9h1h1q20 0 43 9t50.5 27.5t44.5 31.5t46 37.5t35 29.5q208 165 401 317q54 43 100.5 115.5t46.5 131.5z M1792 1120v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47t47 -113z" />
38 <glyph unicode="&#xf004;" horiz-adv-x="1792" d="M896 -128q-26 0 -44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5q224 0 351 -124t127 -344q0 -221 -229 -450l-623 -600 q-18 -18 -44 -18z" />
39 <glyph unicode="&#xf005;" horiz-adv-x="1664" d="M1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -21 -10.5 -35.5t-30.5 -14.5q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455 l502 -73q56 -9 56 -46z" />
40 <glyph unicode="&#xf006;" horiz-adv-x="1664" d="M1137 532l306 297l-422 62l-189 382l-189 -382l-422 -62l306 -297l-73 -421l378 199l377 -199zM1664 889q0 -22 -26 -48l-363 -354l86 -500q1 -7 1 -20q0 -50 -41 -50q-19 0 -40 12l-449 236l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500 l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41t49 -41l225 -455l502 -73q56 -9 56 -46z" />
41 <glyph unicode="&#xf007;" horiz-adv-x="1408" d="M1408 131q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5t43 97.5t62 81t85.5 53.5t111.5 20q9 0 42 -21.5t74.5 -48t108 -48t133.5 -21.5t133.5 21.5t108 48t74.5 48t42 21.5q61 0 111.5 -20t85.5 -53.5t62 -81 t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5z" />
42 <glyph unicode="&#xf008;" horiz-adv-x="1920" d="M384 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 320v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM384 704v128q0 26 -19 45t-45 19h-128 q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 -64v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM384 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45 t45 -19h128q26 0 45 19t19 45zM1792 -64v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1408 704v512q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-512q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1792 320v128 q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 704v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1792 1088v128q0 26 -19 45t-45 19h-128q-26 0 -45 -19 t-19 -45v-128q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1920 1248v-1344q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1344q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
43 <glyph unicode="&#xf009;" horiz-adv-x="1664" d="M768 512v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM768 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 512v-384q0 -52 -38 -90t-90 -38 h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90zM1664 1280v-384q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
44 <glyph unicode="&#xf00a;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 288v-192q0 -40 -28 -68t-68 -28h-320 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1152 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68z" />
45 <glyph unicode="&#xf00b;" horiz-adv-x="1792" d="M512 288v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM512 800v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 288v-192q0 -40 -28 -68t-68 -28h-960 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68zM512 1312v-192q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h320q40 0 68 -28t28 -68zM1792 800v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28 h960q40 0 68 -28t28 -68zM1792 1312v-192q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h960q40 0 68 -28t28 -68z" />
46 <glyph unicode="&#xf00c;" horiz-adv-x="1792" d="M1671 970q0 -40 -28 -68l-724 -724l-136 -136q-28 -28 -68 -28t-68 28l-136 136l-362 362q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -295l656 657q28 28 68 28t68 -28l136 -136q28 -28 28 -68z" />
47 <glyph unicode="&#xf00d;" horiz-adv-x="1408" d="M1298 214q0 -40 -28 -68l-136 -136q-28 -28 -68 -28t-68 28l-294 294l-294 -294q-28 -28 -68 -28t-68 28l-136 136q-28 28 -28 68t28 68l294 294l-294 294q-28 28 -28 68t28 68l136 136q28 28 68 28t68 -28l294 -294l294 294q28 28 68 28t68 -28l136 -136q28 -28 28 -68 t-28 -68l-294 -294l294 -294q28 -28 28 -68z" />
48 <glyph unicode="&#xf00e;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-224q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v224h-224q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h224v224q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5v-224h224 q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5zM1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5 t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z" />
49 <glyph unicode="&#xf010;" horiz-adv-x="1664" d="M1024 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-576q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h576q13 0 22.5 -9.5t9.5 -22.5zM1152 704q0 185 -131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5t316.5 131.5t131.5 316.5z M1664 -128q0 -53 -37.5 -90.5t-90.5 -37.5q-54 0 -90 38l-343 342q-179 -124 -399 -124q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5t273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -220 -124 -399l343 -343q37 -37 37 -90z " />
50 <glyph unicode="&#xf011;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61t-298 61t-245 164t-164 245t-61 298q0 182 80.5 343t226.5 270q43 32 95.5 25t83.5 -50q32 -42 24.5 -94.5t-49.5 -84.5q-98 -74 -151.5 -181t-53.5 -228q0 -104 40.5 -198.5t109.5 -163.5t163.5 -109.5 t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5q0 121 -53.5 228t-151.5 181q-42 32 -49.5 84.5t24.5 94.5q31 43 84 50t95 -25q146 -109 226.5 -270t80.5 -343zM896 1408v-640q0 -52 -38 -90t-90 -38t-90 38t-38 90v640q0 52 38 90t90 38t90 -38t38 -90z" />
51 <glyph unicode="&#xf012;" horiz-adv-x="1792" d="M256 96v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 224v-320q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 480v-576q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v576q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1408 864v-960q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1376v-1472q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1472q0 14 9 23t23 9h192q14 0 23 -9t9 -23z" />
52 <glyph unicode="&#xf013;" d="M1024 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1536 749v-222q0 -12 -8 -23t-20 -13l-185 -28q-19 -54 -39 -91q35 -50 107 -138q10 -12 10 -25t-9 -23q-27 -37 -99 -108t-94 -71q-12 0 -26 9l-138 108q-44 -23 -91 -38 q-16 -136 -29 -186q-7 -28 -36 -28h-222q-14 0 -24.5 8.5t-11.5 21.5l-28 184q-49 16 -90 37l-141 -107q-10 -9 -25 -9q-14 0 -25 11q-126 114 -165 168q-7 10 -7 23q0 12 8 23q15 21 51 66.5t54 70.5q-27 50 -41 99l-183 27q-13 2 -21 12.5t-8 23.5v222q0 12 8 23t19 13 l186 28q14 46 39 92q-40 57 -107 138q-10 12 -10 24q0 10 9 23q26 36 98.5 107.5t94.5 71.5q13 0 26 -10l138 -107q44 23 91 38q16 136 29 186q7 28 36 28h222q14 0 24.5 -8.5t11.5 -21.5l28 -184q49 -16 90 -37l142 107q9 9 24 9q13 0 25 -10q129 -119 165 -170q7 -8 7 -22 q0 -12 -8 -23q-15 -21 -51 -66.5t-54 -70.5q26 -50 41 -98l183 -28q13 -2 21 -12.5t8 -23.5z" />
53 <glyph unicode="&#xf014;" horiz-adv-x="1408" d="M512 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM768 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1024 800v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1152 76v948h-896v-948q0 -22 7 -40.5t14.5 -27t10.5 -8.5h832q3 0 10.5 8.5t14.5 27t7 40.5zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832 q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
54 <glyph unicode="&#xf015;" horiz-adv-x="1664" d="M1408 544v-480q0 -26 -19 -45t-45 -19h-384v384h-256v-384h-384q-26 0 -45 19t-19 45v480q0 1 0.5 3t0.5 3l575 474l575 -474q1 -2 1 -6zM1631 613l-62 -74q-8 -9 -21 -11h-3q-13 0 -21 7l-692 577l-692 -577q-12 -8 -24 -7q-13 2 -21 11l-62 74q-8 10 -7 23.5t11 21.5 l719 599q32 26 76 26t76 -26l244 -204v195q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-408l219 -182q10 -8 11 -21.5t-7 -23.5z" />
55 <glyph unicode="&#xf016;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z " />
56 <glyph unicode="&#xf017;" d="M896 992v-448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
57 <glyph unicode="&#xf018;" horiz-adv-x="1920" d="M1111 540v4l-24 320q-1 13 -11 22.5t-23 9.5h-186q-13 0 -23 -9.5t-11 -22.5l-24 -320v-4q-1 -12 8 -20t21 -8h244q12 0 21 8t8 20zM1870 73q0 -73 -46 -73h-704q13 0 22 9.5t8 22.5l-20 256q-1 13 -11 22.5t-23 9.5h-272q-13 0 -23 -9.5t-11 -22.5l-20 -256 q-1 -13 8 -22.5t22 -9.5h-704q-46 0 -46 73q0 54 26 116l417 1044q8 19 26 33t38 14h339q-13 0 -23 -9.5t-11 -22.5l-15 -192q-1 -14 8 -23t22 -9h166q13 0 22 9t8 23l-15 192q-1 13 -11 22.5t-23 9.5h339q20 0 38 -14t26 -33l417 -1044q26 -62 26 -116z" />
58 <glyph unicode="&#xf019;" horiz-adv-x="1664" d="M1280 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 416v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h465l135 -136 q58 -56 136 -56t136 56l136 136h464q40 0 68 -28t28 -68zM1339 985q17 -41 -14 -70l-448 -448q-18 -19 -45 -19t-45 19l-448 448q-31 29 -14 70q17 39 59 39h256v448q0 26 19 45t45 19h256q26 0 45 -19t19 -45v-448h256q42 0 59 -39z" />
59 <glyph unicode="&#xf01a;" d="M1120 608q0 -12 -10 -24l-319 -319q-11 -9 -23 -9t-23 9l-320 320q-15 16 -7 35q8 20 30 20h192v352q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-352h192q14 0 23 -9t9 -23zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273 t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
60 <glyph unicode="&#xf01b;" d="M1118 660q-8 -20 -30 -20h-192v-352q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v352h-192q-14 0 -23 9t-9 23q0 12 10 24l319 319q11 9 23 9t23 -9l320 -320q15 -16 7 -35zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198 t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
61 <glyph unicode="&#xf01c;" d="M1023 576h316q-1 3 -2.5 8t-2.5 8l-212 496h-708l-212 -496q-1 -2 -2.5 -8t-2.5 -8h316l95 -192h320zM1536 546v-482q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v482q0 62 25 123l238 552q10 25 36.5 42t52.5 17h832q26 0 52.5 -17t36.5 -42l238 -552 q25 -61 25 -123z" />
62 <glyph unicode="&#xf01d;" d="M1184 640q0 -37 -32 -55l-544 -320q-15 -9 -32 -9q-16 0 -32 8q-32 19 -32 56v640q0 37 32 56q33 18 64 -1l544 -320q32 -18 32 -55zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
63 <glyph unicode="&#xf01e;" d="M1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l138 138q-148 137 -349 137q-104 0 -198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5q119 0 225 52t179 147q7 10 23 12q14 0 25 -9 l137 -138q9 -8 9.5 -20.5t-7.5 -22.5q-109 -132 -264 -204.5t-327 -72.5q-156 0 -298 61t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q147 0 284.5 -55.5t244.5 -156.5l130 129q29 31 70 14q39 -17 39 -59z" />
64 <glyph unicode="&#xf021;" d="M1511 480q0 -5 -1 -7q-64 -268 -268 -434.5t-478 -166.5q-146 0 -282.5 55t-243.5 157l-129 -129q-19 -19 -45 -19t-45 19t-19 45v448q0 26 19 45t45 19h448q26 0 45 -19t19 -45t-19 -45l-137 -137q71 -66 161 -102t187 -36q134 0 250 65t186 179q11 17 53 117 q8 23 30 23h192q13 0 22.5 -9.5t9.5 -22.5zM1536 1280v-448q0 -26 -19 -45t-45 -19h-448q-26 0 -45 19t-19 45t19 45l138 138q-148 137 -349 137q-134 0 -250 -65t-186 -179q-11 -17 -53 -117q-8 -23 -30 -23h-199q-13 0 -22.5 9.5t-9.5 22.5v7q65 268 270 434.5t480 166.5 q146 0 284 -55.5t245 -156.5l130 129q19 19 45 19t45 -19t19 -45z" />
65 <glyph unicode="&#xf022;" horiz-adv-x="1792" d="M384 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M384 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1536 352v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5z M1536 608v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5t9.5 -22.5zM1536 864v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h960q13 0 22.5 -9.5 t9.5 -22.5zM1664 160v832q0 13 -9.5 22.5t-22.5 9.5h-1472q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1472q13 0 22.5 9.5t9.5 22.5zM1792 1248v-1088q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1472q66 0 113 -47 t47 -113z" />
66 <glyph unicode="&#xf023;" horiz-adv-x="1152" d="M320 768h512v192q0 106 -75 181t-181 75t-181 -75t-75 -181v-192zM1152 672v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v192q0 184 132 316t316 132t316 -132t132 -316v-192h32q40 0 68 -28t28 -68z" />
67 <glyph unicode="&#xf024;" horiz-adv-x="1792" d="M320 1280q0 -72 -64 -110v-1266q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v1266q-64 38 -64 110q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -25 -12.5 -38.5t-39.5 -27.5q-215 -116 -369 -116q-61 0 -123.5 22t-108.5 48 t-115.5 48t-142.5 22q-192 0 -464 -146q-17 -9 -33 -9q-26 0 -45 19t-19 45v742q0 32 31 55q21 14 79 43q236 120 421 120q107 0 200 -29t219 -88q38 -19 88 -19q54 0 117.5 21t110 47t88 47t54.5 21q26 0 45 -19t19 -45z" />
68 <glyph unicode="&#xf025;" horiz-adv-x="1664" d="M1664 650q0 -166 -60 -314l-20 -49l-185 -33q-22 -83 -90.5 -136.5t-156.5 -53.5v-32q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v576q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-32q71 0 130 -35.5t93 -95.5l68 12q29 95 29 193q0 148 -88 279t-236.5 209t-315.5 78 t-315.5 -78t-236.5 -209t-88 -279q0 -98 29 -193l68 -12q34 60 93 95.5t130 35.5v32q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-576q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v32q-88 0 -156.5 53.5t-90.5 136.5l-185 33l-20 49q-60 148 -60 314q0 151 67 291t179 242.5 t266 163.5t320 61t320 -61t266 -163.5t179 -242.5t67 -291z" />
69 <glyph unicode="&#xf026;" horiz-adv-x="768" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45z" />
70 <glyph unicode="&#xf027;" horiz-adv-x="1152" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142z" />
71 <glyph unicode="&#xf028;" horiz-adv-x="1664" d="M768 1184v-1088q0 -26 -19 -45t-45 -19t-45 19l-333 333h-262q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h262l333 333q19 19 45 19t45 -19t19 -45zM1152 640q0 -76 -42.5 -141.5t-112.5 -93.5q-10 -5 -25 -5q-26 0 -45 18.5t-19 45.5q0 21 12 35.5t29 25t34 23t29 35.5 t12 57t-12 57t-29 35.5t-34 23t-29 25t-12 35.5q0 27 19 45.5t45 18.5q15 0 25 -5q70 -27 112.5 -93t42.5 -142zM1408 640q0 -153 -85 -282.5t-225 -188.5q-13 -5 -25 -5q-27 0 -46 19t-19 45q0 39 39 59q56 29 76 44q74 54 115.5 135.5t41.5 173.5t-41.5 173.5 t-115.5 135.5q-20 15 -76 44q-39 20 -39 59q0 26 19 45t45 19q13 0 26 -5q140 -59 225 -188.5t85 -282.5zM1664 640q0 -230 -127 -422.5t-338 -283.5q-13 -5 -26 -5q-26 0 -45 19t-19 45q0 36 39 59q7 4 22.5 10.5t22.5 10.5q46 25 82 51q123 91 192 227t69 289t-69 289 t-192 227q-36 26 -82 51q-7 4 -22.5 10.5t-22.5 10.5q-39 23 -39 59q0 26 19 45t45 19q13 0 26 -5q211 -91 338 -283.5t127 -422.5z" />
72 <glyph unicode="&#xf029;" horiz-adv-x="1408" d="M384 384v-128h-128v128h128zM384 1152v-128h-128v128h128zM1152 1152v-128h-128v128h128zM128 129h384v383h-384v-383zM128 896h384v384h-384v-384zM896 896h384v384h-384v-384zM640 640v-640h-640v640h640zM1152 128v-128h-128v128h128zM1408 128v-128h-128v128h128z M1408 640v-384h-384v128h-128v-384h-128v640h384v-128h128v128h128zM640 1408v-640h-640v640h640zM1408 1408v-640h-640v640h640z" />
73 <glyph unicode="&#xf02a;" horiz-adv-x="1792" d="M63 0h-63v1408h63v-1408zM126 1h-32v1407h32v-1407zM220 1h-31v1407h31v-1407zM377 1h-31v1407h31v-1407zM534 1h-62v1407h62v-1407zM660 1h-31v1407h31v-1407zM723 1h-31v1407h31v-1407zM786 1h-31v1407h31v-1407zM943 1h-63v1407h63v-1407zM1100 1h-63v1407h63v-1407z M1226 1h-63v1407h63v-1407zM1352 1h-63v1407h63v-1407zM1446 1h-63v1407h63v-1407zM1635 1h-94v1407h94v-1407zM1698 1h-32v1407h32v-1407zM1792 0h-63v1408h63v-1408z" />
74 <glyph unicode="&#xf02b;" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91z" />
75 <glyph unicode="&#xf02c;" horiz-adv-x="1920" d="M448 1088q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1515 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-53 0 -90 37l-715 716q-38 37 -64.5 101t-26.5 117v416q0 52 38 90t90 38h416q53 0 117 -26.5t102 -64.5 l715 -714q37 -39 37 -91zM1899 512q0 -53 -37 -90l-491 -492q-39 -37 -91 -37q-36 0 -59 14t-53 45l470 470q37 37 37 90q0 52 -37 91l-715 714q-38 38 -102 64.5t-117 26.5h224q53 0 117 -26.5t102 -64.5l715 -714q37 -39 37 -91z" />
76 <glyph unicode="&#xf02d;" horiz-adv-x="1664" d="M1639 1058q40 -57 18 -129l-275 -906q-19 -64 -76.5 -107.5t-122.5 -43.5h-923q-77 0 -148.5 53.5t-99.5 131.5q-24 67 -2 127q0 4 3 27t4 37q1 8 -3 21.5t-3 19.5q2 11 8 21t16.5 23.5t16.5 23.5q23 38 45 91.5t30 91.5q3 10 0.5 30t-0.5 28q3 11 17 28t17 23 q21 36 42 92t25 90q1 9 -2.5 32t0.5 28q4 13 22 30.5t22 22.5q19 26 42.5 84.5t27.5 96.5q1 8 -3 25.5t-2 26.5q2 8 9 18t18 23t17 21q8 12 16.5 30.5t15 35t16 36t19.5 32t26.5 23.5t36 11.5t47.5 -5.5l-1 -3q38 9 51 9h761q74 0 114 -56t18 -130l-274 -906 q-36 -119 -71.5 -153.5t-128.5 -34.5h-869q-27 0 -38 -15q-11 -16 -1 -43q24 -70 144 -70h923q29 0 56 15.5t35 41.5l300 987q7 22 5 57q38 -15 59 -43zM575 1056q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5 t-16.5 -22.5zM492 800q-4 -13 2 -22.5t20 -9.5h608q13 0 25.5 9.5t16.5 22.5l21 64q4 13 -2 22.5t-20 9.5h-608q-13 0 -25.5 -9.5t-16.5 -22.5z" />
77 <glyph unicode="&#xf02e;" horiz-adv-x="1280" d="M1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
78 <glyph unicode="&#xf02f;" horiz-adv-x="1664" d="M384 0h896v256h-896v-256zM384 640h896v384h-160q-40 0 -68 28t-28 68v160h-640v-640zM1536 576q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 576v-416q0 -13 -9.5 -22.5t-22.5 -9.5h-224v-160q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68 v160h-224q-13 0 -22.5 9.5t-9.5 22.5v416q0 79 56.5 135.5t135.5 56.5h64v544q0 40 28 68t68 28h672q40 0 88 -20t76 -48l152 -152q28 -28 48 -76t20 -88v-256h64q79 0 135.5 -56.5t56.5 -135.5z" />
79 <glyph unicode="&#xf030;" horiz-adv-x="1920" d="M960 864q119 0 203.5 -84.5t84.5 -203.5t-84.5 -203.5t-203.5 -84.5t-203.5 84.5t-84.5 203.5t84.5 203.5t203.5 84.5zM1664 1280q106 0 181 -75t75 -181v-896q0 -106 -75 -181t-181 -75h-1408q-106 0 -181 75t-75 181v896q0 106 75 181t181 75h224l51 136 q19 49 69.5 84.5t103.5 35.5h512q53 0 103.5 -35.5t69.5 -84.5l51 -136h224zM960 128q185 0 316.5 131.5t131.5 316.5t-131.5 316.5t-316.5 131.5t-316.5 -131.5t-131.5 -316.5t131.5 -316.5t316.5 -131.5z" />
80 <glyph unicode="&#xf031;" horiz-adv-x="1664" d="M725 977l-170 -450q33 0 136.5 -2t160.5 -2q19 0 57 2q-87 253 -184 452zM0 -128l2 79q23 7 56 12.5t57 10.5t49.5 14.5t44.5 29t31 50.5l237 616l280 724h75h53q8 -14 11 -21l205 -480q33 -78 106 -257.5t114 -274.5q15 -34 58 -144.5t72 -168.5q20 -45 35 -57 q19 -15 88 -29.5t84 -20.5q6 -38 6 -57q0 -4 -0.5 -13t-0.5 -13q-63 0 -190 8t-191 8q-76 0 -215 -7t-178 -8q0 43 4 78l131 28q1 0 12.5 2.5t15.5 3.5t14.5 4.5t15 6.5t11 8t9 11t2.5 14q0 16 -31 96.5t-72 177.5t-42 100l-450 2q-26 -58 -76.5 -195.5t-50.5 -162.5 q0 -22 14 -37.5t43.5 -24.5t48.5 -13.5t57 -8.5t41 -4q1 -19 1 -58q0 -9 -2 -27q-58 0 -174.5 10t-174.5 10q-8 0 -26.5 -4t-21.5 -4q-80 -14 -188 -14z" />
81 <glyph unicode="&#xf032;" horiz-adv-x="1408" d="M555 15q74 -32 140 -32q376 0 376 335q0 114 -41 180q-27 44 -61.5 74t-67.5 46.5t-80.5 25t-84 10.5t-94.5 2q-73 0 -101 -10q0 -53 -0.5 -159t-0.5 -158q0 -8 -1 -67.5t-0.5 -96.5t4.5 -83.5t12 -66.5zM541 761q42 -7 109 -7q82 0 143 13t110 44.5t74.5 89.5t25.5 142 q0 70 -29 122.5t-79 82t-108 43.5t-124 14q-50 0 -130 -13q0 -50 4 -151t4 -152q0 -27 -0.5 -80t-0.5 -79q0 -46 1 -69zM0 -128l2 94q15 4 85 16t106 27q7 12 12.5 27t8.5 33.5t5.5 32.5t3 37.5t0.5 34v35.5v30q0 982 -22 1025q-4 8 -22 14.5t-44.5 11t-49.5 7t-48.5 4.5 t-30.5 3l-4 83q98 2 340 11.5t373 9.5q23 0 68.5 -0.5t67.5 -0.5q70 0 136.5 -13t128.5 -42t108 -71t74 -104.5t28 -137.5q0 -52 -16.5 -95.5t-39 -72t-64.5 -57.5t-73 -45t-84 -40q154 -35 256.5 -134t102.5 -248q0 -100 -35 -179.5t-93.5 -130.5t-138 -85.5t-163.5 -48.5 t-176 -14q-44 0 -132 3t-132 3q-106 0 -307 -11t-231 -12z" />
82 <glyph unicode="&#xf033;" horiz-adv-x="1024" d="M0 -126l17 85q6 2 81.5 21.5t111.5 37.5q28 35 41 101q1 7 62 289t114 543.5t52 296.5v25q-24 13 -54.5 18.5t-69.5 8t-58 5.5l19 103q33 -2 120 -6.5t149.5 -7t120.5 -2.5q48 0 98.5 2.5t121 7t98.5 6.5q-5 -39 -19 -89q-30 -10 -101.5 -28.5t-108.5 -33.5 q-8 -19 -14 -42.5t-9 -40t-7.5 -45.5t-6.5 -42q-27 -148 -87.5 -419.5t-77.5 -355.5q-2 -9 -13 -58t-20 -90t-16 -83.5t-6 -57.5l1 -18q17 -4 185 -31q-3 -44 -16 -99q-11 0 -32.5 -1.5t-32.5 -1.5q-29 0 -87 10t-86 10q-138 2 -206 2q-51 0 -143 -9t-121 -11z" />
83 <glyph unicode="&#xf034;" horiz-adv-x="1792" d="M1744 128q33 0 42 -18.5t-11 -44.5l-126 -162q-20 -26 -49 -26t-49 26l-126 162q-20 26 -11 44.5t42 18.5h80v1024h-80q-33 0 -42 18.5t11 44.5l126 162q20 26 49 26t49 -26l126 -162q20 -26 11 -44.5t-42 -18.5h-80v-1024h80zM81 1407l54 -27q12 -5 211 -5q44 0 132 2 t132 2q36 0 107.5 -0.5t107.5 -0.5h293q6 0 21 -0.5t20.5 0t16 3t17.5 9t15 17.5l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 48t-14.5 73.5t-7.5 35.5q-6 8 -12 12.5t-15.5 6t-13 2.5t-18 0.5t-16.5 -0.5 q-17 0 -66.5 0.5t-74.5 0.5t-64 -2t-71 -6q-9 -81 -8 -136q0 -94 2 -388t2 -455q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q19 42 19 383q0 101 -3 303t-3 303v117q0 2 0.5 15.5t0.5 25t-1 25.5t-3 24t-5 14q-11 12 -162 12q-33 0 -93 -12t-80 -26q-19 -13 -34 -72.5t-31.5 -111t-42.5 -53.5q-42 26 -56 44v383z" />
84 <glyph unicode="&#xf035;" d="M81 1407l54 -27q12 -5 211 -5q44 0 132 2t132 2q70 0 246.5 1t304.5 0.5t247 -4.5q33 -1 56 31l42 1q4 0 14 -0.5t14 -0.5q2 -112 2 -336q0 -80 -5 -109q-39 -14 -68 -18q-25 44 -54 128q-3 9 -11 47.5t-15 73.5t-7 36q-10 13 -27 19q-5 2 -66 2q-30 0 -93 1t-103 1 t-94 -2t-96 -7q-9 -81 -8 -136l1 -152v52q0 -55 1 -154t1.5 -180t0.5 -153q0 -16 -2.5 -71.5t0 -91.5t12.5 -69q40 -21 124 -42.5t120 -37.5q5 -40 5 -50q0 -14 -3 -29l-34 -1q-76 -2 -218 8t-207 10q-50 0 -151 -9t-152 -9q-3 51 -3 52v9q17 27 61.5 43t98.5 29t78 27 q7 16 11.5 74t6 145.5t1.5 155t-0.5 153.5t-0.5 89q0 7 -2.5 21.5t-2.5 22.5q0 7 0.5 44t1 73t0 76.5t-3 67.5t-6.5 32q-11 12 -162 12q-41 0 -163 -13.5t-138 -24.5q-19 -12 -34 -71.5t-31.5 -111.5t-42.5 -54q-42 26 -56 44v383zM1310 125q12 0 42 -19.5t57.5 -41.5 t59.5 -49t36 -30q26 -21 26 -49t-26 -49q-4 -3 -36 -30t-59.5 -49t-57.5 -41.5t-42 -19.5q-13 0 -20.5 10.5t-10 28.5t-2.5 33.5t1.5 33t1.5 19.5h-1024q0 -2 1.5 -19.5t1.5 -33t-2.5 -33.5t-10 -28.5t-20.5 -10.5q-12 0 -42 19.5t-57.5 41.5t-59.5 49t-36 30q-26 21 -26 49 t26 49q4 3 36 30t59.5 49t57.5 41.5t42 19.5q13 0 20.5 -10.5t10 -28.5t2.5 -33.5t-1.5 -33t-1.5 -19.5h1024q0 2 -1.5 19.5t-1.5 33t2.5 33.5t10 28.5t20.5 10.5z" />
85 <glyph unicode="&#xf036;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
86 <glyph unicode="&#xf037;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1408 576v-128q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h896q26 0 45 -19t19 -45zM1664 960v-128q0 -26 -19 -45t-45 -19 h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1280 1344v-128q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h640q26 0 45 -19t19 -45z" />
87 <glyph unicode="&#xf038;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1280q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1536q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1536q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1152q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
88 <glyph unicode="&#xf039;" horiz-adv-x="1792" d="M1792 192v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 576v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 960v-128q0 -26 -19 -45 t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-128q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
89 <glyph unicode="&#xf03a;" horiz-adv-x="1792" d="M256 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM256 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5 t9.5 -22.5zM256 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344 q13 0 22.5 -9.5t9.5 -22.5zM256 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-192q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h192q13 0 22.5 -9.5t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v192 q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5z" />
90 <glyph unicode="&#xf03b;" horiz-adv-x="1792" d="M384 992v-576q0 -13 -9.5 -22.5t-22.5 -9.5q-14 0 -23 9l-288 288q-9 9 -9 23t9 23l288 288q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
91 <glyph unicode="&#xf03c;" horiz-adv-x="1792" d="M352 704q0 -14 -9 -23l-288 -288q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v576q0 13 9.5 22.5t22.5 9.5q14 0 23 -9l288 -288q9 -9 9 -23zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5 t9.5 -22.5zM1792 608v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088q13 0 22.5 -9.5t9.5 -22.5zM1792 992v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1088q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1088 q13 0 22.5 -9.5t9.5 -22.5zM1792 1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1728q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1728q13 0 22.5 -9.5t9.5 -22.5z" />
92 <glyph unicode="&#xf03d;" horiz-adv-x="1792" d="M1792 1184v-1088q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-403 403v-166q0 -119 -84.5 -203.5t-203.5 -84.5h-704q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h704q119 0 203.5 -84.5t84.5 -203.5v-165l403 402q18 19 45 19q12 0 25 -5 q39 -17 39 -59z" />
93 <glyph unicode="&#xf03e;" horiz-adv-x="1920" d="M640 960q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1664 576v-448h-1408v192l320 320l160 -160l512 512zM1760 1280h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-1216q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5v1216 q0 13 -9.5 22.5t-22.5 9.5zM1920 1248v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
94 <glyph unicode="&#xf040;" d="M363 0l91 91l-235 235l-91 -91v-107h128v-128h107zM886 928q0 22 -22 22q-10 0 -17 -7l-542 -542q-7 -7 -7 -17q0 -22 22 -22q10 0 17 7l542 542q7 7 7 17zM832 1120l416 -416l-832 -832h-416v416zM1515 1024q0 -53 -37 -90l-166 -166l-416 416l166 165q36 38 90 38 q53 0 91 -38l235 -234q37 -39 37 -91z" />
95 <glyph unicode="&#xf041;" horiz-adv-x="1024" d="M768 896q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1024 896q0 -109 -33 -179l-364 -774q-16 -33 -47.5 -52t-67.5 -19t-67.5 19t-46.5 52l-365 774q-33 70 -33 179q0 212 150 362t362 150t362 -150t150 -362z" />
96 <glyph unicode="&#xf042;" d="M768 96v1088q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
97 <glyph unicode="&#xf043;" horiz-adv-x="1024" d="M512 384q0 36 -20 69q-1 1 -15.5 22.5t-25.5 38t-25 44t-21 50.5q-4 16 -21 16t-21 -16q-7 -23 -21 -50.5t-25 -44t-25.5 -38t-15.5 -22.5q-20 -33 -20 -69q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 512q0 -212 -150 -362t-362 -150t-362 150t-150 362 q0 145 81 275q6 9 62.5 90.5t101 151t99.5 178t83 201.5q9 30 34 47t51 17t51.5 -17t33.5 -47q28 -93 83 -201.5t99.5 -178t101 -151t62.5 -90.5q81 -127 81 -275z" />
98 <glyph unicode="&#xf044;" horiz-adv-x="1792" d="M888 352l116 116l-152 152l-116 -116v-56h96v-96h56zM1328 1072q-16 16 -33 -1l-350 -350q-17 -17 -1 -33t33 1l350 350q17 17 1 33zM1408 478v-190q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-14 -14 -32 -8q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v126q0 13 9 22l64 64q15 15 35 7t20 -29zM1312 1216l288 -288l-672 -672h-288v288zM1756 1084l-92 -92 l-288 288l92 92q28 28 68 28t68 -28l152 -152q28 -28 28 -68t-28 -68z" />
99 <glyph unicode="&#xf045;" horiz-adv-x="1664" d="M1408 547v-259q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h255v0q13 0 22.5 -9.5t9.5 -22.5q0 -27 -26 -32q-77 -26 -133 -60q-10 -4 -16 -4h-112q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832 q66 0 113 47t47 113v214q0 19 18 29q28 13 54 37q16 16 35 8q21 -9 21 -29zM1645 1043l-384 -384q-18 -19 -45 -19q-12 0 -25 5q-39 17 -39 59v192h-160q-323 0 -438 -131q-119 -137 -74 -473q3 -23 -20 -34q-8 -2 -12 -2q-16 0 -26 13q-10 14 -21 31t-39.5 68.5t-49.5 99.5 t-38.5 114t-17.5 122q0 49 3.5 91t14 90t28 88t47 81.5t68.5 74t94.5 61.5t124.5 48.5t159.5 30.5t196.5 11h160v192q0 42 39 59q13 5 25 5q26 0 45 -19l384 -384q19 -19 19 -45t-19 -45z" />
100 <glyph unicode="&#xf046;" horiz-adv-x="1664" d="M1408 606v-318q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q63 0 117 -25q15 -7 18 -23q3 -17 -9 -29l-49 -49q-10 -10 -23 -10q-3 0 -9 2q-23 6 -45 6h-832q-66 0 -113 -47t-47 -113v-832 q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v254q0 13 9 22l64 64q10 10 23 10q6 0 12 -3q20 -8 20 -29zM1639 1095l-814 -814q-24 -24 -57 -24t-57 24l-430 430q-24 24 -24 57t24 57l110 110q24 24 57 24t57 -24l263 -263l647 647q24 24 57 24t57 -24l110 -110 q24 -24 24 -57t-24 -57z" />
101 <glyph unicode="&#xf047;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-384v-384h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v384h-384v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45 t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h384v384h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45t-19 -45t-45 -19h-128v-384h384v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
102 <glyph unicode="&#xf048;" horiz-adv-x="1024" d="M979 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19z" />
103 <glyph unicode="&#xf049;" horiz-adv-x="1792" d="M1747 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-9 9 -13 19v-678q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-678q4 11 13 19l710 710 q19 19 32 13t13 -32v-710q4 11 13 19z" />
104 <glyph unicode="&#xf04a;" horiz-adv-x="1664" d="M1619 1395q19 19 32 13t13 -32v-1472q0 -26 -13 -32t-32 13l-710 710q-8 9 -13 19v-710q0 -26 -13 -32t-32 13l-710 710q-19 19 -19 45t19 45l710 710q19 19 32 13t13 -32v-710q5 11 13 19z" />
105 <glyph unicode="&#xf04b;" horiz-adv-x="1408" d="M1384 609l-1328 -738q-23 -13 -39.5 -3t-16.5 36v1472q0 26 16.5 36t39.5 -3l1328 -738q23 -13 23 -31t-23 -31z" />
106 <glyph unicode="&#xf04c;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45zM640 1344v-1408q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h512q26 0 45 -19t19 -45z" />
107 <glyph unicode="&#xf04d;" d="M1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
108 <glyph unicode="&#xf04e;" horiz-adv-x="1664" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q19 -19 19 -45t-19 -45l-710 -710q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
109 <glyph unicode="&#xf050;" horiz-adv-x="1792" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v710q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19l-710 -710 q-19 -19 -32 -13t-13 32v710q-5 -10 -13 -19z" />
110 <glyph unicode="&#xf051;" horiz-adv-x="1024" d="M45 -115q-19 -19 -32 -13t-13 32v1472q0 26 13 32t32 -13l710 -710q8 -8 13 -19v678q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-1408q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v678q-5 -10 -13 -19z" />
111 <glyph unicode="&#xf052;" horiz-adv-x="1538" d="M14 557l710 710q19 19 45 19t45 -19l710 -710q19 -19 13 -32t-32 -13h-1472q-26 0 -32 13t13 32zM1473 0h-1408q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1408q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19z" />
112 <glyph unicode="&#xf053;" horiz-adv-x="1280" d="M1171 1235l-531 -531l531 -531q19 -19 19 -45t-19 -45l-166 -166q-19 -19 -45 -19t-45 19l-742 742q-19 19 -19 45t19 45l742 742q19 19 45 19t45 -19l166 -166q19 -19 19 -45t-19 -45z" />
113 <glyph unicode="&#xf054;" horiz-adv-x="1280" d="M1107 659l-742 -742q-19 -19 -45 -19t-45 19l-166 166q-19 19 -19 45t19 45l531 531l-531 531q-19 19 -19 45t19 45l166 166q19 19 45 19t45 -19l742 -742q19 -19 19 -45t-19 -45z" />
114 <glyph unicode="&#xf055;" d="M1216 576v128q0 26 -19 45t-45 19h-256v256q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-256h-256q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h256v-256q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v256h256q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5 t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
115 <glyph unicode="&#xf056;" d="M1216 576v128q0 26 -19 45t-45 19h-768q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h768q26 0 45 19t19 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5 t103 -385.5z" />
116 <glyph unicode="&#xf057;" d="M1149 414q0 26 -19 45l-181 181l181 181q19 19 19 45q0 27 -19 46l-90 90q-19 19 -46 19q-26 0 -45 -19l-181 -181l-181 181q-19 19 -45 19q-27 0 -46 -19l-90 -90q-19 -19 -19 -46q0 -26 19 -45l181 -181l-181 -181q-19 -19 -19 -45q0 -27 19 -46l90 -90q19 -19 46 -19 q26 0 45 19l181 181l181 -181q19 -19 45 -19q27 0 46 19l90 90q19 19 19 46zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
117 <glyph unicode="&#xf058;" d="M1284 802q0 28 -18 46l-91 90q-19 19 -45 19t-45 -19l-408 -407l-226 226q-19 19 -45 19t-45 -19l-91 -90q-18 -18 -18 -46q0 -27 18 -45l362 -362q19 -19 45 -19q27 0 46 19l543 543q18 18 18 45zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
118 <glyph unicode="&#xf059;" d="M896 160v192q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h192q14 0 23 9t9 23zM1152 832q0 88 -55.5 163t-138.5 116t-170 41q-243 0 -371 -213q-15 -24 8 -42l132 -100q7 -6 19 -6q16 0 25 12q53 68 86 92q34 24 86 24q48 0 85.5 -26t37.5 -59 q0 -38 -20 -61t-68 -45q-63 -28 -115.5 -86.5t-52.5 -125.5v-36q0 -14 9 -23t23 -9h192q14 0 23 9t9 23q0 19 21.5 49.5t54.5 49.5q32 18 49 28.5t46 35t44.5 48t28 60.5t12.5 81zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
119 <glyph unicode="&#xf05a;" d="M1024 160v160q0 14 -9 23t-23 9h-96v512q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h96v-320h-96q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23t23 -9h448q14 0 23 9t9 23zM896 1056v160q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-160q0 -14 9 -23 t23 -9h192q14 0 23 9t9 23zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
120 <glyph unicode="&#xf05b;" d="M1197 512h-109q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h109q-32 108 -112.5 188.5t-188.5 112.5v-109q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v109q-108 -32 -188.5 -112.5t-112.5 -188.5h109q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-109 q32 -108 112.5 -188.5t188.5 -112.5v109q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-109q108 32 188.5 112.5t112.5 188.5zM1536 704v-128q0 -26 -19 -45t-45 -19h-143q-37 -161 -154.5 -278.5t-278.5 -154.5v-143q0 -26 -19 -45t-45 -19h-128q-26 0 -45 19t-19 45v143 q-161 37 -278.5 154.5t-154.5 278.5h-143q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h143q37 161 154.5 278.5t278.5 154.5v143q0 26 19 45t45 19h128q26 0 45 -19t19 -45v-143q161 -37 278.5 -154.5t154.5 -278.5h143q26 0 45 -19t19 -45z" />
121 <glyph unicode="&#xf05c;" d="M1097 457l-146 -146q-10 -10 -23 -10t-23 10l-137 137l-137 -137q-10 -10 -23 -10t-23 10l-146 146q-10 10 -10 23t10 23l137 137l-137 137q-10 10 -10 23t10 23l146 146q10 10 23 10t23 -10l137 -137l137 137q10 10 23 10t23 -10l146 -146q10 -10 10 -23t-10 -23 l-137 -137l137 -137q10 -10 10 -23t-10 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5 t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
122 <glyph unicode="&#xf05d;" d="M1171 723l-422 -422q-19 -19 -45 -19t-45 19l-294 294q-19 19 -19 45t19 45l102 102q19 19 45 19t45 -19l147 -147l275 275q19 19 45 19t45 -19l102 -102q19 -19 19 -45t-19 -45zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198 t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
123 <glyph unicode="&#xf05e;" d="M1312 643q0 161 -87 295l-754 -753q137 -89 297 -89q111 0 211.5 43.5t173.5 116.5t116 174.5t43 212.5zM313 344l755 754q-135 91 -300 91q-148 0 -273 -73t-198 -199t-73 -274q0 -162 89 -299zM1536 643q0 -157 -61 -300t-163.5 -246t-245 -164t-298.5 -61t-298.5 61 t-245 164t-163.5 246t-61 300t61 299.5t163.5 245.5t245 164t298.5 61t298.5 -61t245 -164t163.5 -245.5t61 -299.5z" />
124 <glyph unicode="&#xf060;" d="M1536 640v-128q0 -53 -32.5 -90.5t-84.5 -37.5h-704l293 -294q38 -36 38 -90t-38 -90l-75 -76q-37 -37 -90 -37q-52 0 -91 37l-651 652q-37 37 -37 90q0 52 37 91l651 650q38 38 91 38q52 0 90 -38l75 -74q38 -38 38 -91t-38 -91l-293 -293h704q52 0 84.5 -37.5 t32.5 -90.5z" />
125 <glyph unicode="&#xf061;" d="M1472 576q0 -54 -37 -91l-651 -651q-39 -37 -91 -37q-51 0 -90 37l-75 75q-38 38 -38 91t38 91l293 293h-704q-52 0 -84.5 37.5t-32.5 90.5v128q0 53 32.5 90.5t84.5 37.5h704l-293 294q-38 36 -38 90t38 90l75 75q38 38 90 38q53 0 91 -38l651 -651q37 -35 37 -90z" />
126 <glyph unicode="&#xf062;" horiz-adv-x="1664" d="M1611 565q0 -51 -37 -90l-75 -75q-38 -38 -91 -38q-54 0 -90 38l-294 293v-704q0 -52 -37.5 -84.5t-90.5 -32.5h-128q-53 0 -90.5 32.5t-37.5 84.5v704l-294 -293q-36 -38 -90 -38t-90 38l-75 75q-38 38 -38 90q0 53 38 91l651 651q35 37 90 37q54 0 91 -37l651 -651 q37 -39 37 -91z" />
127 <glyph unicode="&#xf063;" horiz-adv-x="1664" d="M1611 704q0 -53 -37 -90l-651 -652q-39 -37 -91 -37q-53 0 -90 37l-651 652q-38 36 -38 90q0 53 38 91l74 75q39 37 91 37q53 0 90 -37l294 -294v704q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-704l294 294q37 37 90 37q52 0 91 -37l75 -75q37 -39 37 -91z" />
128 <glyph unicode="&#xf064;" horiz-adv-x="1792" d="M1792 896q0 -26 -19 -45l-512 -512q-19 -19 -45 -19t-45 19t-19 45v256h-224q-98 0 -175.5 -6t-154 -21.5t-133 -42.5t-105.5 -69.5t-80 -101t-48.5 -138.5t-17.5 -181q0 -55 5 -123q0 -6 2.5 -23.5t2.5 -26.5q0 -15 -8.5 -25t-23.5 -10q-16 0 -28 17q-7 9 -13 22 t-13.5 30t-10.5 24q-127 285 -127 451q0 199 53 333q162 403 875 403h224v256q0 26 19 45t45 19t45 -19l512 -512q19 -19 19 -45z" />
129 <glyph unicode="&#xf065;" d="M755 480q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23zM1536 1344v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332 q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45z" />
130 <glyph unicode="&#xf066;" d="M768 576v-448q0 -26 -19 -45t-45 -19t-45 19l-144 144l-332 -332q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l332 332l-144 144q-19 19 -19 45t19 45t45 19h448q26 0 45 -19t19 -45zM1523 1248q0 -13 -10 -23l-332 -332l144 -144q19 -19 19 -45t-19 -45 t-45 -19h-448q-26 0 -45 19t-19 45v448q0 26 19 45t45 19t45 -19l144 -144l332 332q10 10 23 10t23 -10l114 -114q10 -10 10 -23z" />
131 <glyph unicode="&#xf067;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-416v-416q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v416h-416q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h416v416q0 40 28 68t68 28h192q40 0 68 -28t28 -68v-416h416q40 0 68 -28t28 -68z" />
132 <glyph unicode="&#xf068;" horiz-adv-x="1408" d="M1408 800v-192q0 -40 -28 -68t-68 -28h-1216q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h1216q40 0 68 -28t28 -68z" />
133 <glyph unicode="&#xf069;" horiz-adv-x="1664" d="M1482 486q46 -26 59.5 -77.5t-12.5 -97.5l-64 -110q-26 -46 -77.5 -59.5t-97.5 12.5l-266 153v-307q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v307l-266 -153q-46 -26 -97.5 -12.5t-77.5 59.5l-64 110q-26 46 -12.5 97.5t59.5 77.5l266 154l-266 154 q-46 26 -59.5 77.5t12.5 97.5l64 110q26 46 77.5 59.5t97.5 -12.5l266 -153v307q0 52 38 90t90 38h128q52 0 90 -38t38 -90v-307l266 153q46 26 97.5 12.5t77.5 -59.5l64 -110q26 -46 12.5 -97.5t-59.5 -77.5l-266 -154z" />
134 <glyph unicode="&#xf06a;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM896 161v190q0 14 -9 23.5t-22 9.5h-192q-13 0 -23 -10t-10 -23v-190q0 -13 10 -23t23 -10h192 q13 0 22 9.5t9 23.5zM894 505l18 621q0 12 -10 18q-10 8 -24 8h-220q-14 0 -24 -8q-10 -6 -10 -18l17 -621q0 -10 10 -17.5t24 -7.5h185q14 0 23.5 7.5t10.5 17.5z" />
135 <glyph unicode="&#xf06b;" d="M928 180v56v468v192h-320v-192v-468v-56q0 -25 18 -38.5t46 -13.5h192q28 0 46 13.5t18 38.5zM472 1024h195l-126 161q-26 31 -69 31q-40 0 -68 -28t-28 -68t28 -68t68 -28zM1160 1120q0 40 -28 68t-68 28q-43 0 -69 -31l-125 -161h194q40 0 68 28t28 68zM1536 864v-320 q0 -14 -9 -23t-23 -9h-96v-416q0 -40 -28 -68t-68 -28h-1088q-40 0 -68 28t-28 68v416h-96q-14 0 -23 9t-9 23v320q0 14 9 23t23 9h440q-93 0 -158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5q107 0 168 -77l128 -165l128 165q61 77 168 77q93 0 158.5 -65.5t65.5 -158.5 t-65.5 -158.5t-158.5 -65.5h440q14 0 23 -9t9 -23z" />
136 <glyph unicode="&#xf06c;" horiz-adv-x="1792" d="M1280 832q0 26 -19 45t-45 19q-172 0 -318 -49.5t-259.5 -134t-235.5 -219.5q-19 -21 -19 -45q0 -26 19 -45t45 -19q24 0 45 19q27 24 74 71t67 66q137 124 268.5 176t313.5 52q26 0 45 19t19 45zM1792 1030q0 -95 -20 -193q-46 -224 -184.5 -383t-357.5 -268 q-214 -108 -438 -108q-148 0 -286 47q-15 5 -88 42t-96 37q-16 0 -39.5 -32t-45 -70t-52.5 -70t-60 -32q-30 0 -51 11t-31 24t-27 42q-2 4 -6 11t-5.5 10t-3 9.5t-1.5 13.5q0 35 31 73.5t68 65.5t68 56t31 48q0 4 -14 38t-16 44q-9 51 -9 104q0 115 43.5 220t119 184.5 t170.5 139t204 95.5q55 18 145 25.5t179.5 9t178.5 6t163.5 24t113.5 56.5l29.5 29.5t29.5 28t27 20t36.5 16t43.5 4.5q39 0 70.5 -46t47.5 -112t24 -124t8 -96z" />
137 <glyph unicode="&#xf06d;" horiz-adv-x="1408" d="M1408 -160v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-1344q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h1344q13 0 22.5 -9.5t9.5 -22.5zM1152 896q0 -78 -24.5 -144t-64 -112.5t-87.5 -88t-96 -77.5t-87.5 -72t-64 -81.5t-24.5 -96.5q0 -96 67 -224l-4 1l1 -1 q-90 41 -160 83t-138.5 100t-113.5 122.5t-72.5 150.5t-27.5 184q0 78 24.5 144t64 112.5t87.5 88t96 77.5t87.5 72t64 81.5t24.5 96.5q0 94 -66 224l3 -1l-1 1q90 -41 160 -83t138.5 -100t113.5 -122.5t72.5 -150.5t27.5 -184z" />
138 <glyph unicode="&#xf06e;" horiz-adv-x="1792" d="M1664 576q-152 236 -381 353q61 -104 61 -225q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 121 61 225q-229 -117 -381 -353q133 -205 333.5 -326.5t434.5 -121.5t434.5 121.5t333.5 326.5zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5 t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1792 576q0 -34 -20 -69q-140 -230 -376.5 -368.5t-499.5 -138.5t-499.5 139t-376.5 368q-20 35 -20 69t20 69q140 229 376.5 368t499.5 139t499.5 -139t376.5 -368q20 -35 20 -69z" />
139 <glyph unicode="&#xf070;" horiz-adv-x="1792" d="M555 201l78 141q-87 63 -136 159t-49 203q0 121 61 225q-229 -117 -381 -353q167 -258 427 -375zM944 960q0 20 -14 34t-34 14q-125 0 -214.5 -89.5t-89.5 -214.5q0 -20 14 -34t34 -14t34 14t14 34q0 86 61 147t147 61q20 0 34 14t14 34zM1307 1151q0 -7 -1 -9 q-105 -188 -315 -566t-316 -567l-49 -89q-10 -16 -28 -16q-12 0 -134 70q-16 10 -16 28q0 12 44 87q-143 65 -263.5 173t-208.5 245q-20 31 -20 69t20 69q153 235 380 371t496 136q89 0 180 -17l54 97q10 16 28 16q5 0 18 -6t31 -15.5t33 -18.5t31.5 -18.5t19.5 -11.5 q16 -10 16 -27zM1344 704q0 -139 -79 -253.5t-209 -164.5l280 502q8 -45 8 -84zM1792 576q0 -35 -20 -69q-39 -64 -109 -145q-150 -172 -347.5 -267t-419.5 -95l74 132q212 18 392.5 137t301.5 307q-115 179 -282 294l63 112q95 -64 182.5 -153t144.5 -184q20 -34 20 -69z " />
140 <glyph unicode="&#xf071;" horiz-adv-x="1792" d="M1024 161v190q0 14 -9.5 23.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -23.5v-190q0 -14 9.5 -23.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 23.5zM1022 535l18 459q0 12 -10 19q-13 11 -24 11h-220q-11 0 -24 -11q-10 -7 -10 -21l17 -457q0 -10 10 -16.5t24 -6.5h185 q14 0 23.5 6.5t10.5 16.5zM1008 1469l768 -1408q35 -63 -2 -126q-17 -29 -46.5 -46t-63.5 -17h-1536q-34 0 -63.5 17t-46.5 46q-37 63 -2 126l768 1408q17 31 47 49t65 18t65 -18t47 -49z" />
141 <glyph unicode="&#xf072;" horiz-adv-x="1408" d="M1376 1376q44 -52 12 -148t-108 -172l-161 -161l160 -696q5 -19 -12 -33l-128 -96q-7 -6 -19 -6q-4 0 -7 1q-15 3 -21 16l-279 508l-259 -259l53 -194q5 -17 -8 -31l-96 -96q-9 -9 -23 -9h-2q-15 2 -24 13l-189 252l-252 189q-11 7 -13 23q-1 13 9 25l96 97q9 9 23 9 q6 0 8 -1l194 -53l259 259l-508 279q-14 8 -17 24q-2 16 9 27l128 128q14 13 30 8l665 -159l160 160q76 76 172 108t148 -12z" />
142 <glyph unicode="&#xf073;" horiz-adv-x="1664" d="M128 -128h288v288h-288v-288zM480 -128h320v288h-320v-288zM128 224h288v320h-288v-320zM480 224h320v320h-320v-320zM128 608h288v288h-288v-288zM864 -128h320v288h-320v-288zM480 608h320v288h-320v-288zM1248 -128h288v288h-288v-288zM864 224h320v320h-320v-320z M512 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1248 224h288v320h-288v-320zM864 608h320v288h-320v-288zM1248 608h288v288h-288v-288zM1280 1088v288q0 13 -9.5 22.5t-22.5 9.5h-64 q-13 0 -22.5 -9.5t-9.5 -22.5v-288q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1664 1152v-1280q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47 h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
143 <glyph unicode="&#xf074;" horiz-adv-x="1792" d="M666 1055q-60 -92 -137 -273q-22 45 -37 72.5t-40.5 63.5t-51 56.5t-63 35t-81.5 14.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q250 0 410 -225zM1792 256q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192q-32 0 -85 -0.5t-81 -1t-73 1 t-71 5t-64 10.5t-63 18.5t-58 28.5t-59 40t-55 53.5t-56 69.5q59 93 136 273q22 -45 37 -72.5t40.5 -63.5t51 -56.5t63 -35t81.5 -14.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1792 1152q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5 v192h-256q-48 0 -87 -15t-69 -45t-51 -61.5t-45 -77.5q-32 -62 -78 -171q-29 -66 -49.5 -111t-54 -105t-64 -100t-74 -83t-90 -68.5t-106.5 -42t-128 -16.5h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224q48 0 87 15t69 45t51 61.5t45 77.5q32 62 78 171q29 66 49.5 111 t54 105t64 100t74 83t90 68.5t106.5 42t128 16.5h256v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
144 <glyph unicode="&#xf075;" horiz-adv-x="1792" d="M1792 640q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22q-17 -2 -30.5 9t-17.5 29v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281 q0 130 71 248.5t191 204.5t286 136.5t348 50.5q244 0 450 -85.5t326 -233t120 -321.5z" />
145 <glyph unicode="&#xf076;" d="M1536 704v-128q0 -201 -98.5 -362t-274 -251.5t-395.5 -90.5t-395.5 90.5t-274 251.5t-98.5 362v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-128q0 -52 23.5 -90t53.5 -57t71 -30t64 -13t44 -2t44 2t64 13t71 30t53.5 57t23.5 90v128q0 26 19 45t45 19h384 q26 0 45 -19t19 -45zM512 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45zM1536 1344v-384q0 -26 -19 -45t-45 -19h-384q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h384q26 0 45 -19t19 -45z" />
146 <glyph unicode="&#xf077;" horiz-adv-x="1792" d="M1683 205l-166 -165q-19 -19 -45 -19t-45 19l-531 531l-531 -531q-19 -19 -45 -19t-45 19l-166 165q-19 19 -19 45.5t19 45.5l742 741q19 19 45 19t45 -19l742 -741q19 -19 19 -45.5t-19 -45.5z" />
147 <glyph unicode="&#xf078;" horiz-adv-x="1792" d="M1683 728l-742 -741q-19 -19 -45 -19t-45 19l-742 741q-19 19 -19 45.5t19 45.5l166 165q19 19 45 19t45 -19l531 -531l531 531q19 19 45 19t45 -19l166 -165q19 -19 19 -45.5t-19 -45.5z" />
148 <glyph unicode="&#xf079;" horiz-adv-x="1920" d="M1280 32q0 -13 -9.5 -22.5t-22.5 -9.5h-960q-8 0 -13.5 2t-9 7t-5.5 8t-3 11.5t-1 11.5v13v11v160v416h-192q-26 0 -45 19t-19 45q0 24 15 41l320 384q19 22 49 22t49 -22l320 -384q15 -17 15 -41q0 -26 -19 -45t-45 -19h-192v-384h576q16 0 25 -11l160 -192q7 -11 7 -21 zM1920 448q0 -24 -15 -41l-320 -384q-20 -23 -49 -23t-49 23l-320 384q-15 17 -15 41q0 26 19 45t45 19h192v384h-576q-16 0 -25 12l-160 192q-7 9 -7 20q0 13 9.5 22.5t22.5 9.5h960q8 0 13.5 -2t9 -7t5.5 -8t3 -11.5t1 -11.5v-13v-11v-160v-416h192q26 0 45 -19t19 -45z " />
149 <glyph unicode="&#xf07a;" horiz-adv-x="1664" d="M640 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1536 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1664 1088v-512q0 -24 -16 -42.5t-41 -21.5 l-1044 -122q1 -7 4.5 -21.5t6 -26.5t2.5 -22q0 -16 -24 -64h920q26 0 45 -19t19 -45t-19 -45t-45 -19h-1024q-26 0 -45 19t-19 45q0 14 11 39.5t29.5 59.5t20.5 38l-177 823h-204q-26 0 -45 19t-19 45t19 45t45 19h256q16 0 28.5 -6.5t20 -15.5t13 -24.5t7.5 -26.5 t5.5 -29.5t4.5 -25.5h1201q26 0 45 -19t19 -45z" />
150 <glyph unicode="&#xf07b;" horiz-adv-x="1664" d="M1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
151 <glyph unicode="&#xf07c;" horiz-adv-x="1920" d="M1879 584q0 -31 -31 -66l-336 -396q-43 -51 -120.5 -86.5t-143.5 -35.5h-1088q-34 0 -60.5 13t-26.5 43q0 31 31 66l336 396q43 51 120.5 86.5t143.5 35.5h1088q34 0 60.5 -13t26.5 -43zM1536 928v-160h-832q-94 0 -197 -47.5t-164 -119.5l-337 -396l-5 -6q0 4 -0.5 12.5 t-0.5 12.5v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158z" />
152 <glyph unicode="&#xf07d;" horiz-adv-x="768" d="M704 1216q0 -26 -19 -45t-45 -19h-128v-1024h128q26 0 45 -19t19 -45t-19 -45l-256 -256q-19 -19 -45 -19t-45 19l-256 256q-19 19 -19 45t19 45t45 19h128v1024h-128q-26 0 -45 19t-19 45t19 45l256 256q19 19 45 19t45 -19l256 -256q19 -19 19 -45z" />
153 <glyph unicode="&#xf07e;" horiz-adv-x="1792" d="M1792 640q0 -26 -19 -45l-256 -256q-19 -19 -45 -19t-45 19t-19 45v128h-1024v-128q0 -26 -19 -45t-45 -19t-45 19l-256 256q-19 19 -19 45t19 45l256 256q19 19 45 19t45 -19t19 -45v-128h1024v128q0 26 19 45t45 19t45 -19l256 -256q19 -19 19 -45z" />
154 <glyph unicode="&#xf080;" horiz-adv-x="2048" d="M640 640v-512h-256v512h256zM1024 1152v-1024h-256v1024h256zM2048 0v-128h-2048v1536h128v-1408h1920zM1408 896v-768h-256v768h256zM1792 1280v-1152h-256v1152h256z" />
155 <glyph unicode="&#xf081;" d="M1280 926q-56 -25 -121 -34q68 40 93 117q-65 -38 -134 -51q-61 66 -153 66q-87 0 -148.5 -61.5t-61.5 -148.5q0 -29 5 -48q-129 7 -242 65t-192 155q-29 -50 -29 -106q0 -114 91 -175q-47 1 -100 26v-2q0 -75 50 -133.5t123 -72.5q-29 -8 -51 -8q-13 0 -39 4 q21 -63 74.5 -104t121.5 -42q-116 -90 -261 -90q-26 0 -50 3q148 -94 322 -94q112 0 210 35.5t168 95t120.5 137t75 162t24.5 168.5q0 18 -1 27q63 45 105 109zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5 t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
156 <glyph unicode="&#xf082;" d="M1536 160q0 -119 -84.5 -203.5t-203.5 -84.5h-192v608h203l30 224h-233v143q0 54 28 83t96 29l132 1v207q-96 9 -180 9q-136 0 -218 -80.5t-82 -225.5v-166h-224v-224h224v-608h-544q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960 q119 0 203.5 -84.5t84.5 -203.5v-960z" />
157 <glyph unicode="&#xf083;" horiz-adv-x="1792" d="M928 704q0 14 -9 23t-23 9q-66 0 -113 -47t-47 -113q0 -14 9 -23t23 -9t23 9t9 23q0 40 28 68t68 28q14 0 23 9t9 23zM1152 574q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM128 0h1536v128h-1536v-128zM1280 574q0 159 -112.5 271.5 t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM256 1216h384v128h-384v-128zM128 1024h1536v118v138h-828l-64 -128h-644v-128zM1792 1280v-1280q0 -53 -37.5 -90.5t-90.5 -37.5h-1536q-53 0 -90.5 37.5t-37.5 90.5v1280 q0 53 37.5 90.5t90.5 37.5h1536q53 0 90.5 -37.5t37.5 -90.5z" />
158 <glyph unicode="&#xf084;" horiz-adv-x="1792" d="M832 1024q0 80 -56 136t-136 56t-136 -56t-56 -136q0 -42 19 -83q-41 19 -83 19q-80 0 -136 -56t-56 -136t56 -136t136 -56t136 56t56 136q0 42 -19 83q41 -19 83 -19q80 0 136 56t56 136zM1683 320q0 -17 -49 -66t-66 -49q-9 0 -28.5 16t-36.5 33t-38.5 40t-24.5 26 l-96 -96l220 -220q28 -28 28 -68q0 -42 -39 -81t-81 -39q-40 0 -68 28l-671 671q-176 -131 -365 -131q-163 0 -265.5 102.5t-102.5 265.5q0 160 95 313t248 248t313 95q163 0 265.5 -102.5t102.5 -265.5q0 -189 -131 -365l355 -355l96 96q-3 3 -26 24.5t-40 38.5t-33 36.5 t-16 28.5q0 17 49 66t66 49q13 0 23 -10q6 -6 46 -44.5t82 -79.5t86.5 -86t73 -78t28.5 -41z" />
159 <glyph unicode="&#xf085;" horiz-adv-x="1920" d="M896 640q0 106 -75 181t-181 75t-181 -75t-75 -181t75 -181t181 -75t181 75t75 181zM1664 128q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1152q0 52 -38 90t-90 38t-90 -38t-38 -90q0 -53 37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1280 731v-185q0 -10 -7 -19.5t-16 -10.5l-155 -24q-11 -35 -32 -76q34 -48 90 -115q7 -10 7 -20q0 -12 -7 -19q-23 -30 -82.5 -89.5t-78.5 -59.5q-11 0 -21 7l-115 90q-37 -19 -77 -31q-11 -108 -23 -155q-7 -24 -30 -24h-186q-11 0 -20 7.5t-10 17.5 l-23 153q-34 10 -75 31l-118 -89q-7 -7 -20 -7q-11 0 -21 8q-144 133 -144 160q0 9 7 19q10 14 41 53t47 61q-23 44 -35 82l-152 24q-10 1 -17 9.5t-7 19.5v185q0 10 7 19.5t16 10.5l155 24q11 35 32 76q-34 48 -90 115q-7 11 -7 20q0 12 7 20q22 30 82 89t79 59q11 0 21 -7 l115 -90q34 18 77 32q11 108 23 154q7 24 30 24h186q11 0 20 -7.5t10 -17.5l23 -153q34 -10 75 -31l118 89q8 7 20 7q11 0 21 -8q144 -133 144 -160q0 -9 -7 -19q-12 -16 -42 -54t-45 -60q23 -48 34 -82l152 -23q10 -2 17 -10.5t7 -19.5zM1920 198v-140q0 -16 -149 -31 q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20 t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31zM1920 1222v-140q0 -16 -149 -31q-12 -27 -30 -52q51 -113 51 -138q0 -4 -4 -7q-122 -71 -124 -71q-8 0 -46 47t-52 68 q-20 -2 -30 -2t-30 2q-14 -21 -52 -68t-46 -47q-2 0 -124 71q-4 3 -4 7q0 25 51 138q-18 25 -30 52q-149 15 -149 31v140q0 16 149 31q13 29 30 52q-51 113 -51 138q0 4 4 7q4 2 35 20t59 34t30 16q8 0 46 -46.5t52 -67.5q20 2 30 2t30 -2q51 71 92 112l6 2q4 0 124 -70 q4 -3 4 -7q0 -25 -51 -138q17 -23 30 -52q149 -15 149 -31z" />
160 <glyph unicode="&#xf086;" horiz-adv-x="1792" d="M1408 768q0 -139 -94 -257t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224 q0 139 94 257t256.5 186.5t353.5 68.5t353.5 -68.5t256.5 -186.5t94 -257zM1792 512q0 -120 -71 -224.5t-195 -176.5q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7 q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230z" />
161 <glyph unicode="&#xf087;" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 768q0 51 -39 89.5t-89 38.5h-352q0 58 48 159.5t48 160.5q0 98 -32 145t-128 47q-26 -26 -38 -85t-30.5 -125.5t-59.5 -109.5q-22 -23 -77 -91q-4 -5 -23 -30t-31.5 -41t-34.5 -42.5 t-40 -44t-38.5 -35.5t-40 -27t-35.5 -9h-32v-640h32q13 0 31.5 -3t33 -6.5t38 -11t35 -11.5t35.5 -12.5t29 -10.5q211 -73 342 -73h121q192 0 192 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5q32 1 53.5 47t21.5 81zM1536 769 q0 -89 -49 -163q9 -33 9 -69q0 -77 -38 -144q3 -21 3 -43q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5h-36h-93q-96 0 -189.5 22.5t-216.5 65.5q-116 40 -138 40h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h274q36 24 137 155q58 75 107 128 q24 25 35.5 85.5t30.5 126.5t62 108q39 37 90 37q84 0 151 -32.5t102 -101.5t35 -186q0 -93 -48 -192h176q104 0 180 -76t76 -179z" />
162 <glyph unicode="&#xf088;" d="M256 1088q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 512q0 35 -21.5 81t-53.5 47q15 17 25 47.5t10 55.5q0 69 -53 119q18 32 18 69t-17.5 73.5t-47.5 52.5q5 30 5 56q0 85 -49 126t-136 41h-128q-131 0 -342 -73q-5 -2 -29 -10.5 t-35.5 -12.5t-35 -11.5t-38 -11t-33 -6.5t-31.5 -3h-32v-640h32q16 0 35.5 -9t40 -27t38.5 -35.5t40 -44t34.5 -42.5t31.5 -41t23 -30q55 -68 77 -91q41 -43 59.5 -109.5t30.5 -125.5t38 -85q96 0 128 47t32 145q0 59 -48 160.5t-48 159.5h352q50 0 89 38.5t39 89.5z M1536 511q0 -103 -76 -179t-180 -76h-176q48 -99 48 -192q0 -118 -35 -186q-35 -69 -102 -101.5t-151 -32.5q-51 0 -90 37q-34 33 -54 82t-25.5 90.5t-17.5 84.5t-31 64q-48 50 -107 127q-101 131 -137 155h-274q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5 h288q22 0 138 40q128 44 223 66t200 22h112q140 0 226.5 -79t85.5 -216v-5q60 -77 60 -178q0 -22 -3 -43q38 -67 38 -144q0 -36 -9 -69q49 -74 49 -163z" />
163 <glyph unicode="&#xf089;" horiz-adv-x="896" d="M832 1504v-1339l-449 -236q-22 -12 -40 -12q-21 0 -31.5 14.5t-10.5 35.5q0 6 2 20l86 500l-364 354q-25 27 -25 48q0 37 56 46l502 73l225 455q19 41 49 41z" />
164 <glyph unicode="&#xf08a;" horiz-adv-x="1792" d="M1664 940q0 81 -21.5 143t-55 98.5t-81.5 59.5t-94 31t-98 8t-112 -25.5t-110.5 -64t-86.5 -72t-60 -61.5q-18 -22 -49 -22t-49 22q-24 28 -60 61.5t-86.5 72t-110.5 64t-112 25.5t-98 -8t-94 -31t-81.5 -59.5t-55 -98.5t-21.5 -143q0 -168 187 -355l581 -560l580 559 q188 188 188 356zM1792 940q0 -221 -229 -450l-623 -600q-18 -18 -44 -18t-44 18l-624 602q-10 8 -27.5 26t-55.5 65.5t-68 97.5t-53.5 121t-23.5 138q0 220 127 344t351 124q62 0 126.5 -21.5t120 -58t95.5 -68.5t76 -68q36 36 76 68t95.5 68.5t120 58t126.5 21.5 q224 0 351 -124t127 -344z" />
165 <glyph unicode="&#xf08b;" horiz-adv-x="1664" d="M640 96q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-119 0 -203.5 84.5t-84.5 203.5v704q0 119 84.5 203.5t203.5 84.5h320q13 0 22.5 -9.5t9.5 -22.5q0 -4 1 -20t0.5 -26.5t-3 -23.5t-10 -19.5t-20.5 -6.5h-320q-66 0 -113 -47t-47 -113v-704 q0 -66 47 -113t113 -47h288h11h13t11.5 -1t11.5 -3t8 -5.5t7 -9t2 -13.5zM1568 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45z" />
166 <glyph unicode="&#xf08c;" d="M237 122h231v694h-231v-694zM483 1030q-1 52 -36 86t-93 34t-94.5 -34t-36.5 -86q0 -51 35.5 -85.5t92.5 -34.5h1q59 0 95 34.5t36 85.5zM1068 122h231v398q0 154 -73 233t-193 79q-136 0 -209 -117h2v101h-231q3 -66 0 -694h231v388q0 38 7 56q15 35 45 59.5t74 24.5 q116 0 116 -157v-371zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
167 <glyph unicode="&#xf08d;" horiz-adv-x="1152" d="M480 672v448q0 14 -9 23t-23 9t-23 -9t-9 -23v-448q0 -14 9 -23t23 -9t23 9t9 23zM1152 320q0 -26 -19 -45t-45 -19h-429l-51 -483q-2 -12 -10.5 -20.5t-20.5 -8.5h-1q-27 0 -32 27l-76 485h-404q-26 0 -45 19t-19 45q0 123 78.5 221.5t177.5 98.5v512q-52 0 -90 38 t-38 90t38 90t90 38h640q52 0 90 -38t38 -90t-38 -90t-90 -38v-512q99 0 177.5 -98.5t78.5 -221.5z" />
168 <glyph unicode="&#xf08e;" horiz-adv-x="1792" d="M1408 608v-320q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v320 q0 14 9 23t23 9h64q14 0 23 -9t9 -23zM1792 1472v-512q0 -26 -19 -45t-45 -19t-45 19l-176 176l-652 -652q-10 -10 -23 -10t-23 10l-114 114q-10 10 -10 23t10 23l652 652l-176 176q-19 19 -19 45t19 45t45 19h512q26 0 45 -19t19 -45z" />
169 <glyph unicode="&#xf090;" d="M1184 640q0 -26 -19 -45l-544 -544q-19 -19 -45 -19t-45 19t-19 45v288h-448q-26 0 -45 19t-19 45v384q0 26 19 45t45 19h448v288q0 26 19 45t45 19t45 -19l544 -544q19 -19 19 -45zM1536 992v-704q0 -119 -84.5 -203.5t-203.5 -84.5h-320q-13 0 -22.5 9.5t-9.5 22.5 q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q66 0 113 47t47 113v704q0 66 -47 113t-113 47h-288h-11h-13t-11.5 1t-11.5 3t-8 5.5t-7 9t-2 13.5q0 4 -1 20t-0.5 26.5t3 23.5t10 19.5t20.5 6.5h320q119 0 203.5 -84.5t84.5 -203.5z" />
170 <glyph unicode="&#xf091;" horiz-adv-x="1664" d="M458 653q-74 162 -74 371h-256v-96q0 -78 94.5 -162t235.5 -113zM1536 928v96h-256q0 -209 -74 -371q141 29 235.5 113t94.5 162zM1664 1056v-128q0 -71 -41.5 -143t-112 -130t-173 -97.5t-215.5 -44.5q-42 -54 -95 -95q-38 -34 -52.5 -72.5t-14.5 -89.5q0 -54 30.5 -91 t97.5 -37q75 0 133.5 -45.5t58.5 -114.5v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 69 58.5 114.5t133.5 45.5q67 0 97.5 37t30.5 91q0 51 -14.5 89.5t-52.5 72.5q-53 41 -95 95q-113 5 -215.5 44.5t-173 97.5t-112 130t-41.5 143v128q0 40 28 68t68 28h288v96 q0 66 47 113t113 47h576q66 0 113 -47t47 -113v-96h288q40 0 68 -28t28 -68z" />
171 <glyph unicode="&#xf092;" d="M394 184q-8 -9 -20 3q-13 11 -4 19q8 9 20 -3q12 -11 4 -19zM352 245q9 -12 0 -19q-8 -6 -17 7t0 18q9 7 17 -6zM291 305q-5 -7 -13 -2q-10 5 -7 12q3 5 13 2q10 -5 7 -12zM322 271q-6 -7 -16 3q-9 11 -2 16q6 6 16 -3q9 -11 2 -16zM451 159q-4 -12 -19 -6q-17 4 -13 15 t19 7q16 -5 13 -16zM514 154q0 -11 -16 -11q-17 -2 -17 11q0 11 16 11q17 2 17 -11zM572 164q2 -10 -14 -14t-18 8t14 15q16 2 18 -9zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-224q-16 0 -24.5 1t-19.5 5t-16 14.5t-5 27.5v239q0 97 -52 142q57 6 102.5 18t94 39 t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103 q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -103t0.5 -68q0 -22 -11 -33.5t-22 -13t-33 -1.5 h-224q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
172 <glyph unicode="&#xf093;" horiz-adv-x="1664" d="M1280 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 288v-320q0 -40 -28 -68t-68 -28h-1472q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h427q21 -56 70.5 -92 t110.5 -36h256q61 0 110.5 36t70.5 92h427q40 0 68 -28t28 -68zM1339 936q-17 -40 -59 -40h-256v-448q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v448h-256q-42 0 -59 40q-17 39 14 69l448 448q18 19 45 19t45 -19l448 -448q31 -30 14 -69z" />
173 <glyph unicode="&#xf094;" d="M1407 710q0 44 -7 113.5t-18 96.5q-12 30 -17 44t-9 36.5t-4 48.5q0 23 5 68.5t5 67.5q0 37 -10 55q-4 1 -13 1q-19 0 -58 -4.5t-59 -4.5q-60 0 -176 24t-175 24q-43 0 -94.5 -11.5t-85 -23.5t-89.5 -34q-137 -54 -202 -103q-96 -73 -159.5 -189.5t-88 -236t-24.5 -248.5 q0 -40 12.5 -120t12.5 -121q0 -23 -11 -66.5t-11 -65.5t12 -36.5t34 -14.5q24 0 72.5 11t73.5 11q57 0 169.5 -15.5t169.5 -15.5q181 0 284 36q129 45 235.5 152.5t166 245.5t59.5 275zM1535 712q0 -165 -70 -327.5t-196 -288t-281 -180.5q-124 -44 -326 -44 q-57 0 -170 14.5t-169 14.5q-24 0 -72.5 -14.5t-73.5 -14.5q-73 0 -123.5 55.5t-50.5 128.5q0 24 11 68t11 67q0 40 -12.5 120.5t-12.5 121.5q0 111 18 217.5t54.5 209.5t100.5 194t150 156q78 59 232 120q194 78 316 78q60 0 175.5 -24t173.5 -24q19 0 57 5t58 5 q81 0 118 -50.5t37 -134.5q0 -23 -5 -68t-5 -68q0 -10 1 -18.5t3 -17t4 -13.5t6.5 -16t6.5 -17q16 -40 25 -118.5t9 -136.5z" />
174 <glyph unicode="&#xf095;" horiz-adv-x="1408" d="M1408 296q0 -27 -10 -70.5t-21 -68.5q-21 -50 -122 -106q-94 -51 -186 -51q-27 0 -52.5 3.5t-57.5 12.5t-47.5 14.5t-55.5 20.5t-49 18q-98 35 -175 83q-128 79 -264.5 215.5t-215.5 264.5q-48 77 -83 175q-3 9 -18 49t-20.5 55.5t-14.5 47.5t-12.5 57.5t-3.5 52.5 q0 92 51 186q56 101 106 122q25 11 68.5 21t70.5 10q14 0 21 -3q18 -6 53 -76q11 -19 30 -54t35 -63.5t31 -53.5q3 -4 17.5 -25t21.5 -35.5t7 -28.5q0 -20 -28.5 -50t-62 -55t-62 -53t-28.5 -46q0 -9 5 -22.5t8.5 -20.5t14 -24t11.5 -19q76 -137 174 -235t235 -174 q2 -1 19 -11.5t24 -14t20.5 -8.5t22.5 -5q18 0 46 28.5t53 62t55 62t50 28.5q14 0 28.5 -7t35.5 -21.5t25 -17.5q25 -15 53.5 -31t63.5 -35t54 -30q70 -35 76 -53q3 -7 3 -21z" />
175 <glyph unicode="&#xf096;" horiz-adv-x="1408" d="M1120 1280h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113v832q0 66 -47 113t-113 47zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832 q119 0 203.5 -84.5t84.5 -203.5z" />
176 <glyph unicode="&#xf097;" horiz-adv-x="1280" d="M1152 1280h-1024v-1242l423 406l89 85l89 -85l423 -406v1242zM1164 1408q23 0 44 -9q33 -13 52.5 -41t19.5 -62v-1289q0 -34 -19.5 -62t-52.5 -41q-19 -8 -44 -8q-48 0 -83 32l-441 424l-441 -424q-36 -33 -83 -33q-23 0 -44 9q-33 13 -52.5 41t-19.5 62v1289 q0 34 19.5 62t52.5 41q21 9 44 9h1048z" />
177 <glyph unicode="&#xf098;" d="M1280 343q0 11 -2 16q-3 8 -38.5 29.5t-88.5 49.5l-53 29q-5 3 -19 13t-25 15t-21 5q-18 0 -47 -32.5t-57 -65.5t-44 -33q-7 0 -16.5 3.5t-15.5 6.5t-17 9.5t-14 8.5q-99 55 -170.5 126.5t-126.5 170.5q-2 3 -8.5 14t-9.5 17t-6.5 15.5t-3.5 16.5q0 13 20.5 33.5t45 38.5 t45 39.5t20.5 36.5q0 10 -5 21t-15 25t-13 19q-3 6 -15 28.5t-25 45.5t-26.5 47.5t-25 40.5t-16.5 18t-16 2q-48 0 -101 -22q-46 -21 -80 -94.5t-34 -130.5q0 -16 2.5 -34t5 -30.5t9 -33t10 -29.5t12.5 -33t11 -30q60 -164 216.5 -320.5t320.5 -216.5q6 -2 30 -11t33 -12.5 t29.5 -10t33 -9t30.5 -5t34 -2.5q57 0 130.5 34t94.5 80q22 53 22 101zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
178 <glyph unicode="&#xf099;" horiz-adv-x="1664" d="M1620 1128q-67 -98 -162 -167q1 -14 1 -42q0 -130 -38 -259.5t-115.5 -248.5t-184.5 -210.5t-258 -146t-323 -54.5q-271 0 -496 145q35 -4 78 -4q225 0 401 138q-105 2 -188 64.5t-114 159.5q33 -5 61 -5q43 0 85 11q-112 23 -185.5 111.5t-73.5 205.5v4q68 -38 146 -41 q-66 44 -105 115t-39 154q0 88 44 163q121 -149 294.5 -238.5t371.5 -99.5q-8 38 -8 74q0 134 94.5 228.5t228.5 94.5q140 0 236 -102q109 21 205 78q-37 -115 -142 -178q93 10 186 50z" />
179 <glyph unicode="&#xf09a;" horiz-adv-x="1024" d="M959 1524v-264h-157q-86 0 -116 -36t-30 -108v-189h293l-39 -296h-254v-759h-306v759h-255v296h255v218q0 186 104 288.5t277 102.5q147 0 228 -12z" />
180 <glyph unicode="&#xf09b;" d="M1536 640q0 -251 -146.5 -451.5t-378.5 -277.5q-27 -5 -39.5 7t-12.5 30v211q0 97 -52 142q57 6 102.5 18t94 39t81 66.5t53 105t20.5 150.5q0 121 -79 206q37 91 -8 204q-28 9 -81 -11t-92 -44l-38 -24q-93 26 -192 26t-192 -26q-16 11 -42.5 27t-83.5 38.5t-86 13.5 q-44 -113 -7 -204q-79 -85 -79 -206q0 -85 20.5 -150t52.5 -105t80.5 -67t94 -39t102.5 -18q-40 -36 -49 -103q-21 -10 -45 -15t-57 -5t-65.5 21.5t-55.5 62.5q-19 32 -48.5 52t-49.5 24l-20 3q-21 0 -29 -4.5t-5 -11.5t9 -14t13 -12l7 -5q22 -10 43.5 -38t31.5 -51l10 -23 q13 -38 44 -61.5t67 -30t69.5 -7t55.5 3.5l23 4q0 -38 0.5 -89t0.5 -54q0 -18 -13 -30t-40 -7q-232 77 -378.5 277.5t-146.5 451.5q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
181 <glyph unicode="&#xf09c;" horiz-adv-x="1664" d="M1664 960v-256q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45v256q0 106 -75 181t-181 75t-181 -75t-75 -181v-192h96q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h672v192q0 185 131.5 316.5t316.5 131.5 t316.5 -131.5t131.5 -316.5z" />
182 <glyph unicode="&#xf09d;" horiz-adv-x="1920" d="M1760 1408q66 0 113 -47t47 -113v-1216q0 -66 -47 -113t-113 -47h-1600q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1600zM160 1280q-13 0 -22.5 -9.5t-9.5 -22.5v-224h1664v224q0 13 -9.5 22.5t-22.5 9.5h-1600zM1760 0q13 0 22.5 9.5t9.5 22.5v608h-1664v-608 q0 -13 9.5 -22.5t22.5 -9.5h1600zM256 128v128h256v-128h-256zM640 128v128h384v-128h-384z" />
183 <glyph unicode="&#xf09e;" horiz-adv-x="1408" d="M384 192q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM896 69q2 -28 -17 -48q-18 -21 -47 -21h-135q-25 0 -43 16.5t-20 41.5q-22 229 -184.5 391.5t-391.5 184.5q-25 2 -41.5 20t-16.5 43v135q0 29 21 47q17 17 43 17h5q160 -13 306 -80.5 t259 -181.5q114 -113 181.5 -259t80.5 -306zM1408 67q2 -27 -18 -47q-18 -20 -46 -20h-143q-26 0 -44.5 17.5t-19.5 42.5q-12 215 -101 408.5t-231.5 336t-336 231.5t-408.5 102q-25 1 -42.5 19.5t-17.5 43.5v143q0 28 20 46q18 18 44 18h3q262 -13 501.5 -120t425.5 -294 q187 -186 294 -425.5t120 -501.5z" />
184 <glyph unicode="&#xf0a0;" d="M1040 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1296 320q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5zM1408 160v320q0 13 -9.5 22.5t-22.5 9.5 h-1216q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h1216q13 0 22.5 9.5t9.5 22.5zM178 640h1180l-157 482q-4 13 -16 21.5t-26 8.5h-782q-14 0 -26 -8.5t-16 -21.5zM1536 480v-320q0 -66 -47 -113t-113 -47h-1216q-66 0 -113 47t-47 113v320q0 25 16 75 l197 606q17 53 63 86t101 33h782q55 0 101 -33t63 -86l197 -606q16 -50 16 -75z" />
185 <glyph unicode="&#xf0a1;" horiz-adv-x="1792" d="M1664 896q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5v-384q0 -52 -38 -90t-90 -38q-417 347 -812 380q-58 -19 -91 -66t-31 -100.5t40 -92.5q-20 -33 -23 -65.5t6 -58t33.5 -55t48 -50t61.5 -50.5q-29 -58 -111.5 -83t-168.5 -11.5t-132 55.5q-7 23 -29.5 87.5 t-32 94.5t-23 89t-15 101t3.5 98.5t22 110.5h-122q-66 0 -113 47t-47 113v192q0 66 47 113t113 47h480q435 0 896 384q52 0 90 -38t38 -90v-384zM1536 292v954q-394 -302 -768 -343v-270q377 -42 768 -341z" />
186 <glyph unicode="&#xf0a2;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM246 128h1300q-266 300 -266 832q0 51 -24 105t-69 103t-121.5 80.5t-169.5 31.5t-169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -532 -266 -832z M1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5 t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
187 <glyph unicode="&#xf0a3;" d="M1376 640l138 -135q30 -28 20 -70q-12 -41 -52 -51l-188 -48l53 -186q12 -41 -19 -70q-29 -31 -70 -19l-186 53l-48 -188q-10 -40 -51 -52q-12 -2 -19 -2q-31 0 -51 22l-135 138l-135 -138q-28 -30 -70 -20q-41 11 -51 52l-48 188l-186 -53q-41 -12 -70 19q-31 29 -19 70 l53 186l-188 48q-40 10 -52 51q-10 42 20 70l138 135l-138 135q-30 28 -20 70q12 41 52 51l188 48l-53 186q-12 41 19 70q29 31 70 19l186 -53l48 188q10 41 51 51q41 12 70 -19l135 -139l135 139q29 30 70 19q41 -10 51 -51l48 -188l186 53q41 12 70 -19q31 -29 19 -70 l-53 -186l188 -48q40 -10 52 -51q10 -42 -20 -70z" />
188 <glyph unicode="&#xf0a4;" horiz-adv-x="1792" d="M256 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1664 768q0 51 -39 89.5t-89 38.5h-576q0 20 15 48.5t33 55t33 68t15 84.5q0 67 -44.5 97.5t-115.5 30.5q-24 0 -90 -139q-24 -44 -37 -65q-40 -64 -112 -145q-71 -81 -101 -106 q-69 -57 -140 -57h-32v-640h32q72 0 167 -32t193.5 -64t179.5 -32q189 0 189 167q0 26 -5 56q30 16 47.5 52.5t17.5 73.5t-18 69q53 50 53 119q0 25 -10 55.5t-25 47.5h331q52 0 90 38t38 90zM1792 769q0 -105 -75.5 -181t-180.5 -76h-169q-4 -62 -37 -119q3 -21 3 -43 q0 -101 -60 -178q1 -139 -85 -219.5t-227 -80.5q-133 0 -322 69q-164 59 -223 59h-288q-53 0 -90.5 37.5t-37.5 90.5v640q0 53 37.5 90.5t90.5 37.5h288q10 0 21.5 4.5t23.5 14t22.5 18t24 22.5t20.5 21.5t19 21.5t14 17q65 74 100 129q13 21 33 62t37 72t40.5 63t55 49.5 t69.5 17.5q125 0 206.5 -67t81.5 -189q0 -68 -22 -128h374q104 0 180 -76t76 -179z" />
189 <glyph unicode="&#xf0a5;" horiz-adv-x="1792" d="M1376 128h32v640h-32q-35 0 -67.5 12t-62.5 37t-50 46t-49 54q-2 3 -3.5 4.5t-4 4.5t-4.5 5q-72 81 -112 145q-14 22 -38 68q-1 3 -10.5 22.5t-18.5 36t-20 35.5t-21.5 30.5t-18.5 11.5q-71 0 -115.5 -30.5t-44.5 -97.5q0 -43 15 -84.5t33 -68t33 -55t15 -48.5h-576 q-50 0 -89 -38.5t-39 -89.5q0 -52 38 -90t90 -38h331q-15 -17 -25 -47.5t-10 -55.5q0 -69 53 -119q-18 -32 -18 -69t17.5 -73.5t47.5 -52.5q-4 -24 -4 -56q0 -85 48.5 -126t135.5 -41q84 0 183 32t194 64t167 32zM1664 192q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45 t45 -19t45 19t19 45zM1792 768v-640q0 -53 -37.5 -90.5t-90.5 -37.5h-288q-59 0 -223 -59q-190 -69 -317 -69q-142 0 -230 77.5t-87 217.5l1 5q-61 76 -61 178q0 22 3 43q-33 57 -37 119h-169q-105 0 -180.5 76t-75.5 181q0 103 76 179t180 76h374q-22 60 -22 128 q0 122 81.5 189t206.5 67q38 0 69.5 -17.5t55 -49.5t40.5 -63t37 -72t33 -62q35 -55 100 -129q2 -3 14 -17t19 -21.5t20.5 -21.5t24 -22.5t22.5 -18t23.5 -14t21.5 -4.5h288q53 0 90.5 -37.5t37.5 -90.5z" />
190 <glyph unicode="&#xf0a6;" d="M1280 -64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 700q0 189 -167 189q-26 0 -56 -5q-16 30 -52.5 47.5t-73.5 17.5t-69 -18q-50 53 -119 53q-25 0 -55.5 -10t-47.5 -25v331q0 52 -38 90t-90 38q-51 0 -89.5 -39t-38.5 -89v-576 q-20 0 -48.5 15t-55 33t-68 33t-84.5 15q-67 0 -97.5 -44.5t-30.5 -115.5q0 -24 139 -90q44 -24 65 -37q64 -40 145 -112q81 -71 106 -101q57 -69 57 -140v-32h640v32q0 72 32 167t64 193.5t32 179.5zM1536 705q0 -133 -69 -322q-59 -164 -59 -223v-288q0 -53 -37.5 -90.5 t-90.5 -37.5h-640q-53 0 -90.5 37.5t-37.5 90.5v288q0 10 -4.5 21.5t-14 23.5t-18 22.5t-22.5 24t-21.5 20.5t-21.5 19t-17 14q-74 65 -129 100q-21 13 -62 33t-72 37t-63 40.5t-49.5 55t-17.5 69.5q0 125 67 206.5t189 81.5q68 0 128 -22v374q0 104 76 180t179 76 q105 0 181 -75.5t76 -180.5v-169q62 -4 119 -37q21 3 43 3q101 0 178 -60q139 1 219.5 -85t80.5 -227z" />
191 <glyph unicode="&#xf0a7;" d="M1408 576q0 84 -32 183t-64 194t-32 167v32h-640v-32q0 -35 -12 -67.5t-37 -62.5t-46 -50t-54 -49q-9 -8 -14 -12q-81 -72 -145 -112q-22 -14 -68 -38q-3 -1 -22.5 -10.5t-36 -18.5t-35.5 -20t-30.5 -21.5t-11.5 -18.5q0 -71 30.5 -115.5t97.5 -44.5q43 0 84.5 15t68 33 t55 33t48.5 15v-576q0 -50 38.5 -89t89.5 -39q52 0 90 38t38 90v331q46 -35 103 -35q69 0 119 53q32 -18 69 -18t73.5 17.5t52.5 47.5q24 -4 56 -4q85 0 126 48.5t41 135.5zM1280 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1536 580 q0 -142 -77.5 -230t-217.5 -87l-5 1q-76 -61 -178 -61q-22 0 -43 3q-54 -30 -119 -37v-169q0 -105 -76 -180.5t-181 -75.5q-103 0 -179 76t-76 180v374q-54 -22 -128 -22q-121 0 -188.5 81.5t-67.5 206.5q0 38 17.5 69.5t49.5 55t63 40.5t72 37t62 33q55 35 129 100 q3 2 17 14t21.5 19t21.5 20.5t22.5 24t18 22.5t14 23.5t4.5 21.5v288q0 53 37.5 90.5t90.5 37.5h640q53 0 90.5 -37.5t37.5 -90.5v-288q0 -59 59 -223q69 -190 69 -317z" />
192 <glyph unicode="&#xf0a8;" d="M1280 576v128q0 26 -19 45t-45 19h-502l189 189q19 19 19 45t-19 45l-91 91q-18 18 -45 18t-45 -18l-362 -362l-91 -91q-18 -18 -18 -45t18 -45l91 -91l362 -362q18 -18 45 -18t45 18l91 91q18 18 18 45t-18 45l-189 189h502q26 0 45 19t19 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
193 <glyph unicode="&#xf0a9;" d="M1285 640q0 27 -18 45l-91 91l-362 362q-18 18 -45 18t-45 -18l-91 -91q-18 -18 -18 -45t18 -45l189 -189h-502q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h502l-189 -189q-19 -19 -19 -45t19 -45l91 -91q18 -18 45 -18t45 18l362 362l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
194 <glyph unicode="&#xf0aa;" d="M1284 641q0 27 -18 45l-362 362l-91 91q-18 18 -45 18t-45 -18l-91 -91l-362 -362q-18 -18 -18 -45t18 -45l91 -91q18 -18 45 -18t45 18l189 189v-502q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v502l189 -189q19 -19 45 -19t45 19l91 91q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
195 <glyph unicode="&#xf0ab;" d="M1284 639q0 27 -18 45l-91 91q-18 18 -45 18t-45 -18l-189 -189v502q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-502l-189 189q-19 19 -45 19t-45 -19l-91 -91q-18 -18 -18 -45t18 -45l362 -362l91 -91q18 -18 45 -18t45 18l91 91l362 362q18 18 18 45zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
196 <glyph unicode="&#xf0ac;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1042 887q-2 -1 -9.5 -9.5t-13.5 -9.5q2 0 4.5 5t5 11t3.5 7q6 7 22 15q14 6 52 12q34 8 51 -11 q-2 2 9.5 13t14.5 12q3 2 15 4.5t15 7.5l2 22q-12 -1 -17.5 7t-6.5 21q0 -2 -6 -8q0 7 -4.5 8t-11.5 -1t-9 -1q-10 3 -15 7.5t-8 16.5t-4 15q-2 5 -9.5 10.5t-9.5 10.5q-1 2 -2.5 5.5t-3 6.5t-4 5.5t-5.5 2.5t-7 -5t-7.5 -10t-4.5 -5q-3 2 -6 1.5t-4.5 -1t-4.5 -3t-5 -3.5 q-3 -2 -8.5 -3t-8.5 -2q15 5 -1 11q-10 4 -16 3q9 4 7.5 12t-8.5 14h5q-1 4 -8.5 8.5t-17.5 8.5t-13 6q-8 5 -34 9.5t-33 0.5q-5 -6 -4.5 -10.5t4 -14t3.5 -12.5q1 -6 -5.5 -13t-6.5 -12q0 -7 14 -15.5t10 -21.5q-3 -8 -16 -16t-16 -12q-5 -8 -1.5 -18.5t10.5 -16.5 q2 -2 1.5 -4t-3.5 -4.5t-5.5 -4t-6.5 -3.5l-3 -2q-11 -5 -20.5 6t-13.5 26q-7 25 -16 30q-23 8 -29 -1q-5 13 -41 26q-25 9 -58 4q6 1 0 15q-7 15 -19 12q3 6 4 17.5t1 13.5q3 13 12 23q1 1 7 8.5t9.5 13.5t0.5 6q35 -4 50 11q5 5 11.5 17t10.5 17q9 6 14 5.5t14.5 -5.5 t14.5 -5q14 -1 15.5 11t-7.5 20q12 -1 3 17q-5 7 -8 9q-12 4 -27 -5q-8 -4 2 -8q-1 1 -9.5 -10.5t-16.5 -17.5t-16 5q-1 1 -5.5 13.5t-9.5 13.5q-8 0 -16 -15q3 8 -11 15t-24 8q19 12 -8 27q-7 4 -20.5 5t-19.5 -4q-5 -7 -5.5 -11.5t5 -8t10.5 -5.5t11.5 -4t8.5 -3 q14 -10 8 -14q-2 -1 -8.5 -3.5t-11.5 -4.5t-6 -4q-3 -4 0 -14t-2 -14q-5 5 -9 17.5t-7 16.5q7 -9 -25 -6l-10 1q-4 0 -16 -2t-20.5 -1t-13.5 8q-4 8 0 20q1 4 4 2q-4 3 -11 9.5t-10 8.5q-46 -15 -94 -41q6 -1 12 1q5 2 13 6.5t10 5.5q34 14 42 7l5 5q14 -16 20 -25 q-7 4 -30 1q-20 -6 -22 -12q7 -12 5 -18q-4 3 -11.5 10t-14.5 11t-15 5q-16 0 -22 -1q-146 -80 -235 -222q7 -7 12 -8q4 -1 5 -9t2.5 -11t11.5 3q9 -8 3 -19q1 1 44 -27q19 -17 21 -21q3 -11 -10 -18q-1 2 -9 9t-9 4q-3 -5 0.5 -18.5t10.5 -12.5q-7 0 -9.5 -16t-2.5 -35.5 t-1 -23.5l2 -1q-3 -12 5.5 -34.5t21.5 -19.5q-13 -3 20 -43q6 -8 8 -9q3 -2 12 -7.5t15 -10t10 -10.5q4 -5 10 -22.5t14 -23.5q-2 -6 9.5 -20t10.5 -23q-1 0 -2.5 -1t-2.5 -1q3 -7 15.5 -14t15.5 -13q1 -3 2 -10t3 -11t8 -2q2 20 -24 62q-15 25 -17 29q-3 5 -5.5 15.5 t-4.5 14.5q2 0 6 -1.5t8.5 -3.5t7.5 -4t2 -3q-3 -7 2 -17.5t12 -18.5t17 -19t12 -13q6 -6 14 -19.5t0 -13.5q9 0 20 -10t17 -20q5 -8 8 -26t5 -24q2 -7 8.5 -13.5t12.5 -9.5l16 -8t13 -7q5 -2 18.5 -10.5t21.5 -11.5q10 -4 16 -4t14.5 2.5t13.5 3.5q15 2 29 -15t21 -21 q36 -19 55 -11q-2 -1 0.5 -7.5t8 -15.5t9 -14.5t5.5 -8.5q5 -6 18 -15t18 -15q6 4 7 9q-3 -8 7 -20t18 -10q14 3 14 32q-31 -15 -49 18q0 1 -2.5 5.5t-4 8.5t-2.5 8.5t0 7.5t5 3q9 0 10 3.5t-2 12.5t-4 13q-1 8 -11 20t-12 15q-5 -9 -16 -8t-16 9q0 -1 -1.5 -5.5t-1.5 -6.5 q-13 0 -15 1q1 3 2.5 17.5t3.5 22.5q1 4 5.5 12t7.5 14.5t4 12.5t-4.5 9.5t-17.5 2.5q-19 -1 -26 -20q-1 -3 -3 -10.5t-5 -11.5t-9 -7q-7 -3 -24 -2t-24 5q-13 8 -22.5 29t-9.5 37q0 10 2.5 26.5t3 25t-5.5 24.5q3 2 9 9.5t10 10.5q2 1 4.5 1.5t4.5 0t4 1.5t3 6q-1 1 -4 3 q-3 3 -4 3q7 -3 28.5 1.5t27.5 -1.5q15 -11 22 2q0 1 -2.5 9.5t-0.5 13.5q5 -27 29 -9q3 -3 15.5 -5t17.5 -5q3 -2 7 -5.5t5.5 -4.5t5 0.5t8.5 6.5q10 -14 12 -24q11 -40 19 -44q7 -3 11 -2t4.5 9.5t0 14t-1.5 12.5l-1 8v18l-1 8q-15 3 -18.5 12t1.5 18.5t15 18.5q1 1 8 3.5 t15.5 6.5t12.5 8q21 19 15 35q7 0 11 9q-1 0 -5 3t-7.5 5t-4.5 2q9 5 2 16q5 3 7.5 11t7.5 10q9 -12 21 -2q7 8 1 16q5 7 20.5 10.5t18.5 9.5q7 -2 8 2t1 12t3 12q4 5 15 9t13 5l17 11q3 4 0 4q18 -2 31 11q10 11 -6 20q3 6 -3 9.5t-15 5.5q3 1 11.5 0.5t10.5 1.5 q15 10 -7 16q-17 5 -43 -12zM879 10q206 36 351 189q-3 3 -12.5 4.5t-12.5 3.5q-18 7 -24 8q1 7 -2.5 13t-8 9t-12.5 8t-11 7q-2 2 -7 6t-7 5.5t-7.5 4.5t-8.5 2t-10 -1l-3 -1q-3 -1 -5.5 -2.5t-5.5 -3t-4 -3t0 -2.5q-21 17 -36 22q-5 1 -11 5.5t-10.5 7t-10 1.5t-11.5 -7 q-5 -5 -6 -15t-2 -13q-7 5 0 17.5t2 18.5q-3 6 -10.5 4.5t-12 -4.5t-11.5 -8.5t-9 -6.5t-8.5 -5.5t-8.5 -7.5q-3 -4 -6 -12t-5 -11q-2 4 -11.5 6.5t-9.5 5.5q2 -10 4 -35t5 -38q7 -31 -12 -48q-27 -25 -29 -40q-4 -22 12 -26q0 -7 -8 -20.5t-7 -21.5q0 -6 2 -16z" />
197 <glyph unicode="&#xf0ad;" horiz-adv-x="1664" d="M384 64q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1028 484l-682 -682q-37 -37 -90 -37q-52 0 -91 37l-106 108q-38 36 -38 90q0 53 38 91l681 681q39 -98 114.5 -173.5t173.5 -114.5zM1662 919q0 -39 -23 -106q-47 -134 -164.5 -217.5 t-258.5 -83.5q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q58 0 121.5 -16.5t107.5 -46.5q16 -11 16 -28t-16 -28l-293 -169v-224l193 -107q5 3 79 48.5t135.5 81t70.5 35.5q15 0 23.5 -10t8.5 -25z" />
198 <glyph unicode="&#xf0ae;" horiz-adv-x="1792" d="M1024 128h640v128h-640v-128zM640 640h1024v128h-1024v-128zM1280 1152h384v128h-384v-128zM1792 320v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 832v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19 t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45zM1792 1344v-256q0 -26 -19 -45t-45 -19h-1664q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1664q26 0 45 -19t19 -45z" />
199 <glyph unicode="&#xf0b0;" horiz-adv-x="1408" d="M1403 1241q17 -41 -14 -70l-493 -493v-742q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-256 256q-19 19 -19 45v486l-493 493q-31 29 -14 70q17 39 59 39h1280q42 0 59 -39z" />
200 <glyph unicode="&#xf0b1;" horiz-adv-x="1792" d="M640 1280h512v128h-512v-128zM1792 640v-480q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v480h672v-160q0 -26 19 -45t45 -19h320q26 0 45 19t19 45v160h672zM1024 640v-128h-256v128h256zM1792 1120v-384h-1792v384q0 66 47 113t113 47h352v160q0 40 28 68 t68 28h576q40 0 68 -28t28 -68v-160h352q66 0 113 -47t47 -113z" />
201 <glyph unicode="&#xf0b2;" d="M1283 995l-355 -355l355 -355l144 144q29 31 70 14q39 -17 39 -59v-448q0 -26 -19 -45t-45 -19h-448q-42 0 -59 40q-17 39 14 69l144 144l-355 355l-355 -355l144 -144q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l144 -144 l355 355l-355 355l-144 -144q-19 -19 -45 -19q-12 0 -24 5q-40 17 -40 59v448q0 26 19 45t45 19h448q42 0 59 -40q17 -39 -14 -69l-144 -144l355 -355l355 355l-144 144q-31 30 -14 69q17 40 59 40h448q26 0 45 -19t19 -45v-448q0 -42 -39 -59q-13 -5 -25 -5q-26 0 -45 19z " />
202 <glyph unicode="&#xf0c0;" horiz-adv-x="1920" d="M593 640q-162 -5 -265 -128h-134q-82 0 -138 40.5t-56 118.5q0 353 124 353q6 0 43.5 -21t97.5 -42.5t119 -21.5q67 0 133 23q-5 -37 -5 -66q0 -139 81 -256zM1664 3q0 -120 -73 -189.5t-194 -69.5h-874q-121 0 -194 69.5t-73 189.5q0 53 3.5 103.5t14 109t26.5 108.5 t43 97.5t62 81t85.5 53.5t111.5 20q10 0 43 -21.5t73 -48t107 -48t135 -21.5t135 21.5t107 48t73 48t43 21.5q61 0 111.5 -20t85.5 -53.5t62 -81t43 -97.5t26.5 -108.5t14 -109t3.5 -103.5zM640 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75 t75 -181zM1344 896q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5t271.5 -112.5t112.5 -271.5zM1920 671q0 -78 -56 -118.5t-138 -40.5h-134q-103 123 -265 128q81 117 81 256q0 29 -5 66q66 -23 133 -23q59 0 119 21.5t97.5 42.5 t43.5 21q124 0 124 -353zM1792 1280q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181z" />
203 <glyph unicode="&#xf0c1;" horiz-adv-x="1664" d="M1456 320q0 40 -28 68l-208 208q-28 28 -68 28q-42 0 -72 -32q3 -3 19 -18.5t21.5 -21.5t15 -19t13 -25.5t3.5 -27.5q0 -40 -28 -68t-68 -28q-15 0 -27.5 3.5t-25.5 13t-19 15t-21.5 21.5t-18.5 19q-33 -31 -33 -73q0 -40 28 -68l206 -207q27 -27 68 -27q40 0 68 26 l147 146q28 28 28 67zM753 1025q0 40 -28 68l-206 207q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l208 -208q27 -27 68 -27q42 0 72 31q-3 3 -19 18.5t-21.5 21.5t-15 19t-13 25.5t-3.5 27.5q0 40 28 68t68 28q15 0 27.5 -3.5t25.5 -13t19 -15 t21.5 -21.5t18.5 -19q33 31 33 73zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-206 207q-83 83 -83 203q0 123 88 209l-88 88q-86 -88 -208 -88q-120 0 -204 84l-208 208q-84 84 -84 204t85 203l147 146q83 83 203 83q121 0 204 -85l206 -207 q83 -83 83 -203q0 -123 -88 -209l88 -88q86 88 208 88q120 0 204 -84l208 -208q84 -84 84 -204z" />
204 <glyph unicode="&#xf0c2;" horiz-adv-x="1920" d="M1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088q-185 0 -316.5 131.5t-131.5 316.5q0 132 71 241.5t187 163.5q-2 28 -2 43q0 212 150 362t362 150q158 0 286.5 -88t187.5 -230q70 62 166 62q106 0 181 -75t75 -181q0 -75 -41 -138q129 -30 213 -134.5t84 -239.5z " />
205 <glyph unicode="&#xf0c3;" horiz-adv-x="1664" d="M1527 88q56 -89 21.5 -152.5t-140.5 -63.5h-1152q-106 0 -140.5 63.5t21.5 152.5l503 793v399h-64q-26 0 -45 19t-19 45t19 45t45 19h512q26 0 45 -19t19 -45t-19 -45t-45 -19h-64v-399zM748 813l-272 -429h712l-272 429l-20 31v37v399h-128v-399v-37z" />
206 <glyph unicode="&#xf0c4;" horiz-adv-x="1792" d="M960 640q26 0 45 -19t19 -45t-19 -45t-45 -19t-45 19t-19 45t19 45t45 19zM1260 576l507 -398q28 -20 25 -56q-5 -35 -35 -51l-128 -64q-13 -7 -29 -7q-17 0 -31 8l-690 387l-110 -66q-8 -4 -12 -5q14 -49 10 -97q-7 -77 -56 -147.5t-132 -123.5q-132 -84 -277 -84 q-136 0 -222 78q-90 84 -79 207q7 76 56 147t131 124q132 84 278 84q83 0 151 -31q9 13 22 22l122 73l-122 73q-13 9 -22 22q-68 -31 -151 -31q-146 0 -278 84q-82 53 -131 124t-56 147q-5 59 15.5 113t63.5 93q85 79 222 79q145 0 277 -84q83 -52 132 -123t56 -148 q4 -48 -10 -97q4 -1 12 -5l110 -66l690 387q14 8 31 8q16 0 29 -7l128 -64q30 -16 35 -51q3 -36 -25 -56zM579 836q46 42 21 108t-106 117q-92 59 -192 59q-74 0 -113 -36q-46 -42 -21 -108t106 -117q92 -59 192 -59q74 0 113 36zM494 91q81 51 106 117t-21 108 q-39 36 -113 36q-100 0 -192 -59q-81 -51 -106 -117t21 -108q39 -36 113 -36q100 0 192 59zM672 704l96 -58v11q0 36 33 56l14 8l-79 47l-26 -26q-3 -3 -10 -11t-12 -12q-2 -2 -4 -3.5t-3 -2.5zM896 480l96 -32l736 576l-128 64l-768 -431v-113l-160 -96l9 -8q2 -2 7 -6 q4 -4 11 -12t11 -12l26 -26zM1600 64l128 64l-520 408l-177 -138q-2 -3 -13 -7z" />
207 <glyph unicode="&#xf0c5;" horiz-adv-x="1792" d="M1696 1152q40 0 68 -28t28 -68v-1216q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v288h-544q-40 0 -68 28t-28 68v672q0 40 20 88t48 76l408 408q28 28 76 48t88 20h416q40 0 68 -28t28 -68v-328q68 40 128 40h416zM1152 939l-299 -299h299v299zM512 1323l-299 -299 h299v299zM708 676l316 316v416h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h512v256q0 40 20 88t48 76zM1664 -128v1152h-384v-416q0 -40 -28 -68t-68 -28h-416v-640h896z" />
208 <glyph unicode="&#xf0c6;" horiz-adv-x="1408" d="M1404 151q0 -117 -79 -196t-196 -79q-135 0 -235 100l-777 776q-113 115 -113 271q0 159 110 270t269 111q158 0 273 -113l605 -606q10 -10 10 -22q0 -16 -30.5 -46.5t-46.5 -30.5q-13 0 -23 10l-606 607q-79 77 -181 77q-106 0 -179 -75t-73 -181q0 -105 76 -181 l776 -777q63 -63 145 -63q64 0 106 42t42 106q0 82 -63 145l-581 581q-26 24 -60 24q-29 0 -48 -19t-19 -48q0 -32 25 -59l410 -410q10 -10 10 -22q0 -16 -31 -47t-47 -31q-12 0 -22 10l-410 410q-63 61 -63 149q0 82 57 139t139 57q88 0 149 -63l581 -581q100 -98 100 -235 z" />
209 <glyph unicode="&#xf0c7;" d="M384 0h768v384h-768v-384zM1280 0h128v896q0 14 -10 38.5t-20 34.5l-281 281q-10 10 -34 20t-39 10v-416q0 -40 -28 -68t-68 -28h-576q-40 0 -68 28t-28 68v416h-128v-1280h128v416q0 40 28 68t68 28h832q40 0 68 -28t28 -68v-416zM896 928v320q0 13 -9.5 22.5t-22.5 9.5 h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5zM1536 896v-928q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h928q40 0 88 -20t76 -48l280 -280q28 -28 48 -76t20 -88z" />
210 <glyph unicode="&#xf0c8;" d="M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
211 <glyph unicode="&#xf0c9;" d="M1536 192v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 704v-128q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1536 1216v-128q0 -26 -19 -45 t-45 -19h-1408q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
212 <glyph unicode="&#xf0ca;" horiz-adv-x="1792" d="M384 128q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM384 640q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 224v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5 t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1152q0 -80 -56 -136t-136 -56t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z M1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
213 <glyph unicode="&#xf0cb;" horiz-adv-x="1792" d="M381 -84q0 -80 -54.5 -126t-135.5 -46q-106 0 -172 66l57 88q49 -45 106 -45q29 0 50.5 14.5t21.5 42.5q0 64 -105 56l-26 56q8 10 32.5 43.5t42.5 54t37 38.5v1q-16 0 -48.5 -1t-48.5 -1v-53h-106v152h333v-88l-95 -115q51 -12 81 -49t30 -88zM383 543v-159h-362 q-6 36 -6 54q0 51 23.5 93t56.5 68t66 47.5t56.5 43.5t23.5 45q0 25 -14.5 38.5t-39.5 13.5q-46 0 -81 -58l-85 59q24 51 71.5 79.5t105.5 28.5q73 0 123 -41.5t50 -112.5q0 -50 -34 -91.5t-75 -64.5t-75.5 -50.5t-35.5 -52.5h127v60h105zM1792 224v-192q0 -13 -9.5 -22.5 t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM384 1123v-99h-335v99h107q0 41 0.5 122t0.5 121v12h-2q-8 -17 -50 -54l-71 76l136 127h106v-404h108zM1792 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5 t-9.5 22.5v192q0 14 9 23t23 9h1216q13 0 22.5 -9.5t9.5 -22.5zM1792 1248v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1216q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1216q13 0 22.5 -9.5t9.5 -22.5z" />
214 <glyph unicode="&#xf0cc;" horiz-adv-x="1792" d="M1760 640q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-1728q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h1728zM483 704q-28 35 -51 80q-48 97 -48 188q0 181 134 309q133 127 393 127q50 0 167 -19q66 -12 177 -48q10 -38 21 -118q14 -123 14 -183q0 -18 -5 -45l-12 -3l-84 6 l-14 2q-50 149 -103 205q-88 91 -210 91q-114 0 -182 -59q-67 -58 -67 -146q0 -73 66 -140t279 -129q69 -20 173 -66q58 -28 95 -52h-743zM990 448h411q7 -39 7 -92q0 -111 -41 -212q-23 -55 -71 -104q-37 -35 -109 -81q-80 -48 -153 -66q-80 -21 -203 -21q-114 0 -195 23 l-140 40q-57 16 -72 28q-8 8 -8 22v13q0 108 -2 156q-1 30 0 68l2 37v44l102 2q15 -34 30 -71t22.5 -56t12.5 -27q35 -57 80 -94q43 -36 105 -57q59 -22 132 -22q64 0 139 27q77 26 122 86q47 61 47 129q0 84 -81 157q-34 29 -137 71z" />
215 <glyph unicode="&#xf0cd;" d="M48 1313q-37 2 -45 4l-3 88q13 1 40 1q60 0 112 -4q132 -7 166 -7q86 0 168 3q116 4 146 5q56 0 86 2l-1 -14l2 -64v-9q-60 -9 -124 -9q-60 0 -79 -25q-13 -14 -13 -132q0 -13 0.5 -32.5t0.5 -25.5l1 -229l14 -280q6 -124 51 -202q35 -59 96 -92q88 -47 177 -47 q104 0 191 28q56 18 99 51q48 36 65 64q36 56 53 114q21 73 21 229q0 79 -3.5 128t-11 122.5t-13.5 159.5l-4 59q-5 67 -24 88q-34 35 -77 34l-100 -2l-14 3l2 86h84l205 -10q76 -3 196 10l18 -2q6 -38 6 -51q0 -7 -4 -31q-45 -12 -84 -13q-73 -11 -79 -17q-15 -15 -15 -41 q0 -7 1.5 -27t1.5 -31q8 -19 22 -396q6 -195 -15 -304q-15 -76 -41 -122q-38 -65 -112 -123q-75 -57 -182 -89q-109 -33 -255 -33q-167 0 -284 46q-119 47 -179 122q-61 76 -83 195q-16 80 -16 237v333q0 188 -17 213q-25 36 -147 39zM1536 -96v64q0 14 -9 23t-23 9h-1472 q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h1472q14 0 23 9t9 23z" />
216 <glyph unicode="&#xf0ce;" horiz-adv-x="1664" d="M512 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 160v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23 v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM512 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 160v192 q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1024 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 544v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192 q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1536 928v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM1664 1248v-1088q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1344q66 0 113 -47t47 -113 z" />
217 <glyph unicode="&#xf0d0;" horiz-adv-x="1664" d="M1190 955l293 293l-107 107l-293 -293zM1637 1248q0 -27 -18 -45l-1286 -1286q-18 -18 -45 -18t-45 18l-198 198q-18 18 -18 45t18 45l1286 1286q18 18 45 18t45 -18l198 -198q18 -18 18 -45zM286 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM636 1276 l196 -60l-196 -60l-60 -196l-60 196l-196 60l196 60l60 196zM1566 798l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98zM926 1438l98 -30l-98 -30l-30 -98l-30 98l-98 30l98 30l30 98z" />
218 <glyph unicode="&#xf0d1;" horiz-adv-x="1792" d="M640 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM256 640h384v256h-158q-13 0 -22 -9l-195 -195q-9 -9 -9 -22v-30zM1536 128q0 52 -38 90t-90 38t-90 -38t-38 -90t38 -90t90 -38t90 38t38 90zM1792 1216v-1024q0 -15 -4 -26.5t-13.5 -18.5 t-16.5 -11.5t-23.5 -6t-22.5 -2t-25.5 0t-22.5 0.5q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-64q-3 0 -22.5 -0.5t-25.5 0t-22.5 2t-23.5 6t-16.5 11.5t-13.5 18.5t-4 26.5q0 26 19 45t45 19v320q0 8 -0.5 35t0 38 t2.5 34.5t6.5 37t14 30.5t22.5 30l198 198q19 19 50.5 32t58.5 13h160v192q0 26 19 45t45 19h1024q26 0 45 -19t19 -45z" />
219 <glyph unicode="&#xf0d2;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103q-111 0 -218 32q59 93 78 164q9 34 54 211q20 -39 73 -67.5t114 -28.5q121 0 216 68.5t147 188.5t52 270q0 114 -59.5 214t-172.5 163t-255 63q-105 0 -196 -29t-154.5 -77t-109 -110.5t-67 -129.5t-21.5 -134 q0 -104 40 -183t117 -111q30 -12 38 20q2 7 8 31t8 30q6 23 -11 43q-51 61 -51 151q0 151 104.5 259.5t273.5 108.5q151 0 235.5 -82t84.5 -213q0 -170 -68.5 -289t-175.5 -119q-61 0 -98 43.5t-23 104.5q8 35 26.5 93.5t30 103t11.5 75.5q0 50 -27 83t-77 33 q-62 0 -105 -57t-43 -142q0 -73 25 -122l-99 -418q-17 -70 -13 -177q-206 91 -333 281t-127 423q0 209 103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
220 <glyph unicode="&#xf0d3;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-725q85 122 108 210q9 34 53 209q21 -39 73.5 -67t112.5 -28q181 0 295.5 147.5t114.5 373.5q0 84 -35 162.5t-96.5 139t-152.5 97t-197 36.5q-104 0 -194.5 -28.5t-153 -76.5 t-107.5 -109.5t-66.5 -128t-21.5 -132.5q0 -102 39.5 -180t116.5 -110q13 -5 23.5 0t14.5 19q10 44 15 61q6 23 -11 42q-50 62 -50 150q0 150 103.5 256.5t270.5 106.5q149 0 232.5 -81t83.5 -210q0 -168 -67.5 -286t-173.5 -118q-60 0 -97 43.5t-23 103.5q8 34 26.5 92.5 t29.5 102t11 74.5q0 49 -26.5 81.5t-75.5 32.5q-61 0 -103.5 -56.5t-42.5 -139.5q0 -72 24 -121l-98 -414q-24 -100 -7 -254h-183q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960z" />
221 <glyph unicode="&#xf0d4;" d="M829 318q0 -76 -58.5 -112.5t-139.5 -36.5q-41 0 -80.5 9.5t-75.5 28.5t-58 53t-22 78q0 46 25 80t65.5 51.5t82 25t84.5 7.5q20 0 31 -2q2 -1 23 -16.5t26 -19t23 -18t24.5 -22t19 -22.5t17 -26t9 -26.5t4.5 -31.5zM755 863q0 -60 -33 -99.5t-92 -39.5q-53 0 -93 42.5 t-57.5 96.5t-17.5 106q0 61 32 104t92 43q53 0 93.5 -45t58 -101t17.5 -107zM861 1120l88 64h-265q-85 0 -161 -32t-127.5 -98t-51.5 -153q0 -93 64.5 -154.5t158.5 -61.5q22 0 43 3q-13 -29 -13 -54q0 -44 40 -94q-175 -12 -257 -63q-47 -29 -75.5 -73t-28.5 -95 q0 -43 18.5 -77.5t48.5 -56.5t69 -37t77.5 -21t76.5 -6q60 0 120.5 15.5t113.5 46t86 82.5t33 117q0 49 -20 89.5t-49 66.5t-58 47.5t-49 44t-20 44.5t15.5 42.5t37.5 39.5t44 42t37.5 59.5t15.5 82.5q0 60 -22.5 99.5t-72.5 90.5h83zM1152 672h128v64h-128v128h-64v-128 h-128v-64h128v-160h64v160zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
222 <glyph unicode="&#xf0d5;" horiz-adv-x="1664" d="M735 740q0 -36 32 -70.5t77.5 -68t90.5 -73.5t77 -104t32 -142q0 -90 -48 -173q-72 -122 -211 -179.5t-298 -57.5q-132 0 -246.5 41.5t-171.5 137.5q-37 60 -37 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 42 -47.5 74t-15.5 73q0 36 21 85q-46 -4 -68 -4 q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q77 66 182.5 98t217.5 32h418l-138 -88h-131q74 -63 112 -133t38 -160q0 -72 -24.5 -129.5t-59 -93t-69.5 -65t-59.5 -61.5t-24.5 -66zM589 836q38 0 78 16.5t66 43.5q53 57 53 159q0 58 -17 125t-48.5 129.5 t-84.5 103.5t-117 41q-42 0 -82.5 -19.5t-65.5 -52.5q-47 -59 -47 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26zM591 -37q58 0 111.5 13t99 39t73 73t27.5 109q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -48 2 q-53 0 -105 -7t-107.5 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -70 35 -123.5t91.5 -83t119 -44t127.5 -14.5zM1401 839h213v-108h-213v-219h-105v219h-212v108h212v217h105v-217z" />
223 <glyph unicode="&#xf0d6;" horiz-adv-x="1920" d="M768 384h384v96h-128v448h-114l-148 -137l77 -80q42 37 55 57h2v-288h-128v-96zM1280 640q0 -70 -21 -142t-59.5 -134t-101.5 -101t-138 -39t-138 39t-101.5 101t-59.5 134t-21 142t21 142t59.5 134t101.5 101t138 39t138 -39t101.5 -101t59.5 -134t21 -142zM1792 384 v512q-106 0 -181 75t-75 181h-1152q0 -106 -75 -181t-181 -75v-512q106 0 181 -75t75 -181h1152q0 106 75 181t181 75zM1920 1216v-1152q0 -26 -19 -45t-45 -19h-1792q-26 0 -45 19t-19 45v1152q0 26 19 45t45 19h1792q26 0 45 -19t19 -45z" />
224 <glyph unicode="&#xf0d7;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
225 <glyph unicode="&#xf0d8;" horiz-adv-x="1024" d="M1024 320q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
226 <glyph unicode="&#xf0d9;" horiz-adv-x="640" d="M640 1088v-896q0 -26 -19 -45t-45 -19t-45 19l-448 448q-19 19 -19 45t19 45l448 448q19 19 45 19t45 -19t19 -45z" />
227 <glyph unicode="&#xf0da;" horiz-adv-x="640" d="M576 640q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19t-19 45v896q0 26 19 45t45 19t45 -19l448 -448q19 -19 19 -45z" />
228 <glyph unicode="&#xf0db;" horiz-adv-x="1664" d="M160 0h608v1152h-640v-1120q0 -13 9.5 -22.5t22.5 -9.5zM1536 32v1120h-640v-1152h608q13 0 22.5 9.5t9.5 22.5zM1664 1248v-1216q0 -66 -47 -113t-113 -47h-1344q-66 0 -113 47t-47 113v1216q0 66 47 113t113 47h1344q66 0 113 -47t47 -113z" />
229 <glyph unicode="&#xf0dc;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45zM1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
230 <glyph unicode="&#xf0dd;" horiz-adv-x="1024" d="M1024 448q0 -26 -19 -45l-448 -448q-19 -19 -45 -19t-45 19l-448 448q-19 19 -19 45t19 45t45 19h896q26 0 45 -19t19 -45z" />
231 <glyph unicode="&#xf0de;" horiz-adv-x="1024" d="M1024 832q0 -26 -19 -45t-45 -19h-896q-26 0 -45 19t-19 45t19 45l448 448q19 19 45 19t45 -19l448 -448q19 -19 19 -45z" />
232 <glyph unicode="&#xf0e0;" horiz-adv-x="1792" d="M1792 826v-794q0 -66 -47 -113t-113 -47h-1472q-66 0 -113 47t-47 113v794q44 -49 101 -87q362 -246 497 -345q57 -42 92.5 -65.5t94.5 -48t110 -24.5h1h1q51 0 110 24.5t94.5 48t92.5 65.5q170 123 498 345q57 39 100 87zM1792 1120q0 -79 -49 -151t-122 -123 q-376 -261 -468 -325q-10 -7 -42.5 -30.5t-54 -38t-52 -32.5t-57.5 -27t-50 -9h-1h-1q-23 0 -50 9t-57.5 27t-52 32.5t-54 38t-42.5 30.5q-91 64 -262 182.5t-205 142.5q-62 42 -117 115.5t-55 136.5q0 78 41.5 130t118.5 52h1472q65 0 112.5 -47t47.5 -113z" />
233 <glyph unicode="&#xf0e1;" d="M349 911v-991h-330v991h330zM370 1217q1 -73 -50.5 -122t-135.5 -49h-2q-82 0 -132 49t-50 122q0 74 51.5 122.5t134.5 48.5t133 -48.5t51 -122.5zM1536 488v-568h-329v530q0 105 -40.5 164.5t-126.5 59.5q-63 0 -105.5 -34.5t-63.5 -85.5q-11 -30 -11 -81v-553h-329 q2 399 2 647t-1 296l-1 48h329v-144h-2q20 32 41 56t56.5 52t87 43.5t114.5 15.5q171 0 275 -113.5t104 -332.5z" />
234 <glyph unicode="&#xf0e2;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298z" />
235 <glyph unicode="&#xf0e3;" horiz-adv-x="1792" d="M1771 0q0 -53 -37 -90l-107 -108q-39 -37 -91 -37q-53 0 -90 37l-363 364q-38 36 -38 90q0 53 43 96l-256 256l-126 -126q-14 -14 -34 -14t-34 14q2 -2 12.5 -12t12.5 -13t10 -11.5t10 -13.5t6 -13.5t5.5 -16.5t1.5 -18q0 -38 -28 -68q-3 -3 -16.5 -18t-19 -20.5 t-18.5 -16.5t-22 -15.5t-22 -9t-26 -4.5q-40 0 -68 28l-408 408q-28 28 -28 68q0 13 4.5 26t9 22t15.5 22t16.5 18.5t20.5 19t18 16.5q30 28 68 28q10 0 18 -1.5t16.5 -5.5t13.5 -6t13.5 -10t11.5 -10t13 -12.5t12 -12.5q-14 14 -14 34t14 34l348 348q14 14 34 14t34 -14 q-2 2 -12.5 12t-12.5 13t-10 11.5t-10 13.5t-6 13.5t-5.5 16.5t-1.5 18q0 38 28 68q3 3 16.5 18t19 20.5t18.5 16.5t22 15.5t22 9t26 4.5q40 0 68 -28l408 -408q28 -28 28 -68q0 -13 -4.5 -26t-9 -22t-15.5 -22t-16.5 -18.5t-20.5 -19t-18 -16.5q-30 -28 -68 -28 q-10 0 -18 1.5t-16.5 5.5t-13.5 6t-13.5 10t-11.5 10t-13 12.5t-12 12.5q14 -14 14 -34t-14 -34l-126 -126l256 -256q43 43 96 43q52 0 91 -37l363 -363q37 -39 37 -91z" />
236 <glyph unicode="&#xf0e4;" horiz-adv-x="1792" d="M384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM576 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1004 351l101 382q6 26 -7.5 48.5t-38.5 29.5 t-48 -6.5t-30 -39.5l-101 -382q-60 -5 -107 -43.5t-63 -98.5q-20 -77 20 -146t117 -89t146 20t89 117q16 60 -6 117t-72 91zM1664 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1024 1024q0 53 -37.5 90.5 t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1472 832q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1792 384q0 -261 -141 -483q-19 -29 -54 -29h-1402q-35 0 -54 29 q-141 221 -141 483q0 182 71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
237 <glyph unicode="&#xf0e5;" horiz-adv-x="1792" d="M896 1152q-204 0 -381.5 -69.5t-282 -187.5t-104.5 -255q0 -112 71.5 -213.5t201.5 -175.5l87 -50l-27 -96q-24 -91 -70 -172q152 63 275 171l43 38l57 -6q69 -8 130 -8q204 0 381.5 69.5t282 187.5t104.5 255t-104.5 255t-282 187.5t-381.5 69.5zM1792 640 q0 -174 -120 -321.5t-326 -233t-450 -85.5q-70 0 -145 8q-198 -175 -460 -242q-49 -14 -114 -22h-5q-15 0 -27 10.5t-16 27.5v1q-3 4 -0.5 12t2 10t4.5 9.5l6 9t7 8.5t8 9q7 8 31 34.5t34.5 38t31 39.5t32.5 51t27 59t26 76q-157 89 -247.5 220t-90.5 281q0 174 120 321.5 t326 233t450 85.5t450 -85.5t326 -233t120 -321.5z" />
238 <glyph unicode="&#xf0e6;" horiz-adv-x="1792" d="M704 1152q-153 0 -286 -52t-211.5 -141t-78.5 -191q0 -82 53 -158t149 -132l97 -56l-35 -84q34 20 62 39l44 31l53 -10q78 -14 153 -14q153 0 286 52t211.5 141t78.5 191t-78.5 191t-211.5 141t-286 52zM704 1280q191 0 353.5 -68.5t256.5 -186.5t94 -257t-94 -257 t-256.5 -186.5t-353.5 -68.5q-86 0 -176 16q-124 -88 -278 -128q-36 -9 -86 -16h-3q-11 0 -20.5 8t-11.5 21q-1 3 -1 6.5t0.5 6.5t2 6l2.5 5t3.5 5.5t4 5t4.5 5t4 4.5q5 6 23 25t26 29.5t22.5 29t25 38.5t20.5 44q-124 72 -195 177t-71 224q0 139 94 257t256.5 186.5 t353.5 68.5zM1526 111q10 -24 20.5 -44t25 -38.5t22.5 -29t26 -29.5t23 -25q1 -1 4 -4.5t4.5 -5t4 -5t3.5 -5.5l2.5 -5t2 -6t0.5 -6.5t-1 -6.5q-3 -14 -13 -22t-22 -7q-50 7 -86 16q-154 40 -278 128q-90 -16 -176 -16q-271 0 -472 132q58 -4 88 -4q161 0 309 45t264 129 q125 92 192 212t67 254q0 77 -23 152q129 -71 204 -178t75 -230q0 -120 -71 -224.5t-195 -176.5z" />
239 <glyph unicode="&#xf0e7;" horiz-adv-x="896" d="M885 970q18 -20 7 -44l-540 -1157q-13 -25 -42 -25q-4 0 -14 2q-17 5 -25.5 19t-4.5 30l197 808l-406 -101q-4 -1 -12 -1q-18 0 -31 11q-18 15 -13 39l201 825q4 14 16 23t28 9h328q19 0 32 -12.5t13 -29.5q0 -8 -5 -18l-171 -463l396 98q8 2 12 2q19 0 34 -15z" />
240 <glyph unicode="&#xf0e8;" horiz-adv-x="1792" d="M1792 288v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192h-512v-192h96q40 0 68 -28t28 -68v-320 q0 -40 -28 -68t-68 -28h-320q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h96v192q0 52 38 90t90 38h512v192h-96q-40 0 -68 28t-28 68v320q0 40 28 68t68 28h320q40 0 68 -28t28 -68v-320q0 -40 -28 -68t-68 -28h-96v-192h512q52 0 90 -38t38 -90v-192h96q40 0 68 -28t28 -68 z" />
241 <glyph unicode="&#xf0e9;" horiz-adv-x="1664" d="M896 708v-580q0 -104 -76 -180t-180 -76t-180 76t-76 180q0 26 19 45t45 19t45 -19t19 -45q0 -50 39 -89t89 -39t89 39t39 89v580q33 11 64 11t64 -11zM1664 681q0 -13 -9.5 -22.5t-22.5 -9.5q-11 0 -23 10q-49 46 -93 69t-102 23q-68 0 -128 -37t-103 -97 q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -28 -17q-18 0 -29 17q-4 6 -14.5 24t-17.5 28q-43 60 -102.5 97t-127.5 37t-127.5 -37t-102.5 -97q-7 -10 -17.5 -28t-14.5 -24q-11 -17 -29 -17q-17 0 -28 17q-4 6 -14.5 24t-17.5 28q-43 60 -103 97t-128 37q-58 0 -102 -23t-93 -69 q-12 -10 -23 -10q-13 0 -22.5 9.5t-9.5 22.5q0 5 1 7q45 183 172.5 319.5t298 204.5t360.5 68q140 0 274.5 -40t246.5 -113.5t194.5 -187t115.5 -251.5q1 -2 1 -7zM896 1408v-98q-42 2 -64 2t-64 -2v98q0 26 19 45t45 19t45 -19t19 -45z" />
242 <glyph unicode="&#xf0ea;" horiz-adv-x="1792" d="M768 -128h896v640h-416q-40 0 -68 28t-28 68v416h-384v-1152zM1024 1312v64q0 13 -9.5 22.5t-22.5 9.5h-704q-13 0 -22.5 -9.5t-9.5 -22.5v-64q0 -13 9.5 -22.5t22.5 -9.5h704q13 0 22.5 9.5t9.5 22.5zM1280 640h299l-299 299v-299zM1792 512v-672q0 -40 -28 -68t-68 -28 h-960q-40 0 -68 28t-28 68v160h-544q-40 0 -68 28t-28 68v1344q0 40 28 68t68 28h1088q40 0 68 -28t28 -68v-328q21 -13 36 -28l408 -408q28 -28 48 -76t20 -88z" />
243 <glyph unicode="&#xf0eb;" horiz-adv-x="1024" d="M736 960q0 -13 -9.5 -22.5t-22.5 -9.5t-22.5 9.5t-9.5 22.5q0 46 -54 71t-106 25q-13 0 -22.5 9.5t-9.5 22.5t9.5 22.5t22.5 9.5q50 0 99.5 -16t87 -54t37.5 -90zM896 960q0 72 -34.5 134t-90 101.5t-123 62t-136.5 22.5t-136.5 -22.5t-123 -62t-90 -101.5t-34.5 -134 q0 -101 68 -180q10 -11 30.5 -33t30.5 -33q128 -153 141 -298h228q13 145 141 298q10 11 30.5 33t30.5 33q68 79 68 180zM1024 960q0 -155 -103 -268q-45 -49 -74.5 -87t-59.5 -95.5t-34 -107.5q47 -28 47 -82q0 -37 -25 -64q25 -27 25 -64q0 -52 -45 -81q13 -23 13 -47 q0 -46 -31.5 -71t-77.5 -25q-20 -44 -60 -70t-87 -26t-87 26t-60 70q-46 0 -77.5 25t-31.5 71q0 24 13 47q-45 29 -45 81q0 37 25 64q-25 27 -25 64q0 54 47 82q-4 50 -34 107.5t-59.5 95.5t-74.5 87q-103 113 -103 268q0 99 44.5 184.5t117 142t164 89t186.5 32.5 t186.5 -32.5t164 -89t117 -142t44.5 -184.5z" />
244 <glyph unicode="&#xf0ec;" horiz-adv-x="1792" d="M1792 352v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-1376v-192q0 -13 -9.5 -22.5t-22.5 -9.5q-12 0 -24 10l-319 320q-9 9 -9 22q0 14 9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h1376q13 0 22.5 -9.5t9.5 -22.5zM1792 896q0 -14 -9 -23l-320 -320q-9 -9 -23 -9 q-13 0 -22.5 9.5t-9.5 22.5v192h-1376q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h1376v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23z" />
245 <glyph unicode="&#xf0ed;" horiz-adv-x="1920" d="M1280 608q0 14 -9 23t-23 9h-224v352q0 13 -9.5 22.5t-22.5 9.5h-192q-13 0 -22.5 -9.5t-9.5 -22.5v-352h-224q-13 0 -22.5 -9.5t-9.5 -22.5q0 -14 9 -23l352 -352q9 -9 23 -9t23 9l351 351q10 12 10 24zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
246 <glyph unicode="&#xf0ee;" horiz-adv-x="1920" d="M1280 672q0 14 -9 23l-352 352q-9 9 -23 9t-23 -9l-351 -351q-10 -12 -10 -24q0 -14 9 -23t23 -9h224v-352q0 -13 9.5 -22.5t22.5 -9.5h192q13 0 22.5 9.5t9.5 22.5v352h224q13 0 22.5 9.5t9.5 22.5zM1920 384q0 -159 -112.5 -271.5t-271.5 -112.5h-1088 q-185 0 -316.5 131.5t-131.5 316.5q0 130 70 240t188 165q-2 30 -2 43q0 212 150 362t362 150q156 0 285.5 -87t188.5 -231q71 62 166 62q106 0 181 -75t75 -181q0 -76 -41 -138q130 -31 213.5 -135.5t83.5 -238.5z" />
247 <glyph unicode="&#xf0f0;" horiz-adv-x="1408" d="M384 192q0 -26 -19 -45t-45 -19t-45 19t-19 45t19 45t45 19t45 -19t19 -45zM1408 131q0 -121 -73 -190t-194 -69h-874q-121 0 -194 69t-73 190q0 68 5.5 131t24 138t47.5 132.5t81 103t120 60.5q-22 -52 -22 -120v-203q-58 -20 -93 -70t-35 -111q0 -80 56 -136t136 -56 t136 56t56 136q0 61 -35.5 111t-92.5 70v203q0 62 25 93q132 -104 295 -104t295 104q25 -31 25 -93v-64q-106 0 -181 -75t-75 -181v-89q-32 -29 -32 -71q0 -40 28 -68t68 -28t68 28t28 68q0 42 -32 71v89q0 52 38 90t90 38t90 -38t38 -90v-89q-32 -29 -32 -71q0 -40 28 -68 t68 -28t68 28t28 68q0 42 -32 71v89q0 68 -34.5 127.5t-93.5 93.5q0 10 0.5 42.5t0 48t-2.5 41.5t-7 47t-13 40q68 -15 120 -60.5t81 -103t47.5 -132.5t24 -138t5.5 -131zM1088 1024q0 -159 -112.5 -271.5t-271.5 -112.5t-271.5 112.5t-112.5 271.5t112.5 271.5t271.5 112.5 t271.5 -112.5t112.5 -271.5z" />
248 <glyph unicode="&#xf0f1;" horiz-adv-x="1408" d="M1280 832q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 832q0 -62 -35.5 -111t-92.5 -70v-395q0 -159 -131.5 -271.5t-316.5 -112.5t-316.5 112.5t-131.5 271.5v132q-164 20 -274 128t-110 252v512q0 26 19 45t45 19q6 0 16 -2q17 30 47 48 t65 18q53 0 90.5 -37.5t37.5 -90.5t-37.5 -90.5t-90.5 -37.5q-33 0 -64 18v-402q0 -106 94 -181t226 -75t226 75t94 181v402q-31 -18 -64 -18q-53 0 -90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5q35 0 65 -18t47 -48q10 2 16 2q26 0 45 -19t19 -45v-512q0 -144 -110 -252 t-274 -128v-132q0 -106 94 -181t226 -75t226 75t94 181v395q-57 21 -92.5 70t-35.5 111q0 80 56 136t136 56t136 -56t56 -136z" />
249 <glyph unicode="&#xf0f2;" horiz-adv-x="1792" d="M640 1152h512v128h-512v-128zM288 1152v-1280h-64q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h64zM1408 1152v-1280h-1024v1280h128v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h128zM1792 928v-832q0 -92 -66 -158t-158 -66h-64v1280h64q92 0 158 -66 t66 -158z" />
250 <glyph unicode="&#xf0f3;" horiz-adv-x="1792" d="M912 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM1728 128q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-181 75t-75 181h-448q-52 0 -90 38t-38 90q50 42 91 88t85 119.5t74.5 158.5 t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q190 -28 307 -158.5t117 -282.5q0 -139 19.5 -260t50 -206t74.5 -158.5t85 -119.5t91 -88z" />
251 <glyph unicode="&#xf0f4;" horiz-adv-x="1920" d="M1664 896q0 80 -56 136t-136 56h-64v-384h64q80 0 136 56t56 136zM0 128h1792q0 -106 -75 -181t-181 -75h-1280q-106 0 -181 75t-75 181zM1856 896q0 -159 -112.5 -271.5t-271.5 -112.5h-64v-32q0 -92 -66 -158t-158 -66h-704q-92 0 -158 66t-66 158v736q0 26 19 45 t45 19h1152q159 0 271.5 -112.5t112.5 -271.5z" />
252 <glyph unicode="&#xf0f5;" horiz-adv-x="1408" d="M640 1472v-640q0 -61 -35.5 -111t-92.5 -70v-779q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v779q-57 20 -92.5 70t-35.5 111v640q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45v-416q0 -26 19 -45 t45 -19t45 19t19 45v416q0 26 19 45t45 19t45 -19t19 -45zM1408 1472v-1600q0 -52 -38 -90t-90 -38h-128q-52 0 -90 38t-38 90v512h-224q-13 0 -22.5 9.5t-9.5 22.5v800q0 132 94 226t226 94h256q26 0 45 -19t19 -45z" />
253 <glyph unicode="&#xf0f6;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M384 736q0 14 9 23t23 9h704q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64zM1120 512q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704zM1120 256q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-704 q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h704z" />
254 <glyph unicode="&#xf0f7;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 992v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 1248v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1536h-1152v-1536h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM1408 1472v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280q26 0 45 -19t19 -45z" />
255 <glyph unicode="&#xf0f8;" horiz-adv-x="1408" d="M384 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM384 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M1152 224v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM896 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M640 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 480v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5zM1152 736v-64q0 -13 -9.5 -22.5t-22.5 -9.5h-64q-13 0 -22.5 9.5t-9.5 22.5v64q0 13 9.5 22.5t22.5 9.5h64q13 0 22.5 -9.5t9.5 -22.5z M896 -128h384v1152h-256v-32q0 -40 -28 -68t-68 -28h-448q-40 0 -68 28t-28 68v32h-256v-1152h384v224q0 13 9.5 22.5t22.5 9.5h320q13 0 22.5 -9.5t9.5 -22.5v-224zM896 1056v320q0 13 -9.5 22.5t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-96h-128v96q0 13 -9.5 22.5 t-22.5 9.5h-64q-13 0 -22.5 -9.5t-9.5 -22.5v-320q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5v96h128v-96q0 -13 9.5 -22.5t22.5 -9.5h64q13 0 22.5 9.5t9.5 22.5zM1408 1088v-1280q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1280q0 26 19 45t45 19h320 v288q0 40 28 68t68 28h448q40 0 68 -28t28 -68v-288h320q26 0 45 -19t19 -45z" />
256 <glyph unicode="&#xf0f9;" horiz-adv-x="1920" d="M640 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM256 640h384v256h-158q-14 -2 -22 -9l-195 -195q-7 -12 -9 -22v-30zM1536 128q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5 t90.5 37.5t37.5 90.5zM1664 800v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM1920 1344v-1152 q0 -26 -19 -45t-45 -19h-192q0 -106 -75 -181t-181 -75t-181 75t-75 181h-384q0 -106 -75 -181t-181 -75t-181 75t-75 181h-128q-26 0 -45 19t-19 45t19 45t45 19v416q0 26 13 58t32 51l198 198q19 19 51 32t58 13h160v320q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
257 <glyph unicode="&#xf0fa;" horiz-adv-x="1792" d="M1280 416v192q0 14 -9 23t-23 9h-224v224q0 14 -9 23t-23 9h-192q-14 0 -23 -9t-9 -23v-224h-224q-14 0 -23 -9t-9 -23v-192q0 -14 9 -23t23 -9h224v-224q0 -14 9 -23t23 -9h192q14 0 23 9t9 23v224h224q14 0 23 9t9 23zM640 1152h512v128h-512v-128zM256 1152v-1280h-32 q-92 0 -158 66t-66 158v832q0 92 66 158t158 66h32zM1440 1152v-1280h-1088v1280h160v160q0 40 28 68t68 28h576q40 0 68 -28t28 -68v-160h160zM1792 928v-832q0 -92 -66 -158t-158 -66h-32v1280h32q92 0 158 -66t66 -158z" />
258 <glyph unicode="&#xf0fb;" horiz-adv-x="1920" d="M1920 576q-1 -32 -288 -96l-352 -32l-224 -64h-64l-293 -352h69q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-96h-160h-64v32h64v416h-160l-192 -224h-96l-32 32v192h32v32h128v8l-192 24v128l192 24v8h-128v32h-32v192l32 32h96l192 -224h160v416h-64v32h64h160h96 q26 0 45 -4.5t19 -11.5t-19 -11.5t-45 -4.5h-69l293 -352h64l224 -64l352 -32q261 -58 287 -93z" />
259 <glyph unicode="&#xf0fc;" horiz-adv-x="1664" d="M640 640v384h-256v-256q0 -53 37.5 -90.5t90.5 -37.5h128zM1664 192v-192h-1152v192l128 192h-128q-159 0 -271.5 112.5t-112.5 271.5v320l-64 64l32 128h480l32 128h960l32 -192l-64 -32v-800z" />
260 <glyph unicode="&#xf0fd;" d="M1280 192v896q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-512v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-896q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h512v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
261 <glyph unicode="&#xf0fe;" d="M1280 576v128q0 26 -19 45t-45 19h-320v320q0 26 -19 45t-45 19h-128q-26 0 -45 -19t-19 -45v-320h-320q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h320v-320q0 -26 19 -45t45 -19h128q26 0 45 19t19 45v320h320q26 0 45 19t19 45zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
262 <glyph unicode="&#xf100;" horiz-adv-x="1024" d="M627 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23zM1011 160q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23z" />
263 <glyph unicode="&#xf101;" horiz-adv-x="1024" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM979 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23 l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
264 <glyph unicode="&#xf102;" horiz-adv-x="1152" d="M1075 224q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23zM1075 608q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393 q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
265 <glyph unicode="&#xf103;" horiz-adv-x="1152" d="M1075 672q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23zM1075 1056q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23 t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
266 <glyph unicode="&#xf104;" horiz-adv-x="640" d="M627 992q0 -13 -10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
267 <glyph unicode="&#xf105;" horiz-adv-x="640" d="M595 576q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
268 <glyph unicode="&#xf106;" horiz-adv-x="1152" d="M1075 352q0 -13 -10 -23l-50 -50q-10 -10 -23 -10t-23 10l-393 393l-393 -393q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l466 -466q10 -10 10 -23z" />
269 <glyph unicode="&#xf107;" horiz-adv-x="1152" d="M1075 800q0 -13 -10 -23l-466 -466q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l393 -393l393 393q10 10 23 10t23 -10l50 -50q10 -10 10 -23z" />
270 <glyph unicode="&#xf108;" horiz-adv-x="1920" d="M1792 544v832q0 13 -9.5 22.5t-22.5 9.5h-1600q-13 0 -22.5 -9.5t-9.5 -22.5v-832q0 -13 9.5 -22.5t22.5 -9.5h1600q13 0 22.5 9.5t9.5 22.5zM1920 1376v-1088q0 -66 -47 -113t-113 -47h-544q0 -37 16 -77.5t32 -71t16 -43.5q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19 t-19 45q0 14 16 44t32 70t16 78h-544q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h1600q66 0 113 -47t47 -113z" />
271 <glyph unicode="&#xf109;" horiz-adv-x="1920" d="M416 256q-66 0 -113 47t-47 113v704q0 66 47 113t113 47h1088q66 0 113 -47t47 -113v-704q0 -66 -47 -113t-113 -47h-1088zM384 1120v-704q0 -13 9.5 -22.5t22.5 -9.5h1088q13 0 22.5 9.5t9.5 22.5v704q0 13 -9.5 22.5t-22.5 9.5h-1088q-13 0 -22.5 -9.5t-9.5 -22.5z M1760 192h160v-96q0 -40 -47 -68t-113 -28h-1600q-66 0 -113 28t-47 68v96h160h1600zM1040 96q16 0 16 16t-16 16h-160q-16 0 -16 -16t16 -16h160z" />
272 <glyph unicode="&#xf10a;" horiz-adv-x="1152" d="M640 128q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1024 288v960q0 13 -9.5 22.5t-22.5 9.5h-832q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h832q13 0 22.5 9.5t9.5 22.5zM1152 1248v-1088q0 -66 -47 -113t-113 -47h-832 q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h832q66 0 113 -47t47 -113z" />
273 <glyph unicode="&#xf10b;" horiz-adv-x="768" d="M464 128q0 33 -23.5 56.5t-56.5 23.5t-56.5 -23.5t-23.5 -56.5t23.5 -56.5t56.5 -23.5t56.5 23.5t23.5 56.5zM672 288v704q0 13 -9.5 22.5t-22.5 9.5h-512q-13 0 -22.5 -9.5t-9.5 -22.5v-704q0 -13 9.5 -22.5t22.5 -9.5h512q13 0 22.5 9.5t9.5 22.5zM480 1136 q0 16 -16 16h-160q-16 0 -16 -16t16 -16h160q16 0 16 16zM768 1152v-1024q0 -52 -38 -90t-90 -38h-512q-52 0 -90 38t-38 90v1024q0 52 38 90t90 38h512q52 0 90 -38t38 -90z" />
274 <glyph unicode="&#xf10c;" d="M768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103 t279.5 -279.5t103 -385.5z" />
275 <glyph unicode="&#xf10d;" horiz-adv-x="1664" d="M768 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z M1664 576v-384q0 -80 -56 -136t-136 -56h-384q-80 0 -136 56t-56 136v704q0 104 40.5 198.5t109.5 163.5t163.5 109.5t198.5 40.5h64q26 0 45 -19t19 -45v-128q0 -26 -19 -45t-45 -19h-64q-106 0 -181 -75t-75 -181v-32q0 -40 28 -68t68 -28h224q80 0 136 -56t56 -136z" />
276 <glyph unicode="&#xf10e;" horiz-adv-x="1664" d="M768 1216v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136zM1664 1216 v-704q0 -104 -40.5 -198.5t-109.5 -163.5t-163.5 -109.5t-198.5 -40.5h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64q106 0 181 75t75 181v32q0 40 -28 68t-68 28h-224q-80 0 -136 56t-56 136v384q0 80 56 136t136 56h384q80 0 136 -56t56 -136z" />
277 <glyph unicode="&#xf110;" horiz-adv-x="1568" d="M496 192q0 -60 -42.5 -102t-101.5 -42q-60 0 -102 42t-42 102t42 102t102 42q59 0 101.5 -42t42.5 -102zM928 0q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM320 640q0 -66 -47 -113t-113 -47t-113 47t-47 113 t47 113t113 47t113 -47t47 -113zM1360 192q0 -46 -33 -79t-79 -33t-79 33t-33 79t33 79t79 33t79 -33t33 -79zM528 1088q0 -73 -51.5 -124.5t-124.5 -51.5t-124.5 51.5t-51.5 124.5t51.5 124.5t124.5 51.5t124.5 -51.5t51.5 -124.5zM992 1280q0 -80 -56 -136t-136 -56 t-136 56t-56 136t56 136t136 56t136 -56t56 -136zM1536 640q0 -40 -28 -68t-68 -28t-68 28t-28 68t28 68t68 28t68 -28t28 -68zM1328 1088q0 -33 -23.5 -56.5t-56.5 -23.5t-56.5 23.5t-23.5 56.5t23.5 56.5t56.5 23.5t56.5 -23.5t23.5 -56.5z" />
278 <glyph unicode="&#xf111;" d="M1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
279 <glyph unicode="&#xf112;" horiz-adv-x="1792" d="M1792 416q0 -166 -127 -451q-3 -7 -10.5 -24t-13.5 -30t-13 -22q-12 -17 -28 -17q-15 0 -23.5 10t-8.5 25q0 9 2.5 26.5t2.5 23.5q5 68 5 123q0 101 -17.5 181t-48.5 138.5t-80 101t-105.5 69.5t-133 42.5t-154 21.5t-175.5 6h-224v-256q0 -26 -19 -45t-45 -19t-45 19 l-512 512q-19 19 -19 45t19 45l512 512q19 19 45 19t45 -19t19 -45v-256h224q713 0 875 -403q53 -134 53 -333z" />
280 <glyph unicode="&#xf113;" horiz-adv-x="1664" d="M640 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1280 320q0 -40 -12.5 -82t-43 -76t-72.5 -34t-72.5 34t-43 76t-12.5 82t12.5 82t43 76t72.5 34t72.5 -34t43 -76t12.5 -82zM1440 320 q0 120 -69 204t-187 84q-41 0 -195 -21q-71 -11 -157 -11t-157 11q-152 21 -195 21q-118 0 -187 -84t-69 -204q0 -88 32 -153.5t81 -103t122 -60t140 -29.5t149 -7h168q82 0 149 7t140 29.5t122 60t81 103t32 153.5zM1664 496q0 -207 -61 -331q-38 -77 -105.5 -133t-141 -86 t-170 -47.5t-171.5 -22t-167 -4.5q-78 0 -142 3t-147.5 12.5t-152.5 30t-137 51.5t-121 81t-86 115q-62 123 -62 331q0 237 136 396q-27 82 -27 170q0 116 51 218q108 0 190 -39.5t189 -123.5q147 35 309 35q148 0 280 -32q105 82 187 121t189 39q51 -102 51 -218 q0 -87 -27 -168q136 -160 136 -398z" />
281 <glyph unicode="&#xf114;" horiz-adv-x="1664" d="M1536 224v704q0 40 -28 68t-68 28h-704q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68v-960q0 -40 28 -68t68 -28h1216q40 0 68 28t28 68zM1664 928v-704q0 -92 -66 -158t-158 -66h-1216q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320 q92 0 158 -66t66 -158v-32h672q92 0 158 -66t66 -158z" />
282 <glyph unicode="&#xf115;" horiz-adv-x="1920" d="M1781 605q0 35 -53 35h-1088q-40 0 -85.5 -21.5t-71.5 -52.5l-294 -363q-18 -24 -18 -40q0 -35 53 -35h1088q40 0 86 22t71 53l294 363q18 22 18 39zM640 768h768v160q0 40 -28 68t-68 28h-576q-40 0 -68 28t-28 68v64q0 40 -28 68t-68 28h-320q-40 0 -68 -28t-28 -68 v-853l256 315q44 53 116 87.5t140 34.5zM1909 605q0 -62 -46 -120l-295 -363q-43 -53 -116 -87.5t-140 -34.5h-1088q-92 0 -158 66t-66 158v960q0 92 66 158t158 66h320q92 0 158 -66t66 -158v-32h544q92 0 158 -66t66 -158v-160h192q54 0 99 -24.5t67 -70.5q15 -32 15 -68z " />
283 <glyph unicode="&#xf116;" horiz-adv-x="1792" />
284 <glyph unicode="&#xf117;" horiz-adv-x="1792" />
285 <glyph unicode="&#xf118;" d="M1134 461q-37 -121 -138 -195t-228 -74t-228 74t-138 195q-8 25 4 48.5t38 31.5q25 8 48.5 -4t31.5 -38q25 -80 92.5 -129.5t151.5 -49.5t151.5 49.5t92.5 129.5q8 26 32 38t49 4t37 -31.5t4 -48.5zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5 t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5 t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
286 <glyph unicode="&#xf119;" d="M1134 307q8 -25 -4 -48.5t-37 -31.5t-49 4t-32 38q-25 80 -92.5 129.5t-151.5 49.5t-151.5 -49.5t-92.5 -129.5q-8 -26 -31.5 -38t-48.5 -4q-26 8 -38 31.5t-4 48.5q37 121 138 195t228 74t228 -74t138 -195zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204 t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
287 <glyph unicode="&#xf11a;" d="M1152 448q0 -26 -19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h640q26 0 45 -19t19 -45zM640 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1152 896q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5t37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
288 <glyph unicode="&#xf11b;" horiz-adv-x="1920" d="M832 448v128q0 14 -9 23t-23 9h-192v192q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-192h-192q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h192v-192q0 -14 9 -23t23 -9h128q14 0 23 9t9 23v192h192q14 0 23 9t9 23zM1408 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 640q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1920 512q0 -212 -150 -362t-362 -150q-192 0 -338 128h-220q-146 -128 -338 -128q-212 0 -362 150 t-150 362t150 362t362 150h896q212 0 362 -150t150 -362z" />
289 <glyph unicode="&#xf11c;" horiz-adv-x="1920" d="M384 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM512 624v-96q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h224q16 0 16 -16zM384 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 368v-96q0 -16 -16 -16 h-864q-16 0 -16 16v96q0 16 16 16h864q16 0 16 -16zM768 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM640 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1024 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16 h96q16 0 16 -16zM896 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1280 624v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 368v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1152 880v-96 q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1408 880v-96q0 -16 -16 -16h-96q-16 0 -16 16v96q0 16 16 16h96q16 0 16 -16zM1664 880v-352q0 -16 -16 -16h-224q-16 0 -16 16v96q0 16 16 16h112v240q0 16 16 16h96q16 0 16 -16zM1792 128v896h-1664v-896 h1664zM1920 1024v-896q0 -53 -37.5 -90.5t-90.5 -37.5h-1664q-53 0 -90.5 37.5t-37.5 90.5v896q0 53 37.5 90.5t90.5 37.5h1664q53 0 90.5 -37.5t37.5 -90.5z" />
290 <glyph unicode="&#xf11d;" horiz-adv-x="1792" d="M1664 491v616q-169 -91 -306 -91q-82 0 -145 32q-100 49 -184 76.5t-178 27.5q-173 0 -403 -127v-599q245 113 433 113q55 0 103.5 -7.5t98 -26t77 -31t82.5 -39.5l28 -14q44 -22 101 -22q120 0 293 92zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9 h-64q-14 0 -23 9t-9 23v1266q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102 q-15 -9 -33 -9q-16 0 -32 8q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
291 <glyph unicode="&#xf11e;" horiz-adv-x="1792" d="M832 536v192q-181 -16 -384 -117v-185q205 96 384 110zM832 954v197q-172 -8 -384 -126v-189q215 111 384 118zM1664 491v184q-235 -116 -384 -71v224q-20 6 -39 15q-5 3 -33 17t-34.5 17t-31.5 15t-34.5 15.5t-32.5 13t-36 12.5t-35 8.5t-39.5 7.5t-39.5 4t-44 2 q-23 0 -49 -3v-222h19q102 0 192.5 -29t197.5 -82q19 -9 39 -15v-188q42 -17 91 -17q120 0 293 92zM1664 918v189q-169 -91 -306 -91q-45 0 -78 8v-196q148 -42 384 90zM320 1280q0 -35 -17.5 -64t-46.5 -46v-1266q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v1266 q-29 17 -46.5 46t-17.5 64q0 53 37.5 90.5t90.5 37.5t90.5 -37.5t37.5 -90.5zM1792 1216v-763q0 -39 -35 -57q-10 -5 -17 -9q-218 -116 -369 -116q-88 0 -158 35l-28 14q-64 33 -99 48t-91 29t-114 14q-102 0 -235.5 -44t-228.5 -102q-15 -9 -33 -9q-16 0 -32 8 q-32 19 -32 56v742q0 35 31 55q35 21 78.5 42.5t114 52t152.5 49.5t155 19q112 0 209 -31t209 -86q38 -19 89 -19q122 0 310 112q22 12 31 17q31 16 62 -2q31 -20 31 -55z" />
292 <glyph unicode="&#xf120;" horiz-adv-x="1664" d="M585 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23zM1664 96v-64q0 -14 -9 -23t-23 -9h-960q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h960q14 0 23 -9 t9 -23z" />
293 <glyph unicode="&#xf121;" horiz-adv-x="1920" d="M617 137l-50 -50q-10 -10 -23 -10t-23 10l-466 466q-10 10 -10 23t10 23l466 466q10 10 23 10t23 -10l50 -50q10 -10 10 -23t-10 -23l-393 -393l393 -393q10 -10 10 -23t-10 -23zM1208 1204l-373 -1291q-4 -13 -15.5 -19.5t-23.5 -2.5l-62 17q-13 4 -19.5 15.5t-2.5 24.5 l373 1291q4 13 15.5 19.5t23.5 2.5l62 -17q13 -4 19.5 -15.5t2.5 -24.5zM1865 553l-466 -466q-10 -10 -23 -10t-23 10l-50 50q-10 10 -10 23t10 23l393 393l-393 393q-10 10 -10 23t10 23l50 50q10 10 23 10t23 -10l466 -466q10 -10 10 -23t-10 -23z" />
294 <glyph unicode="&#xf122;" horiz-adv-x="1792" d="M640 454v-70q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-69l-397 -398q-19 -19 -19 -45t19 -45zM1792 416q0 -58 -17 -133.5t-38.5 -138t-48 -125t-40.5 -90.5l-20 -40q-8 -17 -28 -17q-6 0 -9 1 q-25 8 -23 34q43 400 -106 565q-64 71 -170.5 110.5t-267.5 52.5v-251q0 -42 -39 -59q-13 -5 -25 -5q-27 0 -45 19l-512 512q-19 19 -19 45t19 45l512 512q29 31 70 14q39 -17 39 -59v-262q411 -28 599 -221q169 -173 169 -509z" />
295 <glyph unicode="&#xf123;" horiz-adv-x="1664" d="M1186 579l257 250l-356 52l-66 10l-30 60l-159 322v-963l59 -31l318 -168l-60 355l-12 66zM1638 841l-363 -354l86 -500q5 -33 -6 -51.5t-34 -18.5q-17 0 -40 12l-449 236l-449 -236q-23 -12 -40 -12q-23 0 -34 18.5t-6 51.5l86 500l-364 354q-32 32 -23 59.5t54 34.5 l502 73l225 455q20 41 49 41q28 0 49 -41l225 -455l502 -73q45 -7 54 -34.5t-24 -59.5z" />
296 <glyph unicode="&#xf124;" horiz-adv-x="1408" d="M1401 1187l-640 -1280q-17 -35 -57 -35q-5 0 -15 2q-22 5 -35.5 22.5t-13.5 39.5v576h-576q-22 0 -39.5 13.5t-22.5 35.5t4 42t29 30l1280 640q13 7 29 7q27 0 45 -19q15 -14 18.5 -34.5t-6.5 -39.5z" />
297 <glyph unicode="&#xf125;" horiz-adv-x="1664" d="M557 256h595v595zM512 301l595 595h-595v-595zM1664 224v-192q0 -14 -9 -23t-23 -9h-224v-224q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v224h-864q-14 0 -23 9t-9 23v864h-224q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23 -9t9 -23 v-224h851l246 247q10 9 23 9t23 -9q9 -10 9 -23t-9 -23l-247 -246v-851h224q14 0 23 -9t9 -23z" />
298 <glyph unicode="&#xf126;" horiz-adv-x="1024" d="M288 64q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM288 1216q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM928 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1024 1088q0 -52 -26 -96.5t-70 -69.5 q-2 -287 -226 -414q-68 -38 -203 -81q-128 -40 -169.5 -71t-41.5 -100v-26q44 -25 70 -69.5t26 -96.5q0 -80 -56 -136t-136 -56t-136 56t-56 136q0 52 26 96.5t70 69.5v820q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136q0 -52 -26 -96.5t-70 -69.5v-497 q54 26 154 57q55 17 87.5 29.5t70.5 31t59 39.5t40.5 51t28 69.5t8.5 91.5q-44 25 -70 69.5t-26 96.5q0 80 56 136t136 56t136 -56t56 -136z" />
299 <glyph unicode="&#xf127;" horiz-adv-x="1664" d="M439 265l-256 -256q-10 -9 -23 -9q-12 0 -23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23zM608 224v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM384 448q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9t-9 23t9 23t23 9h320 q14 0 23 -9t9 -23zM1648 320q0 -120 -85 -203l-147 -146q-83 -83 -203 -83q-121 0 -204 85l-334 335q-21 21 -42 56l239 18l273 -274q27 -27 68 -27.5t68 26.5l147 146q28 28 28 67q0 40 -28 68l-274 275l18 239q35 -21 56 -42l336 -336q84 -86 84 -204zM1031 1044l-239 -18 l-273 274q-28 28 -68 28q-39 0 -68 -27l-147 -146q-28 -28 -28 -67q0 -40 28 -68l274 -274l-18 -240q-35 21 -56 42l-336 336q-84 86 -84 204q0 120 85 203l147 146q83 83 203 83q121 0 204 -85l334 -335q21 -21 42 -56zM1664 960q0 -14 -9 -23t-23 -9h-320q-14 0 -23 9 t-9 23t9 23t23 9h320q14 0 23 -9t9 -23zM1120 1504v-320q0 -14 -9 -23t-23 -9t-23 9t-9 23v320q0 14 9 23t23 9t23 -9t9 -23zM1527 1353l-256 -256q-11 -9 -23 -9t-23 9q-9 10 -9 23t9 23l256 256q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
300 <glyph unicode="&#xf128;" horiz-adv-x="1024" d="M704 280v-240q0 -16 -12 -28t-28 -12h-240q-16 0 -28 12t-12 28v240q0 16 12 28t28 12h240q16 0 28 -12t12 -28zM1020 880q0 -54 -15.5 -101t-35 -76.5t-55 -59.5t-57.5 -43.5t-61 -35.5q-41 -23 -68.5 -65t-27.5 -67q0 -17 -12 -32.5t-28 -15.5h-240q-15 0 -25.5 18.5 t-10.5 37.5v45q0 83 65 156.5t143 108.5q59 27 84 56t25 76q0 42 -46.5 74t-107.5 32q-65 0 -108 -29q-35 -25 -107 -115q-13 -16 -31 -16q-12 0 -25 8l-164 125q-13 10 -15.5 25t5.5 28q160 266 464 266q80 0 161 -31t146 -83t106 -127.5t41 -158.5z" />
301 <glyph unicode="&#xf129;" horiz-adv-x="640" d="M640 192v-128q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h64v384h-64q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h384q26 0 45 -19t19 -45v-576h64q26 0 45 -19t19 -45zM512 1344v-192q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v192 q0 26 19 45t45 19h256q26 0 45 -19t19 -45z" />
302 <glyph unicode="&#xf12a;" horiz-adv-x="640" d="M512 288v-224q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v224q0 26 19 45t45 19h256q26 0 45 -19t19 -45zM542 1344l-28 -768q-1 -26 -20.5 -45t-45.5 -19h-256q-26 0 -45.5 19t-20.5 45l-28 768q-1 26 17.5 45t44.5 19h320q26 0 44.5 -19t17.5 -45z" />
303 <glyph unicode="&#xf12b;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1534 846v-206h-514l-3 27 q-4 28 -4 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q83 65 188 65q110 0 178 -59.5t68 -158.5q0 -56 -24.5 -103t-62 -76.5t-81.5 -58.5t-82 -50.5t-65.5 -51.5t-30.5 -63h232v80 h126z" />
304 <glyph unicode="&#xf12c;" d="M897 167v-167h-248l-159 252l-24 42q-8 9 -11 21h-3l-9 -21q-10 -20 -25 -44l-155 -250h-258v167h128l197 291l-185 272h-137v168h276l139 -228q2 -4 23 -42q8 -9 11 -21h3q3 9 11 21l25 42l140 228h257v-168h-125l-184 -267l204 -296h109zM1536 -50v-206h-514l-4 27 q-3 45 -3 46q0 64 26 117t65 86.5t84 65t84 54.5t65 54t26 64q0 38 -29.5 62.5t-70.5 24.5q-51 0 -97 -39q-14 -11 -36 -38l-105 92q26 37 63 66q80 65 188 65q110 0 178 -59.5t68 -158.5q0 -66 -34.5 -118.5t-84 -86t-99.5 -62.5t-87 -63t-41 -73h232v80h126z" />
305 <glyph unicode="&#xf12d;" horiz-adv-x="1920" d="M896 128l336 384h-768l-336 -384h768zM1909 1205q15 -34 9.5 -71.5t-30.5 -65.5l-896 -1024q-38 -44 -96 -44h-768q-38 0 -69.5 20.5t-47.5 54.5q-15 34 -9.5 71.5t30.5 65.5l896 1024q38 44 96 44h768q38 0 69.5 -20.5t47.5 -54.5z" />
306 <glyph unicode="&#xf12e;" horiz-adv-x="1664" d="M1664 438q0 -81 -44.5 -135t-123.5 -54q-41 0 -77.5 17.5t-59 38t-56.5 38t-71 17.5q-110 0 -110 -124q0 -39 16 -115t15 -115v-5q-22 0 -33 -1q-34 -3 -97.5 -11.5t-115.5 -13.5t-98 -5q-61 0 -103 26.5t-42 83.5q0 37 17.5 71t38 56.5t38 59t17.5 77.5q0 79 -54 123.5 t-135 44.5q-84 0 -143 -45.5t-59 -127.5q0 -43 15 -83t33.5 -64.5t33.5 -53t15 -50.5q0 -45 -46 -89q-37 -35 -117 -35q-95 0 -245 24q-9 2 -27.5 4t-27.5 4l-13 2q-1 0 -3 1q-2 0 -2 1v1024q2 -1 17.5 -3.5t34 -5t21.5 -3.5q150 -24 245 -24q80 0 117 35q46 44 46 89 q0 22 -15 50.5t-33.5 53t-33.5 64.5t-15 83q0 82 59 127.5t144 45.5q80 0 134 -44.5t54 -123.5q0 -41 -17.5 -77.5t-38 -59t-38 -56.5t-17.5 -71q0 -57 42 -83.5t103 -26.5q64 0 180 15t163 17v-2q-1 -2 -3.5 -17.5t-5 -34t-3.5 -21.5q-24 -150 -24 -245q0 -80 35 -117 q44 -46 89 -46q22 0 50.5 15t53 33.5t64.5 33.5t83 15q82 0 127.5 -59t45.5 -143z" />
307 <glyph unicode="&#xf130;" horiz-adv-x="1152" d="M1152 832v-128q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-217 24 -364.5 187.5t-147.5 384.5v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -185 131.5 -316.5t316.5 -131.5 t316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45zM896 1216v-512q0 -132 -94 -226t-226 -94t-226 94t-94 226v512q0 132 94 226t226 94t226 -94t94 -226z" />
308 <glyph unicode="&#xf131;" horiz-adv-x="1408" d="M271 591l-101 -101q-42 103 -42 214v128q0 26 19 45t45 19t45 -19t19 -45v-128q0 -53 15 -113zM1385 1193l-361 -361v-128q0 -132 -94 -226t-226 -94q-55 0 -109 19l-96 -96q97 -51 205 -51q185 0 316.5 131.5t131.5 316.5v128q0 26 19 45t45 19t45 -19t19 -45v-128 q0 -221 -147.5 -384.5t-364.5 -187.5v-132h256q26 0 45 -19t19 -45t-19 -45t-45 -19h-640q-26 0 -45 19t-19 45t19 45t45 19h256v132q-125 13 -235 81l-254 -254q-10 -10 -23 -10t-23 10l-82 82q-10 10 -10 23t10 23l1234 1234q10 10 23 10t23 -10l82 -82q10 -10 10 -23 t-10 -23zM1005 1325l-621 -621v512q0 132 94 226t226 94q102 0 184.5 -59t116.5 -152z" />
309 <glyph unicode="&#xf132;" horiz-adv-x="1280" d="M1088 576v640h-448v-1137q119 63 213 137q235 184 235 360zM1280 1344v-768q0 -86 -33.5 -170.5t-83 -150t-118 -127.5t-126.5 -103t-121 -77.5t-89.5 -49.5t-42.5 -20q-12 -6 -26 -6t-26 6q-16 7 -42.5 20t-89.5 49.5t-121 77.5t-126.5 103t-118 127.5t-83 150 t-33.5 170.5v768q0 26 19 45t45 19h1152q26 0 45 -19t19 -45z" />
310 <glyph unicode="&#xf133;" horiz-adv-x="1664" d="M128 -128h1408v1024h-1408v-1024zM512 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1280 1088v288q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-288q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1664 1152v-1280 q0 -52 -38 -90t-90 -38h-1408q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h128v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h384v96q0 66 47 113t113 47h64q66 0 113 -47t47 -113v-96h128q52 0 90 -38t38 -90z" />
311 <glyph unicode="&#xf134;" horiz-adv-x="1408" d="M512 1344q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1408 1376v-320q0 -16 -12 -25q-8 -7 -20 -7q-4 0 -7 1l-448 96q-11 2 -18 11t-7 20h-256v-102q111 -23 183.5 -111t72.5 -203v-800q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v800 q0 106 62.5 190.5t161.5 114.5v111h-32q-59 0 -115 -23.5t-91.5 -53t-66 -66.5t-40.5 -53.5t-14 -24.5q-17 -35 -57 -35q-16 0 -29 7q-23 12 -31.5 37t3.5 49q5 10 14.5 26t37.5 53.5t60.5 70t85 67t108.5 52.5q-25 42 -25 86q0 66 47 113t113 47t113 -47t47 -113 q0 -33 -14 -64h302q0 11 7 20t18 11l448 96q3 1 7 1q12 0 20 -7q12 -9 12 -25z" />
312 <glyph unicode="&#xf135;" horiz-adv-x="1664" d="M1440 1088q0 40 -28 68t-68 28t-68 -28t-28 -68t28 -68t68 -28t68 28t28 68zM1664 1376q0 -249 -75.5 -430.5t-253.5 -360.5q-81 -80 -195 -176l-20 -379q-2 -16 -16 -26l-384 -224q-7 -4 -16 -4q-12 0 -23 9l-64 64q-13 14 -8 32l85 276l-281 281l-276 -85q-3 -1 -9 -1 q-14 0 -23 9l-64 64q-17 19 -5 39l224 384q10 14 26 16l379 20q96 114 176 195q188 187 358 258t431 71q14 0 24 -9.5t10 -22.5z" />
313 <glyph unicode="&#xf136;" horiz-adv-x="1792" d="M1745 763l-164 -763h-334l178 832q13 56 -15 88q-27 33 -83 33h-169l-204 -953h-334l204 953h-286l-204 -953h-334l204 953l-153 327h1276q101 0 189.5 -40.5t147.5 -113.5q60 -73 81 -168.5t0 -194.5z" />
314 <glyph unicode="&#xf137;" d="M909 141l102 102q19 19 19 45t-19 45l-307 307l307 307q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
315 <glyph unicode="&#xf138;" d="M717 141l454 454q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l307 -307l-307 -307q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
316 <glyph unicode="&#xf139;" d="M1165 397l102 102q19 19 19 45t-19 45l-454 454q-19 19 -45 19t-45 -19l-454 -454q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l307 307l307 -307q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
317 <glyph unicode="&#xf13a;" d="M813 237l454 454q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-307 -307l-307 307q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l454 -454q19 -19 45 -19t45 19zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5 t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
318 <glyph unicode="&#xf13b;" horiz-adv-x="1408" d="M1130 939l16 175h-884l47 -534h612l-22 -228l-197 -53l-196 53l-13 140h-175l22 -278l362 -100h4v1l359 99l50 544h-644l-15 181h674zM0 1408h1408l-128 -1438l-578 -162l-574 162z" />
319 <glyph unicode="&#xf13c;" horiz-adv-x="1792" d="M275 1408h1505l-266 -1333l-804 -267l-698 267l71 356h297l-29 -147l422 -161l486 161l68 339h-1208l58 297h1209l38 191h-1208z" />
320 <glyph unicode="&#xf13d;" horiz-adv-x="1792" d="M960 1280q0 26 -19 45t-45 19t-45 -19t-19 -45t19 -45t45 -19t45 19t19 45zM1792 352v-352q0 -22 -20 -30q-8 -2 -12 -2q-13 0 -23 9l-93 93q-119 -143 -318.5 -226.5t-429.5 -83.5t-429.5 83.5t-318.5 226.5l-93 -93q-9 -9 -23 -9q-4 0 -12 2q-20 8 -20 30v352 q0 14 9 23t23 9h352q22 0 30 -20q8 -19 -7 -35l-100 -100q67 -91 189.5 -153.5t271.5 -82.5v647h-192q-26 0 -45 19t-19 45v128q0 26 19 45t45 19h192v163q-58 34 -93 92.5t-35 128.5q0 106 75 181t181 75t181 -75t75 -181q0 -70 -35 -128.5t-93 -92.5v-163h192q26 0 45 -19 t19 -45v-128q0 -26 -19 -45t-45 -19h-192v-647q149 20 271.5 82.5t189.5 153.5l-100 100q-15 16 -7 35q8 20 30 20h352q14 0 23 -9t9 -23z" />
321 <glyph unicode="&#xf13e;" horiz-adv-x="1152" d="M1056 768q40 0 68 -28t28 -68v-576q0 -40 -28 -68t-68 -28h-960q-40 0 -68 28t-28 68v576q0 40 28 68t68 28h32v320q0 185 131.5 316.5t316.5 131.5t316.5 -131.5t131.5 -316.5q0 -26 -19 -45t-45 -19h-64q-26 0 -45 19t-19 45q0 106 -75 181t-181 75t-181 -75t-75 -181 v-320h736z" />
322 <glyph unicode="&#xf140;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM1152 640q0 159 -112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5t271.5 -112.5t271.5 112.5t112.5 271.5zM1280 640q0 -212 -150 -362t-362 -150t-362 150 t-150 362t150 362t362 150t362 -150t150 -362zM1408 640q0 130 -51 248.5t-136.5 204t-204 136.5t-248.5 51t-248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5zM1536 640 q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
323 <glyph unicode="&#xf141;" horiz-adv-x="1408" d="M384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM896 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM1408 800v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
324 <glyph unicode="&#xf142;" horiz-adv-x="384" d="M384 288v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 800v-192q0 -40 -28 -68t-68 -28h-192q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68zM384 1312v-192q0 -40 -28 -68t-68 -28h-192 q-40 0 -68 28t-28 68v192q0 40 28 68t68 28h192q40 0 68 -28t28 -68z" />
325 <glyph unicode="&#xf143;" d="M512 256q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM863 162q-13 232 -177 396t-396 177q-14 1 -24 -9t-10 -23v-128q0 -13 8.5 -22t21.5 -10q154 -11 264 -121t121 -264q1 -13 10 -21.5t22 -8.5h128q13 0 23 10 t9 24zM1247 161q-5 154 -56 297.5t-139.5 260t-205 205t-260 139.5t-297.5 56q-14 1 -23 -9q-10 -10 -10 -23v-128q0 -13 9 -22t22 -10q204 -7 378 -111.5t278.5 -278.5t111.5 -378q1 -13 10 -22t22 -9h128q13 0 23 10q11 9 9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
326 <glyph unicode="&#xf144;" d="M768 1408q209 0 385.5 -103t279.5 -279.5t103 -385.5t-103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103zM1152 585q32 18 32 55t-32 55l-544 320q-31 19 -64 1q-32 -19 -32 -56v-640q0 -37 32 -56 q16 -8 32 -8q17 0 32 9z" />
327 <glyph unicode="&#xf145;" horiz-adv-x="1792" d="M1024 1084l316 -316l-572 -572l-316 316zM813 105l618 618q19 19 19 45t-19 45l-362 362q-18 18 -45 18t-45 -18l-618 -618q-19 -19 -19 -45t19 -45l362 -362q18 -18 45 -18t45 18zM1702 742l-907 -908q-37 -37 -90.5 -37t-90.5 37l-126 126q56 56 56 136t-56 136 t-136 56t-136 -56l-125 126q-37 37 -37 90.5t37 90.5l907 906q37 37 90.5 37t90.5 -37l125 -125q-56 -56 -56 -136t56 -136t136 -56t136 56l126 -125q37 -37 37 -90.5t-37 -90.5z" />
328 <glyph unicode="&#xf146;" d="M1280 576v128q0 26 -19 45t-45 19h-896q-26 0 -45 -19t-19 -45v-128q0 -26 19 -45t45 -19h896q26 0 45 19t19 45zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
329 <glyph unicode="&#xf147;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h832q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5 t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
330 <glyph unicode="&#xf148;" horiz-adv-x="1024" d="M1018 933q-18 -37 -58 -37h-192v-864q0 -14 -9 -23t-23 -9h-704q-21 0 -29 18q-8 20 4 35l160 192q9 11 25 11h320v640h-192q-40 0 -58 37q-17 37 9 68l320 384q18 22 49 22t49 -22l320 -384q27 -32 9 -68z" />
331 <glyph unicode="&#xf149;" horiz-adv-x="1024" d="M32 1280h704q13 0 22.5 -9.5t9.5 -23.5v-863h192q40 0 58 -37t-9 -69l-320 -384q-18 -22 -49 -22t-49 22l-320 384q-26 31 -9 69q18 37 58 37h192v640h-320q-14 0 -25 11l-160 192q-13 14 -4 34q9 19 29 19z" />
332 <glyph unicode="&#xf14a;" d="M685 237l614 614q19 19 19 45t-19 45l-102 102q-19 19 -45 19t-45 -19l-467 -467l-211 211q-19 19 -45 19t-45 -19l-102 -102q-19 -19 -19 -45t19 -45l358 -358q19 -19 45 -19t45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5 t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
333 <glyph unicode="&#xf14b;" d="M404 428l152 -152l-52 -52h-56v96h-96v56zM818 818q14 -13 -3 -30l-291 -291q-17 -17 -30 -3q-14 13 3 30l291 291q17 17 30 3zM544 128l544 544l-288 288l-544 -544v-288h288zM1152 736l92 92q28 28 28 68t-28 68l-152 152q-28 28 -68 28t-68 -28l-92 -92zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
334 <glyph unicode="&#xf14c;" d="M1280 608v480q0 26 -19 45t-45 19h-480q-42 0 -59 -39q-17 -41 14 -70l144 -144l-534 -534q-19 -19 -19 -45t19 -45l102 -102q19 -19 45 -19t45 19l534 534l144 -144q18 -19 45 -19q12 0 25 5q39 17 39 59zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
335 <glyph unicode="&#xf14d;" d="M1005 435l352 352q19 19 19 45t-19 45l-352 352q-30 31 -69 14q-40 -17 -40 -59v-160q-119 0 -216 -19.5t-162.5 -51t-114 -79t-76.5 -95.5t-44.5 -109t-21.5 -111.5t-5 -110.5q0 -181 167 -404q10 -12 25 -12q7 0 13 3q22 9 19 33q-44 354 62 473q46 52 130 75.5 t224 23.5v-160q0 -42 40 -59q12 -5 24 -5q26 0 45 19zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
336 <glyph unicode="&#xf14e;" d="M640 448l256 128l-256 128v-256zM1024 1039v-542l-512 -256v542zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
337 <glyph unicode="&#xf150;" d="M1145 861q18 -35 -5 -66l-320 -448q-19 -27 -52 -27t-52 27l-320 448q-23 31 -5 66q17 35 57 35h640q40 0 57 -35zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
338 <glyph unicode="&#xf151;" d="M1145 419q-17 -35 -57 -35h-640q-40 0 -57 35q-18 35 5 66l320 448q19 27 52 27t52 -27l320 -448q23 -31 5 -66zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
339 <glyph unicode="&#xf152;" d="M1088 640q0 -33 -27 -52l-448 -320q-31 -23 -66 -5q-35 17 -35 57v640q0 40 35 57q35 18 66 -5l448 -320q27 -19 27 -52zM1280 160v960q0 14 -9 23t-23 9h-960q-14 0 -23 -9t-9 -23v-960q0 -14 9 -23t23 -9h960q14 0 23 9t9 23zM1536 1120v-960q0 -119 -84.5 -203.5 t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
340 <glyph unicode="&#xf153;" horiz-adv-x="1024" d="M976 229l35 -159q3 -12 -3 -22.5t-17 -14.5l-5 -1q-4 -2 -10.5 -3.5t-16 -4.5t-21.5 -5.5t-25.5 -5t-30 -5t-33.5 -4.5t-36.5 -3t-38.5 -1q-234 0 -409 130.5t-238 351.5h-95q-13 0 -22.5 9.5t-9.5 22.5v113q0 13 9.5 22.5t22.5 9.5h66q-2 57 1 105h-67q-14 0 -23 9 t-9 23v114q0 14 9 23t23 9h98q67 210 243.5 338t400.5 128q102 0 194 -23q11 -3 20 -15q6 -11 3 -24l-43 -159q-3 -13 -14 -19.5t-24 -2.5l-4 1q-4 1 -11.5 2.5l-17.5 3.5t-22.5 3.5t-26 3t-29 2.5t-29.5 1q-126 0 -226 -64t-150 -176h468q16 0 25 -12q10 -12 7 -26 l-24 -114q-5 -26 -32 -26h-488q-3 -37 0 -105h459q15 0 25 -12q9 -12 6 -27l-24 -112q-2 -11 -11 -18.5t-20 -7.5h-387q48 -117 149.5 -185.5t228.5 -68.5q18 0 36 1.5t33.5 3.5t29.5 4.5t24.5 5t18.5 4.5l12 3l5 2q13 5 26 -2q12 -7 15 -21z" />
341 <glyph unicode="&#xf154;" horiz-adv-x="1024" d="M1020 399v-367q0 -14 -9 -23t-23 -9h-956q-14 0 -23 9t-9 23v150q0 13 9.5 22.5t22.5 9.5h97v383h-95q-14 0 -23 9.5t-9 22.5v131q0 14 9 23t23 9h95v223q0 171 123.5 282t314.5 111q185 0 335 -125q9 -8 10 -20.5t-7 -22.5l-103 -127q-9 -11 -22 -12q-13 -2 -23 7 q-5 5 -26 19t-69 32t-93 18q-85 0 -137 -47t-52 -123v-215h305q13 0 22.5 -9t9.5 -23v-131q0 -13 -9.5 -22.5t-22.5 -9.5h-305v-379h414v181q0 13 9 22.5t23 9.5h162q14 0 23 -9.5t9 -22.5z" />
342 <glyph unicode="&#xf155;" horiz-adv-x="1024" d="M978 351q0 -153 -99.5 -263.5t-258.5 -136.5v-175q0 -14 -9 -23t-23 -9h-135q-13 0 -22.5 9.5t-9.5 22.5v175q-66 9 -127.5 31t-101.5 44.5t-74 48t-46.5 37.5t-17.5 18q-17 21 -2 41l103 135q7 10 23 12q15 2 24 -9l2 -2q113 -99 243 -125q37 -8 74 -8q81 0 142.5 43 t61.5 122q0 28 -15 53t-33.5 42t-58.5 37.5t-66 32t-80 32.5q-39 16 -61.5 25t-61.5 26.5t-62.5 31t-56.5 35.5t-53.5 42.5t-43.5 49t-35.5 58t-21 66.5t-8.5 78q0 138 98 242t255 134v180q0 13 9.5 22.5t22.5 9.5h135q14 0 23 -9t9 -23v-176q57 -6 110.5 -23t87 -33.5 t63.5 -37.5t39 -29t15 -14q17 -18 5 -38l-81 -146q-8 -15 -23 -16q-14 -3 -27 7q-3 3 -14.5 12t-39 26.5t-58.5 32t-74.5 26t-85.5 11.5q-95 0 -155 -43t-60 -111q0 -26 8.5 -48t29.5 -41.5t39.5 -33t56 -31t60.5 -27t70 -27.5q53 -20 81 -31.5t76 -35t75.5 -42.5t62 -50 t53 -63.5t31.5 -76.5t13 -94z" />
343 <glyph unicode="&#xf156;" horiz-adv-x="898" d="M898 1066v-102q0 -14 -9 -23t-23 -9h-168q-23 -144 -129 -234t-276 -110q167 -178 459 -536q14 -16 4 -34q-8 -18 -29 -18h-195q-16 0 -25 12q-306 367 -498 571q-9 9 -9 22v127q0 13 9.5 22.5t22.5 9.5h112q132 0 212.5 43t102.5 125h-427q-14 0 -23 9t-9 23v102 q0 14 9 23t23 9h413q-57 113 -268 113h-145q-13 0 -22.5 9.5t-9.5 22.5v133q0 14 9 23t23 9h832q14 0 23 -9t9 -23v-102q0 -14 -9 -23t-23 -9h-233q47 -61 64 -144h171q14 0 23 -9t9 -23z" />
344 <glyph unicode="&#xf157;" horiz-adv-x="1027" d="M603 0h-172q-13 0 -22.5 9t-9.5 23v330h-288q-13 0 -22.5 9t-9.5 23v103q0 13 9.5 22.5t22.5 9.5h288v85h-288q-13 0 -22.5 9t-9.5 23v104q0 13 9.5 22.5t22.5 9.5h214l-321 578q-8 16 0 32q10 16 28 16h194q19 0 29 -18l215 -425q19 -38 56 -125q10 24 30.5 68t27.5 61 l191 420q8 19 29 19h191q17 0 27 -16q9 -14 1 -31l-313 -579h215q13 0 22.5 -9.5t9.5 -22.5v-104q0 -14 -9.5 -23t-22.5 -9h-290v-85h290q13 0 22.5 -9.5t9.5 -22.5v-103q0 -14 -9.5 -23t-22.5 -9h-290v-330q0 -13 -9.5 -22.5t-22.5 -9.5z" />
345 <glyph unicode="&#xf158;" horiz-adv-x="1280" d="M1043 971q0 100 -65 162t-171 62h-320v-448h320q106 0 171 62t65 162zM1280 971q0 -193 -126.5 -315t-326.5 -122h-340v-118h505q14 0 23 -9t9 -23v-128q0 -14 -9 -23t-23 -9h-505v-192q0 -14 -9.5 -23t-22.5 -9h-167q-14 0 -23 9t-9 23v192h-224q-14 0 -23 9t-9 23v128 q0 14 9 23t23 9h224v118h-224q-14 0 -23 9t-9 23v149q0 13 9 22.5t23 9.5h224v629q0 14 9 23t23 9h539q200 0 326.5 -122t126.5 -315z" />
346 <glyph unicode="&#xf159;" horiz-adv-x="1792" d="M514 341l81 299h-159l75 -300q1 -1 1 -3t1 -3q0 1 0.5 3.5t0.5 3.5zM630 768l35 128h-292l32 -128h225zM822 768h139l-35 128h-70zM1271 340l78 300h-162l81 -299q0 -1 0.5 -3.5t1.5 -3.5q0 1 0.5 3t0.5 3zM1382 768l33 128h-297l34 -128h230zM1792 736v-64q0 -14 -9 -23 t-23 -9h-213l-164 -616q-7 -24 -31 -24h-159q-24 0 -31 24l-166 616h-209l-167 -616q-7 -24 -31 -24h-159q-11 0 -19.5 7t-10.5 17l-160 616h-208q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h175l-33 128h-142q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h109l-89 344q-5 15 5 28 q10 12 26 12h137q26 0 31 -24l90 -360h359l97 360q7 24 31 24h126q24 0 31 -24l98 -360h365l93 360q5 24 31 24h137q16 0 26 -12q10 -13 5 -28l-91 -344h111q14 0 23 -9t9 -23v-64q0 -14 -9 -23t-23 -9h-145l-34 -128h179q14 0 23 -9t9 -23z" />
347 <glyph unicode="&#xf15a;" horiz-adv-x="1280" d="M1167 896q18 -182 -131 -258q117 -28 175 -103t45 -214q-7 -71 -32.5 -125t-64.5 -89t-97 -58.5t-121.5 -34.5t-145.5 -15v-255h-154v251q-80 0 -122 1v-252h-154v255q-18 0 -54 0.5t-55 0.5h-200l31 183h111q50 0 58 51v402h16q-6 1 -16 1v287q-13 68 -89 68h-111v164 l212 -1q64 0 97 1v252h154v-247q82 2 122 2v245h154v-252q79 -7 140 -22.5t113 -45t82.5 -78t36.5 -114.5zM952 351q0 36 -15 64t-37 46t-57.5 30.5t-65.5 18.5t-74 9t-69 3t-64.5 -1t-47.5 -1v-338q8 0 37 -0.5t48 -0.5t53 1.5t58.5 4t57 8.5t55.5 14t47.5 21t39.5 30 t24.5 40t9.5 51zM881 827q0 33 -12.5 58.5t-30.5 42t-48 28t-55 16.5t-61.5 8t-58 2.5t-54 -1t-39.5 -0.5v-307q5 0 34.5 -0.5t46.5 0t50 2t55 5.5t51.5 11t48.5 18.5t37 27t27 38.5t9 51z" />
348 <glyph unicode="&#xf15b;" d="M1024 1024v472q22 -14 36 -28l408 -408q14 -14 28 -36h-472zM896 992q0 -40 28 -68t68 -28h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544z" />
349 <glyph unicode="&#xf15c;" d="M1468 1060q14 -14 28 -36h-472v472q22 -14 36 -28zM992 896h544v-1056q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h800v-544q0 -40 28 -68t68 -28zM1152 160v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-704q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h704q14 0 23 9t9 23z" />
350 <glyph unicode="&#xf15d;" horiz-adv-x="1664" d="M1191 1128h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1572 -23 v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -11v-2l14 2q9 2 30 2h248v119h121zM1661 874v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162 l230 -662h70z" />
351 <glyph unicode="&#xf15e;" horiz-adv-x="1664" d="M1191 104h177l-72 218l-12 47q-2 16 -2 20h-4l-3 -20q0 -1 -3.5 -18t-7.5 -29zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1661 -150 v-106h-288v106h75l-47 144h-243l-47 -144h75v-106h-287v106h70l230 662h162l230 -662h70zM1572 1001v-233h-584v90l369 529q12 18 21 27l11 9v3q-2 0 -6.5 -0.5t-7.5 -0.5q-12 -3 -30 -3h-232v-115h-120v229h567v-89l-369 -530q-6 -8 -21 -26l-11 -10v-3l14 3q9 1 30 1h248 v119h121z" />
352 <glyph unicode="&#xf160;" horiz-adv-x="1792" d="M736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23zM1792 -32v-192q0 -14 -9 -23t-23 -9h-832q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832 q14 0 23 -9t9 -23zM1600 480v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1408 992v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1216 1504v-192q0 -14 -9 -23t-23 -9h-256 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23z" />
353 <glyph unicode="&#xf161;" horiz-adv-x="1792" d="M1216 -32v-192q0 -14 -9 -23t-23 -9h-256q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h256q14 0 23 -9t9 -23zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192 q14 0 23 -9t9 -23zM1408 480v-192q0 -14 -9 -23t-23 -9h-448q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h448q14 0 23 -9t9 -23zM1600 992v-192q0 -14 -9 -23t-23 -9h-640q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h640q14 0 23 -9t9 -23zM1792 1504v-192q0 -14 -9 -23t-23 -9h-832 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h832q14 0 23 -9t9 -23z" />
354 <glyph unicode="&#xf162;" d="M1346 223q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9t9 -23 zM1486 165q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5 t82 -252.5zM1456 882v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165z" />
355 <glyph unicode="&#xf163;" d="M1346 1247q0 63 -44 116t-103 53q-52 0 -83 -37t-31 -94t36.5 -95t104.5 -38q50 0 85 27t35 68zM736 96q0 -12 -10 -24l-319 -319q-10 -9 -23 -9q-12 0 -23 9l-320 320q-15 16 -7 35q8 20 30 20h192v1376q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1376h192q14 0 23 -9 t9 -23zM1456 -142v-114h-469v114h167v432q0 7 0.5 19t0.5 17v16h-2l-7 -12q-8 -13 -26 -31l-62 -58l-82 86l192 185h123v-654h165zM1486 1189q0 -62 -13 -121.5t-41 -114t-68 -95.5t-98.5 -65.5t-127.5 -24.5q-62 0 -108 16q-24 8 -42 15l39 113q15 -7 31 -11q37 -13 75 -13 q84 0 134.5 58.5t66.5 145.5h-2q-21 -23 -61.5 -37t-84.5 -14q-106 0 -173 71.5t-67 172.5q0 105 72 178t181 73q123 0 205 -94.5t82 -252.5z" />
356 <glyph unicode="&#xf164;" horiz-adv-x="1664" d="M256 192q0 26 -19 45t-45 19q-27 0 -45.5 -19t-18.5 -45q0 -27 18.5 -45.5t45.5 -18.5q26 0 45 18.5t19 45.5zM416 704v-640q0 -26 -19 -45t-45 -19h-288q-26 0 -45 19t-19 45v640q0 26 19 45t45 19h288q26 0 45 -19t19 -45zM1600 704q0 -86 -55 -149q15 -44 15 -76 q3 -76 -43 -137q17 -56 0 -117q-15 -57 -54 -94q9 -112 -49 -181q-64 -76 -197 -78h-36h-76h-17q-66 0 -144 15.5t-121.5 29t-120.5 39.5q-123 43 -158 44q-26 1 -45 19.5t-19 44.5v641q0 25 18 43.5t43 20.5q24 2 76 59t101 121q68 87 101 120q18 18 31 48t17.5 48.5 t13.5 60.5q7 39 12.5 61t19.5 52t34 50q19 19 45 19q46 0 82.5 -10.5t60 -26t40 -40.5t24 -45t12 -50t5 -45t0.5 -39q0 -38 -9.5 -76t-19 -60t-27.5 -56q-3 -6 -10 -18t-11 -22t-8 -24h277q78 0 135 -57t57 -135z" />
357 <glyph unicode="&#xf165;" horiz-adv-x="1664" d="M256 960q0 -26 -19 -45t-45 -19q-27 0 -45.5 19t-18.5 45q0 27 18.5 45.5t45.5 18.5q26 0 45 -18.5t19 -45.5zM416 448v640q0 26 -19 45t-45 19h-288q-26 0 -45 -19t-19 -45v-640q0 -26 19 -45t45 -19h288q26 0 45 19t19 45zM1545 597q55 -61 55 -149q-1 -78 -57.5 -135 t-134.5 -57h-277q4 -14 8 -24t11 -22t10 -18q18 -37 27 -57t19 -58.5t10 -76.5q0 -24 -0.5 -39t-5 -45t-12 -50t-24 -45t-40 -40.5t-60 -26t-82.5 -10.5q-26 0 -45 19q-20 20 -34 50t-19.5 52t-12.5 61q-9 42 -13.5 60.5t-17.5 48.5t-31 48q-33 33 -101 120q-49 64 -101 121 t-76 59q-25 2 -43 20.5t-18 43.5v641q0 26 19 44.5t45 19.5q35 1 158 44q77 26 120.5 39.5t121.5 29t144 15.5h17h76h36q133 -2 197 -78q58 -69 49 -181q39 -37 54 -94q17 -61 0 -117q46 -61 43 -137q0 -32 -15 -76z" />
358 <glyph unicode="&#xf166;" d="M919 233v157q0 50 -29 50q-17 0 -33 -16v-224q16 -16 33 -16q29 0 29 49zM1103 355h66v34q0 51 -33 51t-33 -51v-34zM532 621v-70h-80v-423h-74v423h-78v70h232zM733 495v-367h-67v40q-39 -45 -76 -45q-33 0 -42 28q-6 16 -6 54v290h66v-270q0 -24 1 -26q1 -15 15 -15 q20 0 42 31v280h67zM985 384v-146q0 -52 -7 -73q-12 -42 -53 -42q-35 0 -68 41v-36h-67v493h67v-161q32 40 68 40q41 0 53 -42q7 -21 7 -74zM1236 255v-9q0 -29 -2 -43q-3 -22 -15 -40q-27 -40 -80 -40q-52 0 -81 38q-21 27 -21 86v129q0 59 20 86q29 38 80 38t78 -38 q21 -28 21 -86v-76h-133v-65q0 -51 34 -51q24 0 30 26q0 1 0.5 7t0.5 16.5v21.5h68zM785 1079v-156q0 -51 -32 -51t-32 51v156q0 52 32 52t32 -52zM1318 366q0 177 -19 260q-10 44 -43 73.5t-76 34.5q-136 15 -412 15q-275 0 -411 -15q-44 -5 -76.5 -34.5t-42.5 -73.5 q-20 -87 -20 -260q0 -176 20 -260q10 -43 42.5 -73t75.5 -35q137 -15 412 -15t412 15q43 5 75.5 35t42.5 73q20 84 20 260zM563 1017l90 296h-75l-51 -195l-53 195h-78l24 -69t23 -69q35 -103 46 -158v-201h74v201zM852 936v130q0 58 -21 87q-29 38 -78 38q-51 0 -78 -38 q-21 -29 -21 -87v-130q0 -58 21 -87q27 -38 78 -38q49 0 78 38q21 27 21 87zM1033 816h67v370h-67v-283q-22 -31 -42 -31q-15 0 -16 16q-1 2 -1 26v272h-67v-293q0 -37 6 -55q11 -27 43 -27q36 0 77 45v-40zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960 q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
359 <glyph unicode="&#xf167;" d="M971 292v-211q0 -67 -39 -67q-23 0 -45 22v301q22 22 45 22q39 0 39 -67zM1309 291v-46h-90v46q0 68 45 68t45 -68zM343 509h107v94h-312v-94h105v-569h100v569zM631 -60h89v494h-89v-378q-30 -42 -57 -42q-18 0 -21 21q-1 3 -1 35v364h-89v-391q0 -49 8 -73 q12 -37 58 -37q48 0 102 61v-54zM1060 88v197q0 73 -9 99q-17 56 -71 56q-50 0 -93 -54v217h-89v-663h89v48q45 -55 93 -55q54 0 71 55q9 27 9 100zM1398 98v13h-91q0 -51 -2 -61q-7 -36 -40 -36q-46 0 -46 69v87h179v103q0 79 -27 116q-39 51 -106 51q-68 0 -107 -51 q-28 -37 -28 -116v-173q0 -79 29 -116q39 -51 108 -51q72 0 108 53q18 27 21 54q2 9 2 58zM790 1011v210q0 69 -43 69t-43 -69v-210q0 -70 43 -70t43 70zM1509 260q0 -234 -26 -350q-14 -59 -58 -99t-102 -46q-184 -21 -555 -21t-555 21q-58 6 -102.5 46t-57.5 99 q-26 112 -26 350q0 234 26 350q14 59 58 99t103 47q183 20 554 20t555 -20q58 -7 102.5 -47t57.5 -99q26 -112 26 -350zM511 1536h102l-121 -399v-271h-100v271q-14 74 -61 212q-37 103 -65 187h106l71 -263zM881 1203v-175q0 -81 -28 -118q-37 -51 -106 -51q-67 0 -105 51 q-28 38 -28 118v175q0 80 28 117q38 51 105 51q69 0 106 -51q28 -37 28 -117zM1216 1365v-499h-91v55q-53 -62 -103 -62q-46 0 -59 37q-8 24 -8 75v394h91v-367q0 -33 1 -35q3 -22 21 -22q27 0 57 43v381h91z" />
360 <glyph unicode="&#xf168;" horiz-adv-x="1408" d="M597 869q-10 -18 -257 -456q-27 -46 -65 -46h-239q-21 0 -31 17t0 36l253 448q1 0 0 1l-161 279q-12 22 -1 37q9 15 32 15h239q40 0 66 -45zM1403 1511q11 -16 0 -37l-528 -934v-1l336 -615q11 -20 1 -37q-10 -15 -32 -15h-239q-42 0 -66 45l-339 622q18 32 531 942 q25 45 64 45h241q22 0 31 -15z" />
361 <glyph unicode="&#xf169;" d="M685 771q0 1 -126 222q-21 34 -52 34h-184q-18 0 -26 -11q-7 -12 1 -29l125 -216v-1l-196 -346q-9 -14 0 -28q8 -13 24 -13h185q31 0 50 36zM1309 1268q-7 12 -24 12h-187q-30 0 -49 -35l-411 -729q1 -2 262 -481q20 -35 52 -35h184q18 0 25 12q8 13 -1 28l-260 476v1 l409 723q8 16 0 28zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
362 <glyph unicode="&#xf16a;" horiz-adv-x="1792" d="M1280 640q0 37 -30 54l-512 320q-31 20 -65 2q-33 -18 -33 -56v-640q0 -38 33 -56q16 -8 31 -8q20 0 34 10l512 320q30 17 30 54zM1792 640q0 -96 -1 -150t-8.5 -136.5t-22.5 -147.5q-16 -73 -69 -123t-124 -58q-222 -25 -671 -25t-671 25q-71 8 -124.5 58t-69.5 123 q-14 65 -21.5 147.5t-8.5 136.5t-1 150t1 150t8.5 136.5t22.5 147.5q16 73 69 123t124 58q222 25 671 25t671 -25q71 -8 124.5 -58t69.5 -123q14 -65 21.5 -147.5t8.5 -136.5t1 -150z" />
363 <glyph unicode="&#xf16b;" horiz-adv-x="1792" d="M402 829l494 -305l-342 -285l-490 319zM1388 274v-108l-490 -293v-1l-1 1l-1 -1v1l-489 293v108l147 -96l342 284v2l1 -1l1 1v-2l343 -284zM554 1418l342 -285l-494 -304l-338 270zM1390 829l338 -271l-489 -319l-343 285zM1239 1418l489 -319l-338 -270l-494 304z" />
364 <glyph unicode="&#xf16c;" horiz-adv-x="1408" d="M928 135v-151l-707 -1v151zM1169 481v-701l-1 -35v-1h-1132l-35 1h-1v736h121v-618h928v618h120zM241 393l704 -65l-13 -150l-705 65zM309 709l683 -183l-39 -146l-683 183zM472 1058l609 -360l-77 -130l-609 360zM832 1389l398 -585l-124 -85l-399 584zM1285 1536 l121 -697l-149 -26l-121 697z" />
365 <glyph unicode="&#xf16d;" d="M1362 110v648h-135q20 -63 20 -131q0 -126 -64 -232.5t-174 -168.5t-240 -62q-197 0 -337 135.5t-140 327.5q0 68 20 131h-141v-648q0 -26 17.5 -43.5t43.5 -17.5h1069q25 0 43 17.5t18 43.5zM1078 643q0 124 -90.5 211.5t-218.5 87.5q-127 0 -217.5 -87.5t-90.5 -211.5 t90.5 -211.5t217.5 -87.5q128 0 218.5 87.5t90.5 211.5zM1362 1003v165q0 28 -20 48.5t-49 20.5h-174q-29 0 -49 -20.5t-20 -48.5v-165q0 -29 20 -49t49 -20h174q29 0 49 20t20 49zM1536 1211v-1142q0 -81 -58 -139t-139 -58h-1142q-81 0 -139 58t-58 139v1142q0 81 58 139 t139 58h1142q81 0 139 -58t58 -139z" />
366 <glyph unicode="&#xf16e;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM698 640q0 88 -62 150t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150zM1262 640q0 88 -62 150 t-150 62t-150 -62t-62 -150t62 -150t150 -62t150 62t62 150z" />
367 <glyph unicode="&#xf170;" d="M768 914l201 -306h-402zM1133 384h94l-459 691l-459 -691h94l104 160h522zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
368 <glyph unicode="&#xf171;" horiz-adv-x="1408" d="M815 677q8 -63 -50.5 -101t-111.5 -6q-39 17 -53.5 58t-0.5 82t52 58q36 18 72.5 12t64 -35.5t27.5 -67.5zM926 698q-14 107 -113 164t-197 13q-63 -28 -100.5 -88.5t-34.5 -129.5q4 -91 77.5 -155t165.5 -56q91 8 152 84t50 168zM1165 1240q-20 27 -56 44.5t-58 22 t-71 12.5q-291 47 -566 -2q-43 -7 -66 -12t-55 -22t-50 -43q30 -28 76 -45.5t73.5 -22t87.5 -11.5q228 -29 448 -1q63 8 89.5 12t72.5 21.5t75 46.5zM1222 205q-8 -26 -15.5 -76.5t-14 -84t-28.5 -70t-58 -56.5q-86 -48 -189.5 -71.5t-202 -22t-201.5 18.5q-46 8 -81.5 18 t-76.5 27t-73 43.5t-52 61.5q-25 96 -57 292l6 16l18 9q223 -148 506.5 -148t507.5 148q21 -6 24 -23t-5 -45t-8 -37zM1403 1166q-26 -167 -111 -655q-5 -30 -27 -56t-43.5 -40t-54.5 -31q-252 -126 -610 -88q-248 27 -394 139q-15 12 -25.5 26.5t-17 35t-9 34t-6 39.5 t-5.5 35q-9 50 -26.5 150t-28 161.5t-23.5 147.5t-22 158q3 26 17.5 48.5t31.5 37.5t45 30t46 22.5t48 18.5q125 46 313 64q379 37 676 -50q155 -46 215 -122q16 -20 16.5 -51t-5.5 -54z" />
369 <glyph unicode="&#xf172;" d="M848 666q0 43 -41 66t-77 1q-43 -20 -42.5 -72.5t43.5 -70.5q39 -23 81 4t36 72zM928 682q8 -66 -36 -121t-110 -61t-119 40t-56 113q-2 49 25.5 93t72.5 64q70 31 141.5 -10t81.5 -118zM1100 1073q-20 -21 -53.5 -34t-53 -16t-63.5 -8q-155 -20 -324 0q-44 6 -63 9.5 t-52.5 16t-54.5 32.5q13 19 36 31t40 15.5t47 8.5q198 35 408 1q33 -5 51 -8.5t43 -16t39 -31.5zM1142 327q0 7 5.5 26.5t3 32t-17.5 16.5q-161 -106 -365 -106t-366 106l-12 -6l-5 -12q26 -154 41 -210q47 -81 204 -108q249 -46 428 53q34 19 49 51.5t22.5 85.5t12.5 71z M1272 1020q9 53 -8 75q-43 55 -155 88q-216 63 -487 36q-132 -12 -226 -46q-38 -15 -59.5 -25t-47 -34t-29.5 -54q8 -68 19 -138t29 -171t24 -137q1 -5 5 -31t7 -36t12 -27t22 -28q105 -80 284 -100q259 -28 440 63q24 13 39.5 23t31 29t19.5 40q48 267 80 473zM1536 1120 v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
370 <glyph unicode="&#xf173;" horiz-adv-x="1024" d="M944 207l80 -237q-23 -35 -111 -66t-177 -32q-104 -2 -190.5 26t-142.5 74t-95 106t-55.5 120t-16.5 118v544h-168v215q72 26 129 69.5t91 90t58 102t34 99t15 88.5q1 5 4.5 8.5t7.5 3.5h244v-424h333v-252h-334v-518q0 -30 6.5 -56t22.5 -52.5t49.5 -41.5t81.5 -14 q78 2 134 29z" />
371 <glyph unicode="&#xf174;" d="M1136 75l-62 183q-44 -22 -103 -22q-36 -1 -62 10.5t-38.5 31.5t-17.5 40.5t-5 43.5v398h257v194h-256v326h-188q-8 0 -9 -10q-5 -44 -17.5 -87t-39 -95t-77 -95t-118.5 -68v-165h130v-418q0 -57 21.5 -115t65 -111t121 -85.5t176.5 -30.5q69 1 136.5 25t85.5 50z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
372 <glyph unicode="&#xf175;" horiz-adv-x="768" d="M765 237q8 -19 -5 -35l-350 -384q-10 -10 -23 -10q-14 0 -24 10l-355 384q-13 16 -5 35q9 19 29 19h224v1248q0 14 9 23t23 9h192q14 0 23 -9t9 -23v-1248h224q21 0 29 -19z" />
373 <glyph unicode="&#xf176;" horiz-adv-x="768" d="M765 1043q-9 -19 -29 -19h-224v-1248q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v1248h-224q-21 0 -29 19t5 35l350 384q10 10 23 10q14 0 24 -10l355 -384q13 -16 5 -35z" />
374 <glyph unicode="&#xf177;" horiz-adv-x="1792" d="M1792 736v-192q0 -14 -9 -23t-23 -9h-1248v-224q0 -21 -19 -29t-35 5l-384 350q-10 10 -10 23q0 14 10 24l384 354q16 14 35 6q19 -9 19 -29v-224h1248q14 0 23 -9t9 -23z" />
375 <glyph unicode="&#xf178;" horiz-adv-x="1792" d="M1728 643q0 -14 -10 -24l-384 -354q-16 -14 -35 -6q-19 9 -19 29v224h-1248q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h1248v224q0 21 19 29t35 -5l384 -350q10 -10 10 -23z" />
376 <glyph unicode="&#xf179;" horiz-adv-x="1408" d="M1393 321q-39 -125 -123 -250q-129 -196 -257 -196q-49 0 -140 32q-86 32 -151 32q-61 0 -142 -33q-81 -34 -132 -34q-152 0 -301 259q-147 261 -147 503q0 228 113 374q112 144 284 144q72 0 177 -30q104 -30 138 -30q45 0 143 34q102 34 173 34q119 0 213 -65 q52 -36 104 -100q-79 -67 -114 -118q-65 -94 -65 -207q0 -124 69 -223t158 -126zM1017 1494q0 -61 -29 -136q-30 -75 -93 -138q-54 -54 -108 -72q-37 -11 -104 -17q3 149 78 257q74 107 250 148q1 -3 2.5 -11t2.5 -11q0 -4 0.5 -10t0.5 -10z" />
377 <glyph unicode="&#xf17a;" horiz-adv-x="1664" d="M682 530v-651l-682 94v557h682zM682 1273v-659h-682v565zM1664 530v-786l-907 125v661h907zM1664 1408v-794h-907v669z" />
378 <glyph unicode="&#xf17b;" horiz-adv-x="1408" d="M493 1053q16 0 27.5 11.5t11.5 27.5t-11.5 27.5t-27.5 11.5t-27 -11.5t-11 -27.5t11 -27.5t27 -11.5zM915 1053q16 0 27 11.5t11 27.5t-11 27.5t-27 11.5t-27.5 -11.5t-11.5 -27.5t11.5 -27.5t27.5 -11.5zM103 869q42 0 72 -30t30 -72v-430q0 -43 -29.5 -73t-72.5 -30 t-73 30t-30 73v430q0 42 30 72t73 30zM1163 850v-666q0 -46 -32 -78t-77 -32h-75v-227q0 -43 -30 -73t-73 -30t-73 30t-30 73v227h-138v-227q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73l-1 227h-74q-46 0 -78 32t-32 78v666h918zM931 1255q107 -55 171 -153.5t64 -215.5 h-925q0 117 64 215.5t172 153.5l-71 131q-7 13 5 20q13 6 20 -6l72 -132q95 42 201 42t201 -42l72 132q7 12 20 6q12 -7 5 -20zM1408 767v-430q0 -43 -30 -73t-73 -30q-42 0 -72 30t-30 73v430q0 43 30 72.5t72 29.5q43 0 73 -29.5t30 -72.5z" />
379 <glyph unicode="&#xf17c;" d="M663 1125q-11 -1 -15.5 -10.5t-8.5 -9.5q-5 -1 -5 5q0 12 19 15h10zM750 1111q-4 -1 -11.5 6.5t-17.5 4.5q24 11 32 -2q3 -6 -3 -9zM399 684q-4 1 -6 -3t-4.5 -12.5t-5.5 -13.5t-10 -13q-7 -10 -1 -12q4 -1 12.5 7t12.5 18q1 3 2 7t2 6t1.5 4.5t0.5 4v3t-1 2.5t-3 2z M1254 325q0 18 -55 42q4 15 7.5 27.5t5 26t3 21.5t0.5 22.5t-1 19.5t-3.5 22t-4 20.5t-5 25t-5.5 26.5q-10 48 -47 103t-72 75q24 -20 57 -83q87 -162 54 -278q-11 -40 -50 -42q-31 -4 -38.5 18.5t-8 83.5t-11.5 107q-9 39 -19.5 69t-19.5 45.5t-15.5 24.5t-13 15t-7.5 7 q-14 62 -31 103t-29.5 56t-23.5 33t-15 40q-4 21 6 53.5t4.5 49.5t-44.5 25q-15 3 -44.5 18t-35.5 16q-8 1 -11 26t8 51t36 27q37 3 51 -30t4 -58q-11 -19 -2 -26.5t30 -0.5q13 4 13 36v37q-5 30 -13.5 50t-21 30.5t-23.5 15t-27 7.5q-107 -8 -89 -134q0 -15 -1 -15 q-9 9 -29.5 10.5t-33 -0.5t-15.5 5q1 57 -16 90t-45 34q-27 1 -41.5 -27.5t-16.5 -59.5q-1 -15 3.5 -37t13 -37.5t15.5 -13.5q10 3 16 14q4 9 -7 8q-7 0 -15.5 14.5t-9.5 33.5q-1 22 9 37t34 14q17 0 27 -21t9.5 -39t-1.5 -22q-22 -15 -31 -29q-8 -12 -27.5 -23.5 t-20.5 -12.5q-13 -14 -15.5 -27t7.5 -18q14 -8 25 -19.5t16 -19t18.5 -13t35.5 -6.5q47 -2 102 15q2 1 23 7t34.5 10.5t29.5 13t21 17.5q9 14 20 8q5 -3 6.5 -8.5t-3 -12t-16.5 -9.5q-20 -6 -56.5 -21.5t-45.5 -19.5q-44 -19 -70 -23q-25 -5 -79 2q-10 2 -9 -2t17 -19 q25 -23 67 -22q17 1 36 7t36 14t33.5 17.5t30 17t24.5 12t17.5 2.5t8.5 -11q0 -2 -1 -4.5t-4 -5t-6 -4.5t-8.5 -5t-9 -4.5t-10 -5t-9.5 -4.5q-28 -14 -67.5 -44t-66.5 -43t-49 -1q-21 11 -63 73q-22 31 -25 22q-1 -3 -1 -10q0 -25 -15 -56.5t-29.5 -55.5t-21 -58t11.5 -63 q-23 -6 -62.5 -90t-47.5 -141q-2 -18 -1.5 -69t-5.5 -59q-8 -24 -29 -3q-32 31 -36 94q-2 28 4 56q4 19 -1 18l-4 -5q-36 -65 10 -166q5 -12 25 -28t24 -20q20 -23 104 -90.5t93 -76.5q16 -15 17.5 -38t-14 -43t-45.5 -23q8 -15 29 -44.5t28 -54t7 -70.5q46 24 7 92 q-4 8 -10.5 16t-9.5 12t-2 6q3 5 13 9.5t20 -2.5q46 -52 166 -36q133 15 177 87q23 38 34 30q12 -6 10 -52q-1 -25 -23 -92q-9 -23 -6 -37.5t24 -15.5q3 19 14.5 77t13.5 90q2 21 -6.5 73.5t-7.5 97t23 70.5q15 18 51 18q1 37 34.5 53t72.5 10.5t60 -22.5zM626 1152 q3 17 -2.5 30t-11.5 15q-9 2 -9 -7q2 -5 5 -6q10 0 7 -15q-3 -20 8 -20q3 0 3 3zM1045 955q-2 8 -6.5 11.5t-13 5t-14.5 5.5q-5 3 -9.5 8t-7 8t-5.5 6.5t-4 4t-4 -1.5q-14 -16 7 -43.5t39 -31.5q9 -1 14.5 8t3.5 20zM867 1168q0 11 -5 19.5t-11 12.5t-9 3q-14 -1 -7 -7l4 -2 q14 -4 18 -31q0 -3 8 2zM921 1401q0 2 -2.5 5t-9 7t-9.5 6q-15 15 -24 15q-9 -1 -11.5 -7.5t-1 -13t-0.5 -12.5q-1 -4 -6 -10.5t-6 -9t3 -8.5q4 -3 8 0t11 9t15 9q1 1 9 1t15 2t9 7zM1486 60q20 -12 31 -24.5t12 -24t-2.5 -22.5t-15.5 -22t-23.5 -19.5t-30 -18.5 t-31.5 -16.5t-32 -15.5t-27 -13q-38 -19 -85.5 -56t-75.5 -64q-17 -16 -68 -19.5t-89 14.5q-18 9 -29.5 23.5t-16.5 25.5t-22 19.5t-47 9.5q-44 1 -130 1q-19 0 -57 -1.5t-58 -2.5q-44 -1 -79.5 -15t-53.5 -30t-43.5 -28.5t-53.5 -11.5q-29 1 -111 31t-146 43q-19 4 -51 9.5 t-50 9t-39.5 9.5t-33.5 14.5t-17 19.5q-10 23 7 66.5t18 54.5q1 16 -4 40t-10 42.5t-4.5 36.5t10.5 27q14 12 57 14t60 12q30 18 42 35t12 51q21 -73 -32 -106q-32 -20 -83 -15q-34 3 -43 -10q-13 -15 5 -57q2 -6 8 -18t8.5 -18t4.5 -17t1 -22q0 -15 -17 -49t-14 -48 q3 -17 37 -26q20 -6 84.5 -18.5t99.5 -20.5q24 -6 74 -22t82.5 -23t55.5 -4q43 6 64.5 28t23 48t-7.5 58.5t-19 52t-20 36.5q-121 190 -169 242q-68 74 -113 40q-11 -9 -15 15q-3 16 -2 38q1 29 10 52t24 47t22 42q8 21 26.5 72t29.5 78t30 61t39 54q110 143 124 195 q-12 112 -16 310q-2 90 24 151.5t106 104.5q39 21 104 21q53 1 106 -13.5t89 -41.5q57 -42 91.5 -121.5t29.5 -147.5q-5 -95 30 -214q34 -113 133 -218q55 -59 99.5 -163t59.5 -191q8 -49 5 -84.5t-12 -55.5t-20 -22q-10 -2 -23.5 -19t-27 -35.5t-40.5 -33.5t-61 -14 q-18 1 -31.5 5t-22.5 13.5t-13.5 15.5t-11.5 20.5t-9 19.5q-22 37 -41 30t-28 -49t7 -97q20 -70 1 -195q-10 -65 18 -100.5t73 -33t85 35.5q59 49 89.5 66.5t103.5 42.5q53 18 77 36.5t18.5 34.5t-25 28.5t-51.5 23.5q-33 11 -49.5 48t-15 72.5t15.5 47.5q1 -31 8 -56.5 t14.5 -40.5t20.5 -28.5t21 -19t21.5 -13t16.5 -9.5z" />
380 <glyph unicode="&#xf17d;" d="M1024 36q-42 241 -140 498h-2l-2 -1q-16 -6 -43 -16.5t-101 -49t-137 -82t-131 -114.5t-103 -148l-15 11q184 -150 418 -150q132 0 256 52zM839 643q-21 49 -53 111q-311 -93 -673 -93q-1 -7 -1 -21q0 -124 44 -236.5t124 -201.5q50 89 123.5 166.5t142.5 124.5t130.5 81 t99.5 48l37 13q4 1 13 3.5t13 4.5zM732 855q-120 213 -244 378q-138 -65 -234 -186t-128 -272q302 0 606 80zM1416 536q-210 60 -409 29q87 -239 128 -469q111 75 185 189.5t96 250.5zM611 1277q-1 0 -2 -1q1 1 2 1zM1201 1132q-185 164 -433 164q-76 0 -155 -19 q131 -170 246 -382q69 26 130 60.5t96.5 61.5t65.5 57t37.5 40.5zM1424 647q-3 232 -149 410l-1 -1q-9 -12 -19 -24.5t-43.5 -44.5t-71 -60.5t-100 -65t-131.5 -64.5q25 -53 44 -95q2 -6 6.5 -17.5t7.5 -16.5q36 5 74.5 7t73.5 2t69 -1.5t64 -4t56.5 -5.5t48 -6.5t36.5 -6 t25 -4.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
381 <glyph unicode="&#xf17e;" d="M1173 473q0 50 -19.5 91.5t-48.5 68.5t-73 49t-82.5 34t-87.5 23l-104 24q-30 7 -44 10.5t-35 11.5t-30 16t-16.5 21t-7.5 30q0 77 144 77q43 0 77 -12t54 -28.5t38 -33.5t40 -29t48 -12q47 0 75.5 32t28.5 77q0 55 -56 99.5t-142 67.5t-182 23q-68 0 -132 -15.5 t-119.5 -47t-89 -87t-33.5 -128.5q0 -61 19 -106.5t56 -75.5t80 -48.5t103 -32.5l146 -36q90 -22 112 -36q32 -20 32 -60q0 -39 -40 -64.5t-105 -25.5q-51 0 -91.5 16t-65 38.5t-45.5 45t-46 38.5t-54 16q-50 0 -75.5 -30t-25.5 -75q0 -92 122 -157.5t291 -65.5 q73 0 140 18.5t122.5 53.5t88.5 93.5t33 131.5zM1536 256q0 -159 -112.5 -271.5t-271.5 -112.5q-130 0 -234 80q-77 -16 -150 -16q-143 0 -273.5 55.5t-225 150t-150 225t-55.5 273.5q0 73 16 150q-80 104 -80 234q0 159 112.5 271.5t271.5 112.5q130 0 234 -80 q77 16 150 16q143 0 273.5 -55.5t225 -150t150 -225t55.5 -273.5q0 -73 -16 -150q80 -104 80 -234z" />
382 <glyph unicode="&#xf180;" horiz-adv-x="1280" d="M1000 1102l37 194q5 23 -9 40t-35 17h-712q-23 0 -38.5 -17t-15.5 -37v-1101q0 -7 6 -1l291 352q23 26 38 33.5t48 7.5h239q22 0 37 14.5t18 29.5q24 130 37 191q4 21 -11.5 40t-36.5 19h-294q-29 0 -48 19t-19 48v42q0 29 19 47.5t48 18.5h346q18 0 35 13.5t20 29.5z M1227 1324q-15 -73 -53.5 -266.5t-69.5 -350t-35 -173.5q-6 -22 -9 -32.5t-14 -32.5t-24.5 -33t-38.5 -21t-58 -10h-271q-13 0 -22 -10q-8 -9 -426 -494q-22 -25 -58.5 -28.5t-48.5 5.5q-55 22 -55 98v1410q0 55 38 102.5t120 47.5h888q95 0 127 -53t10 -159zM1227 1324 l-158 -790q4 17 35 173.5t69.5 350t53.5 266.5z" />
383 <glyph unicode="&#xf181;" d="M704 192v1024q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-1024q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1376 576v640q0 14 -9 23t-23 9h-480q-14 0 -23 -9t-9 -23v-640q0 -14 9 -23t23 -9h480q14 0 23 9t9 23zM1536 1344v-1408q0 -26 -19 -45t-45 -19h-1408 q-26 0 -45 19t-19 45v1408q0 26 19 45t45 19h1408q26 0 45 -19t19 -45z" />
384 <glyph unicode="&#xf182;" horiz-adv-x="1280" d="M1280 480q0 -40 -28 -68t-68 -28q-51 0 -80 43l-227 341h-45v-132l247 -411q9 -15 9 -33q0 -26 -19 -45t-45 -19h-192v-272q0 -46 -33 -79t-79 -33h-160q-46 0 -79 33t-33 79v272h-192q-26 0 -45 19t-19 45q0 18 9 33l247 411v132h-45l-227 -341q-29 -43 -80 -43 q-40 0 -68 28t-28 68q0 29 16 53l256 384q73 107 176 107h384q103 0 176 -107l256 -384q16 -24 16 -53zM864 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
385 <glyph unicode="&#xf183;" horiz-adv-x="1024" d="M1024 832v-416q0 -40 -28 -68t-68 -28t-68 28t-28 68v352h-64v-912q0 -46 -33 -79t-79 -33t-79 33t-33 79v464h-64v-464q0 -46 -33 -79t-79 -33t-79 33t-33 79v912h-64v-352q0 -40 -28 -68t-68 -28t-68 28t-28 68v416q0 80 56 136t136 56h640q80 0 136 -56t56 -136z M736 1280q0 -93 -65.5 -158.5t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
386 <glyph unicode="&#xf184;" d="M773 234l350 473q16 22 24.5 59t-6 85t-61.5 79q-40 26 -83 25.5t-73.5 -17.5t-54.5 -45q-36 -40 -96 -40q-59 0 -95 40q-24 28 -54.5 45t-73.5 17.5t-84 -25.5q-46 -31 -60.5 -79t-6 -85t24.5 -59zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
387 <glyph unicode="&#xf185;" horiz-adv-x="1792" d="M1472 640q0 117 -45.5 223.5t-123 184t-184 123t-223.5 45.5t-223.5 -45.5t-184 -123t-123 -184t-45.5 -223.5t45.5 -223.5t123 -184t184 -123t223.5 -45.5t223.5 45.5t184 123t123 184t45.5 223.5zM1748 363q-4 -15 -20 -20l-292 -96v-306q0 -16 -13 -26q-15 -10 -29 -4 l-292 94l-180 -248q-10 -13 -26 -13t-26 13l-180 248l-292 -94q-14 -6 -29 4q-13 10 -13 26v306l-292 96q-16 5 -20 20q-5 17 4 29l180 248l-180 248q-9 13 -4 29q4 15 20 20l292 96v306q0 16 13 26q15 10 29 4l292 -94l180 248q9 12 26 12t26 -12l180 -248l292 94 q14 6 29 -4q13 -10 13 -26v-306l292 -96q16 -5 20 -20q5 -16 -4 -29l-180 -248l180 -248q9 -12 4 -29z" />
388 <glyph unicode="&#xf186;" d="M1262 233q-54 -9 -110 -9q-182 0 -337 90t-245 245t-90 337q0 192 104 357q-201 -60 -328.5 -229t-127.5 -384q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51q144 0 273.5 61.5t220.5 171.5zM1465 318q-94 -203 -283.5 -324.5t-413.5 -121.5q-156 0 -298 61 t-245 164t-164 245t-61 298q0 153 57.5 292.5t156 241.5t235.5 164.5t290 68.5q44 2 61 -39q18 -41 -15 -72q-86 -78 -131.5 -181.5t-45.5 -218.5q0 -148 73 -273t198 -198t273 -73q118 0 228 51q41 18 72 -13q14 -14 17.5 -34t-4.5 -38z" />
389 <glyph unicode="&#xf187;" horiz-adv-x="1792" d="M1088 704q0 26 -19 45t-45 19h-256q-26 0 -45 -19t-19 -45t19 -45t45 -19h256q26 0 45 19t19 45zM1664 896v-960q0 -26 -19 -45t-45 -19h-1408q-26 0 -45 19t-19 45v960q0 26 19 45t45 19h1408q26 0 45 -19t19 -45zM1728 1344v-256q0 -26 -19 -45t-45 -19h-1536 q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h1536q26 0 45 -19t19 -45z" />
390 <glyph unicode="&#xf188;" horiz-adv-x="1664" d="M1632 576q0 -26 -19 -45t-45 -19h-224q0 -171 -67 -290l208 -209q19 -19 19 -45t-19 -45q-18 -19 -45 -19t-45 19l-198 197q-5 -5 -15 -13t-42 -28.5t-65 -36.5t-82 -29t-97 -13v896h-128v-896q-51 0 -101.5 13.5t-87 33t-66 39t-43.5 32.5l-15 14l-183 -207 q-20 -21 -48 -21q-24 0 -43 16q-19 18 -20.5 44.5t15.5 46.5l202 227q-58 114 -58 274h-224q-26 0 -45 19t-19 45t19 45t45 19h224v294l-173 173q-19 19 -19 45t19 45t45 19t45 -19l173 -173h844l173 173q19 19 45 19t45 -19t19 -45t-19 -45l-173 -173v-294h224q26 0 45 -19 t19 -45zM1152 1152h-640q0 133 93.5 226.5t226.5 93.5t226.5 -93.5t93.5 -226.5z" />
391 <glyph unicode="&#xf189;" horiz-adv-x="1920" d="M1917 1016q23 -64 -150 -294q-24 -32 -65 -85q-78 -100 -90 -131q-17 -41 14 -81q17 -21 81 -82h1l1 -1l1 -1l2 -2q141 -131 191 -221q3 -5 6.5 -12.5t7 -26.5t-0.5 -34t-25 -27.5t-59 -12.5l-256 -4q-24 -5 -56 5t-52 22l-20 12q-30 21 -70 64t-68.5 77.5t-61 58 t-56.5 15.5q-3 -1 -8 -3.5t-17 -14.5t-21.5 -29.5t-17 -52t-6.5 -77.5q0 -15 -3.5 -27.5t-7.5 -18.5l-4 -5q-18 -19 -53 -22h-115q-71 -4 -146 16.5t-131.5 53t-103 66t-70.5 57.5l-25 24q-10 10 -27.5 30t-71.5 91t-106 151t-122.5 211t-130.5 272q-6 16 -6 27t3 16l4 6 q15 19 57 19l274 2q12 -2 23 -6.5t16 -8.5l5 -3q16 -11 24 -32q20 -50 46 -103.5t41 -81.5l16 -29q29 -60 56 -104t48.5 -68.5t41.5 -38.5t34 -14t27 5q2 1 5 5t12 22t13.5 47t9.5 81t0 125q-2 40 -9 73t-14 46l-6 12q-25 34 -85 43q-13 2 5 24q17 19 38 30q53 26 239 24 q82 -1 135 -13q20 -5 33.5 -13.5t20.5 -24t10.5 -32t3.5 -45.5t-1 -55t-2.5 -70.5t-1.5 -82.5q0 -11 -1 -42t-0.5 -48t3.5 -40.5t11.5 -39t22.5 -24.5q8 -2 17 -4t26 11t38 34.5t52 67t68 107.5q60 104 107 225q4 10 10 17.5t11 10.5l4 3l5 2.5t13 3t20 0.5l288 2 q39 5 64 -2.5t31 -16.5z" />
392 <glyph unicode="&#xf18a;" horiz-adv-x="1792" d="M675 252q21 34 11 69t-45 50q-34 14 -73 1t-60 -46q-22 -34 -13 -68.5t43 -50.5t74.5 -2.5t62.5 47.5zM769 373q8 13 3.5 26.5t-17.5 18.5q-14 5 -28.5 -0.5t-21.5 -18.5q-17 -31 13 -45q14 -5 29 0.5t22 18.5zM943 266q-45 -102 -158 -150t-224 -12 q-107 34 -147.5 126.5t6.5 187.5q47 93 151.5 139t210.5 19q111 -29 158.5 -119.5t2.5 -190.5zM1255 426q-9 96 -89 170t-208.5 109t-274.5 21q-223 -23 -369.5 -141.5t-132.5 -264.5q9 -96 89 -170t208.5 -109t274.5 -21q223 23 369.5 141.5t132.5 264.5zM1563 422 q0 -68 -37 -139.5t-109 -137t-168.5 -117.5t-226 -83t-270.5 -31t-275 33.5t-240.5 93t-171.5 151t-65 199.5q0 115 69.5 245t197.5 258q169 169 341.5 236t246.5 -7q65 -64 20 -209q-4 -14 -1 -20t10 -7t14.5 0.5t13.5 3.5l6 2q139 59 246 59t153 -61q45 -63 0 -178 q-2 -13 -4.5 -20t4.5 -12.5t12 -7.5t17 -6q57 -18 103 -47t80 -81.5t34 -116.5zM1489 1046q42 -47 54.5 -108.5t-6.5 -117.5q-8 -23 -29.5 -34t-44.5 -4q-23 8 -34 29.5t-4 44.5q20 63 -24 111t-107 35q-24 -5 -45 8t-25 37q-5 24 8 44.5t37 25.5q60 13 119 -5.5t101 -65.5z M1670 1209q87 -96 112.5 -222.5t-13.5 -241.5q-9 -27 -34 -40t-52 -4t-40 34t-5 52q28 82 10 172t-80 158q-62 69 -148 95.5t-173 8.5q-28 -6 -52 9.5t-30 43.5t9.5 51.5t43.5 29.5q123 26 244 -11.5t208 -134.5z" />
393 <glyph unicode="&#xf18b;" d="M1133 -34q-171 -94 -368 -94q-196 0 -367 94q138 87 235.5 211t131.5 268q35 -144 132.5 -268t235.5 -211zM638 1394v-485q0 -252 -126.5 -459.5t-330.5 -306.5q-181 215 -181 495q0 187 83.5 349.5t229.5 269.5t325 137zM1536 638q0 -280 -181 -495 q-204 99 -330.5 306.5t-126.5 459.5v485q179 -30 325 -137t229.5 -269.5t83.5 -349.5z" />
394 <glyph unicode="&#xf18c;" horiz-adv-x="1408" d="M1402 433q-32 -80 -76 -138t-91 -88.5t-99 -46.5t-101.5 -14.5t-96.5 8.5t-86.5 22t-69.5 27.5t-46 22.5l-17 10q-113 -228 -289.5 -359.5t-384.5 -132.5q-19 0 -32 13t-13 32t13 31.5t32 12.5q173 1 322.5 107.5t251.5 294.5q-36 -14 -72 -23t-83 -13t-91 2.5t-93 28.5 t-92 59t-84.5 100t-74.5 146q114 47 214 57t167.5 -7.5t124.5 -56.5t88.5 -77t56.5 -82q53 131 79 291q-7 -1 -18 -2.5t-46.5 -2.5t-69.5 0.5t-81.5 10t-88.5 23t-84 42.5t-75 65t-54.5 94.5t-28.5 127.5q70 28 133.5 36.5t112.5 -1t92 -30t73.5 -50t56 -61t42 -63t27.5 -56 t16 -39.5l4 -16q12 122 12 195q-8 6 -21.5 16t-49 44.5t-63.5 71.5t-54 93t-33 112.5t12 127t70 138.5q73 -25 127.5 -61.5t84.5 -76.5t48 -85t20.5 -89t-0.5 -85.5t-13 -76.5t-19 -62t-17 -42l-7 -15q1 -5 1 -50.5t-1 -71.5q3 7 10 18.5t30.5 43t50.5 58t71 55.5t91.5 44.5 t112 14.5t132.5 -24q-2 -78 -21.5 -141.5t-50 -104.5t-69.5 -71.5t-81.5 -45.5t-84.5 -24t-80 -9.5t-67.5 1t-46.5 4.5l-17 3q-23 -147 -73 -283q6 7 18 18.5t49.5 41t77.5 52.5t99.5 42t117.5 20t129 -23.5t137 -77.5z" />
395 <glyph unicode="&#xf18d;" horiz-adv-x="1280" d="M1259 283v-66q0 -85 -57.5 -144.5t-138.5 -59.5h-57l-260 -269v269h-529q-81 0 -138.5 59.5t-57.5 144.5v66h1238zM1259 609v-255h-1238v255h1238zM1259 937v-255h-1238v255h1238zM1259 1077v-67h-1238v67q0 84 57.5 143.5t138.5 59.5h846q81 0 138.5 -59.5t57.5 -143.5z " />
396 <glyph unicode="&#xf18e;" d="M1152 640q0 -14 -9 -23l-320 -320q-9 -9 -23 -9q-13 0 -22.5 9.5t-9.5 22.5v192h-352q-13 0 -22.5 9.5t-9.5 22.5v192q0 13 9.5 22.5t22.5 9.5h352v192q0 14 9 23t23 9q12 0 24 -10l319 -319q9 -9 9 -23zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
397 <glyph unicode="&#xf190;" d="M1152 736v-192q0 -13 -9.5 -22.5t-22.5 -9.5h-352v-192q0 -14 -9 -23t-23 -9q-12 0 -24 10l-319 319q-9 9 -9 23t9 23l320 320q9 9 23 9q13 0 22.5 -9.5t9.5 -22.5v-192h352q13 0 22.5 -9.5t9.5 -22.5zM1312 640q0 148 -73 273t-198 198t-273 73t-273 -73t-198 -198 t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
398 <glyph unicode="&#xf191;" d="M1024 960v-640q0 -26 -19 -45t-45 -19q-20 0 -37 12l-448 320q-27 19 -27 52t27 52l448 320q17 12 37 12q26 0 45 -19t19 -45zM1280 160v960q0 13 -9.5 22.5t-22.5 9.5h-960q-13 0 -22.5 -9.5t-9.5 -22.5v-960q0 -13 9.5 -22.5t22.5 -9.5h960q13 0 22.5 9.5t9.5 22.5z M1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
399 <glyph unicode="&#xf192;" d="M1024 640q0 -106 -75 -181t-181 -75t-181 75t-75 181t75 181t181 75t181 -75t75 -181zM768 1184q-148 0 -273 -73t-198 -198t-73 -273t73 -273t198 -198t273 -73t273 73t198 198t73 273t-73 273t-198 198t-273 73zM1536 640q0 -209 -103 -385.5t-279.5 -279.5 t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
400 <glyph unicode="&#xf193;" horiz-adv-x="1664" d="M1023 349l102 -204q-58 -179 -210 -290t-339 -111q-156 0 -288.5 77.5t-210 210t-77.5 288.5q0 181 104.5 330t274.5 211l17 -131q-122 -54 -195 -165.5t-73 -244.5q0 -185 131.5 -316.5t316.5 -131.5q126 0 232.5 65t165 175.5t49.5 236.5zM1571 249l58 -114l-256 -128 q-13 -7 -29 -7q-40 0 -57 35l-239 477h-472q-24 0 -42.5 16.5t-21.5 40.5l-96 779q-2 16 6 42q14 51 57 82.5t97 31.5q66 0 113 -47t47 -113q0 -69 -52 -117.5t-120 -41.5l37 -289h423v-128h-407l16 -128h455q40 0 57 -35l228 -455z" />
401 <glyph unicode="&#xf194;" d="M1254 899q16 85 -21 132q-52 65 -187 45q-17 -3 -41 -12.5t-57.5 -30.5t-64.5 -48.5t-59.5 -70t-44.5 -91.5q80 7 113.5 -16t26.5 -99q-5 -52 -52 -143q-43 -78 -71 -99q-44 -32 -87 14q-23 24 -37.5 64.5t-19 73t-10 84t-8.5 71.5q-23 129 -34 164q-12 37 -35.5 69 t-50.5 40q-57 16 -127 -25q-54 -32 -136.5 -106t-122.5 -102v-7q16 -8 25.5 -26t21.5 -20q21 -3 54.5 8.5t58 10.5t41.5 -30q11 -18 18.5 -38.5t15 -48t12.5 -40.5q17 -46 53 -187q36 -146 57 -197q42 -99 103 -125q43 -12 85 -1.5t76 31.5q131 77 250 237 q104 139 172.5 292.5t82.5 226.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
402 <glyph unicode="&#xf195;" horiz-adv-x="1152" d="M1152 704q0 -191 -94.5 -353t-256.5 -256.5t-353 -94.5h-160q-14 0 -23 9t-9 23v611l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v93l-215 -66q-3 -1 -9 -1q-10 0 -19 6q-13 10 -13 26v128q0 23 23 31l233 71v250q0 14 9 23t23 9h160 q14 0 23 -9t9 -23v-181l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-93l375 116q15 5 28 -5t13 -26v-128q0 -23 -23 -31l-393 -121v-487q188 13 318 151t130 328q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
403 <glyph unicode="&#xf196;" horiz-adv-x="1408" d="M1152 736v-64q0 -14 -9 -23t-23 -9h-352v-352q0 -14 -9 -23t-23 -9h-64q-14 0 -23 9t-9 23v352h-352q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h352v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23v-352h352q14 0 23 -9t9 -23zM1280 288v832q0 66 -47 113t-113 47h-832 q-66 0 -113 -47t-47 -113v-832q0 -66 47 -113t113 -47h832q66 0 113 47t47 113zM1408 1120v-832q0 -119 -84.5 -203.5t-203.5 -84.5h-832q-119 0 -203.5 84.5t-84.5 203.5v832q0 119 84.5 203.5t203.5 84.5h832q119 0 203.5 -84.5t84.5 -203.5z" />
404 <glyph unicode="&#xf197;" horiz-adv-x="2176" d="M620 416q-110 -64 -268 -64h-128v64h-64q-13 0 -22.5 23.5t-9.5 56.5q0 24 7 49q-58 2 -96.5 10.5t-38.5 20.5t38.5 20.5t96.5 10.5q-7 25 -7 49q0 33 9.5 56.5t22.5 23.5h64v64h128q158 0 268 -64h1113q42 -7 106.5 -18t80.5 -14q89 -15 150 -40.5t83.5 -47.5t22.5 -40 t-22.5 -40t-83.5 -47.5t-150 -40.5q-16 -3 -80.5 -14t-106.5 -18h-1113zM1739 668q53 -36 53 -92t-53 -92l81 -30q68 48 68 122t-68 122zM625 400h1015q-217 -38 -456 -80q-57 0 -113 -24t-83 -48l-28 -24l-288 -288q-26 -26 -70.5 -45t-89.5 -19h-96l-93 464h29 q157 0 273 64zM352 816h-29l93 464h96q46 0 90 -19t70 -45l288 -288q4 -4 11 -10.5t30.5 -23t48.5 -29t61.5 -23t72.5 -10.5l456 -80h-1015q-116 64 -273 64z" />
405 <glyph unicode="&#xf198;" horiz-adv-x="1664" d="M1519 760q62 0 103.5 -40.5t41.5 -101.5q0 -97 -93 -130l-172 -59l56 -167q7 -21 7 -47q0 -59 -42 -102t-101 -43q-47 0 -85.5 27t-53.5 72l-55 165l-310 -106l55 -164q8 -24 8 -47q0 -59 -42 -102t-102 -43q-47 0 -85 27t-53 72l-55 163l-153 -53q-29 -9 -50 -9 q-61 0 -101.5 40t-40.5 101q0 47 27.5 85t71.5 53l156 53l-105 313l-156 -54q-26 -8 -48 -8q-60 0 -101 40.5t-41 100.5q0 47 27.5 85t71.5 53l157 53l-53 159q-8 24 -8 47q0 60 42 102.5t102 42.5q47 0 85 -27t53 -72l54 -160l310 105l-54 160q-8 24 -8 47q0 59 42.5 102 t101.5 43q47 0 85.5 -27.5t53.5 -71.5l53 -161l162 55q21 6 43 6q60 0 102.5 -39.5t42.5 -98.5q0 -45 -30 -81.5t-74 -51.5l-157 -54l105 -316l164 56q24 8 46 8zM725 498l310 105l-105 315l-310 -107z" />
406 <glyph unicode="&#xf199;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM1280 352v436q-31 -35 -64 -55q-34 -22 -132.5 -85t-151.5 -99q-98 -69 -164 -69v0v0q-66 0 -164 69 q-46 32 -141.5 92.5t-142.5 92.5q-12 8 -33 27t-31 27v-436q0 -40 28 -68t68 -28h832q40 0 68 28t28 68zM1280 925q0 41 -27.5 70t-68.5 29h-832q-40 0 -68 -28t-28 -68q0 -37 30.5 -76.5t67.5 -64.5q47 -32 137.5 -89t129.5 -83q3 -2 17 -11.5t21 -14t21 -13t23.5 -13 t21.5 -9.5t22.5 -7.5t20.5 -2.5t20.5 2.5t22.5 7.5t21.5 9.5t23.5 13t21 13t21 14t17 11.5l267 174q35 23 66.5 62.5t31.5 73.5z" />
407 <glyph unicode="&#xf19a;" horiz-adv-x="1792" d="M127 640q0 163 67 313l367 -1005q-196 95 -315 281t-119 411zM1415 679q0 -19 -2.5 -38.5t-10 -49.5t-11.5 -44t-17.5 -59t-17.5 -58l-76 -256l-278 826q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-75 1 -202 10q-12 1 -20.5 -5t-11.5 -15t-1.5 -18.5t9 -16.5 t19.5 -8l80 -8l120 -328l-168 -504l-280 832q46 3 88 8q19 2 26 18.5t-2.5 31t-28.5 13.5l-205 -10q-7 0 -23 0.5t-26 0.5q105 160 274.5 253.5t367.5 93.5q147 0 280.5 -53t238.5 -149h-10q-55 0 -92 -40.5t-37 -95.5q0 -12 2 -24t4 -21.5t8 -23t9 -21t12 -22.5t12.5 -21 t14.5 -24t14 -23q63 -107 63 -212zM909 573l237 -647q1 -6 5 -11q-126 -44 -255 -44q-112 0 -217 32zM1570 1009q95 -174 95 -369q0 -209 -104 -385.5t-279 -278.5l235 678q59 169 59 276q0 42 -6 79zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286 t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 -215q173 0 331.5 68t273 182.5t182.5 273t68 331.5t-68 331.5t-182.5 273t-273 182.5t-331.5 68t-331.5 -68t-273 -182.5t-182.5 -273t-68 -331.5t68 -331.5t182.5 -273 t273 -182.5t331.5 -68z" />
408 <glyph unicode="&#xf19b;" horiz-adv-x="1792" d="M1086 1536v-1536l-272 -128q-228 20 -414 102t-293 208.5t-107 272.5q0 140 100.5 263.5t275 205.5t391.5 108v-172q-217 -38 -356.5 -150t-139.5 -255q0 -152 154.5 -267t388.5 -145v1360zM1755 954l37 -390l-525 114l147 83q-119 70 -280 99v172q277 -33 481 -157z" />
409 <glyph unicode="&#xf19c;" horiz-adv-x="2048" d="M960 1536l960 -384v-128h-128q0 -26 -20.5 -45t-48.5 -19h-1526q-28 0 -48.5 19t-20.5 45h-128v128zM256 896h256v-768h128v768h256v-768h128v768h256v-768h128v768h256v-768h59q28 0 48.5 -19t20.5 -45v-64h-1664v64q0 26 20.5 45t48.5 19h59v768zM1851 -64 q28 0 48.5 -19t20.5 -45v-128h-1920v128q0 26 20.5 45t48.5 19h1782z" />
410 <glyph unicode="&#xf19d;" horiz-adv-x="2304" d="M1774 700l18 -316q4 -69 -82 -128t-235 -93.5t-323 -34.5t-323 34.5t-235 93.5t-82 128l18 316l574 -181q22 -7 48 -7t48 7zM2304 1024q0 -23 -22 -31l-1120 -352q-4 -1 -10 -1t-10 1l-652 206q-43 -34 -71 -111.5t-34 -178.5q63 -36 63 -109q0 -69 -58 -107l58 -433 q2 -14 -8 -25q-9 -11 -24 -11h-192q-15 0 -24 11q-10 11 -8 25l58 433q-58 38 -58 107q0 73 65 111q11 207 98 330l-333 104q-22 8 -22 31t22 31l1120 352q4 1 10 1t10 -1l1120 -352q22 -8 22 -31z" />
411 <glyph unicode="&#xf19e;" d="M859 579l13 -707q-62 11 -105 11q-41 0 -105 -11l13 707q-40 69 -168.5 295.5t-216.5 374.5t-181 287q58 -15 108 -15q43 0 111 15q63 -111 133.5 -229.5t167 -276.5t138.5 -227q37 61 109.5 177.5t117.5 190t105 176t107 189.5q54 -14 107 -14q56 0 114 14v0 q-28 -39 -60 -88.5t-49.5 -78.5t-56.5 -96t-49 -84q-146 -248 -353 -610z" />
412 <glyph unicode="&#xf1a0;" horiz-adv-x="1280" d="M981 197q0 25 -7 49t-14.5 42t-27 41.5t-29.5 35t-38.5 34.5t-36.5 29t-41.5 30t-36.5 26q-16 2 -49 2q-53 0 -104.5 -7t-107 -25t-97 -46t-68.5 -74.5t-27 -105.5q0 -56 23.5 -102t61 -75.5t87 -50t100 -29t101.5 -8.5q58 0 111.5 13t99 39t73 73t27.5 109zM864 1055 q0 59 -17 125.5t-48 129t-84 103.5t-117 41q-42 0 -82.5 -19.5t-66.5 -52.5q-46 -59 -46 -160q0 -46 10 -97.5t31.5 -103t52 -92.5t75 -67t96.5 -26q37 0 77.5 16.5t65.5 43.5q53 56 53 159zM752 1536h417l-137 -88h-132q75 -63 113 -133t38 -160q0 -72 -24.5 -129.5 t-59.5 -93t-69.5 -65t-59 -61.5t-24.5 -66q0 -36 32 -70.5t77 -68t90.5 -73.5t77.5 -104t32 -142q0 -91 -49 -173q-71 -122 -209.5 -179.5t-298.5 -57.5q-132 0 -246.5 41.5t-172.5 137.5q-36 59 -36 131q0 81 44.5 150t118.5 115q131 82 404 100q-32 41 -47.5 73.5 t-15.5 73.5q0 40 21 85q-46 -4 -68 -4q-148 0 -249.5 96.5t-101.5 244.5q0 82 36 159t99 131q76 66 182 98t218 32z" />
413 <glyph unicode="&#xf1a1;" horiz-adv-x="1984" d="M831 572q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41t96.5 -41t40.5 -98zM1292 711q56 0 96.5 -41t40.5 -98q0 -56 -40.5 -96t-96.5 -40q-57 0 -98 40t-41 96q0 57 41.5 98t97.5 41zM1984 722q0 -62 -31 -114t-83 -82q5 -33 5 -61 q0 -121 -68.5 -230.5t-197.5 -193.5q-125 -82 -285.5 -125.5t-335.5 -43.5q-176 0 -336.5 43.5t-284.5 125.5q-129 84 -197.5 193t-68.5 231q0 29 5 66q-48 31 -77 81.5t-29 109.5q0 94 66 160t160 66q83 0 148 -55q248 158 592 164l134 423q4 14 17.5 21.5t28.5 4.5 l347 -82q22 50 68.5 81t102.5 31q77 0 131.5 -54.5t54.5 -131.5t-54.5 -132t-131.5 -55q-76 0 -130.5 54t-55.5 131l-315 74l-116 -366q327 -14 560 -166q64 58 151 58q94 0 160 -66t66 -160zM1664 1459q-45 0 -77 -32t-32 -77t32 -77t77 -32t77 32t32 77t-32 77t-77 32z M77 722q0 -67 51 -111q49 131 180 235q-36 25 -82 25q-62 0 -105.5 -43.5t-43.5 -105.5zM1567 105q112 73 171.5 166t59.5 194t-59.5 193.5t-171.5 165.5q-116 75 -265.5 115.5t-313.5 40.5t-313.5 -40.5t-265.5 -115.5q-112 -73 -171.5 -165.5t-59.5 -193.5t59.5 -194 t171.5 -166q116 -75 265.5 -115.5t313.5 -40.5t313.5 40.5t265.5 115.5zM1850 605q57 46 57 117q0 62 -43.5 105.5t-105.5 43.5q-49 0 -86 -28q131 -105 178 -238zM1258 237q11 11 27 11t27 -11t11 -27.5t-11 -27.5q-99 -99 -319 -99h-2q-220 0 -319 99q-11 11 -11 27.5 t11 27.5t27 11t27 -11q77 -77 265 -77h2q188 0 265 77z" />
414 <glyph unicode="&#xf1a2;" d="M950 393q7 7 17.5 7t17.5 -7t7 -18t-7 -18q-65 -64 -208 -64h-1h-1q-143 0 -207 64q-8 7 -8 18t8 18q7 7 17.5 7t17.5 -7q49 -51 172 -51h1h1q122 0 173 51zM671 613q0 -37 -26 -64t-63 -27t-63 27t-26 64t26 63t63 26t63 -26t26 -63zM1214 1049q-29 0 -50 21t-21 50 q0 30 21 51t50 21q30 0 51 -21t21 -51q0 -29 -21 -50t-51 -21zM1216 1408q132 0 226 -94t94 -227v-894q0 -133 -94 -227t-226 -94h-896q-132 0 -226 94t-94 227v894q0 133 94 227t226 94h896zM1321 596q35 14 57 45.5t22 70.5q0 51 -36 87.5t-87 36.5q-60 0 -98 -48 q-151 107 -375 115l83 265l206 -49q1 -50 36.5 -85t84.5 -35q50 0 86 35.5t36 85.5t-36 86t-86 36q-36 0 -66 -20.5t-45 -53.5l-227 54q-9 2 -17.5 -2.5t-11.5 -14.5l-95 -302q-224 -4 -381 -113q-36 43 -93 43q-51 0 -87 -36.5t-36 -87.5q0 -37 19.5 -67.5t52.5 -45.5 q-7 -25 -7 -54q0 -98 74 -181.5t201.5 -132t278.5 -48.5q150 0 277.5 48.5t201.5 132t74 181.5q0 27 -6 54zM971 702q37 0 63 -26t26 -63t-26 -64t-63 -27t-63 27t-26 64t26 63t63 26z" />
415 <glyph unicode="&#xf1a3;" d="M866 697l90 27v62q0 79 -58 135t-138 56t-138 -55.5t-58 -134.5v-283q0 -20 -14 -33.5t-33 -13.5t-32.5 13.5t-13.5 33.5v120h-151v-122q0 -82 57.5 -139t139.5 -57q81 0 138.5 56.5t57.5 136.5v280q0 19 13.5 33t33.5 14q19 0 32.5 -14t13.5 -33v-54zM1199 502v122h-150 v-126q0 -20 -13.5 -33.5t-33.5 -13.5q-19 0 -32.5 14t-13.5 33v123l-90 -26l-60 28v-123q0 -80 58 -137t139 -57t138.5 57t57.5 139zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103 t385.5 -103t279.5 -279.5t103 -385.5z" />
416 <glyph unicode="&#xf1a4;" horiz-adv-x="1920" d="M1062 824v118q0 42 -30 72t-72 30t-72 -30t-30 -72v-612q0 -175 -126 -299t-303 -124q-178 0 -303.5 125.5t-125.5 303.5v266h328v-262q0 -43 30 -72.5t72 -29.5t72 29.5t30 72.5v620q0 171 126.5 292t301.5 121q176 0 302 -122t126 -294v-136l-195 -58zM1592 602h328 v-266q0 -178 -125.5 -303.5t-303.5 -125.5q-177 0 -303 124.5t-126 300.5v268l131 -61l195 58v-270q0 -42 30 -71.5t72 -29.5t72 29.5t30 71.5v275z" />
417 <glyph unicode="&#xf1a5;" d="M1472 160v480h-704v704h-480q-93 0 -158.5 -65.5t-65.5 -158.5v-480h704v-704h480q93 0 158.5 65.5t65.5 158.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5 t84.5 -203.5z" />
418 <glyph unicode="&#xf1a6;" horiz-adv-x="2048" d="M328 1254h204v-983h-532v697h328v286zM328 435v369h-123v-369h123zM614 968v-697h205v697h-205zM614 1254v-204h205v204h-205zM901 968h533v-942h-533v163h328v82h-328v697zM1229 435v369h-123v-369h123zM1516 968h532v-942h-532v163h327v82h-327v697zM1843 435v369h-123 v-369h123z" />
419 <glyph unicode="&#xf1a7;" d="M1046 516q0 -64 -38 -109t-91 -45q-43 0 -70 15v277q28 17 70 17q53 0 91 -45.5t38 -109.5zM703 944q0 -64 -38 -109.5t-91 -45.5q-43 0 -70 15v277q28 17 70 17q53 0 91 -45t38 -109zM1265 513q0 134 -88 229t-213 95q-20 0 -39 -3q-23 -78 -78 -136q-87 -95 -211 -101 v-636l211 41v206q51 -19 117 -19q125 0 213 95t88 229zM922 940q0 134 -88.5 229t-213.5 95q-74 0 -141 -36h-186v-840l211 41v206q55 -19 116 -19q125 0 213.5 95t88.5 229zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
420 <glyph unicode="&#xf1a8;" horiz-adv-x="2038" d="M1222 607q75 3 143.5 -20.5t118 -58.5t101 -94.5t84 -108t75.5 -120.5q33 -56 78.5 -109t75.5 -80.5t99 -88.5q-48 -30 -108.5 -57.5t-138.5 -59t-114 -47.5q-44 37 -74 115t-43.5 164.5t-33 180.5t-42.5 168.5t-72.5 123t-122.5 48.5l-10 -2l-6 -4q4 -5 13 -14 q6 -5 28 -23.5t25.5 -22t19 -18t18 -20.5t11.5 -21t10.5 -27.5t4.5 -31t4 -40.5l1 -33q1 -26 -2.5 -57.5t-7.5 -52t-12.5 -58.5t-11.5 -53q-35 1 -101 -9.5t-98 -10.5q-39 0 -72 10q-2 16 -2 47q0 74 3 96q2 13 31.5 41.5t57 59t26.5 51.5q-24 2 -43 -24 q-36 -53 -111.5 -99.5t-136.5 -46.5q-25 0 -75.5 63t-106.5 139.5t-84 96.5q-6 4 -27 30q-482 -112 -513 -112q-16 0 -28 11t-12 27q0 15 8.5 26.5t22.5 14.5l486 106q-8 14 -8 25t5.5 17.5t16 11.5t20 7t23 4.5t18.5 4.5q4 1 15.5 7.5t17.5 6.5q15 0 28 -16t20 -33 q163 37 172 37q17 0 29.5 -11t12.5 -28q0 -15 -8.5 -26t-23.5 -14l-182 -40l-1 -16q-1 -26 81.5 -117.5t104.5 -91.5q47 0 119 80t72 129q0 36 -23.5 53t-51 18.5t-51 11.5t-23.5 34q0 16 10 34l-68 19q43 44 43 117q0 26 -5 58q82 16 144 16q44 0 71.5 -1.5t48.5 -8.5 t31 -13.5t20.5 -24.5t15.5 -33.5t17 -47.5t24 -60l50 25q-3 -40 -23 -60t-42.5 -21t-40 -6.5t-16.5 -20.5zM1282 842q-5 5 -13.5 15.5t-12 14.5t-10.5 11.5t-10 10.5l-8 8t-8.5 7.5t-8 5t-8.5 4.5q-7 3 -14.5 5t-20.5 2.5t-22 0.5h-32.5h-37.5q-126 0 -217 -43 q16 30 36 46.5t54 29.5t65.5 36t46 36.5t50 55t43.5 50.5q12 -9 28 -31.5t32 -36.5t38 -13l12 1v-76l22 -1q247 95 371 190q28 21 50 39t42.5 37.5t33 31t29.5 34t24 31t24.5 37t23 38t27 47.5t29.5 53l7 9q-2 -53 -43 -139q-79 -165 -205 -264t-306 -142q-14 -3 -42 -7.5 t-50 -9.5t-39 -14q3 -19 24.5 -46t21.5 -34q0 -11 -26 -30zM1061 -79q39 26 131.5 47.5t146.5 21.5q9 0 22.5 -15.5t28 -42.5t26 -50t24 -51t14.5 -33q-121 -45 -244 -45q-61 0 -125 11zM822 568l48 12l109 -177l-73 -48zM1323 51q3 -15 3 -16q0 -7 -17.5 -14.5t-46 -13 t-54 -9.5t-53.5 -7.5t-32 -4.5l-7 43q21 2 60.5 8.5t72 10t60.5 3.5h14zM866 679l-96 -20l-6 17q10 1 32.5 7t34.5 6q19 0 35 -10zM1061 45h31l10 -83l-41 -12v95zM1950 1535v1v-1zM1950 1535l-1 -5l-2 -2l1 3zM1950 1535l1 1z" />
421 <glyph unicode="&#xf1a9;" d="M1167 -50q-5 19 -24 5q-30 -22 -87 -39t-131 -17q-129 0 -193 49q-5 4 -13 4q-11 0 -26 -12q-7 -6 -7.5 -16t7.5 -20q34 -32 87.5 -46t102.5 -12.5t99 4.5q41 4 84.5 20.5t65 30t28.5 20.5q12 12 7 29zM1128 65q-19 47 -39 61q-23 15 -76 15q-47 0 -71 -10 q-29 -12 -78 -56q-26 -24 -12 -44q9 -8 17.5 -4.5t31.5 23.5q3 2 10.5 8.5t10.5 8.5t10 7t11.5 7t12.5 5t15 4.5t16.5 2.5t20.5 1q27 0 44.5 -7.5t23 -14.5t13.5 -22q10 -17 12.5 -20t12.5 1q23 12 14 34zM1483 346q0 22 -5 44.5t-16.5 45t-34 36.5t-52.5 14 q-33 0 -97 -41.5t-129 -83.5t-101 -42q-27 -1 -63.5 19t-76 49t-83.5 58t-100 49t-111 19q-115 -1 -197 -78.5t-84 -178.5q-2 -112 74 -164q29 -20 62.5 -28.5t103.5 -8.5q57 0 132 32.5t134 71t120 70.5t93 31q26 -1 65 -31.5t71.5 -67t68 -67.5t55.5 -32q35 -3 58.5 14 t55.5 63q28 41 42.5 101t14.5 106zM1536 506q0 -164 -62 -304.5t-166 -236t-242.5 -149.5t-290.5 -54t-293 57.5t-247.5 157t-170.5 241.5t-64 302q0 89 19.5 172.5t49 145.5t70.5 118.5t78.5 94t78.5 69.5t64.5 46.5t42.5 24.5q14 8 51 26.5t54.5 28.5t48 30t60.5 44 q36 28 58 72.5t30 125.5q129 -155 186 -193q44 -29 130 -68t129 -66q21 -13 39 -25t60.5 -46.5t76 -70.5t75 -95t69 -122t47 -148.5t19.5 -177.5z" />
422 <glyph unicode="&#xf1aa;" d="M1070 463l-160 -160l-151 -152l-30 -30q-65 -64 -151.5 -87t-171.5 -2q-16 -70 -72 -115t-129 -45q-85 0 -145 60.5t-60 145.5q0 72 44.5 128t113.5 72q-22 86 1 173t88 152l12 12l151 -152l-11 -11q-37 -37 -37 -89t37 -90q37 -37 89 -37t89 37l30 30l151 152l161 160z M729 1145l12 -12l-152 -152l-12 12q-37 37 -89 37t-89 -37t-37 -89.5t37 -89.5l29 -29l152 -152l160 -160l-151 -152l-161 160l-151 152l-30 30q-68 67 -90 159.5t5 179.5q-70 15 -115 71t-45 129q0 85 60 145.5t145 60.5q76 0 133.5 -49t69.5 -123q84 20 169.5 -3.5 t149.5 -87.5zM1536 78q0 -85 -60 -145.5t-145 -60.5q-74 0 -131 47t-71 118q-86 -28 -179.5 -6t-161.5 90l-11 12l151 152l12 -12q37 -37 89 -37t89 37t37 89t-37 89l-30 30l-152 152l-160 160l152 152l160 -160l152 -152l29 -30q64 -64 87.5 -150.5t2.5 -171.5 q76 -11 126.5 -68.5t50.5 -134.5zM1534 1202q0 -77 -51 -135t-127 -69q26 -85 3 -176.5t-90 -158.5l-12 -12l-151 152l12 12q37 37 37 89t-37 89t-89 37t-89 -37l-30 -30l-152 -152l-160 -160l-152 152l161 160l152 152l29 30q67 67 159 89.5t178 -3.5q11 75 68.5 126 t135.5 51q85 0 145 -60.5t60 -145.5z" />
423 <glyph unicode="&#xf1ab;" d="M654 458q-1 -3 -12.5 0.5t-31.5 11.5l-20 9q-44 20 -87 49q-7 5 -41 31.5t-38 28.5q-67 -103 -134 -181q-81 -95 -105 -110q-4 -2 -19.5 -4t-18.5 0q6 4 82 92q21 24 85.5 115t78.5 118q17 30 51 98.5t36 77.5q-8 1 -110 -33q-8 -2 -27.5 -7.5t-34.5 -9.5t-17 -5 q-2 -2 -2 -10.5t-1 -9.5q-5 -10 -31 -15q-23 -7 -47 0q-18 4 -28 21q-4 6 -5 23q6 2 24.5 5t29.5 6q58 16 105 32q100 35 102 35q10 2 43 19.5t44 21.5q9 3 21.5 8t14.5 5.5t6 -0.5q2 -12 -1 -33q0 -2 -12.5 -27t-26.5 -53.5t-17 -33.5q-25 -50 -77 -131l64 -28 q12 -6 74.5 -32t67.5 -28q4 -1 10.5 -25.5t4.5 -30.5zM449 944q3 -15 -4 -28q-12 -23 -50 -38q-30 -12 -60 -12q-26 3 -49 26q-14 15 -18 41l1 3q3 -3 19.5 -5t26.5 0t58 16q36 12 55 14q17 0 21 -17zM1147 815l63 -227l-139 42zM39 15l694 232v1032l-694 -233v-1031z M1280 332l102 -31l-181 657l-100 31l-216 -536l102 -31l45 110l211 -65zM777 1294l573 -184v380zM1088 -29l158 -13l-54 -160l-40 66q-130 -83 -276 -108q-58 -12 -91 -12h-84q-79 0 -199.5 39t-183.5 85q-8 7 -8 16q0 8 5 13.5t13 5.5q4 0 18 -7.5t30.5 -16.5t20.5 -11 q73 -37 159.5 -61.5t157.5 -24.5q95 0 167 14.5t157 50.5q15 7 30.5 15.5t34 19t28.5 16.5zM1536 1050v-1079l-774 246q-14 -6 -375 -127.5t-368 -121.5q-13 0 -18 13q0 1 -1 3v1078q3 9 4 10q5 6 20 11q106 35 149 50v384l558 -198q2 0 160.5 55t316 108.5t161.5 53.5 q20 0 20 -21v-418z" />
424 <glyph unicode="&#xf1ac;" horiz-adv-x="1792" d="M288 1152q66 0 113 -47t47 -113v-1088q0 -66 -47 -113t-113 -47h-128q-66 0 -113 47t-47 113v1088q0 66 47 113t113 47h128zM1664 989q58 -34 93 -93t35 -128v-768q0 -106 -75 -181t-181 -75h-864q-66 0 -113 47t-47 113v1536q0 40 28 68t68 28h672q40 0 88 -20t76 -48 l152 -152q28 -28 48 -76t20 -88v-163zM928 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM928 512v128q0 14 -9 23 t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1184 256v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128 q14 0 23 9t9 23zM1184 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 0v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 256v128q0 14 -9 23t-23 9h-128 q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1440 512v128q0 14 -9 23t-23 9h-128q-14 0 -23 -9t-9 -23v-128q0 -14 9 -23t23 -9h128q14 0 23 9t9 23zM1536 896v256h-160q-40 0 -68 28t-28 68v160h-640v-512h896z" />
425 <glyph unicode="&#xf1ad;" d="M1344 1536q26 0 45 -19t19 -45v-1664q0 -26 -19 -45t-45 -19h-1280q-26 0 -45 19t-19 45v1664q0 26 19 45t45 19h1280zM512 1248v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 992v-64q0 -14 9 -23t23 -9h64q14 0 23 9 t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 736v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM512 480v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23zM384 160v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM384 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM384 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 -96v192q0 14 -9 23t-23 9h-320q-14 0 -23 -9 t-9 -23v-192q0 -14 9 -23t23 -9h320q14 0 23 9t9 23zM896 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 928v64 q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM896 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 160v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64 q14 0 23 9t9 23zM1152 416v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 672v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 928v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9 t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1152 1184v64q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-64q0 -14 9 -23t23 -9h64q14 0 23 9t9 23z" />
426 <glyph unicode="&#xf1ae;" horiz-adv-x="1280" d="M1188 988l-292 -292v-824q0 -46 -33 -79t-79 -33t-79 33t-33 79v384h-64v-384q0 -46 -33 -79t-79 -33t-79 33t-33 79v824l-292 292q-28 28 -28 68t28 68t68 28t68 -28l228 -228h368l228 228q28 28 68 28t68 -28t28 -68t-28 -68zM864 1152q0 -93 -65.5 -158.5 t-158.5 -65.5t-158.5 65.5t-65.5 158.5t65.5 158.5t158.5 65.5t158.5 -65.5t65.5 -158.5z" />
427 <glyph unicode="&#xf1b0;" horiz-adv-x="1664" d="M780 1064q0 -60 -19 -113.5t-63 -92.5t-105 -39q-76 0 -138 57.5t-92 135.5t-30 151q0 60 19 113.5t63 92.5t105 39q77 0 138.5 -57.5t91.5 -135t30 -151.5zM438 581q0 -80 -42 -139t-119 -59q-76 0 -141.5 55.5t-100.5 133.5t-35 152q0 80 42 139.5t119 59.5 q76 0 141.5 -55.5t100.5 -134t35 -152.5zM832 608q118 0 255 -97.5t229 -237t92 -254.5q0 -46 -17 -76.5t-48.5 -45t-64.5 -20t-76 -5.5q-68 0 -187.5 45t-182.5 45q-66 0 -192.5 -44.5t-200.5 -44.5q-183 0 -183 146q0 86 56 191.5t139.5 192.5t187.5 146t193 59zM1071 819 q-61 0 -105 39t-63 92.5t-19 113.5q0 74 30 151.5t91.5 135t138.5 57.5q61 0 105 -39t63 -92.5t19 -113.5q0 -73 -30 -151t-92 -135.5t-138 -57.5zM1503 923q77 0 119 -59.5t42 -139.5q0 -74 -35 -152t-100.5 -133.5t-141.5 -55.5q-77 0 -119 59t-42 139q0 74 35 152.5 t100.5 134t141.5 55.5z" />
428 <glyph unicode="&#xf1b1;" horiz-adv-x="768" d="M704 1008q0 -145 -57 -243.5t-152 -135.5l45 -821q2 -26 -16 -45t-44 -19h-192q-26 0 -44 19t-16 45l45 821q-95 37 -152 135.5t-57 243.5q0 128 42.5 249.5t117.5 200t160 78.5t160 -78.5t117.5 -200t42.5 -249.5z" />
429 <glyph unicode="&#xf1b2;" horiz-adv-x="1792" d="M896 -93l640 349v636l-640 -233v-752zM832 772l698 254l-698 254l-698 -254zM1664 1024v-768q0 -35 -18 -65t-49 -47l-704 -384q-28 -16 -61 -16t-61 16l-704 384q-31 17 -49 47t-18 65v768q0 40 23 73t61 47l704 256q22 8 44 8t44 -8l704 -256q38 -14 61 -47t23 -73z " />
430 <glyph unicode="&#xf1b3;" horiz-adv-x="2304" d="M640 -96l384 192v314l-384 -164v-342zM576 358l404 173l-404 173l-404 -173zM1664 -96l384 192v314l-384 -164v-342zM1600 358l404 173l-404 173l-404 -173zM1152 651l384 165v266l-384 -164v-267zM1088 1030l441 189l-441 189l-441 -189zM2176 512v-416q0 -36 -19 -67 t-52 -47l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-5 2 -7 4q-2 -2 -7 -4l-448 -224q-25 -14 -57 -14t-57 14l-448 224q-33 16 -52 47t-19 67v416q0 38 21.5 70t56.5 48l434 186v400q0 38 21.5 70t56.5 48l448 192q23 10 50 10t50 -10l448 -192q35 -16 56.5 -48t21.5 -70 v-400l434 -186q36 -16 57 -48t21 -70z" />
431 <glyph unicode="&#xf1b4;" horiz-adv-x="2048" d="M1848 1197h-511v-124h511v124zM1596 771q-90 0 -146 -52.5t-62 -142.5h408q-18 195 -200 195zM1612 186q63 0 122 32t76 87h221q-100 -307 -427 -307q-214 0 -340.5 132t-126.5 347q0 208 130.5 345.5t336.5 137.5q138 0 240.5 -68t153 -179t50.5 -248q0 -17 -2 -47h-658 q0 -111 57.5 -171.5t166.5 -60.5zM277 236h296q205 0 205 167q0 180 -199 180h-302v-347zM277 773h281q78 0 123.5 36.5t45.5 113.5q0 144 -190 144h-260v-294zM0 1282h594q87 0 155 -14t126.5 -47.5t90 -96.5t31.5 -154q0 -181 -172 -263q114 -32 172 -115t58 -204 q0 -75 -24.5 -136.5t-66 -103.5t-98.5 -71t-121 -42t-134 -13h-611v1260z" />
432 <glyph unicode="&#xf1b5;" d="M1248 1408q119 0 203.5 -84.5t84.5 -203.5v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960zM499 1041h-371v-787h382q117 0 197 57.5t80 170.5q0 158 -143 200q107 52 107 164q0 57 -19.5 96.5 t-56.5 60.5t-79 29.5t-97 8.5zM477 723h-176v184h163q119 0 119 -90q0 -94 -106 -94zM486 388h-185v217h189q124 0 124 -113q0 -104 -128 -104zM1136 356q-68 0 -104 38t-36 107h411q1 10 1 30q0 132 -74.5 220.5t-203.5 88.5q-128 0 -210 -86t-82 -216q0 -135 79 -217 t213 -82q205 0 267 191h-138q-11 -34 -47.5 -54t-75.5 -20zM1126 722q113 0 124 -122h-254q4 56 39 89t91 33zM964 988h319v-77h-319v77z" />
433 <glyph unicode="&#xf1b6;" horiz-adv-x="1792" d="M1582 954q0 -101 -71.5 -172.5t-172.5 -71.5t-172.5 71.5t-71.5 172.5t71.5 172.5t172.5 71.5t172.5 -71.5t71.5 -172.5zM812 212q0 104 -73 177t-177 73q-27 0 -54 -6l104 -42q77 -31 109.5 -106.5t1.5 -151.5q-31 -77 -107 -109t-152 -1q-21 8 -62 24.5t-61 24.5 q32 -60 91 -96.5t130 -36.5q104 0 177 73t73 177zM1642 953q0 126 -89.5 215.5t-215.5 89.5q-127 0 -216.5 -89.5t-89.5 -215.5q0 -127 89.5 -216t216.5 -89q126 0 215.5 89t89.5 216zM1792 953q0 -189 -133.5 -322t-321.5 -133l-437 -319q-12 -129 -109 -218t-229 -89 q-121 0 -214 76t-118 192l-230 92v429l389 -157q79 48 173 48q13 0 35 -2l284 407q2 187 135.5 319t320.5 132q188 0 321.5 -133.5t133.5 -321.5z" />
434 <glyph unicode="&#xf1b7;" d="M1242 889q0 80 -57 136.5t-137 56.5t-136.5 -57t-56.5 -136q0 -80 56.5 -136.5t136.5 -56.5t137 56.5t57 136.5zM632 301q0 -83 -58 -140.5t-140 -57.5q-56 0 -103 29t-72 77q52 -20 98 -40q60 -24 120 1.5t85 86.5q24 60 -1.5 120t-86.5 84l-82 33q22 5 42 5 q82 0 140 -57.5t58 -140.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v153l172 -69q20 -92 93.5 -152t168.5 -60q104 0 181 70t87 173l345 252q150 0 255.5 105.5t105.5 254.5q0 150 -105.5 255.5t-255.5 105.5 q-148 0 -253 -104.5t-107 -252.5l-225 -322q-9 1 -28 1q-75 0 -137 -37l-297 119v468q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5zM1289 887q0 -100 -71 -170.5t-171 -70.5t-170.5 70.5t-70.5 170.5t70.5 171t170.5 71q101 0 171.5 -70.5t70.5 -171.5z " />
435 <glyph unicode="&#xf1b8;" horiz-adv-x="1792" d="M836 367l-15 -368l-2 -22l-420 29q-36 3 -67 31.5t-47 65.5q-11 27 -14.5 55t4 65t12 55t21.5 64t19 53q78 -12 509 -28zM449 953l180 -379l-147 92q-63 -72 -111.5 -144.5t-72.5 -125t-39.5 -94.5t-18.5 -63l-4 -21l-190 357q-17 26 -18 56t6 47l8 18q35 63 114 188 l-140 86zM1680 436l-188 -359q-12 -29 -36.5 -46.5t-43.5 -20.5l-18 -4q-71 -7 -219 -12l8 -164l-230 367l211 362l7 -173q170 -16 283 -5t170 33zM895 1360q-47 -63 -265 -435l-317 187l-19 12l225 356q20 31 60 45t80 10q24 -2 48.5 -12t42 -21t41.5 -33t36 -34.5 t36 -39.5t32 -35zM1550 1053l212 -363q18 -37 12.5 -76t-27.5 -74q-13 -20 -33 -37t-38 -28t-48.5 -22t-47 -16t-51.5 -14t-46 -12q-34 72 -265 436l313 195zM1407 1279l142 83l-220 -373l-419 20l151 86q-34 89 -75 166t-75.5 123.5t-64.5 80t-47 46.5l-17 13l405 -1 q31 3 58 -10.5t39 -28.5l11 -15q39 -61 112 -190z" />
436 <glyph unicode="&#xf1b9;" horiz-adv-x="2048" d="M480 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM516 768h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5zM1888 448q0 66 -47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47t113 47t47 113zM2048 544v-384 q0 -14 -9 -23t-23 -9h-96v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-1024v-128q0 -80 -56 -136t-136 -56t-136 56t-56 136v128h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5t179 63.5h768q98 0 179 -63.5t104 -157.5 l105 -419h28q93 0 158.5 -65.5t65.5 -158.5z" />
437 <glyph unicode="&#xf1ba;" horiz-adv-x="2048" d="M1824 640q93 0 158.5 -65.5t65.5 -158.5v-384q0 -14 -9 -23t-23 -9h-96v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-1024v-64q0 -80 -56 -136t-136 -56t-136 56t-56 136v64h-96q-14 0 -23 9t-9 23v384q0 93 65.5 158.5t158.5 65.5h28l105 419q23 94 104 157.5 t179 63.5h128v224q0 14 9 23t23 9h448q14 0 23 -9t9 -23v-224h128q98 0 179 -63.5t104 -157.5l105 -419h28zM320 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47zM516 640h1016l-89 357q-2 8 -14 17.5t-21 9.5h-768q-9 0 -21 -9.5t-14 -17.5z M1728 160q66 0 113 47t47 113t-47 113t-113 47t-113 -47t-47 -113t47 -113t113 -47z" />
438 <glyph unicode="&#xf1bb;" d="M1504 64q0 -26 -19 -45t-45 -19h-462q1 -17 6 -87.5t5 -108.5q0 -25 -18 -42.5t-43 -17.5h-320q-25 0 -43 17.5t-18 42.5q0 38 5 108.5t6 87.5h-462q-26 0 -45 19t-19 45t19 45l402 403h-229q-26 0 -45 19t-19 45t19 45l402 403h-197q-26 0 -45 19t-19 45t19 45l384 384 q19 19 45 19t45 -19l384 -384q19 -19 19 -45t-19 -45t-45 -19h-197l402 -403q19 -19 19 -45t-19 -45t-45 -19h-229l402 -403q19 -19 19 -45z" />
439 <glyph unicode="&#xf1bc;" d="M1127 326q0 32 -30 51q-193 115 -447 115q-133 0 -287 -34q-42 -9 -42 -52q0 -20 13.5 -34.5t35.5 -14.5q5 0 37 8q132 27 243 27q226 0 397 -103q19 -11 33 -11q19 0 33 13.5t14 34.5zM1223 541q0 40 -35 61q-237 141 -548 141q-153 0 -303 -42q-48 -13 -48 -64 q0 -25 17.5 -42.5t42.5 -17.5q7 0 37 8q122 33 251 33q279 0 488 -124q24 -13 38 -13q25 0 42.5 17.5t17.5 42.5zM1331 789q0 47 -40 70q-126 73 -293 110.5t-343 37.5q-204 0 -364 -47q-23 -7 -38.5 -25.5t-15.5 -48.5q0 -31 20.5 -52t51.5 -21q11 0 40 8q133 37 307 37 q159 0 309.5 -34t253.5 -95q21 -12 40 -12q29 0 50.5 20.5t21.5 51.5zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
440 <glyph unicode="&#xf1bd;" d="M1397 1408q58 0 98.5 -40.5t40.5 -98.5v-1258q0 -58 -40.5 -98.5t-98.5 -40.5h-1258q-58 0 -98.5 40.5t-40.5 98.5v1258q0 58 40.5 98.5t98.5 40.5h1258zM1465 11v1258q0 28 -20 48t-48 20h-1258q-28 0 -48 -20t-20 -48v-1258q0 -28 20 -48t48 -20h1258q28 0 48 20t20 48 zM694 749l188 -387l533 145v-496q0 -7 -5.5 -12.5t-12.5 -5.5h-1258q-7 0 -12.5 5.5t-5.5 12.5v141l711 195l-212 439q4 1 12 2.5t12 1.5q170 32 303.5 21.5t221 -46t143.5 -94.5q27 -28 -25 -42q-64 -16 -256 -62l-97 198q-111 7 -240 -16zM1397 1287q7 0 12.5 -5.5 t5.5 -12.5v-428q-85 30 -188 52q-294 64 -645 12l-18 -3l-65 134h-233l85 -190q-132 -51 -230 -137v560q0 7 5.5 12.5t12.5 5.5h1258zM286 387q-14 -3 -26 4.5t-14 21.5q-24 203 166 305l129 -270z" />
441 <glyph unicode="&#xf1be;" horiz-adv-x="2304" d="M784 164l16 241l-16 523q-1 10 -7.5 17t-16.5 7q-9 0 -16 -7t-7 -17l-14 -523l14 -241q1 -10 7.5 -16.5t15.5 -6.5q22 0 24 23zM1080 193l11 211l-12 586q0 16 -13 24q-8 5 -16 5t-16 -5q-13 -8 -13 -24l-1 -6l-10 -579q0 -1 11 -236v-1q0 -10 6 -17q9 -11 23 -11 q11 0 20 9q9 7 9 20zM35 533l20 -128l-20 -126q-2 -9 -9 -9t-9 9l-17 126l17 128q2 9 9 9t9 -9zM121 612l26 -207l-26 -203q-2 -9 -10 -9q-9 0 -9 10l-23 202l23 207q0 9 9 9q8 0 10 -9zM401 159zM213 650l25 -245l-25 -237q0 -11 -11 -11q-10 0 -12 11l-21 237l21 245 q2 12 12 12q11 0 11 -12zM307 657l23 -252l-23 -244q-2 -13 -14 -13q-13 0 -13 13l-21 244l21 252q0 13 13 13q12 0 14 -13zM401 639l21 -234l-21 -246q-2 -16 -16 -16q-6 0 -10.5 4.5t-4.5 11.5l-20 246l20 234q0 6 4.5 10.5t10.5 4.5q14 0 16 -15zM784 164zM495 785 l21 -380l-21 -246q0 -7 -5 -12.5t-12 -5.5q-16 0 -18 18l-18 246l18 380q2 18 18 18q7 0 12 -5.5t5 -12.5zM589 871l19 -468l-19 -244q0 -8 -5.5 -13.5t-13.5 -5.5q-18 0 -20 19l-16 244l16 468q2 19 20 19q8 0 13.5 -5.5t5.5 -13.5zM687 911l18 -506l-18 -242 q-2 -21 -22 -21q-19 0 -21 21l-16 242l16 506q0 9 6.5 15.5t14.5 6.5q9 0 15 -6.5t7 -15.5zM1079 169v0v0zM881 915l15 -510l-15 -239q0 -10 -7.5 -17.5t-17.5 -7.5t-17 7t-8 18l-14 239l14 510q0 11 7.5 18t17.5 7t17.5 -7t7.5 -18zM980 896l14 -492l-14 -236q0 -11 -8 -19 t-19 -8t-19 8t-9 19l-12 236l12 492q1 12 9 20t19 8t18.5 -8t8.5 -20zM1192 404l-14 -231v0q0 -13 -9 -22t-22 -9t-22 9t-10 22l-6 114l-6 117l12 636v3q2 15 12 24q9 7 20 7q8 0 15 -5q14 -8 16 -26zM2304 423q0 -117 -83 -199.5t-200 -82.5h-786q-13 2 -22 11t-9 22v899 q0 23 28 33q85 34 181 34q195 0 338 -131.5t160 -323.5q53 22 110 22q117 0 200 -83t83 -201z" />
442 <glyph unicode="&#xf1c0;" d="M768 768q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 0q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127 t443 -43zM768 384q237 0 443 43t325 127v-170q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5t-103 128v170q119 -84 325 -127t443 -43zM768 1536q208 0 385 -34.5t280 -93.5t103 -128v-128q0 -69 -103 -128t-280 -93.5t-385 -34.5t-385 34.5t-280 93.5 t-103 128v128q0 69 103 128t280 93.5t385 34.5z" />
443 <glyph unicode="&#xf1c1;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M894 465q33 -26 84 -56q59 7 117 7q147 0 177 -49q16 -22 2 -52q0 -1 -1 -2l-2 -2v-1q-6 -38 -71 -38q-48 0 -115 20t-130 53q-221 -24 -392 -83q-153 -262 -242 -262q-15 0 -28 7l-24 12q-1 1 -6 5q-10 10 -6 36q9 40 56 91.5t132 96.5q14 9 23 -6q2 -2 2 -4q52 85 107 197 q68 136 104 262q-24 82 -30.5 159.5t6.5 127.5q11 40 42 40h21h1q23 0 35 -15q18 -21 9 -68q-2 -6 -4 -8q1 -3 1 -8v-30q-2 -123 -14 -192q55 -164 146 -238zM318 54q52 24 137 158q-51 -40 -87.5 -84t-49.5 -74zM716 974q-15 -42 -2 -132q1 7 7 44q0 3 7 43q1 4 4 8 q-1 1 -1 2t-0.5 1.5t-0.5 1.5q-1 22 -13 36q0 -1 -1 -2v-2zM592 313q135 54 284 81q-2 1 -13 9.5t-16 13.5q-76 67 -127 176q-27 -86 -83 -197q-30 -56 -45 -83zM1238 329q-24 24 -140 24q76 -28 124 -28q14 0 18 1q0 1 -2 3z" />
444 <glyph unicode="&#xf1c2;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M233 768v-107h70l164 -661h159l128 485q7 20 10 46q2 16 2 24h4l3 -24q1 -3 3.5 -20t5.5 -26l128 -485h159l164 661h70v107h-300v-107h90l-99 -438q-5 -20 -7 -46l-2 -21h-4l-3 21q-1 5 -4 21t-5 25l-144 545h-114l-144 -545q-2 -9 -4.5 -24.5t-3.5 -21.5l-4 -21h-4l-2 21 q-2 26 -7 46l-99 438h90v107h-300z" />
445 <glyph unicode="&#xf1c3;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M429 106v-106h281v106h-75l103 161q5 7 10 16.5t7.5 13.5t3.5 4h2q1 -4 5 -10q2 -4 4.5 -7.5t6 -8t6.5 -8.5l107 -161h-76v-106h291v106h-68l-192 273l195 282h67v107h-279v-107h74l-103 -159q-4 -7 -10 -16.5t-9 -13.5l-2 -3h-2q-1 4 -5 10q-6 11 -17 23l-106 159h76v107 h-290v-107h68l189 -272l-194 -283h-68z" />
446 <glyph unicode="&#xf1c4;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M416 106v-106h327v106h-93v167h137q76 0 118 15q67 23 106.5 87t39.5 146q0 81 -37 141t-100 87q-48 19 -130 19h-368v-107h92v-555h-92zM769 386h-119v268h120q52 0 83 -18q56 -33 56 -115q0 -89 -62 -120q-31 -15 -78 -15z" />
447 <glyph unicode="&#xf1c5;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M1280 320v-320h-1024v192l192 192l128 -128l384 384zM448 512q-80 0 -136 56t-56 136t56 136t136 56t136 -56t56 -136t-56 -136t-136 -56z" />
448 <glyph unicode="&#xf1c6;" d="M640 1152v128h-128v-128h128zM768 1024v128h-128v-128h128zM640 896v128h-128v-128h128zM768 768v128h-128v-128h128zM1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400 v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-128v-128h-128v128h-512v-1536h1280zM781 593l107 -349q8 -27 8 -52q0 -83 -72.5 -137.5t-183.5 -54.5t-183.5 54.5t-72.5 137.5q0 25 8 52q21 63 120 396v128h128v-128h79 q22 0 39 -13t23 -34zM640 128q53 0 90.5 19t37.5 45t-37.5 45t-90.5 19t-90.5 -19t-37.5 -45t37.5 -45t90.5 -19z" />
449 <glyph unicode="&#xf1c7;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M620 686q20 -8 20 -30v-544q0 -22 -20 -30q-8 -2 -12 -2q-12 0 -23 9l-166 167h-131q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h131l166 167q16 15 35 7zM1037 -3q31 0 50 24q129 159 129 363t-129 363q-16 21 -43 24t-47 -14q-21 -17 -23.5 -43.5t14.5 -47.5 q100 -123 100 -282t-100 -282q-17 -21 -14.5 -47.5t23.5 -42.5q18 -15 40 -15zM826 145q27 0 47 20q87 93 87 219t-87 219q-18 19 -45 20t-46 -17t-20 -44.5t18 -46.5q52 -57 52 -131t-52 -131q-19 -20 -18 -46.5t20 -44.5q20 -17 44 -17z" />
450 <glyph unicode="&#xf1c8;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M768 768q52 0 90 -38t38 -90v-384q0 -52 -38 -90t-90 -38h-384q-52 0 -90 38t-38 90v384q0 52 38 90t90 38h384zM1260 766q20 -8 20 -30v-576q0 -22 -20 -30q-8 -2 -12 -2q-14 0 -23 9l-265 266v90l265 266q9 9 23 9q4 0 12 -2z" />
451 <glyph unicode="&#xf1c9;" d="M1468 1156q28 -28 48 -76t20 -88v-1152q0 -40 -28 -68t-68 -28h-1344q-40 0 -68 28t-28 68v1600q0 40 28 68t68 28h896q40 0 88 -20t76 -48zM1024 1400v-376h376q-10 29 -22 41l-313 313q-12 12 -41 22zM1408 -128v1024h-416q-40 0 -68 28t-28 68v416h-768v-1536h1280z M480 768q8 11 21 12.5t24 -6.5l51 -38q11 -8 12.5 -21t-6.5 -24l-182 -243l182 -243q8 -11 6.5 -24t-12.5 -21l-51 -38q-11 -8 -24 -6.5t-21 12.5l-226 301q-14 19 0 38zM1282 467q14 -19 0 -38l-226 -301q-8 -11 -21 -12.5t-24 6.5l-51 38q-11 8 -12.5 21t6.5 24l182 243 l-182 243q-8 11 -6.5 24t12.5 21l51 38q11 8 24 6.5t21 -12.5zM662 6q-13 2 -20.5 13t-5.5 24l138 831q2 13 13 20.5t24 5.5l63 -10q13 -2 20.5 -13t5.5 -24l-138 -831q-2 -13 -13 -20.5t-24 -5.5z" />
452 <glyph unicode="&#xf1ca;" d="M1497 709v-198q-101 -23 -198 -23q-65 -136 -165.5 -271t-181.5 -215.5t-128 -106.5q-80 -45 -162 3q-28 17 -60.5 43.5t-85 83.5t-102.5 128.5t-107.5 184t-105.5 244t-91.5 314.5t-70.5 390h283q26 -218 70 -398.5t104.5 -317t121.5 -235.5t140 -195q169 169 287 406 q-142 72 -223 220t-81 333q0 192 104 314.5t284 122.5q178 0 273 -105.5t95 -297.5q0 -159 -58 -286q-7 -1 -19.5 -3t-46 -2t-63 6t-62 25.5t-50.5 51.5q31 103 31 184q0 87 -29 132t-79 45q-53 0 -85 -49.5t-32 -140.5q0 -186 105 -293.5t267 -107.5q62 0 121 14z" />
453 <glyph unicode="&#xf1cb;" horiz-adv-x="1792" d="M216 367l603 -402v359l-334 223zM154 511l193 129l-193 129v-258zM973 -35l603 402l-269 180l-334 -223v-359zM896 458l272 182l-272 182l-272 -182zM485 733l334 223v359l-603 -402zM1445 640l193 -129v258zM1307 733l269 180l-603 402v-359zM1792 913v-546 q0 -41 -34 -64l-819 -546q-21 -13 -43 -13t-43 13l-819 546q-34 23 -34 64v546q0 41 34 64l819 546q21 13 43 13t43 -13l819 -546q34 -23 34 -64z" />
454 <glyph unicode="&#xf1cc;" horiz-adv-x="2048" d="M1800 764q111 -46 179.5 -145.5t68.5 -221.5q0 -164 -118 -280.5t-285 -116.5q-4 0 -11.5 0.5t-10.5 0.5h-1209h-1h-2h-5q-170 10 -288 125.5t-118 280.5q0 110 55 203t147 147q-12 39 -12 82q0 115 82 196t199 81q95 0 172 -58q75 154 222.5 248t326.5 94 q166 0 306 -80.5t221.5 -218.5t81.5 -301q0 -6 -0.5 -18t-0.5 -18zM468 498q0 -122 84 -193t208 -71q137 0 240 99q-16 20 -47.5 56.5t-43.5 50.5q-67 -65 -144 -65q-55 0 -93.5 33.5t-38.5 87.5q0 53 38.5 87t91.5 34q44 0 84.5 -21t73 -55t65 -75t69 -82t77 -75t97 -55 t121.5 -21q121 0 204.5 71.5t83.5 190.5q0 121 -84 192t-207 71q-143 0 -241 -97q14 -16 29.5 -34t34.5 -40t29 -34q66 64 142 64q52 0 92 -33t40 -84q0 -57 -37 -91.5t-94 -34.5q-43 0 -82.5 21t-72 55t-65.5 75t-69.5 82t-77.5 75t-96.5 55t-118.5 21q-122 0 -207 -70.5 t-85 -189.5z" />
455 <glyph unicode="&#xf1cd;" horiz-adv-x="1792" d="M896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM896 1408q-190 0 -361 -90l194 -194q82 28 167 28t167 -28l194 194q-171 90 -361 90zM218 279l194 194 q-28 82 -28 167t28 167l-194 194q-90 -171 -90 -361t90 -361zM896 -128q190 0 361 90l-194 194q-82 -28 -167 -28t-167 28l-194 -194q171 -90 361 -90zM896 256q159 0 271.5 112.5t112.5 271.5t-112.5 271.5t-271.5 112.5t-271.5 -112.5t-112.5 -271.5t112.5 -271.5 t271.5 -112.5zM1380 473l194 -194q90 171 90 361t-90 361l-194 -194q28 -82 28 -167t-28 -167z" />
456 <glyph unicode="&#xf1ce;" horiz-adv-x="1792" d="M1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348q0 222 101 414.5t276.5 317t390.5 155.5v-260q-221 -45 -366.5 -221t-145.5 -406q0 -130 51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 q0 230 -145.5 406t-366.5 221v260q215 -31 390.5 -155.5t276.5 -317t101 -414.5z" />
457 <glyph unicode="&#xf1d0;" horiz-adv-x="1792" d="M19 662q8 217 116 406t305 318h5q0 -1 -1 -3q-8 -8 -28 -33.5t-52 -76.5t-60 -110.5t-44.5 -135.5t-14 -150.5t39 -157.5t108.5 -154q50 -50 102 -69.5t90.5 -11.5t69.5 23.5t47 32.5l16 16q39 51 53 116.5t6.5 122.5t-21 107t-26.5 80l-14 29q-10 25 -30.5 49.5t-43 41 t-43.5 29.5t-35 19l-13 6l104 115q39 -17 78 -52t59 -61l19 -27q1 48 -18.5 103.5t-40.5 87.5l-20 31l161 183l160 -181q-33 -46 -52.5 -102.5t-22.5 -90.5l-4 -33q22 37 61.5 72.5t67.5 52.5l28 17l103 -115q-44 -14 -85 -50t-60 -65l-19 -29q-31 -56 -48 -133.5t-7 -170 t57 -156.5q33 -45 77.5 -60.5t85 -5.5t76 26.5t57.5 33.5l21 16q60 53 96.5 115t48.5 121.5t10 121.5t-18 118t-37 107.5t-45.5 93t-45 72t-34.5 47.5l-13 17q-14 13 -7 13l10 -3q40 -29 62.5 -46t62 -50t64 -58t58.5 -65t55.5 -77t45.5 -88t38 -103t23.5 -117t10.5 -136 q3 -259 -108 -465t-312 -321t-456 -115q-185 0 -351 74t-283.5 198t-184 293t-60.5 353z" />
458 <glyph unicode="&#xf1d1;" horiz-adv-x="1792" d="M874 -102v-66q-208 6 -385 109.5t-283 275.5l58 34q29 -49 73 -99l65 57q148 -168 368 -212l-17 -86q65 -12 121 -13zM276 428l-83 -28q22 -60 49 -112l-57 -33q-98 180 -98 385t98 385l57 -33q-30 -56 -49 -112l82 -28q-35 -100 -35 -212q0 -109 36 -212zM1528 251 l58 -34q-106 -172 -283 -275.5t-385 -109.5v66q56 1 121 13l-17 86q220 44 368 212l65 -57q44 50 73 99zM1377 805l-233 -80q14 -42 14 -85t-14 -85l232 -80q-31 -92 -98 -169l-185 162q-57 -67 -147 -85l48 -241q-52 -10 -98 -10t-98 10l48 241q-90 18 -147 85l-185 -162 q-67 77 -98 169l232 80q-14 42 -14 85t14 85l-233 80q33 93 99 169l185 -162q59 68 147 86l-48 240q44 10 98 10t98 -10l-48 -240q88 -18 147 -86l185 162q66 -76 99 -169zM874 1448v-66q-65 -2 -121 -13l17 -86q-220 -42 -368 -211l-65 56q-38 -42 -73 -98l-57 33 q106 172 282 275.5t385 109.5zM1705 640q0 -205 -98 -385l-57 33q27 52 49 112l-83 28q36 103 36 212q0 112 -35 212l82 28q-19 56 -49 112l57 33q98 -180 98 -385zM1585 1063l-57 -33q-35 56 -73 98l-65 -56q-148 169 -368 211l17 86q-56 11 -121 13v66q209 -6 385 -109.5 t282 -275.5zM1748 640q0 173 -67.5 331t-181.5 272t-272 181.5t-331 67.5t-331 -67.5t-272 -181.5t-181.5 -272t-67.5 -331t67.5 -331t181.5 -272t272 -181.5t331 -67.5t331 67.5t272 181.5t181.5 272t67.5 331zM1792 640q0 -182 -71 -348t-191 -286t-286 -191t-348 -71 t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71t348 -71t286 -191t191 -286t71 -348z" />
459 <glyph unicode="&#xf1d2;" d="M582 228q0 -66 -93 -66q-107 0 -107 63q0 64 98 64q102 0 102 -61zM546 694q0 -85 -74 -85q-77 0 -77 84q0 90 77 90q36 0 55 -25.5t19 -63.5zM712 769v125q-78 -29 -135 -29q-50 29 -110 29q-86 0 -145 -57t-59 -143q0 -50 29.5 -102t73.5 -67v-3q-38 -17 -38 -85 q0 -53 41 -77v-3q-113 -37 -113 -139q0 -45 20 -78.5t54 -51t72 -25.5t81 -8q224 0 224 188q0 67 -48 99t-126 46q-27 5 -51.5 20.5t-24.5 39.5q0 44 49 52q77 15 122 70t45 134q0 24 -10 52q37 9 49 13zM771 350h137q-2 27 -2 82v387q0 46 2 69h-137q3 -23 3 -71v-392 q0 -50 -3 -75zM1280 366v121q-30 -21 -68 -21q-53 0 -53 82v225h52q9 0 26.5 -1t26.5 -1v117h-105q0 82 3 102h-140q4 -24 4 -55v-47h-60v-117q36 3 37 3q3 0 11 -0.5t12 -0.5v-2h-2v-217q0 -37 2.5 -64t11.5 -56.5t24.5 -48.5t43.5 -31t66 -12q64 0 108 24zM924 1072 q0 36 -24 63.5t-60 27.5t-60.5 -27t-24.5 -64q0 -36 25 -62.5t60 -26.5t59.5 27t24.5 62zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
460 <glyph unicode="&#xf1d3;" horiz-adv-x="1792" d="M595 22q0 100 -165 100q-158 0 -158 -104q0 -101 172 -101q151 0 151 105zM536 777q0 61 -30 102t-89 41q-124 0 -124 -145q0 -135 124 -135q119 0 119 137zM805 1101v-202q-36 -12 -79 -22q16 -43 16 -84q0 -127 -73 -216.5t-197 -112.5q-40 -8 -59.5 -27t-19.5 -58 q0 -31 22.5 -51.5t58 -32t78.5 -22t86 -25.5t78.5 -37.5t58 -64t22.5 -98.5q0 -304 -363 -304q-69 0 -130 12.5t-116 41t-87.5 82t-32.5 127.5q0 165 182 225v4q-67 41 -67 126q0 109 63 137v4q-72 24 -119.5 108.5t-47.5 165.5q0 139 95 231.5t235 92.5q96 0 178 -47 q98 0 218 47zM1123 220h-222q4 45 4 134v609q0 94 -4 128h222q-4 -33 -4 -124v-613q0 -89 4 -134zM1724 442v-196q-71 -39 -174 -39q-62 0 -107 20t-70 50t-39.5 78t-18.5 92t-4 103v351h2v4q-7 0 -19 1t-18 1q-21 0 -59 -6v190h96v76q0 54 -6 89h227q-6 -41 -6 -165h171 v-190q-15 0 -43.5 2t-42.5 2h-85v-365q0 -131 87 -131q61 0 109 33zM1148 1389q0 -58 -39 -101.5t-96 -43.5q-58 0 -98 43.5t-40 101.5q0 59 39.5 103t98.5 44q58 0 96.5 -44.5t38.5 -102.5z" />
461 <glyph unicode="&#xf1d4;" d="M825 547l343 588h-150q-21 -39 -63.5 -118.5t-68 -128.5t-59.5 -118.5t-60 -128.5h-3q-21 48 -44.5 97t-52 105.5t-46.5 92t-54 104.5t-49 95h-150l323 -589v-435h134v436zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960 q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
462 <glyph unicode="&#xf1d5;" horiz-adv-x="1280" d="M842 964q0 -80 -57 -136.5t-136 -56.5q-60 0 -111 35q-62 -67 -115 -146q-247 -371 -202 -859q1 -22 -12.5 -38.5t-34.5 -18.5h-5q-20 0 -35 13.5t-17 33.5q-14 126 -3.5 247.5t29.5 217t54 186t69 155.5t74 125q61 90 132 165q-16 35 -16 77q0 80 56.5 136.5t136.5 56.5 t136.5 -56.5t56.5 -136.5zM1223 953q0 -158 -78 -292t-212.5 -212t-292.5 -78q-64 0 -131 14q-21 5 -32.5 23.5t-6.5 39.5q5 20 23 31.5t39 7.5q51 -13 108 -13q97 0 186 38t153 102t102 153t38 186t-38 186t-102 153t-153 102t-186 38t-186 -38t-153 -102t-102 -153 t-38 -186q0 -114 52 -218q10 -20 3.5 -40t-25.5 -30t-39.5 -3t-30.5 26q-64 123 -64 265q0 119 46.5 227t124.5 186t186 124t226 46q158 0 292.5 -78t212.5 -212.5t78 -292.5z" />
463 <glyph unicode="&#xf1d6;" horiz-adv-x="1792" d="M270 730q-8 19 -8 52q0 20 11 49t24 45q-1 22 7.5 53t22.5 43q0 139 92.5 288.5t217.5 209.5q139 66 324 66q133 0 266 -55q49 -21 90 -48t71 -56t55 -68t42 -74t32.5 -84.5t25.5 -89.5t22 -98l1 -5q55 -83 55 -150q0 -14 -9 -40t-9 -38q0 -1 1.5 -3.5t3.5 -5t2 -3.5 q77 -114 120.5 -214.5t43.5 -208.5q0 -43 -19.5 -100t-55.5 -57q-9 0 -19.5 7.5t-19 17.5t-19 26t-16 26.5t-13.5 26t-9 17.5q-1 1 -3 1l-5 -4q-59 -154 -132 -223q20 -20 61.5 -38.5t69 -41.5t35.5 -65q-2 -4 -4 -16t-7 -18q-64 -97 -302 -97q-53 0 -110.5 9t-98 20 t-104.5 30q-15 5 -23 7q-14 4 -46 4.5t-40 1.5q-41 -45 -127.5 -65t-168.5 -20q-35 0 -69 1.5t-93 9t-101 20.5t-74.5 40t-32.5 64q0 40 10 59.5t41 48.5q11 2 40.5 13t49.5 12q4 0 14 2q2 2 2 4l-2 3q-48 11 -108 105.5t-73 156.5l-5 3q-4 0 -12 -20q-18 -41 -54.5 -74.5 t-77.5 -37.5h-1q-4 0 -6 4.5t-5 5.5q-23 54 -23 100q0 275 252 466z" />
464 <glyph unicode="&#xf1d7;" horiz-adv-x="2048" d="M580 1075q0 41 -25 66t-66 25q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 66 24.5t25 65.5zM1323 568q0 28 -25.5 50t-65.5 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q40 0 65.5 22t25.5 51zM1087 1075q0 41 -24.5 66t-65.5 25 q-43 0 -76 -25.5t-33 -65.5q0 -39 33 -64.5t76 -25.5q41 0 65.5 24.5t24.5 65.5zM1722 568q0 28 -26 50t-65 22q-27 0 -49.5 -22.5t-22.5 -49.5q0 -28 22.5 -50.5t49.5 -22.5q39 0 65 22t26 51zM1456 965q-31 4 -70 4q-169 0 -311 -77t-223.5 -208.5t-81.5 -287.5 q0 -78 23 -152q-35 -3 -68 -3q-26 0 -50 1.5t-55 6.5t-44.5 7t-54.5 10.5t-50 10.5l-253 -127l72 218q-290 203 -290 490q0 169 97.5 311t264 223.5t363.5 81.5q176 0 332.5 -66t262 -182.5t136.5 -260.5zM2048 404q0 -117 -68.5 -223.5t-185.5 -193.5l55 -181l-199 109 q-150 -37 -218 -37q-169 0 -311 70.5t-223.5 191.5t-81.5 264t81.5 264t223.5 191.5t311 70.5q161 0 303 -70.5t227.5 -192t85.5 -263.5z" />
465 <glyph unicode="&#xf1d8;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-453 185l-242 -295q-18 -23 -49 -23q-13 0 -22 4q-19 7 -30.5 23.5t-11.5 36.5v349l864 1059l-1069 -925l-395 162q-37 14 -40 55q-2 40 32 59l1664 960q15 9 32 9q20 0 36 -11z" />
466 <glyph unicode="&#xf1d9;" horiz-adv-x="1792" d="M1764 1525q33 -24 27 -64l-256 -1536q-5 -29 -32 -45q-14 -8 -31 -8q-11 0 -24 5l-527 215l-298 -327q-18 -21 -47 -21q-14 0 -23 4q-19 7 -30 23.5t-11 36.5v452l-472 193q-37 14 -40 55q-3 39 32 59l1664 960q35 21 68 -2zM1422 26l221 1323l-1434 -827l336 -137 l863 639l-478 -797z" />
467 <glyph unicode="&#xf1da;" d="M1536 640q0 -156 -61 -298t-164 -245t-245 -164t-298 -61q-172 0 -327 72.5t-264 204.5q-7 10 -6.5 22.5t8.5 20.5l137 138q10 9 25 9q16 -2 23 -12q73 -95 179 -147t225 -52q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5 t-163.5 109.5t-198.5 40.5q-98 0 -188 -35.5t-160 -101.5l137 -138q31 -30 14 -69q-17 -40 -59 -40h-448q-26 0 -45 19t-19 45v448q0 42 40 59q39 17 69 -14l130 -129q107 101 244.5 156.5t284.5 55.5q156 0 298 -61t245 -164t164 -245t61 -298zM896 928v-448q0 -14 -9 -23 t-23 -9h-320q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h224v352q0 14 9 23t23 9h64q14 0 23 -9t9 -23z" />
468 <glyph unicode="&#xf1db;" d="M768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103 t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
469 <glyph unicode="&#xf1dc;" horiz-adv-x="1792" d="M1682 -128q-44 0 -132.5 3.5t-133.5 3.5q-44 0 -132 -3.5t-132 -3.5q-24 0 -37 20.5t-13 45.5q0 31 17 46t39 17t51 7t45 15q33 21 33 140l-1 391q0 21 -1 31q-13 4 -50 4h-675q-38 0 -51 -4q-1 -10 -1 -31l-1 -371q0 -142 37 -164q16 -10 48 -13t57 -3.5t45 -15 t20 -45.5q0 -26 -12.5 -48t-36.5 -22q-47 0 -139.5 3.5t-138.5 3.5q-43 0 -128 -3.5t-127 -3.5q-23 0 -35.5 21t-12.5 45q0 30 15.5 45t36 17.5t47.5 7.5t42 15q33 23 33 143l-1 57v813q0 3 0.5 26t0 36.5t-1.5 38.5t-3.5 42t-6.5 36.5t-11 31.5t-16 18q-15 10 -45 12t-53 2 t-41 14t-18 45q0 26 12 48t36 22q46 0 138.5 -3.5t138.5 -3.5q42 0 126.5 3.5t126.5 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17 -43.5t-38.5 -14.5t-49.5 -4t-43 -13q-35 -21 -35 -160l1 -320q0 -21 1 -32q13 -3 39 -3h699q25 0 38 3q1 11 1 32l1 320q0 139 -35 160 q-18 11 -58.5 12.5t-66 13t-25.5 49.5q0 26 12.5 48t37.5 22q44 0 132 -3.5t132 -3.5q43 0 129 3.5t129 3.5q25 0 37.5 -22t12.5 -48q0 -30 -17.5 -44t-40 -14.5t-51.5 -3t-44 -12.5q-35 -23 -35 -161l1 -943q0 -119 34 -140q16 -10 46 -13.5t53.5 -4.5t41.5 -15.5t18 -44.5 q0 -26 -12 -48t-36 -22z" />
470 <glyph unicode="&#xf1dd;" horiz-adv-x="1280" d="M1278 1347v-73q0 -29 -18.5 -61t-42.5 -32q-50 0 -54 -1q-26 -6 -32 -31q-3 -11 -3 -64v-1152q0 -25 -18 -43t-43 -18h-108q-25 0 -43 18t-18 43v1218h-143v-1218q0 -25 -17.5 -43t-43.5 -18h-108q-26 0 -43.5 18t-17.5 43v496q-147 12 -245 59q-126 58 -192 179 q-64 117 -64 259q0 166 88 286q88 118 209 159q111 37 417 37h479q25 0 43 -18t18 -43z" />
471 <glyph unicode="&#xf1de;" d="M352 128v-128h-352v128h352zM704 256q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM864 640v-128h-864v128h864zM224 1152v-128h-224v128h224zM1536 128v-128h-736v128h736zM576 1280q26 0 45 -19t19 -45v-256 q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1216 768q26 0 45 -19t19 -45v-256q0 -26 -19 -45t-45 -19h-256q-26 0 -45 19t-19 45v256q0 26 19 45t45 19h256zM1536 640v-128h-224v128h224zM1536 1152v-128h-864v128h864z" />
472 <glyph unicode="&#xf1e0;" d="M1216 512q133 0 226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5t-226.5 93.5t-93.5 226.5q0 12 2 34l-360 180q-92 -86 -218 -86q-133 0 -226.5 93.5t-93.5 226.5t93.5 226.5t226.5 93.5q126 0 218 -86l360 180q-2 22 -2 34q0 133 93.5 226.5t226.5 93.5 t226.5 -93.5t93.5 -226.5t-93.5 -226.5t-226.5 -93.5q-126 0 -218 86l-360 -180q2 -22 2 -34t-2 -34l360 -180q92 86 218 86z" />
473 <glyph unicode="&#xf1e1;" d="M1280 341q0 88 -62.5 151t-150.5 63q-84 0 -145 -58l-241 120q2 16 2 23t-2 23l241 120q61 -58 145 -58q88 0 150.5 63t62.5 151t-62.5 150.5t-150.5 62.5t-151 -62.5t-63 -150.5q0 -7 2 -23l-241 -120q-62 57 -145 57q-88 0 -150.5 -62.5t-62.5 -150.5t62.5 -150.5 t150.5 -62.5q83 0 145 57l241 -120q-2 -16 -2 -23q0 -88 63 -150.5t151 -62.5t150.5 62.5t62.5 150.5zM1536 1120v-960q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
474 <glyph unicode="&#xf1e2;" horiz-adv-x="1792" d="M571 947q-10 25 -34 35t-49 0q-108 -44 -191 -127t-127 -191q-10 -25 0 -49t35 -34q13 -5 24 -5q42 0 60 40q34 84 98.5 148.5t148.5 98.5q25 11 35 35t0 49zM1513 1303l46 -46l-244 -243l68 -68q19 -19 19 -45.5t-19 -45.5l-64 -64q89 -161 89 -343q0 -143 -55.5 -273.5 t-150 -225t-225 -150t-273.5 -55.5t-273.5 55.5t-225 150t-150 225t-55.5 273.5t55.5 273.5t150 225t225 150t273.5 55.5q182 0 343 -89l64 64q19 19 45.5 19t45.5 -19l68 -68zM1521 1359q-10 -10 -22 -10q-13 0 -23 10l-91 90q-9 10 -9 23t9 23q10 9 23 9t23 -9l90 -91 q10 -9 10 -22.5t-10 -22.5zM1751 1129q-11 -9 -23 -9t-23 9l-90 91q-10 9 -10 22.5t10 22.5q9 10 22.5 10t22.5 -10l91 -90q9 -10 9 -23t-9 -23zM1792 1312q0 -14 -9 -23t-23 -9h-96q-14 0 -23 9t-9 23t9 23t23 9h96q14 0 23 -9t9 -23zM1600 1504v-96q0 -14 -9 -23t-23 -9 t-23 9t-9 23v96q0 14 9 23t23 9t23 -9t9 -23zM1751 1449l-91 -90q-10 -10 -22 -10q-13 0 -23 10q-10 9 -10 22.5t10 22.5l90 91q10 9 23 9t23 -9q9 -10 9 -23t-9 -23z" />
475 <glyph unicode="&#xf1e3;" horiz-adv-x="1792" d="M609 720l287 208l287 -208l-109 -336h-355zM896 1536q182 0 348 -71t286 -191t191 -286t71 -348t-71 -348t-191 -286t-286 -191t-348 -71t-348 71t-286 191t-191 286t-71 348t71 348t191 286t286 191t348 71zM1515 186q149 203 149 454v3l-102 -89l-240 224l63 323 l134 -12q-150 206 -389 282l53 -124l-287 -159l-287 159l53 124q-239 -76 -389 -282l135 12l62 -323l-240 -224l-102 89v-3q0 -251 149 -454l30 132l326 -40l139 -298l-116 -69q117 -39 240 -39t240 39l-116 69l139 298l326 40z" />
476 <glyph unicode="&#xf1e4;" horiz-adv-x="1792" d="M448 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM256 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM832 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23 v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM640 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM66 768q-28 0 -47 19t-19 46v129h514v-129q0 -27 -19 -46t-46 -19h-383zM1216 224v-192q0 -14 -9 -23t-23 -9h-192 q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1024 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1600 224v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23 zM1408 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 1016v-13h-514v10q0 104 -382 102q-382 -1 -382 -102v-10h-514v13q0 17 8.5 43t34 64t65.5 75.5t110.5 76t160 67.5t224 47.5t293.5 18.5t293 -18.5t224 -47.5 t160.5 -67.5t110.5 -76t65.5 -75.5t34 -64t8.5 -43zM1792 608v-192q0 -14 -9 -23t-23 -9h-192q-14 0 -23 9t-9 23v192q0 14 9 23t23 9h192q14 0 23 -9t9 -23zM1792 962v-129q0 -27 -19 -46t-46 -19h-384q-27 0 -46 19t-19 46v129h514z" />
477 <glyph unicode="&#xf1e5;" horiz-adv-x="1792" d="M704 1216v-768q0 -26 -19 -45t-45 -19v-576q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v512l249 873q7 23 31 23h424zM1024 1216v-704h-256v704h256zM1792 320v-512q0 -26 -19 -45t-45 -19h-512q-26 0 -45 19t-19 45v576q-26 0 -45 19t-19 45v768h424q24 0 31 -23z M736 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23zM1408 1504v-224h-352v224q0 14 9 23t23 9h288q14 0 23 -9t9 -23z" />
478 <glyph unicode="&#xf1e6;" horiz-adv-x="1792" d="M1755 1083q37 -37 37 -90t-37 -91l-401 -400l150 -150l-160 -160q-163 -163 -389.5 -186.5t-411.5 100.5l-362 -362h-181v181l362 362q-124 185 -100.5 411.5t186.5 389.5l160 160l150 -150l400 401q38 37 91 37t90 -37t37 -90.5t-37 -90.5l-400 -401l234 -234l401 400 q38 37 91 37t90 -37z" />
479 <glyph unicode="&#xf1e7;" horiz-adv-x="1792" d="M873 796q0 -83 -63.5 -142.5t-152.5 -59.5t-152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59t152.5 -59t63.5 -143zM1375 796q0 -83 -63 -142.5t-153 -59.5q-89 0 -152.5 59.5t-63.5 142.5q0 84 63.5 143t152.5 59q90 0 153 -59t63 -143zM1600 616v667q0 87 -32 123.5 t-111 36.5h-1112q-83 0 -112.5 -34t-29.5 -126v-673q43 -23 88.5 -40t81 -28t81 -18.5t71 -11t70 -4t58.5 -0.5t56.5 2t44.5 2q68 1 95 -27q6 -6 10 -9q26 -25 61 -51q7 91 118 87q5 0 36.5 -1.5t43 -2t45.5 -1t53 1t54.5 4.5t61 8.5t62 13.5t67 19.5t67.5 27t72 34.5z M1763 621q-121 -149 -372 -252q84 -285 -23 -465q-66 -113 -183 -148q-104 -32 -182 15q-86 51 -82 164l-1 326v1q-8 2 -24.5 6t-23.5 5l-1 -338q4 -114 -83 -164q-79 -47 -183 -15q-117 36 -182 150q-105 180 -22 463q-251 103 -372 252q-25 37 -4 63t60 -1q3 -2 11 -7 t11 -8v694q0 72 47 123t114 51h1257q67 0 114 -51t47 -123v-694l21 15q39 27 60 1t-4 -63z" />
480 <glyph unicode="&#xf1e8;" horiz-adv-x="1792" d="M896 1102v-434h-145v434h145zM1294 1102v-434h-145v434h145zM1294 342l253 254v795h-1194v-1049h326v-217l217 217h398zM1692 1536v-1013l-434 -434h-326l-217 -217h-217v217h-398v1158l109 289h1483z" />
481 <glyph unicode="&#xf1e9;" d="M773 217v-127q-1 -292 -6 -305q-12 -32 -51 -40q-54 -9 -181.5 38t-162.5 89q-13 15 -17 36q-1 12 4 26q4 10 34 47t181 216q1 0 60 70q15 19 39.5 24.5t49.5 -3.5q24 -10 37.5 -29t12.5 -42zM624 468q-3 -55 -52 -70l-120 -39q-275 -88 -292 -88q-35 2 -54 36 q-12 25 -17 75q-8 76 1 166.5t30 124.5t56 32q13 0 202 -77q70 -29 115 -47l84 -34q23 -9 35.5 -30.5t11.5 -48.5zM1450 171q-7 -54 -91.5 -161t-135.5 -127q-37 -14 -63 7q-14 10 -184 287l-47 77q-14 21 -11.5 46t19.5 46q35 43 83 26q1 -1 119 -40q203 -66 242 -79.5 t47 -20.5q28 -22 22 -61zM778 803q5 -102 -54 -122q-58 -17 -114 71l-378 598q-8 35 19 62q41 43 207.5 89.5t224.5 31.5q40 -10 49 -45q3 -18 22 -305.5t24 -379.5zM1440 695q3 -39 -26 -59q-15 -10 -329 -86q-67 -15 -91 -23l1 2q-23 -6 -46 4t-37 32q-30 47 0 87 q1 1 75 102q125 171 150 204t34 39q28 19 65 2q48 -23 123 -133.5t81 -167.5v-3z" />
482 <glyph unicode="&#xf1ea;" horiz-adv-x="2048" d="M1024 1024h-384v-384h384v384zM1152 384v-128h-640v128h640zM1152 1152v-640h-640v640h640zM1792 384v-128h-512v128h512zM1792 640v-128h-512v128h512zM1792 896v-128h-512v128h512zM1792 1152v-128h-512v128h512zM256 192v960h-128v-960q0 -26 19 -45t45 -19t45 19 t19 45zM1920 192v1088h-1536v-1088q0 -33 -11 -64h1483q26 0 45 19t19 45zM2048 1408v-1216q0 -80 -56 -136t-136 -56h-1664q-80 0 -136 56t-56 136v1088h256v128h1792z" />
483 <glyph unicode="&#xf1eb;" horiz-adv-x="2048" d="M1024 13q-20 0 -93 73.5t-73 93.5q0 32 62.5 54t103.5 22t103.5 -22t62.5 -54q0 -20 -73 -93.5t-93 -73.5zM1294 284q-2 0 -40 25t-101.5 50t-128.5 25t-128.5 -25t-101 -50t-40.5 -25q-18 0 -93.5 75t-75.5 93q0 13 10 23q78 77 196 121t233 44t233 -44t196 -121 q10 -10 10 -23q0 -18 -75.5 -93t-93.5 -75zM1567 556q-11 0 -23 8q-136 105 -252 154.5t-268 49.5q-85 0 -170.5 -22t-149 -53t-113.5 -62t-79 -53t-31 -22q-17 0 -92 75t-75 93q0 12 10 22q132 132 320 205t380 73t380 -73t320 -205q10 -10 10 -22q0 -18 -75 -93t-92 -75z M1838 827q-11 0 -22 9q-179 157 -371.5 236.5t-420.5 79.5t-420.5 -79.5t-371.5 -236.5q-11 -9 -22 -9q-17 0 -92.5 75t-75.5 93q0 13 10 23q187 186 445 288t527 102t527 -102t445 -288q10 -10 10 -23q0 -18 -75.5 -93t-92.5 -75z" />
484 <glyph unicode="&#xf1ec;" horiz-adv-x="1792" d="M384 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM384 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5 t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 0q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5 t37.5 90.5zM384 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1152 384q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM768 768q0 53 -37.5 90.5t-90.5 37.5 t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1536 0v384q0 52 -38 90t-90 38t-90 -38t-38 -90v-384q0 -52 38 -90t90 -38t90 38t38 90zM1152 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5z M1536 1088v256q0 26 -19 45t-45 19h-1280q-26 0 -45 -19t-19 -45v-256q0 -26 19 -45t45 -19h1280q26 0 45 19t19 45zM1536 768q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1664 1408v-1536q0 -52 -38 -90t-90 -38 h-1408q-52 0 -90 38t-38 90v1536q0 52 38 90t90 38h1408q52 0 90 -38t38 -90z" />
485 <glyph unicode="&#xf1ed;" horiz-adv-x="1792" d="M1112 1090q0 159 -237 159h-70q-32 0 -59.5 -21.5t-34.5 -52.5l-63 -276q-2 -5 -2 -16q0 -24 17 -39.5t41 -15.5h53q69 0 128.5 13t112.5 41t83.5 81.5t30.5 126.5zM1716 938q0 -265 -220 -428q-219 -161 -612 -161h-61q-32 0 -59 -21.5t-34 -52.5l-73 -316 q-8 -36 -40.5 -61.5t-69.5 -25.5h-213q-31 0 -53 20t-22 51q0 10 13 65h151q34 0 64 23.5t38 56.5l73 316q8 33 37.5 57t63.5 24h61q390 0 607 160t217 421q0 129 -51 207q183 -92 183 -335zM1533 1123q0 -264 -221 -428q-218 -161 -612 -161h-60q-32 0 -59.5 -22t-34.5 -53 l-73 -315q-8 -36 -40 -61.5t-69 -25.5h-214q-31 0 -52.5 19.5t-21.5 51.5q0 8 2 20l300 1301q8 36 40.5 61.5t69.5 25.5h444q68 0 125 -4t120.5 -15t113.5 -30t96.5 -50.5t77.5 -74t49.5 -103.5t18.5 -136z" />
486 <glyph unicode="&#xf1ee;" horiz-adv-x="1792" d="M602 949q19 -61 31 -123.5t17 -141.5t-14 -159t-62 -145q-21 81 -67 157t-95.5 127t-99 90.5t-78.5 57.5t-33 19q-62 34 -81.5 100t14.5 128t101 81.5t129 -14.5q138 -83 238 -177zM927 1236q11 -25 20.5 -46t36.5 -100.5t42.5 -150.5t25.5 -179.5t0 -205.5t-47.5 -209.5 t-105.5 -208.5q-51 -72 -138 -72q-54 0 -98 31q-57 40 -69 109t28 127q60 85 81 195t13 199.5t-32 180.5t-39 128t-22 52q-31 63 -8.5 129.5t85.5 97.5q34 17 75 17q47 0 88.5 -25t63.5 -69zM1248 567q-17 -160 -72 -311q-17 131 -63 246q25 174 -5 361q-27 178 -94 342 q114 -90 212 -211q9 -37 15 -80q26 -179 7 -347zM1520 1440q9 -17 23.5 -49.5t43.5 -117.5t50.5 -178t34 -227.5t5 -269t-47 -300t-112.5 -323.5q-22 -48 -66 -75.5t-95 -27.5q-39 0 -74 16q-67 31 -92.5 100t4.5 136q58 126 90 257.5t37.5 239.5t-3.5 213.5t-26.5 180.5 t-38.5 138.5t-32.5 90t-15.5 32.5q-34 65 -11.5 135.5t87.5 104.5q37 20 81 20q49 0 91.5 -25.5t66.5 -70.5z" />
487 <glyph unicode="&#xf1f0;" horiz-adv-x="2304" d="M1975 546h-138q14 37 66 179l3 9q4 10 10 26t9 26l12 -55zM531 611l-58 295q-11 54 -75 54h-268l-2 -13q311 -79 403 -336zM710 960l-162 -438l-17 89q-26 70 -85 129.5t-131 88.5l135 -510h175l261 641h-176zM849 318h166l104 642h-166zM1617 944q-69 27 -149 27 q-123 0 -201 -59t-79 -153q-1 -102 145 -174q48 -23 67 -41t19 -39q0 -30 -30 -46t-69 -16q-86 0 -156 33l-22 11l-23 -144q74 -34 185 -34q130 -1 208.5 59t80.5 160q0 106 -140 174q-49 25 -71 42t-22 38q0 22 24.5 38.5t70.5 16.5q70 1 124 -24l15 -8zM2042 960h-128 q-65 0 -87 -54l-246 -588h174l35 96h212q5 -22 20 -96h154zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
488 <glyph unicode="&#xf1f1;" horiz-adv-x="2304" d="M671 603h-13q-47 0 -47 -32q0 -22 20 -22q17 0 28 15t12 39zM1066 639h62v3q1 4 0.5 6.5t-1 7t-2 8t-4.5 6.5t-7.5 5t-11.5 2q-28 0 -36 -38zM1606 603h-12q-48 0 -48 -32q0 -22 20 -22q17 0 28 15t12 39zM1925 629q0 41 -30 41q-19 0 -31 -20t-12 -51q0 -42 28 -42 q20 0 32.5 20t12.5 52zM480 770h87l-44 -262h-56l32 201l-71 -201h-39l-4 200l-34 -200h-53l44 262h81l2 -163zM733 663q0 -6 -4 -42q-16 -101 -17 -113h-47l1 22q-20 -26 -58 -26q-23 0 -37.5 16t-14.5 42q0 39 26 60.5t73 21.5q14 0 23 -1q0 3 0.5 5.5t1 4.5t0.5 3 q0 20 -36 20q-29 0 -59 -10q0 4 7 48q38 11 67 11q74 0 74 -62zM889 721l-8 -49q-22 3 -41 3q-27 0 -27 -17q0 -8 4.5 -12t21.5 -11q40 -19 40 -60q0 -72 -87 -71q-34 0 -58 6q0 2 7 49q29 -8 51 -8q32 0 32 19q0 7 -4.5 11.5t-21.5 12.5q-43 20 -43 59q0 72 84 72 q30 0 50 -4zM977 721h28l-7 -52h-29q-2 -17 -6.5 -40.5t-7 -38.5t-2.5 -18q0 -16 19 -16q8 0 16 2l-8 -47q-21 -7 -40 -7q-43 0 -45 47q0 12 8 56q3 20 25 146h55zM1180 648q0 -23 -7 -52h-111q-3 -22 10 -33t38 -11q30 0 58 14l-9 -54q-30 -8 -57 -8q-95 0 -95 95 q0 55 27.5 90.5t69.5 35.5q35 0 55.5 -21t20.5 -56zM1319 722q-13 -23 -22 -62q-22 2 -31 -24t-25 -128h-56l3 14q22 130 29 199h51l-3 -33q14 21 25.5 29.5t28.5 4.5zM1506 763l-9 -57q-28 14 -50 14q-31 0 -51 -27.5t-20 -70.5q0 -30 13.5 -47t38.5 -17q21 0 48 13 l-10 -59q-28 -8 -50 -8q-45 0 -71.5 30.5t-26.5 82.5q0 70 35.5 114.5t91.5 44.5q26 0 61 -13zM1668 663q0 -18 -4 -42q-13 -79 -17 -113h-46l1 22q-20 -26 -59 -26q-23 0 -37 16t-14 42q0 39 25.5 60.5t72.5 21.5q15 0 23 -1q2 7 2 13q0 20 -36 20q-29 0 -59 -10q0 4 8 48 q38 11 67 11q73 0 73 -62zM1809 722q-14 -24 -21 -62q-23 2 -31.5 -23t-25.5 -129h-56l3 14q19 104 29 199h52q0 -11 -4 -33q15 21 26.5 29.5t27.5 4.5zM1950 770h56l-43 -262h-53l3 19q-23 -23 -52 -23q-31 0 -49.5 24t-18.5 64q0 53 27.5 92t64.5 39q31 0 53 -29z M2061 640q0 148 -72.5 273t-198 198t-273.5 73q-181 0 -328 -110q127 -116 171 -284h-50q-44 150 -158 253q-114 -103 -158 -253h-50q44 168 171 284q-147 110 -328 110q-148 0 -273.5 -73t-198 -198t-72.5 -273t72.5 -273t198 -198t273.5 -73q181 0 328 110 q-120 111 -165 264h50q46 -138 152 -233q106 95 152 233h50q-45 -153 -165 -264q147 -110 328 -110q148 0 273.5 73t198 198t72.5 273zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
489 <glyph unicode="&#xf1f2;" horiz-adv-x="2304" d="M313 759q0 -51 -36 -84q-29 -26 -89 -26h-17v220h17q61 0 89 -27q36 -31 36 -83zM2089 824q0 -52 -64 -52h-19v101h20q63 0 63 -49zM380 759q0 74 -50 120.5t-129 46.5h-95v-333h95q74 0 119 38q60 51 60 128zM410 593h65v333h-65v-333zM730 694q0 40 -20.5 62t-75.5 42 q-29 10 -39.5 19t-10.5 23q0 16 13.5 26.5t34.5 10.5q29 0 53 -27l34 44q-41 37 -98 37q-44 0 -74 -27.5t-30 -67.5q0 -35 18 -55.5t64 -36.5q37 -13 45 -19q19 -12 19 -34q0 -20 -14 -33.5t-36 -13.5q-48 0 -71 44l-42 -40q44 -64 115 -64q51 0 83 30.5t32 79.5zM1008 604 v77q-37 -37 -78 -37q-49 0 -80.5 32.5t-31.5 82.5q0 48 31.5 81.5t77.5 33.5q43 0 81 -38v77q-40 20 -80 20q-74 0 -125.5 -50.5t-51.5 -123.5t51 -123.5t125 -50.5q42 0 81 19zM2240 0v527q-65 -40 -144.5 -84t-237.5 -117t-329.5 -137.5t-417.5 -134.5t-504 -118h1569 q26 0 45 19t19 45zM1389 757q0 75 -53 128t-128 53t-128 -53t-53 -128t53 -128t128 -53t128 53t53 128zM1541 584l144 342h-71l-90 -224l-89 224h-71l142 -342h35zM1714 593h184v56h-119v90h115v56h-115v74h119v57h-184v-333zM2105 593h80l-105 140q76 16 76 94q0 47 -31 73 t-87 26h-97v-333h65v133h9zM2304 1274v-1268q0 -56 -38.5 -95t-93.5 -39h-2040q-55 0 -93.5 39t-38.5 95v1268q0 56 38.5 95t93.5 39h2040q55 0 93.5 -39t38.5 -95z" />
490 <glyph unicode="&#xf1f3;" horiz-adv-x="2304" d="M119 854h89l-45 108zM740 328l74 79l-70 79h-163v-49h142v-55h-142v-54h159zM898 406l99 -110v217zM1186 453q0 33 -40 33h-84v-69h83q41 0 41 36zM1475 457q0 29 -42 29h-82v-61h81q43 0 43 32zM1197 923q0 29 -42 29h-82v-60h81q43 0 43 31zM1656 854h89l-44 108z M699 1009v-271h-66v212l-94 -212h-57l-94 212v-212h-132l-25 60h-135l-25 -60h-70l116 271h96l110 -257v257h106l85 -184l77 184h108zM1255 453q0 -20 -5.5 -35t-14 -25t-22.5 -16.5t-26 -10t-31.5 -4.5t-31.5 -1t-32.5 0.5t-29.5 0.5v-91h-126l-80 90l-83 -90h-256v271h260 l80 -89l82 89h207q109 0 109 -89zM964 794v-56h-217v271h217v-57h-152v-49h148v-55h-148v-54h152zM2304 235v-229q0 -55 -38.5 -94.5t-93.5 -39.5h-2040q-55 0 -93.5 39.5t-38.5 94.5v678h111l25 61h55l25 -61h218v46l19 -46h113l20 47v-47h541v99l10 1q10 0 10 -14v-86h279 v23q23 -12 55 -18t52.5 -6.5t63 0.5t51.5 1l25 61h56l25 -61h227v58l34 -58h182v378h-180v-44l-25 44h-185v-44l-23 44h-249q-69 0 -109 -22v22h-172v-22q-24 22 -73 22h-628l-43 -97l-43 97h-198v-44l-22 44h-169l-78 -179v391q0 55 38.5 94.5t93.5 39.5h2040 q55 0 93.5 -39.5t38.5 -94.5v-678h-120q-51 0 -81 -22v22h-177q-55 0 -78 -22v22h-316v-22q-31 22 -87 22h-209v-22q-23 22 -91 22h-234l-54 -58l-50 58h-349v-378h343l55 59l52 -59h211v89h21q59 0 90 13v-102h174v99h8q8 0 10 -2t2 -10v-87h529q57 0 88 24v-24h168 q60 0 95 17zM1546 469q0 -23 -12 -43t-34 -29q25 -9 34 -26t9 -46v-54h-65v45q0 33 -12 43.5t-46 10.5h-69v-99h-65v271h154q48 0 77 -15t29 -58zM1269 936q0 -24 -12.5 -44t-33.5 -29q26 -9 34.5 -25.5t8.5 -46.5v-53h-65q0 9 0.5 26.5t0 25t-3 18.5t-8.5 16t-17.5 8.5 t-29.5 3.5h-70v-98h-64v271l153 -1q49 0 78 -14.5t29 -57.5zM1798 327v-56h-216v271h216v-56h-151v-49h148v-55h-148v-54zM1372 1009v-271h-66v271h66zM2065 357q0 -86 -102 -86h-126v58h126q34 0 34 25q0 16 -17 21t-41.5 5t-49.5 3.5t-42 22.5t-17 55q0 39 26 60t66 21 h130v-57h-119q-36 0 -36 -25q0 -16 17.5 -20.5t42 -4t49 -2.5t42 -21.5t17.5 -54.5zM2304 407v-101q-24 -35 -88 -35h-125v58h125q33 0 33 25q0 13 -12.5 19t-31 5.5t-40 2t-40 8t-31 24t-12.5 48.5q0 39 26.5 60t66.5 21h129v-57h-118q-36 0 -36 -25q0 -20 29 -22t68.5 -5 t56.5 -26zM2139 1008v-270h-92l-122 203v-203h-132l-26 60h-134l-25 -60h-75q-129 0 -129 133q0 138 133 138h63v-59q-7 0 -28 1t-28.5 0.5t-23 -2t-21.5 -6.5t-14.5 -13.5t-11.5 -23t-3 -33.5q0 -38 13.5 -58t49.5 -20h29l92 213h97l109 -256v256h99l114 -188v188h66z" />
491 <glyph unicode="&#xf1f4;" horiz-adv-x="2304" d="M322 689h-15q-19 0 -19 18q0 28 19 85q5 15 15 19.5t28 4.5q77 0 77 -49q0 -41 -30.5 -59.5t-74.5 -18.5zM664 528q-47 0 -47 29q0 62 123 62l3 -3q-5 -88 -79 -88zM1438 687h-15q-19 0 -19 19q0 28 19 85q5 15 14.5 19t28.5 4q77 0 77 -49q0 -41 -30.5 -59.5 t-74.5 -18.5zM1780 527q-47 0 -47 30q0 62 123 62l3 -3q-5 -89 -79 -89zM373 894h-128q-8 0 -14.5 -4t-8.5 -7.5t-7 -12.5q-3 -7 -45 -190t-42 -192q0 -7 5.5 -12.5t13.5 -5.5h62q25 0 32.5 34.5l15 69t32.5 34.5q47 0 87.5 7.5t80.5 24.5t63.5 52.5t23.5 84.5 q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM719 798q-38 0 -74 -6q-2 0 -8.5 -1t-9 -1.5l-7.5 -1.5t-7.5 -2t-6.5 -3t-6.5 -4t-5 -5t-4.5 -7t-4 -9q-9 -29 -9 -39t9 -10q5 0 21.5 5t19.5 6q30 8 58 8q74 0 74 -36q0 -11 -10 -14q-8 -2 -18 -3t-21.5 -1.5t-17.5 -1.5 q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5q0 -38 26 -59.5t64 -21.5q24 0 45.5 6.5t33 13t38.5 23.5q-3 -7 -3 -15t5.5 -13.5t12.5 -5.5h56q1 1 7 3.5t7.5 3.5t5 3.5t5 5.5t2.5 8l45 194q4 13 4 30q0 81 -145 81zM1247 793h-74q-22 0 -39 -23q-5 -7 -29.5 -51 t-46.5 -81.5t-26 -38.5l-5 4q0 77 -27 166q-1 5 -3.5 8.5t-6 6.5t-6.5 5t-8.5 3t-8.5 1.5t-9.5 1t-9 0.5h-10h-8.5q-38 0 -38 -21l1 -5q5 -53 25 -151t25 -143q2 -16 2 -24q0 -19 -30.5 -61.5t-30.5 -58.5q0 -13 40 -13q61 0 76 25l245 415q10 20 10 26q0 9 -8 9zM1489 892 h-129q-18 0 -29 -23q-6 -13 -46.5 -191.5t-40.5 -190.5q0 -20 43 -20h7.5h9h9t9.5 1t8.5 2t8.5 3t6.5 4.5t5.5 6t3 8.5l21 91q2 10 10.5 17t19.5 7q47 0 87.5 7t80.5 24.5t63.5 52.5t23.5 84q0 36 -14.5 61t-41 36.5t-53.5 15.5t-62 4zM1835 798q-26 0 -74 -6 q-38 -6 -48 -16q-7 -8 -11 -19q-8 -24 -8 -39q0 -10 8 -10q1 0 41 12q30 8 58 8q74 0 74 -36q0 -12 -10 -14q-4 -1 -57 -7q-38 -4 -64.5 -10t-56.5 -19.5t-45.5 -39t-15.5 -62.5t26 -58.5t64 -21.5q24 0 45 6t34 13t38 24q-3 -15 -3 -16q0 -5 2 -8.5t6.5 -5.5t8 -3.5 t10.5 -2t9.5 -0.5h9.5h8q42 0 48 25l45 194q3 15 3 31q0 81 -145 81zM2157 889h-55q-25 0 -33 -40q-10 -44 -36.5 -167t-42.5 -190v-5q0 -16 16 -18h1h57q10 0 18.5 6.5t10.5 16.5l83 374h-1l1 5q0 7 -5.5 12.5t-13.5 5.5zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048 q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
492 <glyph unicode="&#xf1f5;" horiz-adv-x="2304" d="M1597 633q0 -69 -21 -106q-19 -35 -52 -35q-23 0 -41 9v224q29 30 57 30q57 0 57 -122zM2035 669h-110q6 98 56 98q51 0 54 -98zM476 534q0 59 -33 91.5t-101 57.5q-36 13 -52 24t-16 25q0 26 38 26q58 0 124 -33l18 112q-67 32 -149 32q-77 0 -123 -38q-48 -39 -48 -109 q0 -58 32.5 -90.5t99.5 -56.5q39 -14 54.5 -25.5t15.5 -27.5q0 -31 -48 -31q-29 0 -70 12.5t-72 30.5l-18 -113q72 -41 168 -41q81 0 129 37q51 41 51 117zM771 749l19 111h-96v135l-129 -21l-18 -114l-46 -8l-17 -103h62v-219q0 -84 44 -120q38 -30 111 -30q32 0 79 11v118 q-32 -7 -44 -7q-42 0 -42 50v197h77zM1087 724v139q-15 3 -28 3q-32 0 -55.5 -16t-33.5 -46l-10 56h-131v-471h150v306q26 31 82 31q16 0 26 -2zM1124 389h150v471h-150v-471zM1746 638q0 122 -45 179q-40 52 -111 52q-64 0 -117 -56l-8 47h-132v-645l150 25v151 q36 -11 68 -11q83 0 134 56q61 65 61 202zM1278 986q0 33 -23 56t-56 23t-56 -23t-23 -56t23 -56.5t56 -23.5t56 23.5t23 56.5zM2176 629q0 113 -48 176q-50 64 -144 64q-96 0 -151.5 -66t-55.5 -180q0 -128 63 -188q55 -55 161 -55q101 0 160 40l-16 103q-57 -31 -128 -31 q-43 0 -63 19q-23 19 -28 66h248q2 14 2 52zM2304 1280v-1280q0 -52 -38 -90t-90 -38h-2048q-52 0 -90 38t-38 90v1280q0 52 38 90t90 38h2048q52 0 90 -38t38 -90z" />
493 <glyph unicode="&#xf1f6;" horiz-adv-x="2048" d="M1558 684q61 -356 298 -556q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5zM1024 -176q16 0 16 16t-16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5zM2026 1424q8 -10 7.5 -23.5t-10.5 -22.5 l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5 l418 363q10 8 23.5 7t21.5 -11z" />
494 <glyph unicode="&#xf1f7;" horiz-adv-x="2048" d="M1040 -160q0 16 -16 16q-59 0 -101.5 42.5t-42.5 101.5q0 16 -16 16t-16 -16q0 -73 51.5 -124.5t124.5 -51.5q16 0 16 16zM503 315l877 760q-42 88 -132.5 146.5t-223.5 58.5q-93 0 -169.5 -31.5t-121.5 -80.5t-69 -103t-24 -105q0 -384 -137 -645zM1856 128 q0 -52 -38 -90t-90 -38h-448q0 -106 -75 -181t-181 -75t-180.5 74.5t-75.5 180.5l149 129h757q-166 187 -227 459l111 97q61 -356 298 -556zM1942 1520l84 -96q8 -10 7.5 -23.5t-10.5 -22.5l-1872 -1622q-10 -8 -23.5 -7t-21.5 11l-84 96q-8 10 -7.5 23.5t10.5 21.5l186 161 q-19 32 -19 66q50 42 91 88t85 119.5t74.5 158.5t50 206t19.5 260q0 152 117 282.5t307 158.5q-8 19 -8 39q0 40 28 68t68 28t68 -28t28 -68q0 -20 -8 -39q124 -18 219 -82.5t148 -157.5l418 363q10 8 23.5 7t21.5 -11z" />
495 <glyph unicode="&#xf1f8;" horiz-adv-x="1408" d="M512 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM768 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM1024 160v704q0 14 -9 23t-23 9h-64q-14 0 -23 -9t-9 -23v-704 q0 -14 9 -23t23 -9h64q14 0 23 9t9 23zM480 1152h448l-48 117q-7 9 -17 11h-317q-10 -2 -17 -11zM1408 1120v-64q0 -14 -9 -23t-23 -9h-96v-948q0 -83 -47 -143.5t-113 -60.5h-832q-66 0 -113 58.5t-47 141.5v952h-96q-14 0 -23 9t-9 23v64q0 14 9 23t23 9h309l70 167 q15 37 54 63t79 26h320q40 0 79 -26t54 -63l70 -167h309q14 0 23 -9t9 -23z" />
496 <glyph unicode="&#xf1f9;" d="M1150 462v-109q0 -50 -36.5 -89t-94 -60.5t-118 -32.5t-117.5 -11q-205 0 -342.5 139t-137.5 346q0 203 136 339t339 136q34 0 75.5 -4.5t93 -18t92.5 -34t69 -56.5t28 -81v-109q0 -16 -16 -16h-118q-16 0 -16 16v70q0 43 -65.5 67.5t-137.5 24.5q-140 0 -228.5 -91.5 t-88.5 -237.5q0 -151 91.5 -249.5t233.5 -98.5q68 0 138 24t70 66v70q0 7 4.5 11.5t10.5 4.5h119q6 0 11 -4.5t5 -11.5zM768 1280q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51t248.5 51t204 136.5t136.5 204t51 248.5 t-51 248.5t-136.5 204t-204 136.5t-248.5 51zM1536 640q0 -209 -103 -385.5t-279.5 -279.5t-385.5 -103t-385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103t385.5 -103t279.5 -279.5t103 -385.5z" />
497 <glyph unicode="&#xf1fa;" d="M972 761q0 108 -53.5 169t-147.5 61q-63 0 -124 -30.5t-110 -84.5t-79.5 -137t-30.5 -180q0 -112 53.5 -173t150.5 -61q96 0 176 66.5t122.5 166t42.5 203.5zM1536 640q0 -111 -37 -197t-98.5 -135t-131.5 -74.5t-145 -27.5q-6 0 -15.5 -0.5t-16.5 -0.5q-95 0 -142 53 q-28 33 -33 83q-52 -66 -131.5 -110t-173.5 -44q-161 0 -249.5 95.5t-88.5 269.5q0 157 66 290t179 210.5t246 77.5q87 0 155 -35.5t106 -99.5l2 19l11 56q1 6 5.5 12t9.5 6h118q5 0 13 -11q5 -5 3 -16l-120 -614q-5 -24 -5 -48q0 -39 12.5 -52t44.5 -13q28 1 57 5.5t73 24 t77 50t57 89.5t24 137q0 292 -174 466t-466 174q-130 0 -248.5 -51t-204 -136.5t-136.5 -204t-51 -248.5t51 -248.5t136.5 -204t204 -136.5t248.5 -51q228 0 405 144q11 9 24 8t21 -12l41 -49q8 -12 7 -24q-2 -13 -12 -22q-102 -83 -227.5 -128t-258.5 -45q-156 0 -298 61 t-245 164t-164 245t-61 298t61 298t164 245t245 164t298 61q344 0 556 -212t212 -556z" />
498 <glyph unicode="&#xf1fb;" horiz-adv-x="1792" d="M1698 1442q94 -94 94 -226.5t-94 -225.5l-225 -223l104 -104q10 -10 10 -23t-10 -23l-210 -210q-10 -10 -23 -10t-23 10l-105 105l-603 -603q-37 -37 -90 -37h-203l-256 -128l-64 64l128 256v203q0 53 37 90l603 603l-105 105q-10 10 -10 23t10 23l210 210q10 10 23 10 t23 -10l104 -104l223 225q93 94 225.5 94t226.5 -94zM512 64l576 576l-192 192l-576 -576v-192h192z" />
499 <glyph unicode="&#xf1fc;" horiz-adv-x="1792" d="M1615 1536q70 0 122.5 -46.5t52.5 -116.5q0 -63 -45 -151q-332 -629 -465 -752q-97 -91 -218 -91q-126 0 -216.5 92.5t-90.5 219.5q0 128 92 212l638 579q59 54 130 54zM706 502q39 -76 106.5 -130t150.5 -76l1 -71q4 -213 -129.5 -347t-348.5 -134q-123 0 -218 46.5 t-152.5 127.5t-86.5 183t-29 220q7 -5 41 -30t62 -44.5t59 -36.5t46 -17q41 0 55 37q25 66 57.5 112.5t69.5 76t88 47.5t103 25.5t125 10.5z" />
500 <glyph unicode="&#xf1fd;" horiz-adv-x="1792" d="M1792 128v-384h-1792v384q45 0 85 14t59 27.5t47 37.5q30 27 51.5 38t56.5 11t55.5 -11t52.5 -38q29 -25 47 -38t58 -27t86 -14q45 0 85 14.5t58 27t48 37.5q21 19 32.5 27t31 15t43.5 7q35 0 56.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14t85 14t59 27.5t47 37.5 q30 27 51.5 38t56.5 11q34 0 55.5 -11t51.5 -38q28 -24 47 -37.5t59 -27.5t85 -14zM1792 448v-192q-35 0 -55.5 11t-52.5 38q-29 25 -47 38t-58 27t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-22 -19 -33 -27t-31 -15t-44 -7q-35 0 -56.5 11t-51.5 38q-29 25 -47 38t-58 27 t-86 14q-45 0 -85 -14.5t-58 -27t-48 -37.5q-21 -19 -32.5 -27t-31 -15t-43.5 -7q-35 0 -56.5 11t-51.5 38q-28 24 -47 37.5t-59 27.5t-85 14q-46 0 -86 -14t-58 -27t-47 -38q-30 -27 -51.5 -38t-56.5 -11v192q0 80 56 136t136 56h64v448h256v-448h256v448h256v-448h256v448 h256v-448h64q80 0 136 -56t56 -136zM512 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1024 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51 t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150zM1536 1312q0 -77 -36 -118.5t-92 -41.5q-53 0 -90.5 37.5t-37.5 90.5q0 29 9.5 51t23.5 34t31 28t31 31.5t23.5 44.5t9.5 67q38 0 83 -74t45 -150z" />
501 <glyph unicode="&#xf1fe;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1664 1024l256 -896h-1664v576l448 576l576 -576z" />
502 <glyph unicode="&#xf200;" horiz-adv-x="1792" d="M768 646l546 -546q-106 -108 -247.5 -168t-298.5 -60q-209 0 -385.5 103t-279.5 279.5t-103 385.5t103 385.5t279.5 279.5t385.5 103v-762zM955 640h773q0 -157 -60 -298.5t-168 -247.5zM1664 768h-768v768q209 0 385.5 -103t279.5 -279.5t103 -385.5z" />
503 <glyph unicode="&#xf201;" horiz-adv-x="2048" d="M2048 0v-128h-2048v1536h128v-1408h1920zM1920 1248v-435q0 -21 -19.5 -29.5t-35.5 7.5l-121 121l-633 -633q-10 -10 -23 -10t-23 10l-233 233l-416 -416l-192 192l585 585q10 10 23 10t23 -10l233 -233l464 464l-121 121q-16 16 -7.5 35.5t29.5 19.5h435q14 0 23 -9 t9 -23z" />
504 <glyph unicode="&#xf202;" horiz-adv-x="1792" d="M1292 832q0 -6 10 -41q10 -29 25 -49.5t41 -34t44 -20t55 -16.5q325 -91 325 -332q0 -146 -105.5 -242.5t-254.5 -96.5q-59 0 -111.5 18.5t-91.5 45.5t-77 74.5t-63 87.5t-53.5 103.5t-43.5 103t-39.5 106.5t-35.5 95q-32 81 -61.5 133.5t-73.5 96.5t-104 64t-142 20 q-96 0 -183 -55.5t-138 -144.5t-51 -185q0 -160 106.5 -279.5t263.5 -119.5q177 0 258 95q56 63 83 116l84 -152q-15 -34 -44 -70l1 -1q-131 -152 -388 -152q-147 0 -269.5 79t-190.5 207.5t-68 274.5q0 105 43.5 206t116 176.5t172 121.5t204.5 46q87 0 159 -19t123.5 -50 t95 -80t72.5 -99t58.5 -117t50.5 -124.5t50 -130.5t55 -127q96 -200 233 -200q81 0 138.5 48.5t57.5 128.5q0 42 -19 72t-50.5 46t-72.5 31.5t-84.5 27t-87.5 34t-81 52t-65 82t-39 122.5q-3 16 -3 33q0 110 87.5 192t198.5 78q78 -3 120.5 -14.5t90.5 -53.5h-1 q12 -11 23 -24.5t26 -36t19 -27.5l-129 -99q-26 49 -54 70v1q-23 21 -97 21q-49 0 -84 -33t-35 -83z" />
505 <glyph unicode="&#xf203;" d="M1432 484q0 173 -234 239q-35 10 -53 16.5t-38 25t-29 46.5q0 2 -2 8.5t-3 12t-1 7.5q0 36 24.5 59.5t60.5 23.5q54 0 71 -15h-1q20 -15 39 -51l93 71q-39 54 -49 64q-33 29 -67.5 39t-85.5 10q-80 0 -142 -57.5t-62 -137.5q0 -7 2 -23q16 -96 64.5 -140t148.5 -73 q29 -8 49 -15.5t45 -21.5t38.5 -34.5t13.5 -46.5v-5q1 -58 -40.5 -93t-100.5 -35q-97 0 -167 144q-23 47 -51.5 121.5t-48 125.5t-54 110.5t-74 95.5t-103.5 60.5t-147 24.5q-101 0 -192 -56t-144 -148t-50 -192v-1q4 -108 50.5 -199t133.5 -147.5t196 -56.5q186 0 279 110 q20 27 31 51l-60 109q-42 -80 -99 -116t-146 -36q-115 0 -191 87t-76 204q0 105 82 189t186 84q112 0 170 -53.5t104 -172.5q8 -21 25.5 -68.5t28.5 -76.5t31.5 -74.5t38.5 -74t45.5 -62.5t55.5 -53.5t66 -33t80 -13.5q107 0 183 69.5t76 174.5zM1536 1120v-960 q0 -119 -84.5 -203.5t-203.5 -84.5h-960q-119 0 -203.5 84.5t-84.5 203.5v960q0 119 84.5 203.5t203.5 84.5h960q119 0 203.5 -84.5t84.5 -203.5z" />
506 <glyph unicode="&#xf204;" horiz-adv-x="2048" d="M1152 640q0 104 -40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5t198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM1920 640q0 104 -40.5 198.5 t-109.5 163.5t-163.5 109.5t-198.5 40.5h-386q119 -90 188.5 -224t69.5 -288t-69.5 -288t-188.5 -224h386q104 0 198.5 40.5t163.5 109.5t109.5 163.5t40.5 198.5zM2048 640q0 -130 -51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5 t-136.5 204t-51 248.5t51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5z" />
507 <glyph unicode="&#xf205;" horiz-adv-x="2048" d="M0 640q0 130 51 248.5t136.5 204t204 136.5t248.5 51h768q130 0 248.5 -51t204 -136.5t136.5 -204t51 -248.5t-51 -248.5t-136.5 -204t-204 -136.5t-248.5 -51h-768q-130 0 -248.5 51t-204 136.5t-136.5 204t-51 248.5zM1408 128q104 0 198.5 40.5t163.5 109.5 t109.5 163.5t40.5 198.5t-40.5 198.5t-109.5 163.5t-163.5 109.5t-198.5 40.5t-198.5 -40.5t-163.5 -109.5t-109.5 -163.5t-40.5 -198.5t40.5 -198.5t109.5 -163.5t163.5 -109.5t198.5 -40.5z" />
508 <glyph unicode="&#xf206;" horiz-adv-x="2304" d="M762 384h-314q-40 0 -57.5 35t6.5 67l188 251q-65 31 -137 31q-132 0 -226 -94t-94 -226t94 -226t226 -94q115 0 203 72.5t111 183.5zM576 512h186q-18 85 -75 148zM1056 512l288 384h-480l-99 -132q105 -103 126 -252h165zM2176 448q0 132 -94 226t-226 94 q-60 0 -121 -24l174 -260q15 -23 10 -49t-27 -40q-15 -11 -36 -11q-35 0 -53 29l-174 260q-93 -95 -93 -225q0 -132 94 -226t226 -94t226 94t94 226zM2304 448q0 -185 -131.5 -316.5t-316.5 -131.5t-316.5 131.5t-131.5 316.5q0 97 39.5 183.5t109.5 149.5l-65 98l-353 -469 q-18 -26 -51 -26h-197q-23 -164 -149 -274t-294 -110q-185 0 -316.5 131.5t-131.5 316.5t131.5 316.5t316.5 131.5q114 0 215 -55l137 183h-224q-26 0 -45 19t-19 45t19 45t45 19h384v-128h435l-85 128h-222q-26 0 -45 19t-19 45t19 45t45 19h256q33 0 53 -28l267 -400 q91 44 192 44q185 0 316.5 -131.5t131.5 -316.5z" />
509 <glyph unicode="&#xf207;" d="M384 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1408 320q0 53 -37.5 90.5t-90.5 37.5t-90.5 -37.5t-37.5 -90.5t37.5 -90.5t90.5 -37.5t90.5 37.5t37.5 90.5zM1362 716l-72 384q-5 23 -22.5 37.5t-40.5 14.5 h-918q-23 0 -40.5 -14.5t-22.5 -37.5l-72 -384q-5 -30 14 -53t49 -23h1062q30 0 49 23t14 53zM1136 1328q0 20 -14 34t-34 14h-640q-20 0 -34 -14t-14 -34t14 -34t34 -14h640q20 0 34 14t14 34zM1536 603v-603h-128v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5 t-37.5 90.5v128h-768v-128q0 -53 -37.5 -90.5t-90.5 -37.5t-90.5 37.5t-37.5 90.5v128h-128v603q0 112 25 223l103 454q9 78 97.5 137t230 89t312.5 30t312.5 -30t230 -89t97.5 -137l105 -454q23 -102 23 -223z" />
510 <glyph unicode="&#xf208;" horiz-adv-x="2048" d="M1463 704q0 -35 -25 -60.5t-61 -25.5h-702q-36 0 -61 25.5t-25 60.5t25 60.5t61 25.5h702q36 0 61 -25.5t25 -60.5zM1677 704q0 86 -23 170h-982q-36 0 -61 25t-25 60q0 36 25 61t61 25h908q-88 143 -235 227t-320 84q-177 0 -327.5 -87.5t-238 -237.5t-87.5 -327 q0 -86 23 -170h982q36 0 61 -25t25 -60q0 -36 -25 -61t-61 -25h-908q88 -143 235.5 -227t320.5 -84q132 0 253 51.5t208 139t139 208t52 253.5zM2048 959q0 -35 -25 -60t-61 -25h-131q17 -85 17 -170q0 -167 -65.5 -319.5t-175.5 -263t-262.5 -176t-319.5 -65.5 q-246 0 -448.5 133t-301.5 350h-189q-36 0 -61 25t-25 61q0 35 25 60t61 25h132q-17 85 -17 170q0 167 65.5 319.5t175.5 263t262.5 176t320.5 65.5q245 0 447.5 -133t301.5 -350h188q36 0 61 -25t25 -61z" />
511 <glyph unicode="&#xf209;" horiz-adv-x="1280" d="M953 1158l-114 -328l117 -21q165 451 165 518q0 56 -38 56q-57 0 -130 -225zM654 471l33 -88q37 42 71 67l-33 5.5t-38.5 7t-32.5 8.5zM362 1367q0 -98 159 -521q18 10 49 10q15 0 75 -5l-121 351q-75 220 -123 220q-19 0 -29 -17.5t-10 -37.5zM283 608q0 -36 51.5 -119 t117.5 -153t100 -70q14 0 25.5 13t11.5 27q0 24 -32 102q-13 32 -32 72t-47.5 89t-61.5 81t-62 32q-20 0 -45.5 -27t-25.5 -47zM125 273q0 -41 25 -104q59 -145 183.5 -227t281.5 -82q227 0 382 170q152 169 152 427q0 43 -1 67t-11.5 62t-30.5 56q-56 49 -211.5 75.5 t-270.5 26.5q-37 0 -49 -11q-12 -5 -12 -35q0 -34 21.5 -60t55.5 -40t77.5 -23.5t87.5 -11.5t85 -4t70 0h23q24 0 40 -19q15 -19 19 -55q-28 -28 -96 -54q-61 -22 -93 -46q-64 -46 -108.5 -114t-44.5 -137q0 -31 18.5 -88.5t18.5 -87.5l-3 -12q-4 -12 -4 -14 q-137 10 -146 216q-8 -2 -41 -2q2 -7 2 -21q0 -53 -40.5 -89.5t-94.5 -36.5q-82 0 -166.5 78t-84.5 159q0 34 33 67q52 -64 60 -76q77 -104 133 -104q12 0 26.5 8.5t14.5 20.5q0 34 -87.5 145t-116.5 111q-43 0 -70 -44.5t-27 -90.5zM11 264q0 101 42.5 163t136.5 88 q-28 74 -28 104q0 62 61 123t122 61q29 0 70 -15q-163 462 -163 567q0 80 41 130.5t119 50.5q131 0 325 -581q6 -17 8 -23q6 16 29 79.5t43.5 118.5t54 127.5t64.5 123t70.5 86.5t76.5 36q71 0 112 -49t41 -122q0 -108 -159 -550q61 -15 100.5 -46t58.5 -78t26 -93.5 t7 -110.5q0 -150 -47 -280t-132 -225t-211 -150t-278 -55q-111 0 -223 42q-149 57 -258 191.5t-109 286.5z" />
512 <glyph unicode="&#xf20a;" horiz-adv-x="2048" d="M785 528h207q-14 -158 -98.5 -248.5t-214.5 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-203q-5 64 -35.5 99t-81.5 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t40 -51.5t66 -18q95 0 109 139zM1497 528h206 q-14 -158 -98 -248.5t-214 -90.5q-162 0 -254.5 116t-92.5 316q0 194 93 311.5t233 117.5q148 0 232 -87t97 -247h-204q-4 64 -35 99t-81 35q-57 0 -88.5 -60.5t-31.5 -177.5q0 -48 5 -84t18 -69.5t39.5 -51.5t65.5 -18q49 0 76.5 38t33.5 101zM1856 647q0 207 -15.5 307 t-60.5 161q-6 8 -13.5 14t-21.5 15t-16 11q-86 63 -697 63q-625 0 -710 -63q-5 -4 -17.5 -11.5t-21 -14t-14.5 -14.5q-45 -60 -60 -159.5t-15 -308.5q0 -208 15 -307.5t60 -160.5q6 -8 15 -15t20.5 -14t17.5 -12q44 -33 239.5 -49t470.5 -16q610 0 697 65q5 4 17 11t20.5 14 t13.5 16q46 60 61 159t15 309zM2048 1408v-1536h-2048v1536h2048z" />
513 <glyph unicode="&#xf20b;" d="M992 912v-496q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v496q0 112 -80 192t-192 80h-272v-1152q0 -14 -9 -23t-23 -9h-160q-14 0 -23 9t-9 23v1344q0 14 9 23t23 9h464q135 0 249 -66.5t180.5 -180.5t66.5 -249zM1376 1376v-880q0 -135 -66.5 -249t-180.5 -180.5 t-249 -66.5h-464q-14 0 -23 9t-9 23v960q0 14 9 23t23 9h160q14 0 23 -9t9 -23v-768h272q112 0 192 80t80 192v880q0 14 9 23t23 9h160q14 0 23 -9t9 -23z" />
514 <glyph unicode="&#xf20c;" d="M1311 694v-114q0 -24 -13.5 -38t-37.5 -14h-202q-24 0 -38 14t-14 38v114q0 24 14 38t38 14h202q24 0 37.5 -14t13.5 -38zM821 464v250q0 53 -32.5 85.5t-85.5 32.5h-133q-68 0 -96 -52q-28 52 -96 52h-130q-53 0 -85.5 -32.5t-32.5 -85.5v-250q0 -22 21 -22h55 q22 0 22 22v230q0 24 13.5 38t38.5 14h94q24 0 38 -14t14 -38v-230q0 -22 21 -22h54q22 0 22 22v230q0 24 14 38t38 14h97q24 0 37.5 -14t13.5 -38v-230q0 -22 22 -22h55q21 0 21 22zM1410 560v154q0 53 -33 85.5t-86 32.5h-264q-53 0 -86 -32.5t-33 -85.5v-410 q0 -21 22 -21h55q21 0 21 21v180q31 -42 94 -42h191q53 0 86 32.5t33 85.5zM1536 1176v-1072q0 -96 -68 -164t-164 -68h-1072q-96 0 -164 68t-68 164v1072q0 96 68 164t164 68h1072q96 0 164 -68t68 -164z" />
515 <glyph unicode="&#xf20d;" horiz-adv-x="1792" />
516 <glyph unicode="&#xf20e;" horiz-adv-x="1792" />
517 <glyph unicode="&#xf500;" horiz-adv-x="1792" />
518 </font>
519 </defs></svg>
0 // Bordered & Pulled
1 // -------------------------
2
3 .@{fa-css-prefix}-border {
4 padding: .2em .25em .15em;
5 border: solid .08em @fa-border-color;
6 border-radius: .1em;
7 }
8
9 .pull-right { float: right; }
10 .pull-left { float: left; }
11
12 .@{fa-css-prefix} {
13 &.pull-left { margin-right: .3em; }
14 &.pull-right { margin-left: .3em; }
15 }
0 // Base Class Definition
1 // -------------------------
2
3 .@{fa-css-prefix} {
4 display: inline-block;
5 font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
6 font-size: inherit; // can't have font-size inherit on line above, so need to override
7 text-rendering: auto; // optimizelegibility throws things off #1094
8 -webkit-font-smoothing: antialiased;
9 -moz-osx-font-smoothing: grayscale;
10 }
0 // Fixed Width Icons
1 // -------------------------
2 .@{fa-css-prefix}-fw {
3 width: (18em / 14);
4 text-align: center;
5 }
0 /*!
1 * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
2 * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
3 */
4
5 @import "variables.less";
6 @import "mixins.less";
7 @import "path.less";
8 @import "core.less";
9 @import "larger.less";
10 @import "fixed-width.less";
11 @import "list.less";
12 @import "bordered-pulled.less";
13 @import "spinning.less";
14 @import "rotated-flipped.less";
15 @import "stacked.less";
16 @import "icons.less";
0 /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
1 readers do not read off random characters that represent icons */
2
3 .@{fa-css-prefix}-glass:before { content: @fa-var-glass; }
4 .@{fa-css-prefix}-music:before { content: @fa-var-music; }
5 .@{fa-css-prefix}-search:before { content: @fa-var-search; }
6 .@{fa-css-prefix}-envelope-o:before { content: @fa-var-envelope-o; }
7 .@{fa-css-prefix}-heart:before { content: @fa-var-heart; }
8 .@{fa-css-prefix}-star:before { content: @fa-var-star; }
9 .@{fa-css-prefix}-star-o:before { content: @fa-var-star-o; }
10 .@{fa-css-prefix}-user:before { content: @fa-var-user; }
11 .@{fa-css-prefix}-film:before { content: @fa-var-film; }
12 .@{fa-css-prefix}-th-large:before { content: @fa-var-th-large; }
13 .@{fa-css-prefix}-th:before { content: @fa-var-th; }
14 .@{fa-css-prefix}-th-list:before { content: @fa-var-th-list; }
15 .@{fa-css-prefix}-check:before { content: @fa-var-check; }
16 .@{fa-css-prefix}-remove:before,
17 .@{fa-css-prefix}-close:before,
18 .@{fa-css-prefix}-times:before { content: @fa-var-times; }
19 .@{fa-css-prefix}-search-plus:before { content: @fa-var-search-plus; }
20 .@{fa-css-prefix}-search-minus:before { content: @fa-var-search-minus; }
21 .@{fa-css-prefix}-power-off:before { content: @fa-var-power-off; }
22 .@{fa-css-prefix}-signal:before { content: @fa-var-signal; }
23 .@{fa-css-prefix}-gear:before,
24 .@{fa-css-prefix}-cog:before { content: @fa-var-cog; }
25 .@{fa-css-prefix}-trash-o:before { content: @fa-var-trash-o; }
26 .@{fa-css-prefix}-home:before { content: @fa-var-home; }
27 .@{fa-css-prefix}-file-o:before { content: @fa-var-file-o; }
28 .@{fa-css-prefix}-clock-o:before { content: @fa-var-clock-o; }
29 .@{fa-css-prefix}-road:before { content: @fa-var-road; }
30 .@{fa-css-prefix}-download:before { content: @fa-var-download; }
31 .@{fa-css-prefix}-arrow-circle-o-down:before { content: @fa-var-arrow-circle-o-down; }
32 .@{fa-css-prefix}-arrow-circle-o-up:before { content: @fa-var-arrow-circle-o-up; }
33 .@{fa-css-prefix}-inbox:before { content: @fa-var-inbox; }
34 .@{fa-css-prefix}-play-circle-o:before { content: @fa-var-play-circle-o; }
35 .@{fa-css-prefix}-rotate-right:before,
36 .@{fa-css-prefix}-repeat:before { content: @fa-var-repeat; }
37 .@{fa-css-prefix}-refresh:before { content: @fa-var-refresh; }
38 .@{fa-css-prefix}-list-alt:before { content: @fa-var-list-alt; }
39 .@{fa-css-prefix}-lock:before { content: @fa-var-lock; }
40 .@{fa-css-prefix}-flag:before { content: @fa-var-flag; }
41 .@{fa-css-prefix}-headphones:before { content: @fa-var-headphones; }
42 .@{fa-css-prefix}-volume-off:before { content: @fa-var-volume-off; }
43 .@{fa-css-prefix}-volume-down:before { content: @fa-var-volume-down; }
44 .@{fa-css-prefix}-volume-up:before { content: @fa-var-volume-up; }
45 .@{fa-css-prefix}-qrcode:before { content: @fa-var-qrcode; }
46 .@{fa-css-prefix}-barcode:before { content: @fa-var-barcode; }
47 .@{fa-css-prefix}-tag:before { content: @fa-var-tag; }
48 .@{fa-css-prefix}-tags:before { content: @fa-var-tags; }
49 .@{fa-css-prefix}-book:before { content: @fa-var-book; }
50 .@{fa-css-prefix}-bookmark:before { content: @fa-var-bookmark; }
51 .@{fa-css-prefix}-print:before { content: @fa-var-print; }
52 .@{fa-css-prefix}-camera:before { content: @fa-var-camera; }
53 .@{fa-css-prefix}-font:before { content: @fa-var-font; }
54 .@{fa-css-prefix}-bold:before { content: @fa-var-bold; }
55 .@{fa-css-prefix}-italic:before { content: @fa-var-italic; }
56 .@{fa-css-prefix}-text-height:before { content: @fa-var-text-height; }
57 .@{fa-css-prefix}-text-width:before { content: @fa-var-text-width; }
58 .@{fa-css-prefix}-align-left:before { content: @fa-var-align-left; }
59 .@{fa-css-prefix}-align-center:before { content: @fa-var-align-center; }
60 .@{fa-css-prefix}-align-right:before { content: @fa-var-align-right; }
61 .@{fa-css-prefix}-align-justify:before { content: @fa-var-align-justify; }
62 .@{fa-css-prefix}-list:before { content: @fa-var-list; }
63 .@{fa-css-prefix}-dedent:before,
64 .@{fa-css-prefix}-outdent:before { content: @fa-var-outdent; }
65 .@{fa-css-prefix}-indent:before { content: @fa-var-indent; }
66 .@{fa-css-prefix}-video-camera:before { content: @fa-var-video-camera; }
67 .@{fa-css-prefix}-photo:before,
68 .@{fa-css-prefix}-image:before,
69 .@{fa-css-prefix}-picture-o:before { content: @fa-var-picture-o; }
70 .@{fa-css-prefix}-pencil:before { content: @fa-var-pencil; }
71 .@{fa-css-prefix}-map-marker:before { content: @fa-var-map-marker; }
72 .@{fa-css-prefix}-adjust:before { content: @fa-var-adjust; }
73 .@{fa-css-prefix}-tint:before { content: @fa-var-tint; }
74 .@{fa-css-prefix}-edit:before,
75 .@{fa-css-prefix}-pencil-square-o:before { content: @fa-var-pencil-square-o; }
76 .@{fa-css-prefix}-share-square-o:before { content: @fa-var-share-square-o; }
77 .@{fa-css-prefix}-check-square-o:before { content: @fa-var-check-square-o; }
78 .@{fa-css-prefix}-arrows:before { content: @fa-var-arrows; }
79 .@{fa-css-prefix}-step-backward:before { content: @fa-var-step-backward; }
80 .@{fa-css-prefix}-fast-backward:before { content: @fa-var-fast-backward; }
81 .@{fa-css-prefix}-backward:before { content: @fa-var-backward; }
82 .@{fa-css-prefix}-play:before { content: @fa-var-play; }
83 .@{fa-css-prefix}-pause:before { content: @fa-var-pause; }
84 .@{fa-css-prefix}-stop:before { content: @fa-var-stop; }
85 .@{fa-css-prefix}-forward:before { content: @fa-var-forward; }
86 .@{fa-css-prefix}-fast-forward:before { content: @fa-var-fast-forward; }
87 .@{fa-css-prefix}-step-forward:before { content: @fa-var-step-forward; }
88 .@{fa-css-prefix}-eject:before { content: @fa-var-eject; }
89 .@{fa-css-prefix}-chevron-left:before { content: @fa-var-chevron-left; }
90 .@{fa-css-prefix}-chevron-right:before { content: @fa-var-chevron-right; }
91 .@{fa-css-prefix}-plus-circle:before { content: @fa-var-plus-circle; }
92 .@{fa-css-prefix}-minus-circle:before { content: @fa-var-minus-circle; }
93 .@{fa-css-prefix}-times-circle:before { content: @fa-var-times-circle; }
94 .@{fa-css-prefix}-check-circle:before { content: @fa-var-check-circle; }
95 .@{fa-css-prefix}-question-circle:before { content: @fa-var-question-circle; }
96 .@{fa-css-prefix}-info-circle:before { content: @fa-var-info-circle; }
97 .@{fa-css-prefix}-crosshairs:before { content: @fa-var-crosshairs; }
98 .@{fa-css-prefix}-times-circle-o:before { content: @fa-var-times-circle-o; }
99 .@{fa-css-prefix}-check-circle-o:before { content: @fa-var-check-circle-o; }
100 .@{fa-css-prefix}-ban:before { content: @fa-var-ban; }
101 .@{fa-css-prefix}-arrow-left:before { content: @fa-var-arrow-left; }
102 .@{fa-css-prefix}-arrow-right:before { content: @fa-var-arrow-right; }
103 .@{fa-css-prefix}-arrow-up:before { content: @fa-var-arrow-up; }
104 .@{fa-css-prefix}-arrow-down:before { content: @fa-var-arrow-down; }
105 .@{fa-css-prefix}-mail-forward:before,
106 .@{fa-css-prefix}-share:before { content: @fa-var-share; }
107 .@{fa-css-prefix}-expand:before { content: @fa-var-expand; }
108 .@{fa-css-prefix}-compress:before { content: @fa-var-compress; }
109 .@{fa-css-prefix}-plus:before { content: @fa-var-plus; }
110 .@{fa-css-prefix}-minus:before { content: @fa-var-minus; }
111 .@{fa-css-prefix}-asterisk:before { content: @fa-var-asterisk; }
112 .@{fa-css-prefix}-exclamation-circle:before { content: @fa-var-exclamation-circle; }
113 .@{fa-css-prefix}-gift:before { content: @fa-var-gift; }
114 .@{fa-css-prefix}-leaf:before { content: @fa-var-leaf; }
115 .@{fa-css-prefix}-fire:before { content: @fa-var-fire; }
116 .@{fa-css-prefix}-eye:before { content: @fa-var-eye; }
117 .@{fa-css-prefix}-eye-slash:before { content: @fa-var-eye-slash; }
118 .@{fa-css-prefix}-warning:before,
119 .@{fa-css-prefix}-exclamation-triangle:before { content: @fa-var-exclamation-triangle; }
120 .@{fa-css-prefix}-plane:before { content: @fa-var-plane; }
121 .@{fa-css-prefix}-calendar:before { content: @fa-var-calendar; }
122 .@{fa-css-prefix}-random:before { content: @fa-var-random; }
123 .@{fa-css-prefix}-comment:before { content: @fa-var-comment; }
124 .@{fa-css-prefix}-magnet:before { content: @fa-var-magnet; }
125 .@{fa-css-prefix}-chevron-up:before { content: @fa-var-chevron-up; }
126 .@{fa-css-prefix}-chevron-down:before { content: @fa-var-chevron-down; }
127 .@{fa-css-prefix}-retweet:before { content: @fa-var-retweet; }
128 .@{fa-css-prefix}-shopping-cart:before { content: @fa-var-shopping-cart; }
129 .@{fa-css-prefix}-folder:before { content: @fa-var-folder; }
130 .@{fa-css-prefix}-folder-open:before { content: @fa-var-folder-open; }
131 .@{fa-css-prefix}-arrows-v:before { content: @fa-var-arrows-v; }
132 .@{fa-css-prefix}-arrows-h:before { content: @fa-var-arrows-h; }
133 .@{fa-css-prefix}-bar-chart-o:before,
134 .@{fa-css-prefix}-bar-chart:before { content: @fa-var-bar-chart; }
135 .@{fa-css-prefix}-twitter-square:before { content: @fa-var-twitter-square; }
136 .@{fa-css-prefix}-facebook-square:before { content: @fa-var-facebook-square; }
137 .@{fa-css-prefix}-camera-retro:before { content: @fa-var-camera-retro; }
138 .@{fa-css-prefix}-key:before { content: @fa-var-key; }
139 .@{fa-css-prefix}-gears:before,
140 .@{fa-css-prefix}-cogs:before { content: @fa-var-cogs; }
141 .@{fa-css-prefix}-comments:before { content: @fa-var-comments; }
142 .@{fa-css-prefix}-thumbs-o-up:before { content: @fa-var-thumbs-o-up; }
143 .@{fa-css-prefix}-thumbs-o-down:before { content: @fa-var-thumbs-o-down; }
144 .@{fa-css-prefix}-star-half:before { content: @fa-var-star-half; }
145 .@{fa-css-prefix}-heart-o:before { content: @fa-var-heart-o; }
146 .@{fa-css-prefix}-sign-out:before { content: @fa-var-sign-out; }
147 .@{fa-css-prefix}-linkedin-square:before { content: @fa-var-linkedin-square; }
148 .@{fa-css-prefix}-thumb-tack:before { content: @fa-var-thumb-tack; }
149 .@{fa-css-prefix}-external-link:before { content: @fa-var-external-link; }
150 .@{fa-css-prefix}-sign-in:before { content: @fa-var-sign-in; }
151 .@{fa-css-prefix}-trophy:before { content: @fa-var-trophy; }
152 .@{fa-css-prefix}-github-square:before { content: @fa-var-github-square; }
153 .@{fa-css-prefix}-upload:before { content: @fa-var-upload; }
154 .@{fa-css-prefix}-lemon-o:before { content: @fa-var-lemon-o; }
155 .@{fa-css-prefix}-phone:before { content: @fa-var-phone; }
156 .@{fa-css-prefix}-square-o:before { content: @fa-var-square-o; }
157 .@{fa-css-prefix}-bookmark-o:before { content: @fa-var-bookmark-o; }
158 .@{fa-css-prefix}-phone-square:before { content: @fa-var-phone-square; }
159 .@{fa-css-prefix}-twitter:before { content: @fa-var-twitter; }
160 .@{fa-css-prefix}-facebook:before { content: @fa-var-facebook; }
161 .@{fa-css-prefix}-github:before { content: @fa-var-github; }
162 .@{fa-css-prefix}-unlock:before { content: @fa-var-unlock; }
163 .@{fa-css-prefix}-credit-card:before { content: @fa-var-credit-card; }
164 .@{fa-css-prefix}-rss:before { content: @fa-var-rss; }
165 .@{fa-css-prefix}-hdd-o:before { content: @fa-var-hdd-o; }
166 .@{fa-css-prefix}-bullhorn:before { content: @fa-var-bullhorn; }
167 .@{fa-css-prefix}-bell:before { content: @fa-var-bell; }
168 .@{fa-css-prefix}-certificate:before { content: @fa-var-certificate; }
169 .@{fa-css-prefix}-hand-o-right:before { content: @fa-var-hand-o-right; }
170 .@{fa-css-prefix}-hand-o-left:before { content: @fa-var-hand-o-left; }
171 .@{fa-css-prefix}-hand-o-up:before { content: @fa-var-hand-o-up; }
172 .@{fa-css-prefix}-hand-o-down:before { content: @fa-var-hand-o-down; }
173 .@{fa-css-prefix}-arrow-circle-left:before { content: @fa-var-arrow-circle-left; }
174 .@{fa-css-prefix}-arrow-circle-right:before { content: @fa-var-arrow-circle-right; }
175 .@{fa-css-prefix}-arrow-circle-up:before { content: @fa-var-arrow-circle-up; }
176 .@{fa-css-prefix}-arrow-circle-down:before { content: @fa-var-arrow-circle-down; }
177 .@{fa-css-prefix}-globe:before { content: @fa-var-globe; }
178 .@{fa-css-prefix}-wrench:before { content: @fa-var-wrench; }
179 .@{fa-css-prefix}-tasks:before { content: @fa-var-tasks; }
180 .@{fa-css-prefix}-filter:before { content: @fa-var-filter; }
181 .@{fa-css-prefix}-briefcase:before { content: @fa-var-briefcase; }
182 .@{fa-css-prefix}-arrows-alt:before { content: @fa-var-arrows-alt; }
183 .@{fa-css-prefix}-group:before,
184 .@{fa-css-prefix}-users:before { content: @fa-var-users; }
185 .@{fa-css-prefix}-chain:before,
186 .@{fa-css-prefix}-link:before { content: @fa-var-link; }
187 .@{fa-css-prefix}-cloud:before { content: @fa-var-cloud; }
188 .@{fa-css-prefix}-flask:before { content: @fa-var-flask; }
189 .@{fa-css-prefix}-cut:before,
190 .@{fa-css-prefix}-scissors:before { content: @fa-var-scissors; }
191 .@{fa-css-prefix}-copy:before,
192 .@{fa-css-prefix}-files-o:before { content: @fa-var-files-o; }
193 .@{fa-css-prefix}-paperclip:before { content: @fa-var-paperclip; }
194 .@{fa-css-prefix}-save:before,
195 .@{fa-css-prefix}-floppy-o:before { content: @fa-var-floppy-o; }
196 .@{fa-css-prefix}-square:before { content: @fa-var-square; }
197 .@{fa-css-prefix}-navicon:before,
198 .@{fa-css-prefix}-reorder:before,
199 .@{fa-css-prefix}-bars:before { content: @fa-var-bars; }
200 .@{fa-css-prefix}-list-ul:before { content: @fa-var-list-ul; }
201 .@{fa-css-prefix}-list-ol:before { content: @fa-var-list-ol; }
202 .@{fa-css-prefix}-strikethrough:before { content: @fa-var-strikethrough; }
203 .@{fa-css-prefix}-underline:before { content: @fa-var-underline; }
204 .@{fa-css-prefix}-table:before { content: @fa-var-table; }
205 .@{fa-css-prefix}-magic:before { content: @fa-var-magic; }
206 .@{fa-css-prefix}-truck:before { content: @fa-var-truck; }
207 .@{fa-css-prefix}-pinterest:before { content: @fa-var-pinterest; }
208 .@{fa-css-prefix}-pinterest-square:before { content: @fa-var-pinterest-square; }
209 .@{fa-css-prefix}-google-plus-square:before { content: @fa-var-google-plus-square; }
210 .@{fa-css-prefix}-google-plus:before { content: @fa-var-google-plus; }
211 .@{fa-css-prefix}-money:before { content: @fa-var-money; }
212 .@{fa-css-prefix}-caret-down:before { content: @fa-var-caret-down; }
213 .@{fa-css-prefix}-caret-up:before { content: @fa-var-caret-up; }
214 .@{fa-css-prefix}-caret-left:before { content: @fa-var-caret-left; }
215 .@{fa-css-prefix}-caret-right:before { content: @fa-var-caret-right; }
216 .@{fa-css-prefix}-columns:before { content: @fa-var-columns; }
217 .@{fa-css-prefix}-unsorted:before,
218 .@{fa-css-prefix}-sort:before { content: @fa-var-sort; }
219 .@{fa-css-prefix}-sort-down:before,
220 .@{fa-css-prefix}-sort-desc:before { content: @fa-var-sort-desc; }
221 .@{fa-css-prefix}-sort-up:before,
222 .@{fa-css-prefix}-sort-asc:before { content: @fa-var-sort-asc; }
223 .@{fa-css-prefix}-envelope:before { content: @fa-var-envelope; }
224 .@{fa-css-prefix}-linkedin:before { content: @fa-var-linkedin; }
225 .@{fa-css-prefix}-rotate-left:before,
226 .@{fa-css-prefix}-undo:before { content: @fa-var-undo; }
227 .@{fa-css-prefix}-legal:before,
228 .@{fa-css-prefix}-gavel:before { content: @fa-var-gavel; }
229 .@{fa-css-prefix}-dashboard:before,
230 .@{fa-css-prefix}-tachometer:before { content: @fa-var-tachometer; }
231 .@{fa-css-prefix}-comment-o:before { content: @fa-var-comment-o; }
232 .@{fa-css-prefix}-comments-o:before { content: @fa-var-comments-o; }
233 .@{fa-css-prefix}-flash:before,
234 .@{fa-css-prefix}-bolt:before { content: @fa-var-bolt; }
235 .@{fa-css-prefix}-sitemap:before { content: @fa-var-sitemap; }
236 .@{fa-css-prefix}-umbrella:before { content: @fa-var-umbrella; }
237 .@{fa-css-prefix}-paste:before,
238 .@{fa-css-prefix}-clipboard:before { content: @fa-var-clipboard; }
239 .@{fa-css-prefix}-lightbulb-o:before { content: @fa-var-lightbulb-o; }
240 .@{fa-css-prefix}-exchange:before { content: @fa-var-exchange; }
241 .@{fa-css-prefix}-cloud-download:before { content: @fa-var-cloud-download; }
242 .@{fa-css-prefix}-cloud-upload:before { content: @fa-var-cloud-upload; }
243 .@{fa-css-prefix}-user-md:before { content: @fa-var-user-md; }
244 .@{fa-css-prefix}-stethoscope:before { content: @fa-var-stethoscope; }
245 .@{fa-css-prefix}-suitcase:before { content: @fa-var-suitcase; }
246 .@{fa-css-prefix}-bell-o:before { content: @fa-var-bell-o; }
247 .@{fa-css-prefix}-coffee:before { content: @fa-var-coffee; }
248 .@{fa-css-prefix}-cutlery:before { content: @fa-var-cutlery; }
249 .@{fa-css-prefix}-file-text-o:before { content: @fa-var-file-text-o; }
250 .@{fa-css-prefix}-building-o:before { content: @fa-var-building-o; }
251 .@{fa-css-prefix}-hospital-o:before { content: @fa-var-hospital-o; }
252 .@{fa-css-prefix}-ambulance:before { content: @fa-var-ambulance; }
253 .@{fa-css-prefix}-medkit:before { content: @fa-var-medkit; }
254 .@{fa-css-prefix}-fighter-jet:before { content: @fa-var-fighter-jet; }
255 .@{fa-css-prefix}-beer:before { content: @fa-var-beer; }
256 .@{fa-css-prefix}-h-square:before { content: @fa-var-h-square; }
257 .@{fa-css-prefix}-plus-square:before { content: @fa-var-plus-square; }
258 .@{fa-css-prefix}-angle-double-left:before { content: @fa-var-angle-double-left; }
259 .@{fa-css-prefix}-angle-double-right:before { content: @fa-var-angle-double-right; }
260 .@{fa-css-prefix}-angle-double-up:before { content: @fa-var-angle-double-up; }
261 .@{fa-css-prefix}-angle-double-down:before { content: @fa-var-angle-double-down; }
262 .@{fa-css-prefix}-angle-left:before { content: @fa-var-angle-left; }
263 .@{fa-css-prefix}-angle-right:before { content: @fa-var-angle-right; }
264 .@{fa-css-prefix}-angle-up:before { content: @fa-var-angle-up; }
265 .@{fa-css-prefix}-angle-down:before { content: @fa-var-angle-down; }
266 .@{fa-css-prefix}-desktop:before { content: @fa-var-desktop; }
267 .@{fa-css-prefix}-laptop:before { content: @fa-var-laptop; }
268 .@{fa-css-prefix}-tablet:before { content: @fa-var-tablet; }
269 .@{fa-css-prefix}-mobile-phone:before,
270 .@{fa-css-prefix}-mobile:before { content: @fa-var-mobile; }
271 .@{fa-css-prefix}-circle-o:before { content: @fa-var-circle-o; }
272 .@{fa-css-prefix}-quote-left:before { content: @fa-var-quote-left; }
273 .@{fa-css-prefix}-quote-right:before { content: @fa-var-quote-right; }
274 .@{fa-css-prefix}-spinner:before { content: @fa-var-spinner; }
275 .@{fa-css-prefix}-circle:before { content: @fa-var-circle; }
276 .@{fa-css-prefix}-mail-reply:before,
277 .@{fa-css-prefix}-reply:before { content: @fa-var-reply; }
278 .@{fa-css-prefix}-github-alt:before { content: @fa-var-github-alt; }
279 .@{fa-css-prefix}-folder-o:before { content: @fa-var-folder-o; }
280 .@{fa-css-prefix}-folder-open-o:before { content: @fa-var-folder-open-o; }
281 .@{fa-css-prefix}-smile-o:before { content: @fa-var-smile-o; }
282 .@{fa-css-prefix}-frown-o:before { content: @fa-var-frown-o; }
283 .@{fa-css-prefix}-meh-o:before { content: @fa-var-meh-o; }
284 .@{fa-css-prefix}-gamepad:before { content: @fa-var-gamepad; }
285 .@{fa-css-prefix}-keyboard-o:before { content: @fa-var-keyboard-o; }
286 .@{fa-css-prefix}-flag-o:before { content: @fa-var-flag-o; }
287 .@{fa-css-prefix}-flag-checkered:before { content: @fa-var-flag-checkered; }
288 .@{fa-css-prefix}-terminal:before { content: @fa-var-terminal; }
289 .@{fa-css-prefix}-code:before { content: @fa-var-code; }
290 .@{fa-css-prefix}-mail-reply-all:before,
291 .@{fa-css-prefix}-reply-all:before { content: @fa-var-reply-all; }
292 .@{fa-css-prefix}-star-half-empty:before,
293 .@{fa-css-prefix}-star-half-full:before,
294 .@{fa-css-prefix}-star-half-o:before { content: @fa-var-star-half-o; }
295 .@{fa-css-prefix}-location-arrow:before { content: @fa-var-location-arrow; }
296 .@{fa-css-prefix}-crop:before { content: @fa-var-crop; }
297 .@{fa-css-prefix}-code-fork:before { content: @fa-var-code-fork; }
298 .@{fa-css-prefix}-unlink:before,
299 .@{fa-css-prefix}-chain-broken:before { content: @fa-var-chain-broken; }
300 .@{fa-css-prefix}-question:before { content: @fa-var-question; }
301 .@{fa-css-prefix}-info:before { content: @fa-var-info; }
302 .@{fa-css-prefix}-exclamation:before { content: @fa-var-exclamation; }
303 .@{fa-css-prefix}-superscript:before { content: @fa-var-superscript; }
304 .@{fa-css-prefix}-subscript:before { content: @fa-var-subscript; }
305 .@{fa-css-prefix}-eraser:before { content: @fa-var-eraser; }
306 .@{fa-css-prefix}-puzzle-piece:before { content: @fa-var-puzzle-piece; }
307 .@{fa-css-prefix}-microphone:before { content: @fa-var-microphone; }
308 .@{fa-css-prefix}-microphone-slash:before { content: @fa-var-microphone-slash; }
309 .@{fa-css-prefix}-shield:before { content: @fa-var-shield; }
310 .@{fa-css-prefix}-calendar-o:before { content: @fa-var-calendar-o; }
311 .@{fa-css-prefix}-fire-extinguisher:before { content: @fa-var-fire-extinguisher; }
312 .@{fa-css-prefix}-rocket:before { content: @fa-var-rocket; }
313 .@{fa-css-prefix}-maxcdn:before { content: @fa-var-maxcdn; }
314 .@{fa-css-prefix}-chevron-circle-left:before { content: @fa-var-chevron-circle-left; }
315 .@{fa-css-prefix}-chevron-circle-right:before { content: @fa-var-chevron-circle-right; }
316 .@{fa-css-prefix}-chevron-circle-up:before { content: @fa-var-chevron-circle-up; }
317 .@{fa-css-prefix}-chevron-circle-down:before { content: @fa-var-chevron-circle-down; }
318 .@{fa-css-prefix}-html5:before { content: @fa-var-html5; }
319 .@{fa-css-prefix}-css3:before { content: @fa-var-css3; }
320 .@{fa-css-prefix}-anchor:before { content: @fa-var-anchor; }
321 .@{fa-css-prefix}-unlock-alt:before { content: @fa-var-unlock-alt; }
322 .@{fa-css-prefix}-bullseye:before { content: @fa-var-bullseye; }
323 .@{fa-css-prefix}-ellipsis-h:before { content: @fa-var-ellipsis-h; }
324 .@{fa-css-prefix}-ellipsis-v:before { content: @fa-var-ellipsis-v; }
325 .@{fa-css-prefix}-rss-square:before { content: @fa-var-rss-square; }
326 .@{fa-css-prefix}-play-circle:before { content: @fa-var-play-circle; }
327 .@{fa-css-prefix}-ticket:before { content: @fa-var-ticket; }
328 .@{fa-css-prefix}-minus-square:before { content: @fa-var-minus-square; }
329 .@{fa-css-prefix}-minus-square-o:before { content: @fa-var-minus-square-o; }
330 .@{fa-css-prefix}-level-up:before { content: @fa-var-level-up; }
331 .@{fa-css-prefix}-level-down:before { content: @fa-var-level-down; }
332 .@{fa-css-prefix}-check-square:before { content: @fa-var-check-square; }
333 .@{fa-css-prefix}-pencil-square:before { content: @fa-var-pencil-square; }
334 .@{fa-css-prefix}-external-link-square:before { content: @fa-var-external-link-square; }
335 .@{fa-css-prefix}-share-square:before { content: @fa-var-share-square; }
336 .@{fa-css-prefix}-compass:before { content: @fa-var-compass; }
337 .@{fa-css-prefix}-toggle-down:before,
338 .@{fa-css-prefix}-caret-square-o-down:before { content: @fa-var-caret-square-o-down; }
339 .@{fa-css-prefix}-toggle-up:before,
340 .@{fa-css-prefix}-caret-square-o-up:before { content: @fa-var-caret-square-o-up; }
341 .@{fa-css-prefix}-toggle-right:before,
342 .@{fa-css-prefix}-caret-square-o-right:before { content: @fa-var-caret-square-o-right; }
343 .@{fa-css-prefix}-euro:before,
344 .@{fa-css-prefix}-eur:before { content: @fa-var-eur; }
345 .@{fa-css-prefix}-gbp:before { content: @fa-var-gbp; }
346 .@{fa-css-prefix}-dollar:before,
347 .@{fa-css-prefix}-usd:before { content: @fa-var-usd; }
348 .@{fa-css-prefix}-rupee:before,
349 .@{fa-css-prefix}-inr:before { content: @fa-var-inr; }
350 .@{fa-css-prefix}-cny:before,
351 .@{fa-css-prefix}-rmb:before,
352 .@{fa-css-prefix}-yen:before,
353 .@{fa-css-prefix}-jpy:before { content: @fa-var-jpy; }
354 .@{fa-css-prefix}-ruble:before,
355 .@{fa-css-prefix}-rouble:before,
356 .@{fa-css-prefix}-rub:before { content: @fa-var-rub; }
357 .@{fa-css-prefix}-won:before,
358 .@{fa-css-prefix}-krw:before { content: @fa-var-krw; }
359 .@{fa-css-prefix}-bitcoin:before,
360 .@{fa-css-prefix}-btc:before { content: @fa-var-btc; }
361 .@{fa-css-prefix}-file:before { content: @fa-var-file; }
362 .@{fa-css-prefix}-file-text:before { content: @fa-var-file-text; }
363 .@{fa-css-prefix}-sort-alpha-asc:before { content: @fa-var-sort-alpha-asc; }
364 .@{fa-css-prefix}-sort-alpha-desc:before { content: @fa-var-sort-alpha-desc; }
365 .@{fa-css-prefix}-sort-amount-asc:before { content: @fa-var-sort-amount-asc; }
366 .@{fa-css-prefix}-sort-amount-desc:before { content: @fa-var-sort-amount-desc; }
367 .@{fa-css-prefix}-sort-numeric-asc:before { content: @fa-var-sort-numeric-asc; }
368 .@{fa-css-prefix}-sort-numeric-desc:before { content: @fa-var-sort-numeric-desc; }
369 .@{fa-css-prefix}-thumbs-up:before { content: @fa-var-thumbs-up; }
370 .@{fa-css-prefix}-thumbs-down:before { content: @fa-var-thumbs-down; }
371 .@{fa-css-prefix}-youtube-square:before { content: @fa-var-youtube-square; }
372 .@{fa-css-prefix}-youtube:before { content: @fa-var-youtube; }
373 .@{fa-css-prefix}-xing:before { content: @fa-var-xing; }
374 .@{fa-css-prefix}-xing-square:before { content: @fa-var-xing-square; }
375 .@{fa-css-prefix}-youtube-play:before { content: @fa-var-youtube-play; }
376 .@{fa-css-prefix}-dropbox:before { content: @fa-var-dropbox; }
377 .@{fa-css-prefix}-stack-overflow:before { content: @fa-var-stack-overflow; }
378 .@{fa-css-prefix}-instagram:before { content: @fa-var-instagram; }
379 .@{fa-css-prefix}-flickr:before { content: @fa-var-flickr; }
380 .@{fa-css-prefix}-adn:before { content: @fa-var-adn; }
381 .@{fa-css-prefix}-bitbucket:before { content: @fa-var-bitbucket; }
382 .@{fa-css-prefix}-bitbucket-square:before { content: @fa-var-bitbucket-square; }
383 .@{fa-css-prefix}-tumblr:before { content: @fa-var-tumblr; }
384 .@{fa-css-prefix}-tumblr-square:before { content: @fa-var-tumblr-square; }
385 .@{fa-css-prefix}-long-arrow-down:before { content: @fa-var-long-arrow-down; }
386 .@{fa-css-prefix}-long-arrow-up:before { content: @fa-var-long-arrow-up; }
387 .@{fa-css-prefix}-long-arrow-left:before { content: @fa-var-long-arrow-left; }
388 .@{fa-css-prefix}-long-arrow-right:before { content: @fa-var-long-arrow-right; }
389 .@{fa-css-prefix}-apple:before { content: @fa-var-apple; }
390 .@{fa-css-prefix}-windows:before { content: @fa-var-windows; }
391 .@{fa-css-prefix}-android:before { content: @fa-var-android; }
392 .@{fa-css-prefix}-linux:before { content: @fa-var-linux; }
393 .@{fa-css-prefix}-dribbble:before { content: @fa-var-dribbble; }
394 .@{fa-css-prefix}-skype:before { content: @fa-var-skype; }
395 .@{fa-css-prefix}-foursquare:before { content: @fa-var-foursquare; }
396 .@{fa-css-prefix}-trello:before { content: @fa-var-trello; }
397 .@{fa-css-prefix}-female:before { content: @fa-var-female; }
398 .@{fa-css-prefix}-male:before { content: @fa-var-male; }
399 .@{fa-css-prefix}-gittip:before { content: @fa-var-gittip; }
400 .@{fa-css-prefix}-sun-o:before { content: @fa-var-sun-o; }
401 .@{fa-css-prefix}-moon-o:before { content: @fa-var-moon-o; }
402 .@{fa-css-prefix}-archive:before { content: @fa-var-archive; }
403 .@{fa-css-prefix}-bug:before { content: @fa-var-bug; }
404 .@{fa-css-prefix}-vk:before { content: @fa-var-vk; }
405 .@{fa-css-prefix}-weibo:before { content: @fa-var-weibo; }
406 .@{fa-css-prefix}-renren:before { content: @fa-var-renren; }
407 .@{fa-css-prefix}-pagelines:before { content: @fa-var-pagelines; }
408 .@{fa-css-prefix}-stack-exchange:before { content: @fa-var-stack-exchange; }
409 .@{fa-css-prefix}-arrow-circle-o-right:before { content: @fa-var-arrow-circle-o-right; }
410 .@{fa-css-prefix}-arrow-circle-o-left:before { content: @fa-var-arrow-circle-o-left; }
411 .@{fa-css-prefix}-toggle-left:before,
412 .@{fa-css-prefix}-caret-square-o-left:before { content: @fa-var-caret-square-o-left; }
413 .@{fa-css-prefix}-dot-circle-o:before { content: @fa-var-dot-circle-o; }
414 .@{fa-css-prefix}-wheelchair:before { content: @fa-var-wheelchair; }
415 .@{fa-css-prefix}-vimeo-square:before { content: @fa-var-vimeo-square; }
416 .@{fa-css-prefix}-turkish-lira:before,
417 .@{fa-css-prefix}-try:before { content: @fa-var-try; }
418 .@{fa-css-prefix}-plus-square-o:before { content: @fa-var-plus-square-o; }
419 .@{fa-css-prefix}-space-shuttle:before { content: @fa-var-space-shuttle; }
420 .@{fa-css-prefix}-slack:before { content: @fa-var-slack; }
421 .@{fa-css-prefix}-envelope-square:before { content: @fa-var-envelope-square; }
422 .@{fa-css-prefix}-wordpress:before { content: @fa-var-wordpress; }
423 .@{fa-css-prefix}-openid:before { content: @fa-var-openid; }
424 .@{fa-css-prefix}-institution:before,
425 .@{fa-css-prefix}-bank:before,
426 .@{fa-css-prefix}-university:before { content: @fa-var-university; }
427 .@{fa-css-prefix}-mortar-board:before,
428 .@{fa-css-prefix}-graduation-cap:before { content: @fa-var-graduation-cap; }
429 .@{fa-css-prefix}-yahoo:before { content: @fa-var-yahoo; }
430 .@{fa-css-prefix}-google:before { content: @fa-var-google; }
431 .@{fa-css-prefix}-reddit:before { content: @fa-var-reddit; }
432 .@{fa-css-prefix}-reddit-square:before { content: @fa-var-reddit-square; }
433 .@{fa-css-prefix}-stumbleupon-circle:before { content: @fa-var-stumbleupon-circle; }
434 .@{fa-css-prefix}-stumbleupon:before { content: @fa-var-stumbleupon; }
435 .@{fa-css-prefix}-delicious:before { content: @fa-var-delicious; }
436 .@{fa-css-prefix}-digg:before { content: @fa-var-digg; }
437 .@{fa-css-prefix}-pied-piper:before { content: @fa-var-pied-piper; }
438 .@{fa-css-prefix}-pied-piper-alt:before { content: @fa-var-pied-piper-alt; }
439 .@{fa-css-prefix}-drupal:before { content: @fa-var-drupal; }
440 .@{fa-css-prefix}-joomla:before { content: @fa-var-joomla; }
441 .@{fa-css-prefix}-language:before { content: @fa-var-language; }
442 .@{fa-css-prefix}-fax:before { content: @fa-var-fax; }
443 .@{fa-css-prefix}-building:before { content: @fa-var-building; }
444 .@{fa-css-prefix}-child:before { content: @fa-var-child; }
445 .@{fa-css-prefix}-paw:before { content: @fa-var-paw; }
446 .@{fa-css-prefix}-spoon:before { content: @fa-var-spoon; }
447 .@{fa-css-prefix}-cube:before { content: @fa-var-cube; }
448 .@{fa-css-prefix}-cubes:before { content: @fa-var-cubes; }
449 .@{fa-css-prefix}-behance:before { content: @fa-var-behance; }
450 .@{fa-css-prefix}-behance-square:before { content: @fa-var-behance-square; }
451 .@{fa-css-prefix}-steam:before { content: @fa-var-steam; }
452 .@{fa-css-prefix}-steam-square:before { content: @fa-var-steam-square; }
453 .@{fa-css-prefix}-recycle:before { content: @fa-var-recycle; }
454 .@{fa-css-prefix}-automobile:before,
455 .@{fa-css-prefix}-car:before { content: @fa-var-car; }
456 .@{fa-css-prefix}-cab:before,
457 .@{fa-css-prefix}-taxi:before { content: @fa-var-taxi; }
458 .@{fa-css-prefix}-tree:before { content: @fa-var-tree; }
459 .@{fa-css-prefix}-spotify:before { content: @fa-var-spotify; }
460 .@{fa-css-prefix}-deviantart:before { content: @fa-var-deviantart; }
461 .@{fa-css-prefix}-soundcloud:before { content: @fa-var-soundcloud; }
462 .@{fa-css-prefix}-database:before { content: @fa-var-database; }
463 .@{fa-css-prefix}-file-pdf-o:before { content: @fa-var-file-pdf-o; }
464 .@{fa-css-prefix}-file-word-o:before { content: @fa-var-file-word-o; }
465 .@{fa-css-prefix}-file-excel-o:before { content: @fa-var-file-excel-o; }
466 .@{fa-css-prefix}-file-powerpoint-o:before { content: @fa-var-file-powerpoint-o; }
467 .@{fa-css-prefix}-file-photo-o:before,
468 .@{fa-css-prefix}-file-picture-o:before,
469 .@{fa-css-prefix}-file-image-o:before { content: @fa-var-file-image-o; }
470 .@{fa-css-prefix}-file-zip-o:before,
471 .@{fa-css-prefix}-file-archive-o:before { content: @fa-var-file-archive-o; }
472 .@{fa-css-prefix}-file-sound-o:before,
473 .@{fa-css-prefix}-file-audio-o:before { content: @fa-var-file-audio-o; }
474 .@{fa-css-prefix}-file-movie-o:before,
475 .@{fa-css-prefix}-file-video-o:before { content: @fa-var-file-video-o; }
476 .@{fa-css-prefix}-file-code-o:before { content: @fa-var-file-code-o; }
477 .@{fa-css-prefix}-vine:before { content: @fa-var-vine; }
478 .@{fa-css-prefix}-codepen:before { content: @fa-var-codepen; }
479 .@{fa-css-prefix}-jsfiddle:before { content: @fa-var-jsfiddle; }
480 .@{fa-css-prefix}-life-bouy:before,
481 .@{fa-css-prefix}-life-buoy:before,
482 .@{fa-css-prefix}-life-saver:before,
483 .@{fa-css-prefix}-support:before,
484 .@{fa-css-prefix}-life-ring:before { content: @fa-var-life-ring; }
485 .@{fa-css-prefix}-circle-o-notch:before { content: @fa-var-circle-o-notch; }
486 .@{fa-css-prefix}-ra:before,
487 .@{fa-css-prefix}-rebel:before { content: @fa-var-rebel; }
488 .@{fa-css-prefix}-ge:before,
489 .@{fa-css-prefix}-empire:before { content: @fa-var-empire; }
490 .@{fa-css-prefix}-git-square:before { content: @fa-var-git-square; }
491 .@{fa-css-prefix}-git:before { content: @fa-var-git; }
492 .@{fa-css-prefix}-hacker-news:before { content: @fa-var-hacker-news; }
493 .@{fa-css-prefix}-tencent-weibo:before { content: @fa-var-tencent-weibo; }
494 .@{fa-css-prefix}-qq:before { content: @fa-var-qq; }
495 .@{fa-css-prefix}-wechat:before,
496 .@{fa-css-prefix}-weixin:before { content: @fa-var-weixin; }
497 .@{fa-css-prefix}-send:before,
498 .@{fa-css-prefix}-paper-plane:before { content: @fa-var-paper-plane; }
499 .@{fa-css-prefix}-send-o:before,
500 .@{fa-css-prefix}-paper-plane-o:before { content: @fa-var-paper-plane-o; }
501 .@{fa-css-prefix}-history:before { content: @fa-var-history; }
502 .@{fa-css-prefix}-circle-thin:before { content: @fa-var-circle-thin; }
503 .@{fa-css-prefix}-header:before { content: @fa-var-header; }
504 .@{fa-css-prefix}-paragraph:before { content: @fa-var-paragraph; }
505 .@{fa-css-prefix}-sliders:before { content: @fa-var-sliders; }
506 .@{fa-css-prefix}-share-alt:before { content: @fa-var-share-alt; }
507 .@{fa-css-prefix}-share-alt-square:before { content: @fa-var-share-alt-square; }
508 .@{fa-css-prefix}-bomb:before { content: @fa-var-bomb; }
509 .@{fa-css-prefix}-soccer-ball-o:before,
510 .@{fa-css-prefix}-futbol-o:before { content: @fa-var-futbol-o; }
511 .@{fa-css-prefix}-tty:before { content: @fa-var-tty; }
512 .@{fa-css-prefix}-binoculars:before { content: @fa-var-binoculars; }
513 .@{fa-css-prefix}-plug:before { content: @fa-var-plug; }
514 .@{fa-css-prefix}-slideshare:before { content: @fa-var-slideshare; }
515 .@{fa-css-prefix}-twitch:before { content: @fa-var-twitch; }
516 .@{fa-css-prefix}-yelp:before { content: @fa-var-yelp; }
517 .@{fa-css-prefix}-newspaper-o:before { content: @fa-var-newspaper-o; }
518 .@{fa-css-prefix}-wifi:before { content: @fa-var-wifi; }
519 .@{fa-css-prefix}-calculator:before { content: @fa-var-calculator; }
520 .@{fa-css-prefix}-paypal:before { content: @fa-var-paypal; }
521 .@{fa-css-prefix}-google-wallet:before { content: @fa-var-google-wallet; }
522 .@{fa-css-prefix}-cc-visa:before { content: @fa-var-cc-visa; }
523 .@{fa-css-prefix}-cc-mastercard:before { content: @fa-var-cc-mastercard; }
524 .@{fa-css-prefix}-cc-discover:before { content: @fa-var-cc-discover; }
525 .@{fa-css-prefix}-cc-amex:before { content: @fa-var-cc-amex; }
526 .@{fa-css-prefix}-cc-paypal:before { content: @fa-var-cc-paypal; }
527 .@{fa-css-prefix}-cc-stripe:before { content: @fa-var-cc-stripe; }
528 .@{fa-css-prefix}-bell-slash:before { content: @fa-var-bell-slash; }
529 .@{fa-css-prefix}-bell-slash-o:before { content: @fa-var-bell-slash-o; }
530 .@{fa-css-prefix}-trash:before { content: @fa-var-trash; }
531 .@{fa-css-prefix}-copyright:before { content: @fa-var-copyright; }
532 .@{fa-css-prefix}-at:before { content: @fa-var-at; }
533 .@{fa-css-prefix}-eyedropper:before { content: @fa-var-eyedropper; }
534 .@{fa-css-prefix}-paint-brush:before { content: @fa-var-paint-brush; }
535 .@{fa-css-prefix}-birthday-cake:before { content: @fa-var-birthday-cake; }
536 .@{fa-css-prefix}-area-chart:before { content: @fa-var-area-chart; }
537 .@{fa-css-prefix}-pie-chart:before { content: @fa-var-pie-chart; }
538 .@{fa-css-prefix}-line-chart:before { content: @fa-var-line-chart; }
539 .@{fa-css-prefix}-lastfm:before { content: @fa-var-lastfm; }
540 .@{fa-css-prefix}-lastfm-square:before { content: @fa-var-lastfm-square; }
541 .@{fa-css-prefix}-toggle-off:before { content: @fa-var-toggle-off; }
542 .@{fa-css-prefix}-toggle-on:before { content: @fa-var-toggle-on; }
543 .@{fa-css-prefix}-bicycle:before { content: @fa-var-bicycle; }
544 .@{fa-css-prefix}-bus:before { content: @fa-var-bus; }
545 .@{fa-css-prefix}-ioxhost:before { content: @fa-var-ioxhost; }
546 .@{fa-css-prefix}-angellist:before { content: @fa-var-angellist; }
547 .@{fa-css-prefix}-cc:before { content: @fa-var-cc; }
548 .@{fa-css-prefix}-shekel:before,
549 .@{fa-css-prefix}-sheqel:before,
550 .@{fa-css-prefix}-ils:before { content: @fa-var-ils; }
551 .@{fa-css-prefix}-meanpath:before { content: @fa-var-meanpath; }
0 // Icon Sizes
1 // -------------------------
2
3 /* makes the font 33% larger relative to the icon container */
4 .@{fa-css-prefix}-lg {
5 font-size: (4em / 3);
6 line-height: (3em / 4);
7 vertical-align: -15%;
8 }
9 .@{fa-css-prefix}-2x { font-size: 2em; }
10 .@{fa-css-prefix}-3x { font-size: 3em; }
11 .@{fa-css-prefix}-4x { font-size: 4em; }
12 .@{fa-css-prefix}-5x { font-size: 5em; }
0 // List Icons
1 // -------------------------
2
3 .@{fa-css-prefix}-ul {
4 padding-left: 0;
5 margin-left: @fa-li-width;
6 list-style-type: none;
7 > li { position: relative; }
8 }
9 .@{fa-css-prefix}-li {
10 position: absolute;
11 left: -@fa-li-width;
12 width: @fa-li-width;
13 top: (2em / 14);
14 text-align: center;
15 &.@{fa-css-prefix}-lg {
16 left: (-@fa-li-width + (4em / 14));
17 }
18 }
0 // Mixins
1 // --------------------------
2
3 .fa-icon() {
4 display: inline-block;
5 font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
6 font-size: inherit; // can't have font-size inherit on line above, so need to override
7 text-rendering: auto; // optimizelegibility throws things off #1094
8 -webkit-font-smoothing: antialiased;
9 -moz-osx-font-smoothing: grayscale;
10 }
11
12 .fa-icon-rotate(@degrees, @rotation) {
13 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation);
14 -webkit-transform: rotate(@degrees);
15 -ms-transform: rotate(@degrees);
16 transform: rotate(@degrees);
17 }
18
19 .fa-icon-flip(@horiz, @vert, @rotation) {
20 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=@rotation, mirror=1);
21 -webkit-transform: scale(@horiz, @vert);
22 -ms-transform: scale(@horiz, @vert);
23 transform: scale(@horiz, @vert);
24 }
0 /* FONT PATH
1 * -------------------------- */
2
3 @font-face {
4 font-family: 'FontAwesome';
5 src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
6 src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'),
7 url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
8 url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),
9 url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg');
10 // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
11 font-weight: normal;
12 font-style: normal;
13 }
0 // Rotated & Flipped Icons
1 // -------------------------
2
3 .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); }
4 .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); }
5 .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); }
6
7 .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); }
8 .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); }
9
10 // Hook for IE8-9
11 // -------------------------
12
13 :root .@{fa-css-prefix}-rotate-90,
14 :root .@{fa-css-prefix}-rotate-180,
15 :root .@{fa-css-prefix}-rotate-270,
16 :root .@{fa-css-prefix}-flip-horizontal,
17 :root .@{fa-css-prefix}-flip-vertical {
18 filter: none;
19 }
0 // Spinning Icons
1 // --------------------------
2
3 .@{fa-css-prefix}-spin {
4 -webkit-animation: fa-spin 2s infinite linear;
5 animation: fa-spin 2s infinite linear;
6 }
7
8 @-webkit-keyframes fa-spin {
9 0% {
10 -webkit-transform: rotate(0deg);
11 transform: rotate(0deg);
12 }
13 100% {
14 -webkit-transform: rotate(359deg);
15 transform: rotate(359deg);
16 }
17 }
18
19 @keyframes fa-spin {
20 0% {
21 -webkit-transform: rotate(0deg);
22 transform: rotate(0deg);
23 }
24 100% {
25 -webkit-transform: rotate(359deg);
26 transform: rotate(359deg);
27 }
28 }
0 // Stacked Icons
1 // -------------------------
2
3 .@{fa-css-prefix}-stack {
4 position: relative;
5 display: inline-block;
6 width: 2em;
7 height: 2em;
8 line-height: 2em;
9 vertical-align: middle;
10 }
11 .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x {
12 position: absolute;
13 left: 0;
14 width: 100%;
15 text-align: center;
16 }
17 .@{fa-css-prefix}-stack-1x { line-height: inherit; }
18 .@{fa-css-prefix}-stack-2x { font-size: 2em; }
19 .@{fa-css-prefix}-inverse { color: @fa-inverse; }
0 // Variables
1 // --------------------------
2
3 @fa-font-path: "../fonts";
4 //@fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts"; // for referencing Bootstrap CDN font files directly
5 @fa-css-prefix: fa;
6 @fa-version: "4.2.0";
7 @fa-border-color: #eee;
8 @fa-inverse: #fff;
9 @fa-li-width: (30em / 14);
10
11 @fa-var-adjust: "\f042";
12 @fa-var-adn: "\f170";
13 @fa-var-align-center: "\f037";
14 @fa-var-align-justify: "\f039";
15 @fa-var-align-left: "\f036";
16 @fa-var-align-right: "\f038";
17 @fa-var-ambulance: "\f0f9";
18 @fa-var-anchor: "\f13d";
19 @fa-var-android: "\f17b";
20 @fa-var-angellist: "\f209";
21 @fa-var-angle-double-down: "\f103";
22 @fa-var-angle-double-left: "\f100";
23 @fa-var-angle-double-right: "\f101";
24 @fa-var-angle-double-up: "\f102";
25 @fa-var-angle-down: "\f107";
26 @fa-var-angle-left: "\f104";
27 @fa-var-angle-right: "\f105";
28 @fa-var-angle-up: "\f106";
29 @fa-var-apple: "\f179";
30 @fa-var-archive: "\f187";
31 @fa-var-area-chart: "\f1fe";
32 @fa-var-arrow-circle-down: "\f0ab";
33 @fa-var-arrow-circle-left: "\f0a8";
34 @fa-var-arrow-circle-o-down: "\f01a";
35 @fa-var-arrow-circle-o-left: "\f190";
36 @fa-var-arrow-circle-o-right: "\f18e";
37 @fa-var-arrow-circle-o-up: "\f01b";
38 @fa-var-arrow-circle-right: "\f0a9";
39 @fa-var-arrow-circle-up: "\f0aa";
40 @fa-var-arrow-down: "\f063";
41 @fa-var-arrow-left: "\f060";
42 @fa-var-arrow-right: "\f061";
43 @fa-var-arrow-up: "\f062";
44 @fa-var-arrows: "\f047";
45 @fa-var-arrows-alt: "\f0b2";
46 @fa-var-arrows-h: "\f07e";
47 @fa-var-arrows-v: "\f07d";
48 @fa-var-asterisk: "\f069";
49 @fa-var-at: "\f1fa";
50 @fa-var-automobile: "\f1b9";
51 @fa-var-backward: "\f04a";
52 @fa-var-ban: "\f05e";
53 @fa-var-bank: "\f19c";
54 @fa-var-bar-chart: "\f080";
55 @fa-var-bar-chart-o: "\f080";
56 @fa-var-barcode: "\f02a";
57 @fa-var-bars: "\f0c9";
58 @fa-var-beer: "\f0fc";
59 @fa-var-behance: "\f1b4";
60 @fa-var-behance-square: "\f1b5";
61 @fa-var-bell: "\f0f3";
62 @fa-var-bell-o: "\f0a2";
63 @fa-var-bell-slash: "\f1f6";
64 @fa-var-bell-slash-o: "\f1f7";
65 @fa-var-bicycle: "\f206";
66 @fa-var-binoculars: "\f1e5";
67 @fa-var-birthday-cake: "\f1fd";
68 @fa-var-bitbucket: "\f171";
69 @fa-var-bitbucket-square: "\f172";
70 @fa-var-bitcoin: "\f15a";
71 @fa-var-bold: "\f032";
72 @fa-var-bolt: "\f0e7";
73 @fa-var-bomb: "\f1e2";
74 @fa-var-book: "\f02d";
75 @fa-var-bookmark: "\f02e";
76 @fa-var-bookmark-o: "\f097";
77 @fa-var-briefcase: "\f0b1";
78 @fa-var-btc: "\f15a";
79 @fa-var-bug: "\f188";
80 @fa-var-building: "\f1ad";
81 @fa-var-building-o: "\f0f7";
82 @fa-var-bullhorn: "\f0a1";
83 @fa-var-bullseye: "\f140";
84 @fa-var-bus: "\f207";
85 @fa-var-cab: "\f1ba";
86 @fa-var-calculator: "\f1ec";
87 @fa-var-calendar: "\f073";
88 @fa-var-calendar-o: "\f133";
89 @fa-var-camera: "\f030";
90 @fa-var-camera-retro: "\f083";
91 @fa-var-car: "\f1b9";
92 @fa-var-caret-down: "\f0d7";
93 @fa-var-caret-left: "\f0d9";
94 @fa-var-caret-right: "\f0da";
95 @fa-var-caret-square-o-down: "\f150";
96 @fa-var-caret-square-o-left: "\f191";
97 @fa-var-caret-square-o-right: "\f152";
98 @fa-var-caret-square-o-up: "\f151";
99 @fa-var-caret-up: "\f0d8";
100 @fa-var-cc: "\f20a";
101 @fa-var-cc-amex: "\f1f3";
102 @fa-var-cc-discover: "\f1f2";
103 @fa-var-cc-mastercard: "\f1f1";
104 @fa-var-cc-paypal: "\f1f4";
105 @fa-var-cc-stripe: "\f1f5";
106 @fa-var-cc-visa: "\f1f0";
107 @fa-var-certificate: "\f0a3";
108 @fa-var-chain: "\f0c1";
109 @fa-var-chain-broken: "\f127";
110 @fa-var-check: "\f00c";
111 @fa-var-check-circle: "\f058";
112 @fa-var-check-circle-o: "\f05d";
113 @fa-var-check-square: "\f14a";
114 @fa-var-check-square-o: "\f046";
115 @fa-var-chevron-circle-down: "\f13a";
116 @fa-var-chevron-circle-left: "\f137";
117 @fa-var-chevron-circle-right: "\f138";
118 @fa-var-chevron-circle-up: "\f139";
119 @fa-var-chevron-down: "\f078";
120 @fa-var-chevron-left: "\f053";
121 @fa-var-chevron-right: "\f054";
122 @fa-var-chevron-up: "\f077";
123 @fa-var-child: "\f1ae";
124 @fa-var-circle: "\f111";
125 @fa-var-circle-o: "\f10c";
126 @fa-var-circle-o-notch: "\f1ce";
127 @fa-var-circle-thin: "\f1db";
128 @fa-var-clipboard: "\f0ea";
129 @fa-var-clock-o: "\f017";
130 @fa-var-close: "\f00d";
131 @fa-var-cloud: "\f0c2";
132 @fa-var-cloud-download: "\f0ed";
133 @fa-var-cloud-upload: "\f0ee";
134 @fa-var-cny: "\f157";
135 @fa-var-code: "\f121";
136 @fa-var-code-fork: "\f126";
137 @fa-var-codepen: "\f1cb";
138 @fa-var-coffee: "\f0f4";
139 @fa-var-cog: "\f013";
140 @fa-var-cogs: "\f085";
141 @fa-var-columns: "\f0db";
142 @fa-var-comment: "\f075";
143 @fa-var-comment-o: "\f0e5";
144 @fa-var-comments: "\f086";
145 @fa-var-comments-o: "\f0e6";
146 @fa-var-compass: "\f14e";
147 @fa-var-compress: "\f066";
148 @fa-var-copy: "\f0c5";
149 @fa-var-copyright: "\f1f9";
150 @fa-var-credit-card: "\f09d";
151 @fa-var-crop: "\f125";
152 @fa-var-crosshairs: "\f05b";
153 @fa-var-css3: "\f13c";
154 @fa-var-cube: "\f1b2";
155 @fa-var-cubes: "\f1b3";
156 @fa-var-cut: "\f0c4";
157 @fa-var-cutlery: "\f0f5";
158 @fa-var-dashboard: "\f0e4";
159 @fa-var-database: "\f1c0";
160 @fa-var-dedent: "\f03b";
161 @fa-var-delicious: "\f1a5";
162 @fa-var-desktop: "\f108";
163 @fa-var-deviantart: "\f1bd";
164 @fa-var-digg: "\f1a6";
165 @fa-var-dollar: "\f155";
166 @fa-var-dot-circle-o: "\f192";
167 @fa-var-download: "\f019";
168 @fa-var-dribbble: "\f17d";
169 @fa-var-dropbox: "\f16b";
170 @fa-var-drupal: "\f1a9";
171 @fa-var-edit: "\f044";
172 @fa-var-eject: "\f052";
173 @fa-var-ellipsis-h: "\f141";
174 @fa-var-ellipsis-v: "\f142";
175 @fa-var-empire: "\f1d1";
176 @fa-var-envelope: "\f0e0";
177 @fa-var-envelope-o: "\f003";
178 @fa-var-envelope-square: "\f199";
179 @fa-var-eraser: "\f12d";
180 @fa-var-eur: "\f153";
181 @fa-var-euro: "\f153";
182 @fa-var-exchange: "\f0ec";
183 @fa-var-exclamation: "\f12a";
184 @fa-var-exclamation-circle: "\f06a";
185 @fa-var-exclamation-triangle: "\f071";
186 @fa-var-expand: "\f065";
187 @fa-var-external-link: "\f08e";
188 @fa-var-external-link-square: "\f14c";
189 @fa-var-eye: "\f06e";
190 @fa-var-eye-slash: "\f070";
191 @fa-var-eyedropper: "\f1fb";
192 @fa-var-facebook: "\f09a";
193 @fa-var-facebook-square: "\f082";
194 @fa-var-fast-backward: "\f049";
195 @fa-var-fast-forward: "\f050";
196 @fa-var-fax: "\f1ac";
197 @fa-var-female: "\f182";
198 @fa-var-fighter-jet: "\f0fb";
199 @fa-var-file: "\f15b";
200 @fa-var-file-archive-o: "\f1c6";
201 @fa-var-file-audio-o: "\f1c7";
202 @fa-var-file-code-o: "\f1c9";
203 @fa-var-file-excel-o: "\f1c3";
204 @fa-var-file-image-o: "\f1c5";
205 @fa-var-file-movie-o: "\f1c8";
206 @fa-var-file-o: "\f016";
207 @fa-var-file-pdf-o: "\f1c1";
208 @fa-var-file-photo-o: "\f1c5";
209 @fa-var-file-picture-o: "\f1c5";
210 @fa-var-file-powerpoint-o: "\f1c4";
211 @fa-var-file-sound-o: "\f1c7";
212 @fa-var-file-text: "\f15c";
213 @fa-var-file-text-o: "\f0f6";
214 @fa-var-file-video-o: "\f1c8";
215 @fa-var-file-word-o: "\f1c2";
216 @fa-var-file-zip-o: "\f1c6";
217 @fa-var-files-o: "\f0c5";
218 @fa-var-film: "\f008";
219 @fa-var-filter: "\f0b0";
220 @fa-var-fire: "\f06d";
221 @fa-var-fire-extinguisher: "\f134";
222 @fa-var-flag: "\f024";
223 @fa-var-flag-checkered: "\f11e";
224 @fa-var-flag-o: "\f11d";
225 @fa-var-flash: "\f0e7";
226 @fa-var-flask: "\f0c3";
227 @fa-var-flickr: "\f16e";
228 @fa-var-floppy-o: "\f0c7";
229 @fa-var-folder: "\f07b";
230 @fa-var-folder-o: "\f114";
231 @fa-var-folder-open: "\f07c";
232 @fa-var-folder-open-o: "\f115";
233 @fa-var-font: "\f031";
234 @fa-var-forward: "\f04e";
235 @fa-var-foursquare: "\f180";
236 @fa-var-frown-o: "\f119";
237 @fa-var-futbol-o: "\f1e3";
238 @fa-var-gamepad: "\f11b";
239 @fa-var-gavel: "\f0e3";
240 @fa-var-gbp: "\f154";
241 @fa-var-ge: "\f1d1";
242 @fa-var-gear: "\f013";
243 @fa-var-gears: "\f085";
244 @fa-var-gift: "\f06b";
245 @fa-var-git: "\f1d3";
246 @fa-var-git-square: "\f1d2";
247 @fa-var-github: "\f09b";
248 @fa-var-github-alt: "\f113";
249 @fa-var-github-square: "\f092";
250 @fa-var-gittip: "\f184";
251 @fa-var-glass: "\f000";
252 @fa-var-globe: "\f0ac";
253 @fa-var-google: "\f1a0";
254 @fa-var-google-plus: "\f0d5";
255 @fa-var-google-plus-square: "\f0d4";
256 @fa-var-google-wallet: "\f1ee";
257 @fa-var-graduation-cap: "\f19d";
258 @fa-var-group: "\f0c0";
259 @fa-var-h-square: "\f0fd";
260 @fa-var-hacker-news: "\f1d4";
261 @fa-var-hand-o-down: "\f0a7";
262 @fa-var-hand-o-left: "\f0a5";
263 @fa-var-hand-o-right: "\f0a4";
264 @fa-var-hand-o-up: "\f0a6";
265 @fa-var-hdd-o: "\f0a0";
266 @fa-var-header: "\f1dc";
267 @fa-var-headphones: "\f025";
268 @fa-var-heart: "\f004";
269 @fa-var-heart-o: "\f08a";
270 @fa-var-history: "\f1da";
271 @fa-var-home: "\f015";
272 @fa-var-hospital-o: "\f0f8";
273 @fa-var-html5: "\f13b";
274 @fa-var-ils: "\f20b";
275 @fa-var-image: "\f03e";
276 @fa-var-inbox: "\f01c";
277 @fa-var-indent: "\f03c";
278 @fa-var-info: "\f129";
279 @fa-var-info-circle: "\f05a";
280 @fa-var-inr: "\f156";
281 @fa-var-instagram: "\f16d";
282 @fa-var-institution: "\f19c";
283 @fa-var-ioxhost: "\f208";
284 @fa-var-italic: "\f033";
285 @fa-var-joomla: "\f1aa";
286 @fa-var-jpy: "\f157";
287 @fa-var-jsfiddle: "\f1cc";
288 @fa-var-key: "\f084";
289 @fa-var-keyboard-o: "\f11c";
290 @fa-var-krw: "\f159";
291 @fa-var-language: "\f1ab";
292 @fa-var-laptop: "\f109";
293 @fa-var-lastfm: "\f202";
294 @fa-var-lastfm-square: "\f203";
295 @fa-var-leaf: "\f06c";
296 @fa-var-legal: "\f0e3";
297 @fa-var-lemon-o: "\f094";
298 @fa-var-level-down: "\f149";
299 @fa-var-level-up: "\f148";
300 @fa-var-life-bouy: "\f1cd";
301 @fa-var-life-buoy: "\f1cd";
302 @fa-var-life-ring: "\f1cd";
303 @fa-var-life-saver: "\f1cd";
304 @fa-var-lightbulb-o: "\f0eb";
305 @fa-var-line-chart: "\f201";
306 @fa-var-link: "\f0c1";
307 @fa-var-linkedin: "\f0e1";
308 @fa-var-linkedin-square: "\f08c";
309 @fa-var-linux: "\f17c";
310 @fa-var-list: "\f03a";
311 @fa-var-list-alt: "\f022";
312 @fa-var-list-ol: "\f0cb";
313 @fa-var-list-ul: "\f0ca";
314 @fa-var-location-arrow: "\f124";
315 @fa-var-lock: "\f023";
316 @fa-var-long-arrow-down: "\f175";
317 @fa-var-long-arrow-left: "\f177";
318 @fa-var-long-arrow-right: "\f178";
319 @fa-var-long-arrow-up: "\f176";
320 @fa-var-magic: "\f0d0";
321 @fa-var-magnet: "\f076";
322 @fa-var-mail-forward: "\f064";
323 @fa-var-mail-reply: "\f112";
324 @fa-var-mail-reply-all: "\f122";
325 @fa-var-male: "\f183";
326 @fa-var-map-marker: "\f041";
327 @fa-var-maxcdn: "\f136";
328 @fa-var-meanpath: "\f20c";
329 @fa-var-medkit: "\f0fa";
330 @fa-var-meh-o: "\f11a";
331 @fa-var-microphone: "\f130";
332 @fa-var-microphone-slash: "\f131";
333 @fa-var-minus: "\f068";
334 @fa-var-minus-circle: "\f056";
335 @fa-var-minus-square: "\f146";
336 @fa-var-minus-square-o: "\f147";
337 @fa-var-mobile: "\f10b";
338 @fa-var-mobile-phone: "\f10b";
339 @fa-var-money: "\f0d6";
340 @fa-var-moon-o: "\f186";
341 @fa-var-mortar-board: "\f19d";
342 @fa-var-music: "\f001";
343 @fa-var-navicon: "\f0c9";
344 @fa-var-newspaper-o: "\f1ea";
345 @fa-var-openid: "\f19b";
346 @fa-var-outdent: "\f03b";
347 @fa-var-pagelines: "\f18c";
348 @fa-var-paint-brush: "\f1fc";
349 @fa-var-paper-plane: "\f1d8";
350 @fa-var-paper-plane-o: "\f1d9";
351 @fa-var-paperclip: "\f0c6";
352 @fa-var-paragraph: "\f1dd";
353 @fa-var-paste: "\f0ea";
354 @fa-var-pause: "\f04c";
355 @fa-var-paw: "\f1b0";
356 @fa-var-paypal: "\f1ed";
357 @fa-var-pencil: "\f040";
358 @fa-var-pencil-square: "\f14b";
359 @fa-var-pencil-square-o: "\f044";
360 @fa-var-phone: "\f095";
361 @fa-var-phone-square: "\f098";
362 @fa-var-photo: "\f03e";
363 @fa-var-picture-o: "\f03e";
364 @fa-var-pie-chart: "\f200";
365 @fa-var-pied-piper: "\f1a7";
366 @fa-var-pied-piper-alt: "\f1a8";
367 @fa-var-pinterest: "\f0d2";
368 @fa-var-pinterest-square: "\f0d3";
369 @fa-var-plane: "\f072";
370 @fa-var-play: "\f04b";
371 @fa-var-play-circle: "\f144";
372 @fa-var-play-circle-o: "\f01d";
373 @fa-var-plug: "\f1e6";
374 @fa-var-plus: "\f067";
375 @fa-var-plus-circle: "\f055";
376 @fa-var-plus-square: "\f0fe";
377 @fa-var-plus-square-o: "\f196";
378 @fa-var-power-off: "\f011";
379 @fa-var-print: "\f02f";
380 @fa-var-puzzle-piece: "\f12e";
381 @fa-var-qq: "\f1d6";
382 @fa-var-qrcode: "\f029";
383 @fa-var-question: "\f128";
384 @fa-var-question-circle: "\f059";
385 @fa-var-quote-left: "\f10d";
386 @fa-var-quote-right: "\f10e";
387 @fa-var-ra: "\f1d0";
388 @fa-var-random: "\f074";
389 @fa-var-rebel: "\f1d0";
390 @fa-var-recycle: "\f1b8";
391 @fa-var-reddit: "\f1a1";
392 @fa-var-reddit-square: "\f1a2";
393 @fa-var-refresh: "\f021";
394 @fa-var-remove: "\f00d";
395 @fa-var-renren: "\f18b";
396 @fa-var-reorder: "\f0c9";
397 @fa-var-repeat: "\f01e";
398 @fa-var-reply: "\f112";
399 @fa-var-reply-all: "\f122";
400 @fa-var-retweet: "\f079";
401 @fa-var-rmb: "\f157";
402 @fa-var-road: "\f018";
403 @fa-var-rocket: "\f135";
404 @fa-var-rotate-left: "\f0e2";
405 @fa-var-rotate-right: "\f01e";
406 @fa-var-rouble: "\f158";
407 @fa-var-rss: "\f09e";
408 @fa-var-rss-square: "\f143";
409 @fa-var-rub: "\f158";
410 @fa-var-ruble: "\f158";
411 @fa-var-rupee: "\f156";
412 @fa-var-save: "\f0c7";
413 @fa-var-scissors: "\f0c4";
414 @fa-var-search: "\f002";
415 @fa-var-search-minus: "\f010";
416 @fa-var-search-plus: "\f00e";
417 @fa-var-send: "\f1d8";
418 @fa-var-send-o: "\f1d9";
419 @fa-var-share: "\f064";
420 @fa-var-share-alt: "\f1e0";
421 @fa-var-share-alt-square: "\f1e1";
422 @fa-var-share-square: "\f14d";
423 @fa-var-share-square-o: "\f045";
424 @fa-var-shekel: "\f20b";
425 @fa-var-sheqel: "\f20b";
426 @fa-var-shield: "\f132";
427 @fa-var-shopping-cart: "\f07a";
428 @fa-var-sign-in: "\f090";
429 @fa-var-sign-out: "\f08b";
430 @fa-var-signal: "\f012";
431 @fa-var-sitemap: "\f0e8";
432 @fa-var-skype: "\f17e";
433 @fa-var-slack: "\f198";
434 @fa-var-sliders: "\f1de";
435 @fa-var-slideshare: "\f1e7";
436 @fa-var-smile-o: "\f118";
437 @fa-var-soccer-ball-o: "\f1e3";
438 @fa-var-sort: "\f0dc";
439 @fa-var-sort-alpha-asc: "\f15d";
440 @fa-var-sort-alpha-desc: "\f15e";
441 @fa-var-sort-amount-asc: "\f160";
442 @fa-var-sort-amount-desc: "\f161";
443 @fa-var-sort-asc: "\f0de";
444 @fa-var-sort-desc: "\f0dd";
445 @fa-var-sort-down: "\f0dd";
446 @fa-var-sort-numeric-asc: "\f162";
447 @fa-var-sort-numeric-desc: "\f163";
448 @fa-var-sort-up: "\f0de";
449 @fa-var-soundcloud: "\f1be";
450 @fa-var-space-shuttle: "\f197";
451 @fa-var-spinner: "\f110";
452 @fa-var-spoon: "\f1b1";
453 @fa-var-spotify: "\f1bc";
454 @fa-var-square: "\f0c8";
455 @fa-var-square-o: "\f096";
456 @fa-var-stack-exchange: "\f18d";
457 @fa-var-stack-overflow: "\f16c";
458 @fa-var-star: "\f005";
459 @fa-var-star-half: "\f089";
460 @fa-var-star-half-empty: "\f123";
461 @fa-var-star-half-full: "\f123";
462 @fa-var-star-half-o: "\f123";
463 @fa-var-star-o: "\f006";
464 @fa-var-steam: "\f1b6";
465 @fa-var-steam-square: "\f1b7";
466 @fa-var-step-backward: "\f048";
467 @fa-var-step-forward: "\f051";
468 @fa-var-stethoscope: "\f0f1";
469 @fa-var-stop: "\f04d";
470 @fa-var-strikethrough: "\f0cc";
471 @fa-var-stumbleupon: "\f1a4";
472 @fa-var-stumbleupon-circle: "\f1a3";
473 @fa-var-subscript: "\f12c";
474 @fa-var-suitcase: "\f0f2";
475 @fa-var-sun-o: "\f185";
476 @fa-var-superscript: "\f12b";
477 @fa-var-support: "\f1cd";
478 @fa-var-table: "\f0ce";
479 @fa-var-tablet: "\f10a";
480 @fa-var-tachometer: "\f0e4";
481 @fa-var-tag: "\f02b";
482 @fa-var-tags: "\f02c";
483 @fa-var-tasks: "\f0ae";
484 @fa-var-taxi: "\f1ba";
485 @fa-var-tencent-weibo: "\f1d5";
486 @fa-var-terminal: "\f120";
487 @fa-var-text-height: "\f034";
488 @fa-var-text-width: "\f035";
489 @fa-var-th: "\f00a";
490 @fa-var-th-large: "\f009";
491 @fa-var-th-list: "\f00b";
492 @fa-var-thumb-tack: "\f08d";
493 @fa-var-thumbs-down: "\f165";
494 @fa-var-thumbs-o-down: "\f088";
495 @fa-var-thumbs-o-up: "\f087";
496 @fa-var-thumbs-up: "\f164";
497 @fa-var-ticket: "\f145";
498 @fa-var-times: "\f00d";
499 @fa-var-times-circle: "\f057";
500 @fa-var-times-circle-o: "\f05c";
501 @fa-var-tint: "\f043";
502 @fa-var-toggle-down: "\f150";
503 @fa-var-toggle-left: "\f191";
504 @fa-var-toggle-off: "\f204";
505 @fa-var-toggle-on: "\f205";
506 @fa-var-toggle-right: "\f152";
507 @fa-var-toggle-up: "\f151";
508 @fa-var-trash: "\f1f8";
509 @fa-var-trash-o: "\f014";
510 @fa-var-tree: "\f1bb";
511 @fa-var-trello: "\f181";
512 @fa-var-trophy: "\f091";
513 @fa-var-truck: "\f0d1";
514 @fa-var-try: "\f195";
515 @fa-var-tty: "\f1e4";
516 @fa-var-tumblr: "\f173";
517 @fa-var-tumblr-square: "\f174";
518 @fa-var-turkish-lira: "\f195";
519 @fa-var-twitch: "\f1e8";
520 @fa-var-twitter: "\f099";
521 @fa-var-twitter-square: "\f081";
522 @fa-var-umbrella: "\f0e9";
523 @fa-var-underline: "\f0cd";
524 @fa-var-undo: "\f0e2";
525 @fa-var-university: "\f19c";
526 @fa-var-unlink: "\f127";
527 @fa-var-unlock: "\f09c";
528 @fa-var-unlock-alt: "\f13e";
529 @fa-var-unsorted: "\f0dc";
530 @fa-var-upload: "\f093";
531 @fa-var-usd: "\f155";
532 @fa-var-user: "\f007";
533 @fa-var-user-md: "\f0f0";
534 @fa-var-users: "\f0c0";
535 @fa-var-video-camera: "\f03d";
536 @fa-var-vimeo-square: "\f194";
537 @fa-var-vine: "\f1ca";
538 @fa-var-vk: "\f189";
539 @fa-var-volume-down: "\f027";
540 @fa-var-volume-off: "\f026";
541 @fa-var-volume-up: "\f028";
542 @fa-var-warning: "\f071";
543 @fa-var-wechat: "\f1d7";
544 @fa-var-weibo: "\f18a";
545 @fa-var-weixin: "\f1d7";
546 @fa-var-wheelchair: "\f193";
547 @fa-var-wifi: "\f1eb";
548 @fa-var-windows: "\f17a";
549 @fa-var-won: "\f159";
550 @fa-var-wordpress: "\f19a";
551 @fa-var-wrench: "\f0ad";
552 @fa-var-xing: "\f168";
553 @fa-var-xing-square: "\f169";
554 @fa-var-yahoo: "\f19e";
555 @fa-var-yelp: "\f1e9";
556 @fa-var-yen: "\f157";
557 @fa-var-youtube: "\f167";
558 @fa-var-youtube-play: "\f16a";
559 @fa-var-youtube-square: "\f166";
560
0 // Bordered & Pulled
1 // -------------------------
2
3 .#{$fa-css-prefix}-border {
4 padding: .2em .25em .15em;
5 border: solid .08em $fa-border-color;
6 border-radius: .1em;
7 }
8
9 .pull-right { float: right; }
10 .pull-left { float: left; }
11
12 .#{$fa-css-prefix} {
13 &.pull-left { margin-right: .3em; }
14 &.pull-right { margin-left: .3em; }
15 }
0 // Base Class Definition
1 // -------------------------
2
3 .#{$fa-css-prefix} {
4 display: inline-block;
5 font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
6 font-size: inherit; // can't have font-size inherit on line above, so need to override
7 text-rendering: auto; // optimizelegibility throws things off #1094
8 -webkit-font-smoothing: antialiased;
9 -moz-osx-font-smoothing: grayscale;
10 }
0 // Fixed Width Icons
1 // -------------------------
2 .#{$fa-css-prefix}-fw {
3 width: (18em / 14);
4 text-align: center;
5 }
0 /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen
1 readers do not read off random characters that represent icons */
2
3 .#{$fa-css-prefix}-glass:before { content: $fa-var-glass; }
4 .#{$fa-css-prefix}-music:before { content: $fa-var-music; }
5 .#{$fa-css-prefix}-search:before { content: $fa-var-search; }
6 .#{$fa-css-prefix}-envelope-o:before { content: $fa-var-envelope-o; }
7 .#{$fa-css-prefix}-heart:before { content: $fa-var-heart; }
8 .#{$fa-css-prefix}-star:before { content: $fa-var-star; }
9 .#{$fa-css-prefix}-star-o:before { content: $fa-var-star-o; }
10 .#{$fa-css-prefix}-user:before { content: $fa-var-user; }
11 .#{$fa-css-prefix}-film:before { content: $fa-var-film; }
12 .#{$fa-css-prefix}-th-large:before { content: $fa-var-th-large; }
13 .#{$fa-css-prefix}-th:before { content: $fa-var-th; }
14 .#{$fa-css-prefix}-th-list:before { content: $fa-var-th-list; }
15 .#{$fa-css-prefix}-check:before { content: $fa-var-check; }
16 .#{$fa-css-prefix}-remove:before,
17 .#{$fa-css-prefix}-close:before,
18 .#{$fa-css-prefix}-times:before { content: $fa-var-times; }
19 .#{$fa-css-prefix}-search-plus:before { content: $fa-var-search-plus; }
20 .#{$fa-css-prefix}-search-minus:before { content: $fa-var-search-minus; }
21 .#{$fa-css-prefix}-power-off:before { content: $fa-var-power-off; }
22 .#{$fa-css-prefix}-signal:before { content: $fa-var-signal; }
23 .#{$fa-css-prefix}-gear:before,
24 .#{$fa-css-prefix}-cog:before { content: $fa-var-cog; }
25 .#{$fa-css-prefix}-trash-o:before { content: $fa-var-trash-o; }
26 .#{$fa-css-prefix}-home:before { content: $fa-var-home; }
27 .#{$fa-css-prefix}-file-o:before { content: $fa-var-file-o; }
28 .#{$fa-css-prefix}-clock-o:before { content: $fa-var-clock-o; }
29 .#{$fa-css-prefix}-road:before { content: $fa-var-road; }
30 .#{$fa-css-prefix}-download:before { content: $fa-var-download; }
31 .#{$fa-css-prefix}-arrow-circle-o-down:before { content: $fa-var-arrow-circle-o-down; }
32 .#{$fa-css-prefix}-arrow-circle-o-up:before { content: $fa-var-arrow-circle-o-up; }
33 .#{$fa-css-prefix}-inbox:before { content: $fa-var-inbox; }
34 .#{$fa-css-prefix}-play-circle-o:before { content: $fa-var-play-circle-o; }
35 .#{$fa-css-prefix}-rotate-right:before,
36 .#{$fa-css-prefix}-repeat:before { content: $fa-var-repeat; }
37 .#{$fa-css-prefix}-refresh:before { content: $fa-var-refresh; }
38 .#{$fa-css-prefix}-list-alt:before { content: $fa-var-list-alt; }
39 .#{$fa-css-prefix}-lock:before { content: $fa-var-lock; }
40 .#{$fa-css-prefix}-flag:before { content: $fa-var-flag; }
41 .#{$fa-css-prefix}-headphones:before { content: $fa-var-headphones; }
42 .#{$fa-css-prefix}-volume-off:before { content: $fa-var-volume-off; }
43 .#{$fa-css-prefix}-volume-down:before { content: $fa-var-volume-down; }
44 .#{$fa-css-prefix}-volume-up:before { content: $fa-var-volume-up; }
45 .#{$fa-css-prefix}-qrcode:before { content: $fa-var-qrcode; }
46 .#{$fa-css-prefix}-barcode:before { content: $fa-var-barcode; }
47 .#{$fa-css-prefix}-tag:before { content: $fa-var-tag; }
48 .#{$fa-css-prefix}-tags:before { content: $fa-var-tags; }
49 .#{$fa-css-prefix}-book:before { content: $fa-var-book; }
50 .#{$fa-css-prefix}-bookmark:before { content: $fa-var-bookmark; }
51 .#{$fa-css-prefix}-print:before { content: $fa-var-print; }
52 .#{$fa-css-prefix}-camera:before { content: $fa-var-camera; }
53 .#{$fa-css-prefix}-font:before { content: $fa-var-font; }
54 .#{$fa-css-prefix}-bold:before { content: $fa-var-bold; }
55 .#{$fa-css-prefix}-italic:before { content: $fa-var-italic; }
56 .#{$fa-css-prefix}-text-height:before { content: $fa-var-text-height; }
57 .#{$fa-css-prefix}-text-width:before { content: $fa-var-text-width; }
58 .#{$fa-css-prefix}-align-left:before { content: $fa-var-align-left; }
59 .#{$fa-css-prefix}-align-center:before { content: $fa-var-align-center; }
60 .#{$fa-css-prefix}-align-right:before { content: $fa-var-align-right; }
61 .#{$fa-css-prefix}-align-justify:before { content: $fa-var-align-justify; }
62 .#{$fa-css-prefix}-list:before { content: $fa-var-list; }
63 .#{$fa-css-prefix}-dedent:before,
64 .#{$fa-css-prefix}-outdent:before { content: $fa-var-outdent; }
65 .#{$fa-css-prefix}-indent:before { content: $fa-var-indent; }
66 .#{$fa-css-prefix}-video-camera:before { content: $fa-var-video-camera; }
67 .#{$fa-css-prefix}-photo:before,
68 .#{$fa-css-prefix}-image:before,
69 .#{$fa-css-prefix}-picture-o:before { content: $fa-var-picture-o; }
70 .#{$fa-css-prefix}-pencil:before { content: $fa-var-pencil; }
71 .#{$fa-css-prefix}-map-marker:before { content: $fa-var-map-marker; }
72 .#{$fa-css-prefix}-adjust:before { content: $fa-var-adjust; }
73 .#{$fa-css-prefix}-tint:before { content: $fa-var-tint; }
74 .#{$fa-css-prefix}-edit:before,
75 .#{$fa-css-prefix}-pencil-square-o:before { content: $fa-var-pencil-square-o; }
76 .#{$fa-css-prefix}-share-square-o:before { content: $fa-var-share-square-o; }
77 .#{$fa-css-prefix}-check-square-o:before { content: $fa-var-check-square-o; }
78 .#{$fa-css-prefix}-arrows:before { content: $fa-var-arrows; }
79 .#{$fa-css-prefix}-step-backward:before { content: $fa-var-step-backward; }
80 .#{$fa-css-prefix}-fast-backward:before { content: $fa-var-fast-backward; }
81 .#{$fa-css-prefix}-backward:before { content: $fa-var-backward; }
82 .#{$fa-css-prefix}-play:before { content: $fa-var-play; }
83 .#{$fa-css-prefix}-pause:before { content: $fa-var-pause; }
84 .#{$fa-css-prefix}-stop:before { content: $fa-var-stop; }
85 .#{$fa-css-prefix}-forward:before { content: $fa-var-forward; }
86 .#{$fa-css-prefix}-fast-forward:before { content: $fa-var-fast-forward; }
87 .#{$fa-css-prefix}-step-forward:before { content: $fa-var-step-forward; }
88 .#{$fa-css-prefix}-eject:before { content: $fa-var-eject; }
89 .#{$fa-css-prefix}-chevron-left:before { content: $fa-var-chevron-left; }
90 .#{$fa-css-prefix}-chevron-right:before { content: $fa-var-chevron-right; }
91 .#{$fa-css-prefix}-plus-circle:before { content: $fa-var-plus-circle; }
92 .#{$fa-css-prefix}-minus-circle:before { content: $fa-var-minus-circle; }
93 .#{$fa-css-prefix}-times-circle:before { content: $fa-var-times-circle; }
94 .#{$fa-css-prefix}-check-circle:before { content: $fa-var-check-circle; }
95 .#{$fa-css-prefix}-question-circle:before { content: $fa-var-question-circle; }
96 .#{$fa-css-prefix}-info-circle:before { content: $fa-var-info-circle; }
97 .#{$fa-css-prefix}-crosshairs:before { content: $fa-var-crosshairs; }
98 .#{$fa-css-prefix}-times-circle-o:before { content: $fa-var-times-circle-o; }
99 .#{$fa-css-prefix}-check-circle-o:before { content: $fa-var-check-circle-o; }
100 .#{$fa-css-prefix}-ban:before { content: $fa-var-ban; }
101 .#{$fa-css-prefix}-arrow-left:before { content: $fa-var-arrow-left; }
102 .#{$fa-css-prefix}-arrow-right:before { content: $fa-var-arrow-right; }
103 .#{$fa-css-prefix}-arrow-up:before { content: $fa-var-arrow-up; }
104 .#{$fa-css-prefix}-arrow-down:before { content: $fa-var-arrow-down; }
105 .#{$fa-css-prefix}-mail-forward:before,
106 .#{$fa-css-prefix}-share:before { content: $fa-var-share; }
107 .#{$fa-css-prefix}-expand:before { content: $fa-var-expand; }
108 .#{$fa-css-prefix}-compress:before { content: $fa-var-compress; }
109 .#{$fa-css-prefix}-plus:before { content: $fa-var-plus; }
110 .#{$fa-css-prefix}-minus:before { content: $fa-var-minus; }
111 .#{$fa-css-prefix}-asterisk:before { content: $fa-var-asterisk; }
112 .#{$fa-css-prefix}-exclamation-circle:before { content: $fa-var-exclamation-circle; }
113 .#{$fa-css-prefix}-gift:before { content: $fa-var-gift; }
114 .#{$fa-css-prefix}-leaf:before { content: $fa-var-leaf; }
115 .#{$fa-css-prefix}-fire:before { content: $fa-var-fire; }
116 .#{$fa-css-prefix}-eye:before { content: $fa-var-eye; }
117 .#{$fa-css-prefix}-eye-slash:before { content: $fa-var-eye-slash; }
118 .#{$fa-css-prefix}-warning:before,
119 .#{$fa-css-prefix}-exclamation-triangle:before { content: $fa-var-exclamation-triangle; }
120 .#{$fa-css-prefix}-plane:before { content: $fa-var-plane; }
121 .#{$fa-css-prefix}-calendar:before { content: $fa-var-calendar; }
122 .#{$fa-css-prefix}-random:before { content: $fa-var-random; }
123 .#{$fa-css-prefix}-comment:before { content: $fa-var-comment; }
124 .#{$fa-css-prefix}-magnet:before { content: $fa-var-magnet; }
125 .#{$fa-css-prefix}-chevron-up:before { content: $fa-var-chevron-up; }
126 .#{$fa-css-prefix}-chevron-down:before { content: $fa-var-chevron-down; }
127 .#{$fa-css-prefix}-retweet:before { content: $fa-var-retweet; }
128 .#{$fa-css-prefix}-shopping-cart:before { content: $fa-var-shopping-cart; }
129 .#{$fa-css-prefix}-folder:before { content: $fa-var-folder; }
130 .#{$fa-css-prefix}-folder-open:before { content: $fa-var-folder-open; }
131 .#{$fa-css-prefix}-arrows-v:before { content: $fa-var-arrows-v; }
132 .#{$fa-css-prefix}-arrows-h:before { content: $fa-var-arrows-h; }
133 .#{$fa-css-prefix}-bar-chart-o:before,
134 .#{$fa-css-prefix}-bar-chart:before { content: $fa-var-bar-chart; }
135 .#{$fa-css-prefix}-twitter-square:before { content: $fa-var-twitter-square; }
136 .#{$fa-css-prefix}-facebook-square:before { content: $fa-var-facebook-square; }
137 .#{$fa-css-prefix}-camera-retro:before { content: $fa-var-camera-retro; }
138 .#{$fa-css-prefix}-key:before { content: $fa-var-key; }
139 .#{$fa-css-prefix}-gears:before,
140 .#{$fa-css-prefix}-cogs:before { content: $fa-var-cogs; }
141 .#{$fa-css-prefix}-comments:before { content: $fa-var-comments; }
142 .#{$fa-css-prefix}-thumbs-o-up:before { content: $fa-var-thumbs-o-up; }
143 .#{$fa-css-prefix}-thumbs-o-down:before { content: $fa-var-thumbs-o-down; }
144 .#{$fa-css-prefix}-star-half:before { content: $fa-var-star-half; }
145 .#{$fa-css-prefix}-heart-o:before { content: $fa-var-heart-o; }
146 .#{$fa-css-prefix}-sign-out:before { content: $fa-var-sign-out; }
147 .#{$fa-css-prefix}-linkedin-square:before { content: $fa-var-linkedin-square; }
148 .#{$fa-css-prefix}-thumb-tack:before { content: $fa-var-thumb-tack; }
149 .#{$fa-css-prefix}-external-link:before { content: $fa-var-external-link; }
150 .#{$fa-css-prefix}-sign-in:before { content: $fa-var-sign-in; }
151 .#{$fa-css-prefix}-trophy:before { content: $fa-var-trophy; }
152 .#{$fa-css-prefix}-github-square:before { content: $fa-var-github-square; }
153 .#{$fa-css-prefix}-upload:before { content: $fa-var-upload; }
154 .#{$fa-css-prefix}-lemon-o:before { content: $fa-var-lemon-o; }
155 .#{$fa-css-prefix}-phone:before { content: $fa-var-phone; }
156 .#{$fa-css-prefix}-square-o:before { content: $fa-var-square-o; }
157 .#{$fa-css-prefix}-bookmark-o:before { content: $fa-var-bookmark-o; }
158 .#{$fa-css-prefix}-phone-square:before { content: $fa-var-phone-square; }
159 .#{$fa-css-prefix}-twitter:before { content: $fa-var-twitter; }
160 .#{$fa-css-prefix}-facebook:before { content: $fa-var-facebook; }
161 .#{$fa-css-prefix}-github:before { content: $fa-var-github; }
162 .#{$fa-css-prefix}-unlock:before { content: $fa-var-unlock; }
163 .#{$fa-css-prefix}-credit-card:before { content: $fa-var-credit-card; }
164 .#{$fa-css-prefix}-rss:before { content: $fa-var-rss; }
165 .#{$fa-css-prefix}-hdd-o:before { content: $fa-var-hdd-o; }
166 .#{$fa-css-prefix}-bullhorn:before { content: $fa-var-bullhorn; }
167 .#{$fa-css-prefix}-bell:before { content: $fa-var-bell; }
168 .#{$fa-css-prefix}-certificate:before { content: $fa-var-certificate; }
169 .#{$fa-css-prefix}-hand-o-right:before { content: $fa-var-hand-o-right; }
170 .#{$fa-css-prefix}-hand-o-left:before { content: $fa-var-hand-o-left; }
171 .#{$fa-css-prefix}-hand-o-up:before { content: $fa-var-hand-o-up; }
172 .#{$fa-css-prefix}-hand-o-down:before { content: $fa-var-hand-o-down; }
173 .#{$fa-css-prefix}-arrow-circle-left:before { content: $fa-var-arrow-circle-left; }
174 .#{$fa-css-prefix}-arrow-circle-right:before { content: $fa-var-arrow-circle-right; }
175 .#{$fa-css-prefix}-arrow-circle-up:before { content: $fa-var-arrow-circle-up; }
176 .#{$fa-css-prefix}-arrow-circle-down:before { content: $fa-var-arrow-circle-down; }
177 .#{$fa-css-prefix}-globe:before { content: $fa-var-globe; }
178 .#{$fa-css-prefix}-wrench:before { content: $fa-var-wrench; }
179 .#{$fa-css-prefix}-tasks:before { content: $fa-var-tasks; }
180 .#{$fa-css-prefix}-filter:before { content: $fa-var-filter; }
181 .#{$fa-css-prefix}-briefcase:before { content: $fa-var-briefcase; }
182 .#{$fa-css-prefix}-arrows-alt:before { content: $fa-var-arrows-alt; }
183 .#{$fa-css-prefix}-group:before,
184 .#{$fa-css-prefix}-users:before { content: $fa-var-users; }
185 .#{$fa-css-prefix}-chain:before,
186 .#{$fa-css-prefix}-link:before { content: $fa-var-link; }
187 .#{$fa-css-prefix}-cloud:before { content: $fa-var-cloud; }
188 .#{$fa-css-prefix}-flask:before { content: $fa-var-flask; }
189 .#{$fa-css-prefix}-cut:before,
190 .#{$fa-css-prefix}-scissors:before { content: $fa-var-scissors; }
191 .#{$fa-css-prefix}-copy:before,
192 .#{$fa-css-prefix}-files-o:before { content: $fa-var-files-o; }
193 .#{$fa-css-prefix}-paperclip:before { content: $fa-var-paperclip; }
194 .#{$fa-css-prefix}-save:before,
195 .#{$fa-css-prefix}-floppy-o:before { content: $fa-var-floppy-o; }
196 .#{$fa-css-prefix}-square:before { content: $fa-var-square; }
197 .#{$fa-css-prefix}-navicon:before,
198 .#{$fa-css-prefix}-reorder:before,
199 .#{$fa-css-prefix}-bars:before { content: $fa-var-bars; }
200 .#{$fa-css-prefix}-list-ul:before { content: $fa-var-list-ul; }
201 .#{$fa-css-prefix}-list-ol:before { content: $fa-var-list-ol; }
202 .#{$fa-css-prefix}-strikethrough:before { content: $fa-var-strikethrough; }
203 .#{$fa-css-prefix}-underline:before { content: $fa-var-underline; }
204 .#{$fa-css-prefix}-table:before { content: $fa-var-table; }
205 .#{$fa-css-prefix}-magic:before { content: $fa-var-magic; }
206 .#{$fa-css-prefix}-truck:before { content: $fa-var-truck; }
207 .#{$fa-css-prefix}-pinterest:before { content: $fa-var-pinterest; }
208 .#{$fa-css-prefix}-pinterest-square:before { content: $fa-var-pinterest-square; }
209 .#{$fa-css-prefix}-google-plus-square:before { content: $fa-var-google-plus-square; }
210 .#{$fa-css-prefix}-google-plus:before { content: $fa-var-google-plus; }
211 .#{$fa-css-prefix}-money:before { content: $fa-var-money; }
212 .#{$fa-css-prefix}-caret-down:before { content: $fa-var-caret-down; }
213 .#{$fa-css-prefix}-caret-up:before { content: $fa-var-caret-up; }
214 .#{$fa-css-prefix}-caret-left:before { content: $fa-var-caret-left; }
215 .#{$fa-css-prefix}-caret-right:before { content: $fa-var-caret-right; }
216 .#{$fa-css-prefix}-columns:before { content: $fa-var-columns; }
217 .#{$fa-css-prefix}-unsorted:before,
218 .#{$fa-css-prefix}-sort:before { content: $fa-var-sort; }
219 .#{$fa-css-prefix}-sort-down:before,
220 .#{$fa-css-prefix}-sort-desc:before { content: $fa-var-sort-desc; }
221 .#{$fa-css-prefix}-sort-up:before,
222 .#{$fa-css-prefix}-sort-asc:before { content: $fa-var-sort-asc; }
223 .#{$fa-css-prefix}-envelope:before { content: $fa-var-envelope; }
224 .#{$fa-css-prefix}-linkedin:before { content: $fa-var-linkedin; }
225 .#{$fa-css-prefix}-rotate-left:before,
226 .#{$fa-css-prefix}-undo:before { content: $fa-var-undo; }
227 .#{$fa-css-prefix}-legal:before,
228 .#{$fa-css-prefix}-gavel:before { content: $fa-var-gavel; }
229 .#{$fa-css-prefix}-dashboard:before,
230 .#{$fa-css-prefix}-tachometer:before { content: $fa-var-tachometer; }
231 .#{$fa-css-prefix}-comment-o:before { content: $fa-var-comment-o; }
232 .#{$fa-css-prefix}-comments-o:before { content: $fa-var-comments-o; }
233 .#{$fa-css-prefix}-flash:before,
234 .#{$fa-css-prefix}-bolt:before { content: $fa-var-bolt; }
235 .#{$fa-css-prefix}-sitemap:before { content: $fa-var-sitemap; }
236 .#{$fa-css-prefix}-umbrella:before { content: $fa-var-umbrella; }
237 .#{$fa-css-prefix}-paste:before,
238 .#{$fa-css-prefix}-clipboard:before { content: $fa-var-clipboard; }
239 .#{$fa-css-prefix}-lightbulb-o:before { content: $fa-var-lightbulb-o; }
240 .#{$fa-css-prefix}-exchange:before { content: $fa-var-exchange; }
241 .#{$fa-css-prefix}-cloud-download:before { content: $fa-var-cloud-download; }
242 .#{$fa-css-prefix}-cloud-upload:before { content: $fa-var-cloud-upload; }
243 .#{$fa-css-prefix}-user-md:before { content: $fa-var-user-md; }
244 .#{$fa-css-prefix}-stethoscope:before { content: $fa-var-stethoscope; }
245 .#{$fa-css-prefix}-suitcase:before { content: $fa-var-suitcase; }
246 .#{$fa-css-prefix}-bell-o:before { content: $fa-var-bell-o; }
247 .#{$fa-css-prefix}-coffee:before { content: $fa-var-coffee; }
248 .#{$fa-css-prefix}-cutlery:before { content: $fa-var-cutlery; }
249 .#{$fa-css-prefix}-file-text-o:before { content: $fa-var-file-text-o; }
250 .#{$fa-css-prefix}-building-o:before { content: $fa-var-building-o; }
251 .#{$fa-css-prefix}-hospital-o:before { content: $fa-var-hospital-o; }
252 .#{$fa-css-prefix}-ambulance:before { content: $fa-var-ambulance; }
253 .#{$fa-css-prefix}-medkit:before { content: $fa-var-medkit; }
254 .#{$fa-css-prefix}-fighter-jet:before { content: $fa-var-fighter-jet; }
255 .#{$fa-css-prefix}-beer:before { content: $fa-var-beer; }
256 .#{$fa-css-prefix}-h-square:before { content: $fa-var-h-square; }
257 .#{$fa-css-prefix}-plus-square:before { content: $fa-var-plus-square; }
258 .#{$fa-css-prefix}-angle-double-left:before { content: $fa-var-angle-double-left; }
259 .#{$fa-css-prefix}-angle-double-right:before { content: $fa-var-angle-double-right; }
260 .#{$fa-css-prefix}-angle-double-up:before { content: $fa-var-angle-double-up; }
261 .#{$fa-css-prefix}-angle-double-down:before { content: $fa-var-angle-double-down; }
262 .#{$fa-css-prefix}-angle-left:before { content: $fa-var-angle-left; }
263 .#{$fa-css-prefix}-angle-right:before { content: $fa-var-angle-right; }
264 .#{$fa-css-prefix}-angle-up:before { content: $fa-var-angle-up; }
265 .#{$fa-css-prefix}-angle-down:before { content: $fa-var-angle-down; }
266 .#{$fa-css-prefix}-desktop:before { content: $fa-var-desktop; }
267 .#{$fa-css-prefix}-laptop:before { content: $fa-var-laptop; }
268 .#{$fa-css-prefix}-tablet:before { content: $fa-var-tablet; }
269 .#{$fa-css-prefix}-mobile-phone:before,
270 .#{$fa-css-prefix}-mobile:before { content: $fa-var-mobile; }
271 .#{$fa-css-prefix}-circle-o:before { content: $fa-var-circle-o; }
272 .#{$fa-css-prefix}-quote-left:before { content: $fa-var-quote-left; }
273 .#{$fa-css-prefix}-quote-right:before { content: $fa-var-quote-right; }
274 .#{$fa-css-prefix}-spinner:before { content: $fa-var-spinner; }
275 .#{$fa-css-prefix}-circle:before { content: $fa-var-circle; }
276 .#{$fa-css-prefix}-mail-reply:before,
277 .#{$fa-css-prefix}-reply:before { content: $fa-var-reply; }
278 .#{$fa-css-prefix}-github-alt:before { content: $fa-var-github-alt; }
279 .#{$fa-css-prefix}-folder-o:before { content: $fa-var-folder-o; }
280 .#{$fa-css-prefix}-folder-open-o:before { content: $fa-var-folder-open-o; }
281 .#{$fa-css-prefix}-smile-o:before { content: $fa-var-smile-o; }
282 .#{$fa-css-prefix}-frown-o:before { content: $fa-var-frown-o; }
283 .#{$fa-css-prefix}-meh-o:before { content: $fa-var-meh-o; }
284 .#{$fa-css-prefix}-gamepad:before { content: $fa-var-gamepad; }
285 .#{$fa-css-prefix}-keyboard-o:before { content: $fa-var-keyboard-o; }
286 .#{$fa-css-prefix}-flag-o:before { content: $fa-var-flag-o; }
287 .#{$fa-css-prefix}-flag-checkered:before { content: $fa-var-flag-checkered; }
288 .#{$fa-css-prefix}-terminal:before { content: $fa-var-terminal; }
289 .#{$fa-css-prefix}-code:before { content: $fa-var-code; }
290 .#{$fa-css-prefix}-mail-reply-all:before,
291 .#{$fa-css-prefix}-reply-all:before { content: $fa-var-reply-all; }
292 .#{$fa-css-prefix}-star-half-empty:before,
293 .#{$fa-css-prefix}-star-half-full:before,
294 .#{$fa-css-prefix}-star-half-o:before { content: $fa-var-star-half-o; }
295 .#{$fa-css-prefix}-location-arrow:before { content: $fa-var-location-arrow; }
296 .#{$fa-css-prefix}-crop:before { content: $fa-var-crop; }
297 .#{$fa-css-prefix}-code-fork:before { content: $fa-var-code-fork; }
298 .#{$fa-css-prefix}-unlink:before,
299 .#{$fa-css-prefix}-chain-broken:before { content: $fa-var-chain-broken; }
300 .#{$fa-css-prefix}-question:before { content: $fa-var-question; }
301 .#{$fa-css-prefix}-info:before { content: $fa-var-info; }
302 .#{$fa-css-prefix}-exclamation:before { content: $fa-var-exclamation; }
303 .#{$fa-css-prefix}-superscript:before { content: $fa-var-superscript; }
304 .#{$fa-css-prefix}-subscript:before { content: $fa-var-subscript; }
305 .#{$fa-css-prefix}-eraser:before { content: $fa-var-eraser; }
306 .#{$fa-css-prefix}-puzzle-piece:before { content: $fa-var-puzzle-piece; }
307 .#{$fa-css-prefix}-microphone:before { content: $fa-var-microphone; }
308 .#{$fa-css-prefix}-microphone-slash:before { content: $fa-var-microphone-slash; }
309 .#{$fa-css-prefix}-shield:before { content: $fa-var-shield; }
310 .#{$fa-css-prefix}-calendar-o:before { content: $fa-var-calendar-o; }
311 .#{$fa-css-prefix}-fire-extinguisher:before { content: $fa-var-fire-extinguisher; }
312 .#{$fa-css-prefix}-rocket:before { content: $fa-var-rocket; }
313 .#{$fa-css-prefix}-maxcdn:before { content: $fa-var-maxcdn; }
314 .#{$fa-css-prefix}-chevron-circle-left:before { content: $fa-var-chevron-circle-left; }
315 .#{$fa-css-prefix}-chevron-circle-right:before { content: $fa-var-chevron-circle-right; }
316 .#{$fa-css-prefix}-chevron-circle-up:before { content: $fa-var-chevron-circle-up; }
317 .#{$fa-css-prefix}-chevron-circle-down:before { content: $fa-var-chevron-circle-down; }
318 .#{$fa-css-prefix}-html5:before { content: $fa-var-html5; }
319 .#{$fa-css-prefix}-css3:before { content: $fa-var-css3; }
320 .#{$fa-css-prefix}-anchor:before { content: $fa-var-anchor; }
321 .#{$fa-css-prefix}-unlock-alt:before { content: $fa-var-unlock-alt; }
322 .#{$fa-css-prefix}-bullseye:before { content: $fa-var-bullseye; }
323 .#{$fa-css-prefix}-ellipsis-h:before { content: $fa-var-ellipsis-h; }
324 .#{$fa-css-prefix}-ellipsis-v:before { content: $fa-var-ellipsis-v; }
325 .#{$fa-css-prefix}-rss-square:before { content: $fa-var-rss-square; }
326 .#{$fa-css-prefix}-play-circle:before { content: $fa-var-play-circle; }
327 .#{$fa-css-prefix}-ticket:before { content: $fa-var-ticket; }
328 .#{$fa-css-prefix}-minus-square:before { content: $fa-var-minus-square; }
329 .#{$fa-css-prefix}-minus-square-o:before { content: $fa-var-minus-square-o; }
330 .#{$fa-css-prefix}-level-up:before { content: $fa-var-level-up; }
331 .#{$fa-css-prefix}-level-down:before { content: $fa-var-level-down; }
332 .#{$fa-css-prefix}-check-square:before { content: $fa-var-check-square; }
333 .#{$fa-css-prefix}-pencil-square:before { content: $fa-var-pencil-square; }
334 .#{$fa-css-prefix}-external-link-square:before { content: $fa-var-external-link-square; }
335 .#{$fa-css-prefix}-share-square:before { content: $fa-var-share-square; }
336 .#{$fa-css-prefix}-compass:before { content: $fa-var-compass; }
337 .#{$fa-css-prefix}-toggle-down:before,
338 .#{$fa-css-prefix}-caret-square-o-down:before { content: $fa-var-caret-square-o-down; }
339 .#{$fa-css-prefix}-toggle-up:before,
340 .#{$fa-css-prefix}-caret-square-o-up:before { content: $fa-var-caret-square-o-up; }
341 .#{$fa-css-prefix}-toggle-right:before,
342 .#{$fa-css-prefix}-caret-square-o-right:before { content: $fa-var-caret-square-o-right; }
343 .#{$fa-css-prefix}-euro:before,
344 .#{$fa-css-prefix}-eur:before { content: $fa-var-eur; }
345 .#{$fa-css-prefix}-gbp:before { content: $fa-var-gbp; }
346 .#{$fa-css-prefix}-dollar:before,
347 .#{$fa-css-prefix}-usd:before { content: $fa-var-usd; }
348 .#{$fa-css-prefix}-rupee:before,
349 .#{$fa-css-prefix}-inr:before { content: $fa-var-inr; }
350 .#{$fa-css-prefix}-cny:before,
351 .#{$fa-css-prefix}-rmb:before,
352 .#{$fa-css-prefix}-yen:before,
353 .#{$fa-css-prefix}-jpy:before { content: $fa-var-jpy; }
354 .#{$fa-css-prefix}-ruble:before,
355 .#{$fa-css-prefix}-rouble:before,
356 .#{$fa-css-prefix}-rub:before { content: $fa-var-rub; }
357 .#{$fa-css-prefix}-won:before,
358 .#{$fa-css-prefix}-krw:before { content: $fa-var-krw; }
359 .#{$fa-css-prefix}-bitcoin:before,
360 .#{$fa-css-prefix}-btc:before { content: $fa-var-btc; }
361 .#{$fa-css-prefix}-file:before { content: $fa-var-file; }
362 .#{$fa-css-prefix}-file-text:before { content: $fa-var-file-text; }
363 .#{$fa-css-prefix}-sort-alpha-asc:before { content: $fa-var-sort-alpha-asc; }
364 .#{$fa-css-prefix}-sort-alpha-desc:before { content: $fa-var-sort-alpha-desc; }
365 .#{$fa-css-prefix}-sort-amount-asc:before { content: $fa-var-sort-amount-asc; }
366 .#{$fa-css-prefix}-sort-amount-desc:before { content: $fa-var-sort-amount-desc; }
367 .#{$fa-css-prefix}-sort-numeric-asc:before { content: $fa-var-sort-numeric-asc; }
368 .#{$fa-css-prefix}-sort-numeric-desc:before { content: $fa-var-sort-numeric-desc; }
369 .#{$fa-css-prefix}-thumbs-up:before { content: $fa-var-thumbs-up; }
370 .#{$fa-css-prefix}-thumbs-down:before { content: $fa-var-thumbs-down; }
371 .#{$fa-css-prefix}-youtube-square:before { content: $fa-var-youtube-square; }
372 .#{$fa-css-prefix}-youtube:before { content: $fa-var-youtube; }
373 .#{$fa-css-prefix}-xing:before { content: $fa-var-xing; }
374 .#{$fa-css-prefix}-xing-square:before { content: $fa-var-xing-square; }
375 .#{$fa-css-prefix}-youtube-play:before { content: $fa-var-youtube-play; }
376 .#{$fa-css-prefix}-dropbox:before { content: $fa-var-dropbox; }
377 .#{$fa-css-prefix}-stack-overflow:before { content: $fa-var-stack-overflow; }
378 .#{$fa-css-prefix}-instagram:before { content: $fa-var-instagram; }
379 .#{$fa-css-prefix}-flickr:before { content: $fa-var-flickr; }
380 .#{$fa-css-prefix}-adn:before { content: $fa-var-adn; }
381 .#{$fa-css-prefix}-bitbucket:before { content: $fa-var-bitbucket; }
382 .#{$fa-css-prefix}-bitbucket-square:before { content: $fa-var-bitbucket-square; }
383 .#{$fa-css-prefix}-tumblr:before { content: $fa-var-tumblr; }
384 .#{$fa-css-prefix}-tumblr-square:before { content: $fa-var-tumblr-square; }
385 .#{$fa-css-prefix}-long-arrow-down:before { content: $fa-var-long-arrow-down; }
386 .#{$fa-css-prefix}-long-arrow-up:before { content: $fa-var-long-arrow-up; }
387 .#{$fa-css-prefix}-long-arrow-left:before { content: $fa-var-long-arrow-left; }
388 .#{$fa-css-prefix}-long-arrow-right:before { content: $fa-var-long-arrow-right; }
389 .#{$fa-css-prefix}-apple:before { content: $fa-var-apple; }
390 .#{$fa-css-prefix}-windows:before { content: $fa-var-windows; }
391 .#{$fa-css-prefix}-android:before { content: $fa-var-android; }
392 .#{$fa-css-prefix}-linux:before { content: $fa-var-linux; }
393 .#{$fa-css-prefix}-dribbble:before { content: $fa-var-dribbble; }
394 .#{$fa-css-prefix}-skype:before { content: $fa-var-skype; }
395 .#{$fa-css-prefix}-foursquare:before { content: $fa-var-foursquare; }
396 .#{$fa-css-prefix}-trello:before { content: $fa-var-trello; }
397 .#{$fa-css-prefix}-female:before { content: $fa-var-female; }
398 .#{$fa-css-prefix}-male:before { content: $fa-var-male; }
399 .#{$fa-css-prefix}-gittip:before { content: $fa-var-gittip; }
400 .#{$fa-css-prefix}-sun-o:before { content: $fa-var-sun-o; }
401 .#{$fa-css-prefix}-moon-o:before { content: $fa-var-moon-o; }
402 .#{$fa-css-prefix}-archive:before { content: $fa-var-archive; }
403 .#{$fa-css-prefix}-bug:before { content: $fa-var-bug; }
404 .#{$fa-css-prefix}-vk:before { content: $fa-var-vk; }
405 .#{$fa-css-prefix}-weibo:before { content: $fa-var-weibo; }
406 .#{$fa-css-prefix}-renren:before { content: $fa-var-renren; }
407 .#{$fa-css-prefix}-pagelines:before { content: $fa-var-pagelines; }
408 .#{$fa-css-prefix}-stack-exchange:before { content: $fa-var-stack-exchange; }
409 .#{$fa-css-prefix}-arrow-circle-o-right:before { content: $fa-var-arrow-circle-o-right; }
410 .#{$fa-css-prefix}-arrow-circle-o-left:before { content: $fa-var-arrow-circle-o-left; }
411 .#{$fa-css-prefix}-toggle-left:before,
412 .#{$fa-css-prefix}-caret-square-o-left:before { content: $fa-var-caret-square-o-left; }
413 .#{$fa-css-prefix}-dot-circle-o:before { content: $fa-var-dot-circle-o; }
414 .#{$fa-css-prefix}-wheelchair:before { content: $fa-var-wheelchair; }
415 .#{$fa-css-prefix}-vimeo-square:before { content: $fa-var-vimeo-square; }
416 .#{$fa-css-prefix}-turkish-lira:before,
417 .#{$fa-css-prefix}-try:before { content: $fa-var-try; }
418 .#{$fa-css-prefix}-plus-square-o:before { content: $fa-var-plus-square-o; }
419 .#{$fa-css-prefix}-space-shuttle:before { content: $fa-var-space-shuttle; }
420 .#{$fa-css-prefix}-slack:before { content: $fa-var-slack; }
421 .#{$fa-css-prefix}-envelope-square:before { content: $fa-var-envelope-square; }
422 .#{$fa-css-prefix}-wordpress:before { content: $fa-var-wordpress; }
423 .#{$fa-css-prefix}-openid:before { content: $fa-var-openid; }
424 .#{$fa-css-prefix}-institution:before,
425 .#{$fa-css-prefix}-bank:before,
426 .#{$fa-css-prefix}-university:before { content: $fa-var-university; }
427 .#{$fa-css-prefix}-mortar-board:before,
428 .#{$fa-css-prefix}-graduation-cap:before { content: $fa-var-graduation-cap; }
429 .#{$fa-css-prefix}-yahoo:before { content: $fa-var-yahoo; }
430 .#{$fa-css-prefix}-google:before { content: $fa-var-google; }
431 .#{$fa-css-prefix}-reddit:before { content: $fa-var-reddit; }
432 .#{$fa-css-prefix}-reddit-square:before { content: $fa-var-reddit-square; }
433 .#{$fa-css-prefix}-stumbleupon-circle:before { content: $fa-var-stumbleupon-circle; }
434 .#{$fa-css-prefix}-stumbleupon:before { content: $fa-var-stumbleupon; }
435 .#{$fa-css-prefix}-delicious:before { content: $fa-var-delicious; }
436 .#{$fa-css-prefix}-digg:before { content: $fa-var-digg; }
437 .#{$fa-css-prefix}-pied-piper:before { content: $fa-var-pied-piper; }
438 .#{$fa-css-prefix}-pied-piper-alt:before { content: $fa-var-pied-piper-alt; }
439 .#{$fa-css-prefix}-drupal:before { content: $fa-var-drupal; }
440 .#{$fa-css-prefix}-joomla:before { content: $fa-var-joomla; }
441 .#{$fa-css-prefix}-language:before { content: $fa-var-language; }
442 .#{$fa-css-prefix}-fax:before { content: $fa-var-fax; }
443 .#{$fa-css-prefix}-building:before { content: $fa-var-building; }
444 .#{$fa-css-prefix}-child:before { content: $fa-var-child; }
445 .#{$fa-css-prefix}-paw:before { content: $fa-var-paw; }
446 .#{$fa-css-prefix}-spoon:before { content: $fa-var-spoon; }
447 .#{$fa-css-prefix}-cube:before { content: $fa-var-cube; }
448 .#{$fa-css-prefix}-cubes:before { content: $fa-var-cubes; }
449 .#{$fa-css-prefix}-behance:before { content: $fa-var-behance; }
450 .#{$fa-css-prefix}-behance-square:before { content: $fa-var-behance-square; }
451 .#{$fa-css-prefix}-steam:before { content: $fa-var-steam; }
452 .#{$fa-css-prefix}-steam-square:before { content: $fa-var-steam-square; }
453 .#{$fa-css-prefix}-recycle:before { content: $fa-var-recycle; }
454 .#{$fa-css-prefix}-automobile:before,
455 .#{$fa-css-prefix}-car:before { content: $fa-var-car; }
456 .#{$fa-css-prefix}-cab:before,
457 .#{$fa-css-prefix}-taxi:before { content: $fa-var-taxi; }
458 .#{$fa-css-prefix}-tree:before { content: $fa-var-tree; }
459 .#{$fa-css-prefix}-spotify:before { content: $fa-var-spotify; }
460 .#{$fa-css-prefix}-deviantart:before { content: $fa-var-deviantart; }
461 .#{$fa-css-prefix}-soundcloud:before { content: $fa-var-soundcloud; }
462 .#{$fa-css-prefix}-database:before { content: $fa-var-database; }
463 .#{$fa-css-prefix}-file-pdf-o:before { content: $fa-var-file-pdf-o; }
464 .#{$fa-css-prefix}-file-word-o:before { content: $fa-var-file-word-o; }
465 .#{$fa-css-prefix}-file-excel-o:before { content: $fa-var-file-excel-o; }
466 .#{$fa-css-prefix}-file-powerpoint-o:before { content: $fa-var-file-powerpoint-o; }
467 .#{$fa-css-prefix}-file-photo-o:before,
468 .#{$fa-css-prefix}-file-picture-o:before,
469 .#{$fa-css-prefix}-file-image-o:before { content: $fa-var-file-image-o; }
470 .#{$fa-css-prefix}-file-zip-o:before,
471 .#{$fa-css-prefix}-file-archive-o:before { content: $fa-var-file-archive-o; }
472 .#{$fa-css-prefix}-file-sound-o:before,
473 .#{$fa-css-prefix}-file-audio-o:before { content: $fa-var-file-audio-o; }
474 .#{$fa-css-prefix}-file-movie-o:before,
475 .#{$fa-css-prefix}-file-video-o:before { content: $fa-var-file-video-o; }
476 .#{$fa-css-prefix}-file-code-o:before { content: $fa-var-file-code-o; }
477 .#{$fa-css-prefix}-vine:before { content: $fa-var-vine; }
478 .#{$fa-css-prefix}-codepen:before { content: $fa-var-codepen; }
479 .#{$fa-css-prefix}-jsfiddle:before { content: $fa-var-jsfiddle; }
480 .#{$fa-css-prefix}-life-bouy:before,
481 .#{$fa-css-prefix}-life-buoy:before,
482 .#{$fa-css-prefix}-life-saver:before,
483 .#{$fa-css-prefix}-support:before,
484 .#{$fa-css-prefix}-life-ring:before { content: $fa-var-life-ring; }
485 .#{$fa-css-prefix}-circle-o-notch:before { content: $fa-var-circle-o-notch; }
486 .#{$fa-css-prefix}-ra:before,
487 .#{$fa-css-prefix}-rebel:before { content: $fa-var-rebel; }
488 .#{$fa-css-prefix}-ge:before,
489 .#{$fa-css-prefix}-empire:before { content: $fa-var-empire; }
490 .#{$fa-css-prefix}-git-square:before { content: $fa-var-git-square; }
491 .#{$fa-css-prefix}-git:before { content: $fa-var-git; }
492 .#{$fa-css-prefix}-hacker-news:before { content: $fa-var-hacker-news; }
493 .#{$fa-css-prefix}-tencent-weibo:before { content: $fa-var-tencent-weibo; }
494 .#{$fa-css-prefix}-qq:before { content: $fa-var-qq; }
495 .#{$fa-css-prefix}-wechat:before,
496 .#{$fa-css-prefix}-weixin:before { content: $fa-var-weixin; }
497 .#{$fa-css-prefix}-send:before,
498 .#{$fa-css-prefix}-paper-plane:before { content: $fa-var-paper-plane; }
499 .#{$fa-css-prefix}-send-o:before,
500 .#{$fa-css-prefix}-paper-plane-o:before { content: $fa-var-paper-plane-o; }
501 .#{$fa-css-prefix}-history:before { content: $fa-var-history; }
502 .#{$fa-css-prefix}-circle-thin:before { content: $fa-var-circle-thin; }
503 .#{$fa-css-prefix}-header:before { content: $fa-var-header; }
504 .#{$fa-css-prefix}-paragraph:before { content: $fa-var-paragraph; }
505 .#{$fa-css-prefix}-sliders:before { content: $fa-var-sliders; }
506 .#{$fa-css-prefix}-share-alt:before { content: $fa-var-share-alt; }
507 .#{$fa-css-prefix}-share-alt-square:before { content: $fa-var-share-alt-square; }
508 .#{$fa-css-prefix}-bomb:before { content: $fa-var-bomb; }
509 .#{$fa-css-prefix}-soccer-ball-o:before,
510 .#{$fa-css-prefix}-futbol-o:before { content: $fa-var-futbol-o; }
511 .#{$fa-css-prefix}-tty:before { content: $fa-var-tty; }
512 .#{$fa-css-prefix}-binoculars:before { content: $fa-var-binoculars; }
513 .#{$fa-css-prefix}-plug:before { content: $fa-var-plug; }
514 .#{$fa-css-prefix}-slideshare:before { content: $fa-var-slideshare; }
515 .#{$fa-css-prefix}-twitch:before { content: $fa-var-twitch; }
516 .#{$fa-css-prefix}-yelp:before { content: $fa-var-yelp; }
517 .#{$fa-css-prefix}-newspaper-o:before { content: $fa-var-newspaper-o; }
518 .#{$fa-css-prefix}-wifi:before { content: $fa-var-wifi; }
519 .#{$fa-css-prefix}-calculator:before { content: $fa-var-calculator; }
520 .#{$fa-css-prefix}-paypal:before { content: $fa-var-paypal; }
521 .#{$fa-css-prefix}-google-wallet:before { content: $fa-var-google-wallet; }
522 .#{$fa-css-prefix}-cc-visa:before { content: $fa-var-cc-visa; }
523 .#{$fa-css-prefix}-cc-mastercard:before { content: $fa-var-cc-mastercard; }
524 .#{$fa-css-prefix}-cc-discover:before { content: $fa-var-cc-discover; }
525 .#{$fa-css-prefix}-cc-amex:before { content: $fa-var-cc-amex; }
526 .#{$fa-css-prefix}-cc-paypal:before { content: $fa-var-cc-paypal; }
527 .#{$fa-css-prefix}-cc-stripe:before { content: $fa-var-cc-stripe; }
528 .#{$fa-css-prefix}-bell-slash:before { content: $fa-var-bell-slash; }
529 .#{$fa-css-prefix}-bell-slash-o:before { content: $fa-var-bell-slash-o; }
530 .#{$fa-css-prefix}-trash:before { content: $fa-var-trash; }
531 .#{$fa-css-prefix}-copyright:before { content: $fa-var-copyright; }
532 .#{$fa-css-prefix}-at:before { content: $fa-var-at; }
533 .#{$fa-css-prefix}-eyedropper:before { content: $fa-var-eyedropper; }
534 .#{$fa-css-prefix}-paint-brush:before { content: $fa-var-paint-brush; }
535 .#{$fa-css-prefix}-birthday-cake:before { content: $fa-var-birthday-cake; }
536 .#{$fa-css-prefix}-area-chart:before { content: $fa-var-area-chart; }
537 .#{$fa-css-prefix}-pie-chart:before { content: $fa-var-pie-chart; }
538 .#{$fa-css-prefix}-line-chart:before { content: $fa-var-line-chart; }
539 .#{$fa-css-prefix}-lastfm:before { content: $fa-var-lastfm; }
540 .#{$fa-css-prefix}-lastfm-square:before { content: $fa-var-lastfm-square; }
541 .#{$fa-css-prefix}-toggle-off:before { content: $fa-var-toggle-off; }
542 .#{$fa-css-prefix}-toggle-on:before { content: $fa-var-toggle-on; }
543 .#{$fa-css-prefix}-bicycle:before { content: $fa-var-bicycle; }
544 .#{$fa-css-prefix}-bus:before { content: $fa-var-bus; }
545 .#{$fa-css-prefix}-ioxhost:before { content: $fa-var-ioxhost; }
546 .#{$fa-css-prefix}-angellist:before { content: $fa-var-angellist; }
547 .#{$fa-css-prefix}-cc:before { content: $fa-var-cc; }
548 .#{$fa-css-prefix}-shekel:before,
549 .#{$fa-css-prefix}-sheqel:before,
550 .#{$fa-css-prefix}-ils:before { content: $fa-var-ils; }
551 .#{$fa-css-prefix}-meanpath:before { content: $fa-var-meanpath; }
0 // Icon Sizes
1 // -------------------------
2
3 /* makes the font 33% larger relative to the icon container */
4 .#{$fa-css-prefix}-lg {
5 font-size: (4em / 3);
6 line-height: (3em / 4);
7 vertical-align: -15%;
8 }
9 .#{$fa-css-prefix}-2x { font-size: 2em; }
10 .#{$fa-css-prefix}-3x { font-size: 3em; }
11 .#{$fa-css-prefix}-4x { font-size: 4em; }
12 .#{$fa-css-prefix}-5x { font-size: 5em; }
0 // List Icons
1 // -------------------------
2
3 .#{$fa-css-prefix}-ul {
4 padding-left: 0;
5 margin-left: $fa-li-width;
6 list-style-type: none;
7 > li { position: relative; }
8 }
9 .#{$fa-css-prefix}-li {
10 position: absolute;
11 left: -$fa-li-width;
12 width: $fa-li-width;
13 top: (2em / 14);
14 text-align: center;
15 &.#{$fa-css-prefix}-lg {
16 left: -$fa-li-width + (4em / 14);
17 }
18 }
0 // Mixins
1 // --------------------------
2
3 @mixin fa-icon() {
4 display: inline-block;
5 font: normal normal normal 14px/1 FontAwesome; // shortening font declaration
6 font-size: inherit; // can't have font-size inherit on line above, so need to override
7 text-rendering: auto; // optimizelegibility throws things off #1094
8 -webkit-font-smoothing: antialiased;
9 -moz-osx-font-smoothing: grayscale;
10 }
11
12 @mixin fa-icon-rotate($degrees, $rotation) {
13 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
14 -webkit-transform: rotate($degrees);
15 -ms-transform: rotate($degrees);
16 transform: rotate($degrees);
17 }
18
19 @mixin fa-icon-flip($horiz, $vert, $rotation) {
20 filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation});
21 -webkit-transform: scale($horiz, $vert);
22 -ms-transform: scale($horiz, $vert);
23 transform: scale($horiz, $vert);
24 }
0 /* FONT PATH
1 * -------------------------- */
2
3 @font-face {
4 font-family: 'FontAwesome';
5 src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}');
6 src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'),
7 url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'),
8 url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'),
9 url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg');
10 //src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts
11 font-weight: normal;
12 font-style: normal;
13 }
0 // Rotated & Flipped Icons
1 // -------------------------
2
3 .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); }
4 .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); }
5 .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); }
6
7 .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); }
8 .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); }
9
10 // Hook for IE8-9
11 // -------------------------
12
13 :root .#{$fa-css-prefix}-rotate-90,
14 :root .#{$fa-css-prefix}-rotate-180,
15 :root .#{$fa-css-prefix}-rotate-270,
16 :root .#{$fa-css-prefix}-flip-horizontal,
17 :root .#{$fa-css-prefix}-flip-vertical {
18 filter: none;
19 }
0 // Spinning Icons
1 // --------------------------
2
3 .#{$fa-css-prefix}-spin {
4 -webkit-animation: fa-spin 2s infinite linear;
5 animation: fa-spin 2s infinite linear;
6 }
7
8 @-webkit-keyframes fa-spin {
9 0% {
10 -webkit-transform: rotate(0deg);
11 transform: rotate(0deg);
12 }
13 100% {
14 -webkit-transform: rotate(359deg);
15 transform: rotate(359deg);
16 }
17 }
18
19 @keyframes fa-spin {
20 0% {
21 -webkit-transform: rotate(0deg);
22 transform: rotate(0deg);
23 }
24 100% {
25 -webkit-transform: rotate(359deg);
26 transform: rotate(359deg);
27 }
28 }
0 // Stacked Icons
1 // -------------------------
2
3 .#{$fa-css-prefix}-stack {
4 position: relative;
5 display: inline-block;
6 width: 2em;
7 height: 2em;
8 line-height: 2em;
9 vertical-align: middle;
10 }
11 .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x {
12 position: absolute;
13 left: 0;
14 width: 100%;
15 text-align: center;
16 }
17 .#{$fa-css-prefix}-stack-1x { line-height: inherit; }
18 .#{$fa-css-prefix}-stack-2x { font-size: 2em; }
19 .#{$fa-css-prefix}-inverse { color: $fa-inverse; }
0 // Variables
1 // --------------------------
2
3 $fa-font-path: "../fonts" !default;
4 //$fa-font-path: "//netdna.bootstrapcdn.com/font-awesome/4.2.0/fonts" !default; // for referencing Bootstrap CDN font files directly
5 $fa-css-prefix: fa !default;
6 $fa-version: "4.2.0" !default;
7 $fa-border-color: #eee !default;
8 $fa-inverse: #fff !default;
9 $fa-li-width: (30em / 14) !default;
10
11 $fa-var-adjust: "\f042";
12 $fa-var-adn: "\f170";
13 $fa-var-align-center: "\f037";
14 $fa-var-align-justify: "\f039";
15 $fa-var-align-left: "\f036";
16 $fa-var-align-right: "\f038";
17 $fa-var-ambulance: "\f0f9";
18 $fa-var-anchor: "\f13d";
19 $fa-var-android: "\f17b";
20 $fa-var-angellist: "\f209";
21 $fa-var-angle-double-down: "\f103";
22 $fa-var-angle-double-left: "\f100";
23 $fa-var-angle-double-right: "\f101";
24 $fa-var-angle-double-up: "\f102";
25 $fa-var-angle-down: "\f107";
26 $fa-var-angle-left: "\f104";
27 $fa-var-angle-right: "\f105";
28 $fa-var-angle-up: "\f106";
29 $fa-var-apple: "\f179";
30 $fa-var-archive: "\f187";
31 $fa-var-area-chart: "\f1fe";
32 $fa-var-arrow-circle-down: "\f0ab";
33 $fa-var-arrow-circle-left: "\f0a8";
34 $fa-var-arrow-circle-o-down: "\f01a";
35 $fa-var-arrow-circle-o-left: "\f190";
36 $fa-var-arrow-circle-o-right: "\f18e";
37 $fa-var-arrow-circle-o-up: "\f01b";
38 $fa-var-arrow-circle-right: "\f0a9";
39 $fa-var-arrow-circle-up: "\f0aa";
40 $fa-var-arrow-down: "\f063";
41 $fa-var-arrow-left: "\f060";
42 $fa-var-arrow-right: "\f061";
43 $fa-var-arrow-up: "\f062";
44 $fa-var-arrows: "\f047";
45 $fa-var-arrows-alt: "\f0b2";
46 $fa-var-arrows-h: "\f07e";
47 $fa-var-arrows-v: "\f07d";
48 $fa-var-asterisk: "\f069";
49 $fa-var-at: "\f1fa";
50 $fa-var-automobile: "\f1b9";
51 $fa-var-backward: "\f04a";
52 $fa-var-ban: "\f05e";
53 $fa-var-bank: "\f19c";
54 $fa-var-bar-chart: "\f080";
55 $fa-var-bar-chart-o: "\f080";
56 $fa-var-barcode: "\f02a";
57 $fa-var-bars: "\f0c9";
58 $fa-var-beer: "\f0fc";
59 $fa-var-behance: "\f1b4";
60 $fa-var-behance-square: "\f1b5";
61 $fa-var-bell: "\f0f3";
62 $fa-var-bell-o: "\f0a2";
63 $fa-var-bell-slash: "\f1f6";
64 $fa-var-bell-slash-o: "\f1f7";
65 $fa-var-bicycle: "\f206";
66 $fa-var-binoculars: "\f1e5";
67 $fa-var-birthday-cake: "\f1fd";
68 $fa-var-bitbucket: "\f171";
69 $fa-var-bitbucket-square: "\f172";
70 $fa-var-bitcoin: "\f15a";
71 $fa-var-bold: "\f032";
72 $fa-var-bolt: "\f0e7";
73 $fa-var-bomb: "\f1e2";
74 $fa-var-book: "\f02d";
75 $fa-var-bookmark: "\f02e";
76 $fa-var-bookmark-o: "\f097";
77 $fa-var-briefcase: "\f0b1";
78 $fa-var-btc: "\f15a";
79 $fa-var-bug: "\f188";
80 $fa-var-building: "\f1ad";
81 $fa-var-building-o: "\f0f7";
82 $fa-var-bullhorn: "\f0a1";
83 $fa-var-bullseye: "\f140";
84 $fa-var-bus: "\f207";
85 $fa-var-cab: "\f1ba";
86 $fa-var-calculator: "\f1ec";
87 $fa-var-calendar: "\f073";
88 $fa-var-calendar-o: "\f133";
89 $fa-var-camera: "\f030";
90 $fa-var-camera-retro: "\f083";
91 $fa-var-car: "\f1b9";
92 $fa-var-caret-down: "\f0d7";
93 $fa-var-caret-left: "\f0d9";
94 $fa-var-caret-right: "\f0da";
95 $fa-var-caret-square-o-down: "\f150";
96 $fa-var-caret-square-o-left: "\f191";
97 $fa-var-caret-square-o-right: "\f152";
98 $fa-var-caret-square-o-up: "\f151";
99 $fa-var-caret-up: "\f0d8";
100 $fa-var-cc: "\f20a";
101 $fa-var-cc-amex: "\f1f3";
102 $fa-var-cc-discover: "\f1f2";
103 $fa-var-cc-mastercard: "\f1f1";
104 $fa-var-cc-paypal: "\f1f4";
105 $fa-var-cc-stripe: "\f1f5";
106 $fa-var-cc-visa: "\f1f0";
107 $fa-var-certificate: "\f0a3";
108 $fa-var-chain: "\f0c1";
109 $fa-var-chain-broken: "\f127";
110 $fa-var-check: "\f00c";
111 $fa-var-check-circle: "\f058";
112 $fa-var-check-circle-o: "\f05d";
113 $fa-var-check-square: "\f14a";
114 $fa-var-check-square-o: "\f046";
115 $fa-var-chevron-circle-down: "\f13a";
116 $fa-var-chevron-circle-left: "\f137";
117 $fa-var-chevron-circle-right: "\f138";
118 $fa-var-chevron-circle-up: "\f139";
119 $fa-var-chevron-down: "\f078";
120 $fa-var-chevron-left: "\f053";
121 $fa-var-chevron-right: "\f054";
122 $fa-var-chevron-up: "\f077";
123 $fa-var-child: "\f1ae";
124 $fa-var-circle: "\f111";
125 $fa-var-circle-o: "\f10c";
126 $fa-var-circle-o-notch: "\f1ce";
127 $fa-var-circle-thin: "\f1db";
128 $fa-var-clipboard: "\f0ea";
129 $fa-var-clock-o: "\f017";
130 $fa-var-close: "\f00d";
131 $fa-var-cloud: "\f0c2";
132 $fa-var-cloud-download: "\f0ed";
133 $fa-var-cloud-upload: "\f0ee";
134 $fa-var-cny: "\f157";
135 $fa-var-code: "\f121";
136 $fa-var-code-fork: "\f126";
137 $fa-var-codepen: "\f1cb";
138 $fa-var-coffee: "\f0f4";
139 $fa-var-cog: "\f013";
140 $fa-var-cogs: "\f085";
141 $fa-var-columns: "\f0db";
142 $fa-var-comment: "\f075";
143 $fa-var-comment-o: "\f0e5";
144 $fa-var-comments: "\f086";
145 $fa-var-comments-o: "\f0e6";
146 $fa-var-compass: "\f14e";
147 $fa-var-compress: "\f066";
148 $fa-var-copy: "\f0c5";
149 $fa-var-copyright: "\f1f9";
150 $fa-var-credit-card: "\f09d";
151 $fa-var-crop: "\f125";
152 $fa-var-crosshairs: "\f05b";
153 $fa-var-css3: "\f13c";
154 $fa-var-cube: "\f1b2";
155 $fa-var-cubes: "\f1b3";
156 $fa-var-cut: "\f0c4";
157 $fa-var-cutlery: "\f0f5";
158 $fa-var-dashboard: "\f0e4";
159 $fa-var-database: "\f1c0";
160 $fa-var-dedent: "\f03b";
161 $fa-var-delicious: "\f1a5";
162 $fa-var-desktop: "\f108";
163 $fa-var-deviantart: "\f1bd";
164 $fa-var-digg: "\f1a6";
165 $fa-var-dollar: "\f155";
166 $fa-var-dot-circle-o: "\f192";
167 $fa-var-download: "\f019";
168 $fa-var-dribbble: "\f17d";
169 $fa-var-dropbox: "\f16b";
170 $fa-var-drupal: "\f1a9";
171 $fa-var-edit: "\f044";
172 $fa-var-eject: "\f052";
173 $fa-var-ellipsis-h: "\f141";
174 $fa-var-ellipsis-v: "\f142";
175 $fa-var-empire: "\f1d1";
176 $fa-var-envelope: "\f0e0";
177 $fa-var-envelope-o: "\f003";
178 $fa-var-envelope-square: "\f199";
179 $fa-var-eraser: "\f12d";
180 $fa-var-eur: "\f153";
181 $fa-var-euro: "\f153";
182 $fa-var-exchange: "\f0ec";
183 $fa-var-exclamation: "\f12a";
184 $fa-var-exclamation-circle: "\f06a";
185 $fa-var-exclamation-triangle: "\f071";
186 $fa-var-expand: "\f065";
187 $fa-var-external-link: "\f08e";
188 $fa-var-external-link-square: "\f14c";
189 $fa-var-eye: "\f06e";
190 $fa-var-eye-slash: "\f070";
191 $fa-var-eyedropper: "\f1fb";
192 $fa-var-facebook: "\f09a";
193 $fa-var-facebook-square: "\f082";
194 $fa-var-fast-backward: "\f049";
195 $fa-var-fast-forward: "\f050";
196 $fa-var-fax: "\f1ac";
197 $fa-var-female: "\f182";
198 $fa-var-fighter-jet: "\f0fb";
199 $fa-var-file: "\f15b";
200 $fa-var-file-archive-o: "\f1c6";
201 $fa-var-file-audio-o: "\f1c7";
202 $fa-var-file-code-o: "\f1c9";
203 $fa-var-file-excel-o: "\f1c3";
204 $fa-var-file-image-o: "\f1c5";
205 $fa-var-file-movie-o: "\f1c8";
206 $fa-var-file-o: "\f016";
207 $fa-var-file-pdf-o: "\f1c1";
208 $fa-var-file-photo-o: "\f1c5";
209 $fa-var-file-picture-o: "\f1c5";
210 $fa-var-file-powerpoint-o: "\f1c4";
211 $fa-var-file-sound-o: "\f1c7";
212 $fa-var-file-text: "\f15c";
213 $fa-var-file-text-o: "\f0f6";
214 $fa-var-file-video-o: "\f1c8";
215 $fa-var-file-word-o: "\f1c2";
216 $fa-var-file-zip-o: "\f1c6";
217 $fa-var-files-o: "\f0c5";
218 $fa-var-film: "\f008";
219 $fa-var-filter: "\f0b0";
220 $fa-var-fire: "\f06d";
221 $fa-var-fire-extinguisher: "\f134";
222 $fa-var-flag: "\f024";
223 $fa-var-flag-checkered: "\f11e";
224 $fa-var-flag-o: "\f11d";
225 $fa-var-flash: "\f0e7";
226 $fa-var-flask: "\f0c3";
227 $fa-var-flickr: "\f16e";
228 $fa-var-floppy-o: "\f0c7";
229 $fa-var-folder: "\f07b";
230 $fa-var-folder-o: "\f114";
231 $fa-var-folder-open: "\f07c";
232 $fa-var-folder-open-o: "\f115";
233 $fa-var-font: "\f031";
234 $fa-var-forward: "\f04e";
235 $fa-var-foursquare: "\f180";
236 $fa-var-frown-o: "\f119";
237 $fa-var-futbol-o: "\f1e3";
238 $fa-var-gamepad: "\f11b";
239 $fa-var-gavel: "\f0e3";
240 $fa-var-gbp: "\f154";
241 $fa-var-ge: "\f1d1";
242 $fa-var-gear: "\f013";
243 $fa-var-gears: "\f085";
244 $fa-var-gift: "\f06b";
245 $fa-var-git: "\f1d3";
246 $fa-var-git-square: "\f1d2";
247 $fa-var-github: "\f09b";
248 $fa-var-github-alt: "\f113";
249 $fa-var-github-square: "\f092";
250 $fa-var-gittip: "\f184";
251 $fa-var-glass: "\f000";
252 $fa-var-globe: "\f0ac";
253 $fa-var-google: "\f1a0";
254 $fa-var-google-plus: "\f0d5";
255 $fa-var-google-plus-square: "\f0d4";
256 $fa-var-google-wallet: "\f1ee";
257 $fa-var-graduation-cap: "\f19d";
258 $fa-var-group: "\f0c0";
259 $fa-var-h-square: "\f0fd";
260 $fa-var-hacker-news: "\f1d4";
261 $fa-var-hand-o-down: "\f0a7";
262 $fa-var-hand-o-left: "\f0a5";
263 $fa-var-hand-o-right: "\f0a4";
264 $fa-var-hand-o-up: "\f0a6";
265 $fa-var-hdd-o: "\f0a0";
266 $fa-var-header: "\f1dc";
267 $fa-var-headphones: "\f025";
268 $fa-var-heart: "\f004";
269 $fa-var-heart-o: "\f08a";
270 $fa-var-history: "\f1da";
271 $fa-var-home: "\f015";
272 $fa-var-hospital-o: "\f0f8";
273 $fa-var-html5: "\f13b";
274 $fa-var-ils: "\f20b";
275 $fa-var-image: "\f03e";
276 $fa-var-inbox: "\f01c";
277 $fa-var-indent: "\f03c";
278 $fa-var-info: "\f129";
279 $fa-var-info-circle: "\f05a";
280 $fa-var-inr: "\f156";
281 $fa-var-instagram: "\f16d";
282 $fa-var-institution: "\f19c";
283 $fa-var-ioxhost: "\f208";
284 $fa-var-italic: "\f033";
285 $fa-var-joomla: "\f1aa";
286 $fa-var-jpy: "\f157";
287 $fa-var-jsfiddle: "\f1cc";
288 $fa-var-key: "\f084";
289 $fa-var-keyboard-o: "\f11c";
290 $fa-var-krw: "\f159";
291 $fa-var-language: "\f1ab";
292 $fa-var-laptop: "\f109";
293 $fa-var-lastfm: "\f202";
294 $fa-var-lastfm-square: "\f203";
295 $fa-var-leaf: "\f06c";
296 $fa-var-legal: "\f0e3";
297 $fa-var-lemon-o: "\f094";
298 $fa-var-level-down: "\f149";
299 $fa-var-level-up: "\f148";
300 $fa-var-life-bouy: "\f1cd";
301 $fa-var-life-buoy: "\f1cd";
302 $fa-var-life-ring: "\f1cd";
303 $fa-var-life-saver: "\f1cd";
304 $fa-var-lightbulb-o: "\f0eb";
305 $fa-var-line-chart: "\f201";
306 $fa-var-link: "\f0c1";
307 $fa-var-linkedin: "\f0e1";
308 $fa-var-linkedin-square: "\f08c";
309 $fa-var-linux: "\f17c";
310 $fa-var-list: "\f03a";
311 $fa-var-list-alt: "\f022";
312 $fa-var-list-ol: "\f0cb";
313 $fa-var-list-ul: "\f0ca";
314 $fa-var-location-arrow: "\f124";
315 $fa-var-lock: "\f023";
316 $fa-var-long-arrow-down: "\f175";
317 $fa-var-long-arrow-left: "\f177";
318 $fa-var-long-arrow-right: "\f178";
319 $fa-var-long-arrow-up: "\f176";
320 $fa-var-magic: "\f0d0";
321 $fa-var-magnet: "\f076";
322 $fa-var-mail-forward: "\f064";
323 $fa-var-mail-reply: "\f112";
324 $fa-var-mail-reply-all: "\f122";
325 $fa-var-male: "\f183";
326 $fa-var-map-marker: "\f041";
327 $fa-var-maxcdn: "\f136";
328 $fa-var-meanpath: "\f20c";
329 $fa-var-medkit: "\f0fa";
330 $fa-var-meh-o: "\f11a";
331 $fa-var-microphone: "\f130";
332 $fa-var-microphone-slash: "\f131";
333 $fa-var-minus: "\f068";
334 $fa-var-minus-circle: "\f056";
335 $fa-var-minus-square: "\f146";
336 $fa-var-minus-square-o: "\f147";
337 $fa-var-mobile: "\f10b";
338 $fa-var-mobile-phone: "\f10b";
339 $fa-var-money: "\f0d6";
340 $fa-var-moon-o: "\f186";
341 $fa-var-mortar-board: "\f19d";
342 $fa-var-music: "\f001";
343 $fa-var-navicon: "\f0c9";
344 $fa-var-newspaper-o: "\f1ea";
345 $fa-var-openid: "\f19b";
346 $fa-var-outdent: "\f03b";
347 $fa-var-pagelines: "\f18c";
348 $fa-var-paint-brush: "\f1fc";
349 $fa-var-paper-plane: "\f1d8";
350 $fa-var-paper-plane-o: "\f1d9";
351 $fa-var-paperclip: "\f0c6";
352 $fa-var-paragraph: "\f1dd";
353 $fa-var-paste: "\f0ea";
354 $fa-var-pause: "\f04c";
355 $fa-var-paw: "\f1b0";
356 $fa-var-paypal: "\f1ed";
357 $fa-var-pencil: "\f040";
358 $fa-var-pencil-square: "\f14b";
359 $fa-var-pencil-square-o: "\f044";
360 $fa-var-phone: "\f095";
361 $fa-var-phone-square: "\f098";
362 $fa-var-photo: "\f03e";
363 $fa-var-picture-o: "\f03e";
364 $fa-var-pie-chart: "\f200";
365 $fa-var-pied-piper: "\f1a7";
366 $fa-var-pied-piper-alt: "\f1a8";
367 $fa-var-pinterest: "\f0d2";
368 $fa-var-pinterest-square: "\f0d3";
369 $fa-var-plane: "\f072";
370 $fa-var-play: "\f04b";
371 $fa-var-play-circle: "\f144";
372 $fa-var-play-circle-o: "\f01d";
373 $fa-var-plug: "\f1e6";
374 $fa-var-plus: "\f067";
375 $fa-var-plus-circle: "\f055";
376 $fa-var-plus-square: "\f0fe";
377 $fa-var-plus-square-o: "\f196";
378 $fa-var-power-off: "\f011";
379 $fa-var-print: "\f02f";
380 $fa-var-puzzle-piece: "\f12e";
381 $fa-var-qq: "\f1d6";
382 $fa-var-qrcode: "\f029";
383 $fa-var-question: "\f128";
384 $fa-var-question-circle: "\f059";
385 $fa-var-quote-left: "\f10d";
386 $fa-var-quote-right: "\f10e";
387 $fa-var-ra: "\f1d0";
388 $fa-var-random: "\f074";
389 $fa-var-rebel: "\f1d0";
390 $fa-var-recycle: "\f1b8";
391 $fa-var-reddit: "\f1a1";
392 $fa-var-reddit-square: "\f1a2";
393 $fa-var-refresh: "\f021";
394 $fa-var-remove: "\f00d";
395 $fa-var-renren: "\f18b";
396 $fa-var-reorder: "\f0c9";
397 $fa-var-repeat: "\f01e";
398 $fa-var-reply: "\f112";
399 $fa-var-reply-all: "\f122";
400 $fa-var-retweet: "\f079";
401 $fa-var-rmb: "\f157";
402 $fa-var-road: "\f018";
403 $fa-var-rocket: "\f135";
404 $fa-var-rotate-left: "\f0e2";
405 $fa-var-rotate-right: "\f01e";
406 $fa-var-rouble: "\f158";
407 $fa-var-rss: "\f09e";
408 $fa-var-rss-square: "\f143";
409 $fa-var-rub: "\f158";
410 $fa-var-ruble: "\f158";
411 $fa-var-rupee: "\f156";
412 $fa-var-save: "\f0c7";
413 $fa-var-scissors: "\f0c4";
414 $fa-var-search: "\f002";
415 $fa-var-search-minus: "\f010";
416 $fa-var-search-plus: "\f00e";
417 $fa-var-send: "\f1d8";
418 $fa-var-send-o: "\f1d9";
419 $fa-var-share: "\f064";
420 $fa-var-share-alt: "\f1e0";
421 $fa-var-share-alt-square: "\f1e1";
422 $fa-var-share-square: "\f14d";
423 $fa-var-share-square-o: "\f045";
424 $fa-var-shekel: "\f20b";
425 $fa-var-sheqel: "\f20b";
426 $fa-var-shield: "\f132";
427 $fa-var-shopping-cart: "\f07a";
428 $fa-var-sign-in: "\f090";
429 $fa-var-sign-out: "\f08b";
430 $fa-var-signal: "\f012";
431 $fa-var-sitemap: "\f0e8";
432 $fa-var-skype: "\f17e";
433 $fa-var-slack: "\f198";
434 $fa-var-sliders: "\f1de";
435 $fa-var-slideshare: "\f1e7";
436 $fa-var-smile-o: "\f118";
437 $fa-var-soccer-ball-o: "\f1e3";
438 $fa-var-sort: "\f0dc";
439 $fa-var-sort-alpha-asc: "\f15d";
440 $fa-var-sort-alpha-desc: "\f15e";
441 $fa-var-sort-amount-asc: "\f160";
442 $fa-var-sort-amount-desc: "\f161";
443 $fa-var-sort-asc: "\f0de";
444 $fa-var-sort-desc: "\f0dd";
445 $fa-var-sort-down: "\f0dd";
446 $fa-var-sort-numeric-asc: "\f162";
447 $fa-var-sort-numeric-desc: "\f163";
448 $fa-var-sort-up: "\f0de";
449 $fa-var-soundcloud: "\f1be";
450 $fa-var-space-shuttle: "\f197";
451 $fa-var-spinner: "\f110";
452 $fa-var-spoon: "\f1b1";
453 $fa-var-spotify: "\f1bc";
454 $fa-var-square: "\f0c8";
455 $fa-var-square-o: "\f096";
456 $fa-var-stack-exchange: "\f18d";
457 $fa-var-stack-overflow: "\f16c";
458 $fa-var-star: "\f005";
459 $fa-var-star-half: "\f089";
460 $fa-var-star-half-empty: "\f123";
461 $fa-var-star-half-full: "\f123";
462 $fa-var-star-half-o: "\f123";
463 $fa-var-star-o: "\f006";
464 $fa-var-steam: "\f1b6";
465 $fa-var-steam-square: "\f1b7";
466 $fa-var-step-backward: "\f048";
467 $fa-var-step-forward: "\f051";
468 $fa-var-stethoscope: "\f0f1";
469 $fa-var-stop: "\f04d";
470 $fa-var-strikethrough: "\f0cc";
471 $fa-var-stumbleupon: "\f1a4";
472 $fa-var-stumbleupon-circle: "\f1a3";
473 $fa-var-subscript: "\f12c";
474 $fa-var-suitcase: "\f0f2";
475 $fa-var-sun-o: "\f185";
476 $fa-var-superscript: "\f12b";
477 $fa-var-support: "\f1cd";
478 $fa-var-table: "\f0ce";
479 $fa-var-tablet: "\f10a";
480 $fa-var-tachometer: "\f0e4";
481 $fa-var-tag: "\f02b";
482 $fa-var-tags: "\f02c";
483 $fa-var-tasks: "\f0ae";
484 $fa-var-taxi: "\f1ba";
485 $fa-var-tencent-weibo: "\f1d5";
486 $fa-var-terminal: "\f120";
487 $fa-var-text-height: "\f034";
488 $fa-var-text-width: "\f035";
489 $fa-var-th: "\f00a";
490 $fa-var-th-large: "\f009";
491 $fa-var-th-list: "\f00b";
492 $fa-var-thumb-tack: "\f08d";
493 $fa-var-thumbs-down: "\f165";
494 $fa-var-thumbs-o-down: "\f088";
495 $fa-var-thumbs-o-up: "\f087";
496 $fa-var-thumbs-up: "\f164";
497 $fa-var-ticket: "\f145";
498 $fa-var-times: "\f00d";
499 $fa-var-times-circle: "\f057";
500 $fa-var-times-circle-o: "\f05c";
501 $fa-var-tint: "\f043";
502 $fa-var-toggle-down: "\f150";
503 $fa-var-toggle-left: "\f191";
504 $fa-var-toggle-off: "\f204";
505 $fa-var-toggle-on: "\f205";
506 $fa-var-toggle-right: "\f152";
507 $fa-var-toggle-up: "\f151";
508 $fa-var-trash: "\f1f8";
509 $fa-var-trash-o: "\f014";
510 $fa-var-tree: "\f1bb";
511 $fa-var-trello: "\f181";
512 $fa-var-trophy: "\f091";
513 $fa-var-truck: "\f0d1";
514 $fa-var-try: "\f195";
515 $fa-var-tty: "\f1e4";
516 $fa-var-tumblr: "\f173";
517 $fa-var-tumblr-square: "\f174";
518 $fa-var-turkish-lira: "\f195";
519 $fa-var-twitch: "\f1e8";
520 $fa-var-twitter: "\f099";
521 $fa-var-twitter-square: "\f081";
522 $fa-var-umbrella: "\f0e9";
523 $fa-var-underline: "\f0cd";
524 $fa-var-undo: "\f0e2";
525 $fa-var-university: "\f19c";
526 $fa-var-unlink: "\f127";
527 $fa-var-unlock: "\f09c";
528 $fa-var-unlock-alt: "\f13e";
529 $fa-var-unsorted: "\f0dc";
530 $fa-var-upload: "\f093";
531 $fa-var-usd: "\f155";
532 $fa-var-user: "\f007";
533 $fa-var-user-md: "\f0f0";
534 $fa-var-users: "\f0c0";
535 $fa-var-video-camera: "\f03d";
536 $fa-var-vimeo-square: "\f194";
537 $fa-var-vine: "\f1ca";
538 $fa-var-vk: "\f189";
539 $fa-var-volume-down: "\f027";
540 $fa-var-volume-off: "\f026";
541 $fa-var-volume-up: "\f028";
542 $fa-var-warning: "\f071";
543 $fa-var-wechat: "\f1d7";
544 $fa-var-weibo: "\f18a";
545 $fa-var-weixin: "\f1d7";
546 $fa-var-wheelchair: "\f193";
547 $fa-var-wifi: "\f1eb";
548 $fa-var-windows: "\f17a";
549 $fa-var-won: "\f159";
550 $fa-var-wordpress: "\f19a";
551 $fa-var-wrench: "\f0ad";
552 $fa-var-xing: "\f168";
553 $fa-var-xing-square: "\f169";
554 $fa-var-yahoo: "\f19e";
555 $fa-var-yelp: "\f1e9";
556 $fa-var-yen: "\f157";
557 $fa-var-youtube: "\f167";
558 $fa-var-youtube-play: "\f16a";
559 $fa-var-youtube-square: "\f166";
560
0 /*!
1 * Font Awesome 4.2.0 by @davegandy - http://fontawesome.io - @fontawesome
2 * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
3 */
4
5 @import "variables";
6 @import "mixins";
7 @import "path";
8 @import "core";
9 @import "larger";
10 @import "fixed-width";
11 @import "list";
12 @import "bordered-pulled";
13 @import "spinning";
14 @import "rotated-flipped";
15 @import "stacked";
16 @import "icons";
0 /*
1 * jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
2 *
3 * Uses the built in easing capabilities added In jQuery 1.1
4 * to offer multiple easing options
5 *
6 * TERMS OF USE - jQuery Easing
7 *
8 * Open source under the BSD License.
9 *
10 * Copyright © 2008 George McGinley Smith
11 * All rights reserved.
12 *
13 * Redistribution and use in source and binary forms, with or without modification,
14 * are permitted provided that the following conditions are met:
15 *
16 * Redistributions of source code must retain the above copyright notice, this list of
17 * conditions and the following disclaimer.
18 * Redistributions in binary form must reproduce the above copyright notice, this list
19 * of conditions and the following disclaimer in the documentation and/or other materials
20 * provided with the distribution.
21 *
22 * Neither the name of the author nor the names of contributors may be used to endorse
23 * or promote products derived from this software without specific prior written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
26 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
27 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
28 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
29 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
30 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
31 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
33 * OF THE POSSIBILITY OF SUCH DAMAGE.
34 *
35 */
36
37 // t: current time, b: begInnIng value, c: change In value, d: duration
38 eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('h.i[\'1a\']=h.i[\'z\'];h.O(h.i,{y:\'D\',z:9(x,t,b,c,d){6 h.i[h.i.y](x,t,b,c,d)},17:9(x,t,b,c,d){6 c*(t/=d)*t+b},D:9(x,t,b,c,d){6-c*(t/=d)*(t-2)+b},13:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t+b;6-c/2*((--t)*(t-2)-1)+b},X:9(x,t,b,c,d){6 c*(t/=d)*t*t+b},U:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t+1)+b},R:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t+b;6 c/2*((t-=2)*t*t+2)+b},N:9(x,t,b,c,d){6 c*(t/=d)*t*t*t+b},M:9(x,t,b,c,d){6-c*((t=t/d-1)*t*t*t-1)+b},L:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t+b;6-c/2*((t-=2)*t*t*t-2)+b},K:9(x,t,b,c,d){6 c*(t/=d)*t*t*t*t+b},J:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t*t*t+1)+b},I:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t*t+b;6 c/2*((t-=2)*t*t*t*t+2)+b},G:9(x,t,b,c,d){6-c*8.C(t/d*(8.g/2))+c+b},15:9(x,t,b,c,d){6 c*8.n(t/d*(8.g/2))+b},12:9(x,t,b,c,d){6-c/2*(8.C(8.g*t/d)-1)+b},Z:9(x,t,b,c,d){6(t==0)?b:c*8.j(2,10*(t/d-1))+b},Y:9(x,t,b,c,d){6(t==d)?b+c:c*(-8.j(2,-10*t/d)+1)+b},W:9(x,t,b,c,d){e(t==0)6 b;e(t==d)6 b+c;e((t/=d/2)<1)6 c/2*8.j(2,10*(t-1))+b;6 c/2*(-8.j(2,-10*--t)+2)+b},V:9(x,t,b,c,d){6-c*(8.o(1-(t/=d)*t)-1)+b},S:9(x,t,b,c,d){6 c*8.o(1-(t=t/d-1)*t)+b},Q:9(x,t,b,c,d){e((t/=d/2)<1)6-c/2*(8.o(1-t*t)-1)+b;6 c/2*(8.o(1-(t-=2)*t)+1)+b},P:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6-(a*8.j(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b},H:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6 a*8.j(2,-10*t)*8.n((t*d-s)*(2*8.g)/p)+c+b},T:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d/2)==2)6 b+c;e(!p)p=d*(.3*1.5);e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);e(t<1)6-.5*(a*8.j(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b;6 a*8.j(2,-10*(t-=1))*8.n((t*d-s)*(2*8.g)/p)*.5+c+b},F:9(x,t,b,c,d,s){e(s==u)s=1.l;6 c*(t/=d)*t*((s+1)*t-s)+b},E:9(x,t,b,c,d,s){e(s==u)s=1.l;6 c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},16:9(x,t,b,c,d,s){e(s==u)s=1.l;e((t/=d/2)<1)6 c/2*(t*t*(((s*=(1.B))+1)*t-s))+b;6 c/2*((t-=2)*t*(((s*=(1.B))+1)*t+s)+2)+b},A:9(x,t,b,c,d){6 c-h.i.v(x,d-t,0,c,d)+b},v:9(x,t,b,c,d){e((t/=d)<(1/2.k)){6 c*(7.q*t*t)+b}m e(t<(2/2.k)){6 c*(7.q*(t-=(1.5/2.k))*t+.k)+b}m e(t<(2.5/2.k)){6 c*(7.q*(t-=(2.14/2.k))*t+.11)+b}m{6 c*(7.q*(t-=(2.18/2.k))*t+.19)+b}},1b:9(x,t,b,c,d){e(t<d/2)6 h.i.A(x,t*2,0,c,d)*.5+b;6 h.i.v(x,t*2-d,0,c,d)*.5+c*.5+b}});',62,74,'||||||return||Math|function|||||if|var|PI|jQuery|easing|pow|75|70158|else|sin|sqrt||5625|asin|||undefined|easeOutBounce|abs||def|swing|easeInBounce|525|cos|easeOutQuad|easeOutBack|easeInBack|easeInSine|easeOutElastic|easeInOutQuint|easeOutQuint|easeInQuint|easeInOutQuart|easeOutQuart|easeInQuart|extend|easeInElastic|easeInOutCirc|easeInOutCubic|easeOutCirc|easeInOutElastic|easeOutCubic|easeInCirc|easeInOutExpo|easeInCubic|easeOutExpo|easeInExpo||9375|easeInOutSine|easeInOutQuad|25|easeOutSine|easeInOutBack|easeInQuad|625|984375|jswing|easeInOutBounce'.split('|'),0,{}))
39
40 /*
41 *
42 * TERMS OF USE - EASING EQUATIONS
43 *
44 * Open source under the BSD License.
45 *
46 * Copyright © 2001 Robert Penner
47 * All rights reserved.
48 *
49 * Redistribution and use in source and binary forms, with or without modification,
50 * are permitted provided that the following conditions are met:
51 *
52 * Redistributions of source code must retain the above copyright notice, this list of
53 * conditions and the following disclaimer.
54 * Redistributions in binary form must reproduce the above copyright notice, this list
55 * of conditions and the following disclaimer in the documentation and/or other materials
56 * provided with the distribution.
57 *
58 * Neither the name of the author nor the names of contributors may be used to endorse
59 * or promote products derived from this software without specific prior written permission.
60 *
61 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
62 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
63 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
64 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
65 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
66 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
67 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
68 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
69 * OF THE POSSIBILITY OF SUCH DAMAGE.
70 *
71 */
0 /*
1 * FancyBox - jQuery Plugin
2 * Simple and fancy lightbox alternative
3 *
4 * Examples and documentation at: http://fancybox.net
5 *
6 * Copyright (c) 2008 - 2010 Janis Skarnelis
7 * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
8 *
9 * Version: 1.3.4 (11/11/2010)
10 * Requires: jQuery v1.3+
11 *
12 * Dual licensed under the MIT and GPL licenses:
13 * http://www.opensource.org/licenses/mit-license.php
14 * http://www.gnu.org/licenses/gpl.html
15 */
16
17 ;(function($) {
18 var tmp, loading, overlay, wrap, outer, content, close, title, nav_left, nav_right,
19
20 selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [],
21
22 ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i,
23
24 loadingTimer, loadingFrame = 1,
25
26 titleHeight = 0, titleStr = '', start_pos, final_pos, busy = false, fx = $.extend($('<div/>')[0], { prop: 0 }),
27
28 isIE6 = $.browser.msie && $.browser.version < 7 && !window.XMLHttpRequest,
29
30 /*
31 * Private methods
32 */
33
34 _abort = function() {
35 loading.hide();
36
37 imgPreloader.onerror = imgPreloader.onload = null;
38
39 if (ajaxLoader) {
40 ajaxLoader.abort();
41 }
42
43 tmp.empty();
44 },
45
46 _error = function() {
47 if (false === selectedOpts.onError(selectedArray, selectedIndex, selectedOpts)) {
48 loading.hide();
49 busy = false;
50 return;
51 }
52
53 selectedOpts.titleShow = false;
54
55 selectedOpts.width = 'auto';
56 selectedOpts.height = 'auto';
57
58 tmp.html( '<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>' );
59
60 _process_inline();
61 },
62
63 _start = function() {
64 var obj = selectedArray[ selectedIndex ],
65 href,
66 type,
67 title,
68 str,
69 emb,
70 ret;
71
72 _abort();
73
74 selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox')));
75
76 ret = selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts);
77
78 if (ret === false) {
79 busy = false;
80 return;
81 } else if (typeof ret == 'object') {
82 selectedOpts = $.extend(selectedOpts, ret);
83 }
84
85 title = selectedOpts.title || (obj.nodeName ? $(obj).attr('title') : obj.title) || '';
86
87 if (obj.nodeName && !selectedOpts.orig) {
88 selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj);
89 }
90
91 if (title === '' && selectedOpts.orig && selectedOpts.titleFromAlt) {
92 title = selectedOpts.orig.attr('alt');
93 }
94
95 href = selectedOpts.href || (obj.nodeName ? $(obj).attr('href') : obj.href) || null;
96
97 if ((/^(?:javascript)/i).test(href) || href == '#') {
98 href = null;
99 }
100
101 if (selectedOpts.type) {
102 type = selectedOpts.type;
103
104 if (!href) {
105 href = selectedOpts.content;
106 }
107
108 } else if (selectedOpts.content) {
109 type = 'html';
110
111 } else if (href) {
112 if (href.match(imgRegExp)) {
113 type = 'image';
114
115 } else if (href.match(swfRegExp)) {
116 type = 'swf';
117
118 } else if ($(obj).hasClass("iframe")) {
119 type = 'iframe';
120
121 } else if (href.indexOf("#") === 0) {
122 type = 'inline';
123
124 } else {
125 type = 'ajax';
126 }
127 }
128
129 if (!type) {
130 _error();
131 return;
132 }
133
134 if (type == 'inline') {
135 obj = href.substr(href.indexOf("#"));
136 type = $(obj).length > 0 ? 'inline' : 'ajax';
137 }
138
139 selectedOpts.type = type;
140 selectedOpts.href = href;
141 selectedOpts.title = title;
142
143 if (selectedOpts.autoDimensions) {
144 if (selectedOpts.type == 'html' || selectedOpts.type == 'inline' || selectedOpts.type == 'ajax') {
145 selectedOpts.width = 'auto';
146 selectedOpts.height = 'auto';
147 } else {
148 selectedOpts.autoDimensions = false;
149 }
150 }
151
152 if (selectedOpts.modal) {
153 selectedOpts.overlayShow = true;
154 selectedOpts.hideOnOverlayClick = false;
155 selectedOpts.hideOnContentClick = false;
156 selectedOpts.enableEscapeButton = false;
157 selectedOpts.showCloseButton = false;
158 }
159
160 selectedOpts.padding = parseInt(selectedOpts.padding, 10);
161 selectedOpts.margin = parseInt(selectedOpts.margin, 10);
162
163 tmp.css('padding', (selectedOpts.padding + selectedOpts.margin));
164
165 $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() {
166 $(this).replaceWith(content.children());
167 });
168
169 switch (type) {
170 case 'html' :
171 tmp.html( selectedOpts.content );
172 _process_inline();
173 break;
174
175 case 'inline' :
176 if ( $(obj).parent().is('#fancybox-content') === true) {
177 busy = false;
178 return;
179 }
180
181 $('<div class="fancybox-inline-tmp" />')
182 .hide()
183 .insertBefore( $(obj) )
184 .bind('fancybox-cleanup', function() {
185 $(this).replaceWith(content.children());
186 }).bind('fancybox-cancel', function() {
187 $(this).replaceWith(tmp.children());
188 });
189
190 $(obj).appendTo(tmp);
191
192 _process_inline();
193 break;
194
195 case 'image':
196 busy = false;
197
198 $.fancybox.showActivity();
199
200 imgPreloader = new Image();
201
202 imgPreloader.onerror = function() {
203 _error();
204 };
205
206 imgPreloader.onload = function() {
207 busy = true;
208
209 imgPreloader.onerror = imgPreloader.onload = null;
210
211 _process_image();
212 };
213
214 imgPreloader.src = href;
215 break;
216
217 case 'swf':
218 selectedOpts.scrolling = 'no';
219
220 str = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"><param name="movie" value="' + href + '"></param>';
221 emb = '';
222
223 $.each(selectedOpts.swf, function(name, val) {
224 str += '<param name="' + name + '" value="' + val + '"></param>';
225 emb += ' ' + name + '="' + val + '"';
226 });
227
228 str += '<embed src="' + href + '" type="application/x-shockwave-flash" width="' + selectedOpts.width + '" height="' + selectedOpts.height + '"' + emb + '></embed></object>';
229
230 tmp.html(str);
231
232 _process_inline();
233 break;
234
235 case 'ajax':
236 busy = false;
237
238 $.fancybox.showActivity();
239
240 selectedOpts.ajax.win = selectedOpts.ajax.success;
241
242 ajaxLoader = $.ajax($.extend({}, selectedOpts.ajax, {
243 url : href,
244 data : selectedOpts.ajax.data || {},
245 error : function(XMLHttpRequest, textStatus, errorThrown) {
246 if ( XMLHttpRequest.status > 0 ) {
247 _error();
248 }
249 },
250 success : function(data, textStatus, XMLHttpRequest) {
251 var o = typeof XMLHttpRequest == 'object' ? XMLHttpRequest : ajaxLoader;
252 if (o.status == 200) {
253 if ( typeof selectedOpts.ajax.win == 'function' ) {
254 ret = selectedOpts.ajax.win(href, data, textStatus, XMLHttpRequest);
255
256 if (ret === false) {
257 loading.hide();
258 return;
259 } else if (typeof ret == 'string' || typeof ret == 'object') {
260 data = ret;
261 }
262 }
263
264 tmp.html( data );
265 _process_inline();
266 }
267 }
268 }));
269
270 break;
271
272 case 'iframe':
273 _show();
274 break;
275 }
276 },
277
278 _process_inline = function() {
279 var
280 w = selectedOpts.width,
281 h = selectedOpts.height;
282
283 if (w.toString().indexOf('%') > -1) {
284 w = parseInt( ($(window).width() - (selectedOpts.margin * 2)) * parseFloat(w) / 100, 10) + 'px';
285
286 } else {
287 w = w == 'auto' ? 'auto' : w + 'px';
288 }
289
290 if (h.toString().indexOf('%') > -1) {
291 h = parseInt( ($(window).height() - (selectedOpts.margin * 2)) * parseFloat(h) / 100, 10) + 'px';
292
293 } else {
294 h = h == 'auto' ? 'auto' : h + 'px';
295 }
296
297 tmp.wrapInner('<div style="width:' + w + ';height:' + h + ';overflow: ' + (selectedOpts.scrolling == 'auto' ? 'auto' : (selectedOpts.scrolling == 'yes' ? 'scroll' : 'hidden')) + ';position:relative;"></div>');
298
299 selectedOpts.width = tmp.width();
300 selectedOpts.height = tmp.height();
301
302 _show();
303 },
304
305 _process_image = function() {
306 selectedOpts.width = imgPreloader.width;
307 selectedOpts.height = imgPreloader.height;
308
309 $("<img />").attr({
310 'id' : 'fancybox-img',
311 'src' : imgPreloader.src,
312 'alt' : selectedOpts.title
313 }).appendTo( tmp );
314
315 _show();
316 },
317
318 _show = function() {
319 var pos, equal;
320
321 loading.hide();
322
323 if (wrap.is(":visible") && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {
324 $.event.trigger('fancybox-cancel');
325
326 busy = false;
327 return;
328 }
329
330 busy = true;
331
332 $(content.add( overlay )).unbind();
333
334 $(window).unbind("resize.fb scroll.fb");
335 $(document).unbind('keydown.fb');
336
337 if (wrap.is(":visible") && currentOpts.titlePosition !== 'outside') {
338 wrap.css('height', wrap.height());
339 }
340
341 currentArray = selectedArray;
342 currentIndex = selectedIndex;
343 currentOpts = selectedOpts;
344
345 if (currentOpts.overlayShow) {
346 overlay.css({
347 'background-color' : currentOpts.overlayColor,
348 'opacity' : currentOpts.overlayOpacity,
349 'cursor' : currentOpts.hideOnOverlayClick ? 'pointer' : 'auto',
350 'height' : $(document).height()
351 });
352
353 if (!overlay.is(':visible')) {
354 if (isIE6) {
355 $('select:not(#fancybox-tmp select)').filter(function() {
356 return this.style.visibility !== 'hidden';
357 }).css({'visibility' : 'hidden'}).one('fancybox-cleanup', function() {
358 this.style.visibility = 'inherit';
359 });
360 }
361
362 overlay.show();
363 }
364 } else {
365 overlay.hide();
366 }
367
368 final_pos = _get_zoom_to();
369
370 _process_title();
371
372 if (wrap.is(":visible")) {
373 $( close.add( nav_left ).add( nav_right ) ).hide();
374
375 pos = wrap.position(),
376
377 start_pos = {
378 top : pos.top,
379 left : pos.left,
380 width : wrap.width(),
381 height : wrap.height()
382 };
383
384 equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height);
385
386 content.fadeTo(currentOpts.changeFade, 0.3, function() {
387 var finish_resizing = function() {
388 content.html( tmp.contents() ).fadeTo(currentOpts.changeFade, 1, _finish);
389 };
390
391 $.event.trigger('fancybox-change');
392
393 content
394 .empty()
395 .removeAttr('filter')
396 .css({
397 'border-width' : currentOpts.padding,
398 'width' : final_pos.width - currentOpts.padding * 2,
399 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2
400 });
401
402 if (equal) {
403 finish_resizing();
404
405 } else {
406 fx.prop = 0;
407
408 $(fx).animate({prop: 1}, {
409 duration : currentOpts.changeSpeed,
410 easing : currentOpts.easingChange,
411 step : _draw,
412 complete : finish_resizing
413 });
414 }
415 });
416
417 return;
418 }
419
420 wrap.removeAttr("style");
421
422 content.css('border-width', currentOpts.padding);
423
424 if (currentOpts.transitionIn == 'elastic') {
425 start_pos = _get_zoom_from();
426
427 content.html( tmp.contents() );
428
429 wrap.show();
430
431 if (currentOpts.opacity) {
432 final_pos.opacity = 0;
433 }
434
435 fx.prop = 0;
436
437 $(fx).animate({prop: 1}, {
438 duration : currentOpts.speedIn,
439 easing : currentOpts.easingIn,
440 step : _draw,
441 complete : _finish
442 });
443
444 return;
445 }
446
447 if (currentOpts.titlePosition == 'inside' && titleHeight > 0) {
448 title.show();
449 }
450
451 content
452 .css({
453 'width' : final_pos.width - currentOpts.padding * 2,
454 'height' : selectedOpts.autoDimensions ? 'auto' : final_pos.height - titleHeight - currentOpts.padding * 2
455 })
456 .html( tmp.contents() );
457
458 wrap
459 .css(final_pos)
460 .fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish );
461 },
462
463 _format_title = function(title) {
464 if (title && title.length) {
465 if (currentOpts.titlePosition == 'float') {
466 return '<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">' + title + '</td><td id="fancybox-title-float-right"></td></tr></table>';
467 }
468
469 return '<div id="fancybox-title-' + currentOpts.titlePosition + '">' + title + '</div>';
470 }
471
472 return false;
473 },
474
475 _process_title = function() {
476 titleStr = currentOpts.title || '';
477 titleHeight = 0;
478
479 title
480 .empty()
481 .removeAttr('style')
482 .removeClass();
483
484 if (currentOpts.titleShow === false) {
485 title.hide();
486 return;
487 }
488
489 titleStr = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(titleStr, currentArray, currentIndex, currentOpts) : _format_title(titleStr);
490
491 if (!titleStr || titleStr === '') {
492 title.hide();
493 return;
494 }
495
496 title
497 .addClass('fancybox-title-' + currentOpts.titlePosition)
498 .html( titleStr )
499 .appendTo( 'body' )
500 .show();
501
502 switch (currentOpts.titlePosition) {
503 case 'inside':
504 title
505 .css({
506 'width' : final_pos.width - (currentOpts.padding * 2),
507 'marginLeft' : currentOpts.padding,
508 'marginRight' : currentOpts.padding
509 });
510
511 titleHeight = title.outerHeight(true);
512
513 title.appendTo( outer );
514
515 final_pos.height += titleHeight;
516 break;
517
518 case 'over':
519 title
520 .css({
521 'marginLeft' : currentOpts.padding,
522 'width' : final_pos.width - (currentOpts.padding * 2),
523 'bottom' : currentOpts.padding
524 })
525 .appendTo( outer );
526 break;
527
528 case 'float':
529 title
530 .css('left', parseInt((title.width() - final_pos.width - 40)/ 2, 10) * -1)
531 .appendTo( wrap );
532 break;
533
534 default:
535 title
536 .css({
537 'width' : final_pos.width - (currentOpts.padding * 2),
538 'paddingLeft' : currentOpts.padding,
539 'paddingRight' : currentOpts.padding
540 })
541 .appendTo( wrap );
542 break;
543 }
544
545 title.hide();
546 },
547
548 _set_navigation = function() {
549 if (currentOpts.enableEscapeButton || currentOpts.enableKeyboardNav) {
550 $(document).bind('keydown.fb', function(e) {
551 if (e.keyCode == 27 && currentOpts.enableEscapeButton) {
552 e.preventDefault();
553 $.fancybox.close();
554
555 } else if ((e.keyCode == 37 || e.keyCode == 39) && currentOpts.enableKeyboardNav && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA' && e.target.tagName !== 'SELECT') {
556 e.preventDefault();
557 $.fancybox[ e.keyCode == 37 ? 'prev' : 'next']();
558 }
559 });
560 }
561
562 if (!currentOpts.showNavArrows) {
563 nav_left.hide();
564 nav_right.hide();
565 return;
566 }
567
568 if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) {
569 nav_left.show();
570 }
571
572 if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) {
573 nav_right.show();
574 }
575 },
576
577 _finish = function () {
578 if (!$.support.opacity) {
579 content.get(0).style.removeAttribute('filter');
580 wrap.get(0).style.removeAttribute('filter');
581 }
582
583 if (selectedOpts.autoDimensions) {
584 content.css('height', 'auto');
585 }
586
587 wrap.css('height', 'auto');
588
589 if (titleStr && titleStr.length) {
590 title.show();
591 }
592
593 if (currentOpts.showCloseButton) {
594 close.show();
595 }
596
597 _set_navigation();
598
599 if (currentOpts.hideOnContentClick) {
600 content.bind('click', $.fancybox.close);
601 }
602
603 if (currentOpts.hideOnOverlayClick) {
604 overlay.bind('click', $.fancybox.close);
605 }
606
607 $(window).bind("resize.fb", $.fancybox.resize);
608
609 if (currentOpts.centerOnScroll) {
610 $(window).bind("scroll.fb", $.fancybox.center);
611 }
612
613 if (currentOpts.type == 'iframe') {
614 $('<iframe id="fancybox-frame" name="fancybox-frame' + new Date().getTime() + '" frameborder="0" hspace="0" ' + ($.browser.msie ? 'allowtransparency="true""' : '') + ' scrolling="' + selectedOpts.scrolling + '" src="' + currentOpts.href + '"></iframe>').appendTo(content);
615 }
616
617 wrap.show();
618
619 busy = false;
620
621 $.fancybox.center();
622
623 currentOpts.onComplete(currentArray, currentIndex, currentOpts);
624
625 _preload_images();
626 },
627
628 _preload_images = function() {
629 var href,
630 objNext;
631
632 if ((currentArray.length -1) > currentIndex) {
633 href = currentArray[ currentIndex + 1 ].href;
634
635 if (typeof href !== 'undefined' && href.match(imgRegExp)) {
636 objNext = new Image();
637 objNext.src = href;
638 }
639 }
640
641 if (currentIndex > 0) {
642 href = currentArray[ currentIndex - 1 ].href;
643
644 if (typeof href !== 'undefined' && href.match(imgRegExp)) {
645 objNext = new Image();
646 objNext.src = href;
647 }
648 }
649 },
650
651 _draw = function(pos) {
652 var dim = {
653 width : parseInt(start_pos.width + (final_pos.width - start_pos.width) * pos, 10),
654 height : parseInt(start_pos.height + (final_pos.height - start_pos.height) * pos, 10),
655
656 top : parseInt(start_pos.top + (final_pos.top - start_pos.top) * pos, 10),
657 left : parseInt(start_pos.left + (final_pos.left - start_pos.left) * pos, 10)
658 };
659
660 if (typeof final_pos.opacity !== 'undefined') {
661 dim.opacity = pos < 0.5 ? 0.5 : pos;
662 }
663
664 wrap.css(dim);
665
666 content.css({
667 'width' : dim.width - currentOpts.padding * 2,
668 'height' : dim.height - (titleHeight * pos) - currentOpts.padding * 2
669 });
670 },
671
672 _get_viewport = function() {
673 return [
674 $(window).width() - (currentOpts.margin * 2),
675 $(window).height() - (currentOpts.margin * 2),
676 $(document).scrollLeft() + currentOpts.margin,
677 $(document).scrollTop() + currentOpts.margin
678 ];
679 },
680
681 _get_zoom_to = function () {
682 var view = _get_viewport(),
683 to = {},
684 resize = currentOpts.autoScale,
685 double_padding = currentOpts.padding * 2,
686 ratio;
687
688 if (currentOpts.width.toString().indexOf('%') > -1) {
689 to.width = parseInt((view[0] * parseFloat(currentOpts.width)) / 100, 10);
690 } else {
691 to.width = currentOpts.width + double_padding;
692 }
693
694 if (currentOpts.height.toString().indexOf('%') > -1) {
695 to.height = parseInt((view[1] * parseFloat(currentOpts.height)) / 100, 10);
696 } else {
697 to.height = currentOpts.height + double_padding;
698 }
699
700 if (resize && (to.width > view[0] || to.height > view[1])) {
701 if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') {
702 ratio = (currentOpts.width ) / (currentOpts.height );
703
704 if ((to.width ) > view[0]) {
705 to.width = view[0];
706 to.height = parseInt(((to.width - double_padding) / ratio) + double_padding, 10);
707 }
708
709 if ((to.height) > view[1]) {
710 to.height = view[1];
711 to.width = parseInt(((to.height - double_padding) * ratio) + double_padding, 10);
712 }
713
714 } else {
715 to.width = Math.min(to.width, view[0]);
716 to.height = Math.min(to.height, view[1]);
717 }
718 }
719
720 to.top = parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - to.height - 40) * 0.5)), 10);
721 to.left = parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - to.width - 40) * 0.5)), 10);
722
723 return to;
724 },
725
726 _get_obj_pos = function(obj) {
727 var pos = obj.offset();
728
729 pos.top += parseInt( obj.css('paddingTop'), 10 ) || 0;
730 pos.left += parseInt( obj.css('paddingLeft'), 10 ) || 0;
731
732 pos.top += parseInt( obj.css('border-top-width'), 10 ) || 0;
733 pos.left += parseInt( obj.css('border-left-width'), 10 ) || 0;
734
735 pos.width = obj.width();
736 pos.height = obj.height();
737
738 return pos;
739 },
740
741 _get_zoom_from = function() {
742 var orig = selectedOpts.orig ? $(selectedOpts.orig) : false,
743 from = {},
744 pos,
745 view;
746
747 if (orig && orig.length) {
748 pos = _get_obj_pos(orig);
749
750 from = {
751 width : pos.width + (currentOpts.padding * 2),
752 height : pos.height + (currentOpts.padding * 2),
753 top : pos.top - currentOpts.padding - 20,
754 left : pos.left - currentOpts.padding - 20
755 };
756
757 } else {
758 view = _get_viewport();
759
760 from = {
761 width : currentOpts.padding * 2,
762 height : currentOpts.padding * 2,
763 top : parseInt(view[3] + view[1] * 0.5, 10),
764 left : parseInt(view[2] + view[0] * 0.5, 10)
765 };
766 }
767
768 return from;
769 },
770
771 _animate_loading = function() {
772 if (!loading.is(':visible')){
773 clearInterval(loadingTimer);
774 return;
775 }
776
777 $('div', loading).css('top', (loadingFrame * -40) + 'px');
778
779 loadingFrame = (loadingFrame + 1) % 12;
780 };
781
782 /*
783 * Public methods
784 */
785
786 $.fn.fancybox = function(options) {
787 if (!$(this).length) {
788 return this;
789 }
790
791 $(this)
792 .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {})))
793 .unbind('click.fb')
794 .bind('click.fb', function(e) {
795 e.preventDefault();
796
797 if (busy) {
798 return;
799 }
800
801 busy = true;
802
803 $(this).blur();
804
805 selectedArray = [];
806 selectedIndex = 0;
807
808 var rel = $(this).attr('rel') || '';
809
810 if (!rel || rel == '' || rel === 'nofollow') {
811 selectedArray.push(this);
812
813 } else {
814 selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]");
815 selectedIndex = selectedArray.index( this );
816 }
817
818 _start();
819
820 return;
821 });
822
823 return this;
824 };
825
826 $.fancybox = function(obj) {
827 var opts;
828
829 if (busy) {
830 return;
831 }
832
833 busy = true;
834 opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {};
835
836 selectedArray = [];
837 selectedIndex = parseInt(opts.index, 10) || 0;
838
839 if ($.isArray(obj)) {
840 for (var i = 0, j = obj.length; i < j; i++) {
841 if (typeof obj[i] == 'object') {
842 $(obj[i]).data('fancybox', $.extend({}, opts, obj[i]));
843 } else {
844 obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts));
845 }
846 }
847
848 selectedArray = jQuery.merge(selectedArray, obj);
849
850 } else {
851 if (typeof obj == 'object') {
852 $(obj).data('fancybox', $.extend({}, opts, obj));
853 } else {
854 obj = $({}).data('fancybox', $.extend({content : obj}, opts));
855 }
856
857 selectedArray.push(obj);
858 }
859
860 if (selectedIndex > selectedArray.length || selectedIndex < 0) {
861 selectedIndex = 0;
862 }
863
864 _start();
865 };
866
867 $.fancybox.showActivity = function() {
868 clearInterval(loadingTimer);
869
870 loading.show();
871 loadingTimer = setInterval(_animate_loading, 66);
872 };
873
874 $.fancybox.hideActivity = function() {
875 loading.hide();
876 };
877
878 $.fancybox.next = function() {
879 return $.fancybox.pos( currentIndex + 1);
880 };
881
882 $.fancybox.prev = function() {
883 return $.fancybox.pos( currentIndex - 1);
884 };
885
886 $.fancybox.pos = function(pos) {
887 if (busy) {
888 return;
889 }
890
891 pos = parseInt(pos);
892
893 selectedArray = currentArray;
894
895 if (pos > -1 && pos < currentArray.length) {
896 selectedIndex = pos;
897 _start();
898
899 } else if (currentOpts.cyclic && currentArray.length > 1) {
900 selectedIndex = pos >= currentArray.length ? 0 : currentArray.length - 1;
901 _start();
902 }
903
904 return;
905 };
906
907 $.fancybox.cancel = function() {
908 if (busy) {
909 return;
910 }
911
912 busy = true;
913
914 $.event.trigger('fancybox-cancel');
915
916 _abort();
917
918 selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts);
919
920 busy = false;
921 };
922
923 // Note: within an iframe use - parent.$.fancybox.close();
924 $.fancybox.close = function() {
925 if (busy || wrap.is(':hidden')) {
926 return;
927 }
928
929 busy = true;
930
931 if (currentOpts && false === currentOpts.onCleanup(currentArray, currentIndex, currentOpts)) {
932 busy = false;
933 return;
934 }
935
936 _abort();
937
938 $(close.add( nav_left ).add( nav_right )).hide();
939
940 $(content.add( overlay )).unbind();
941
942 $(window).unbind("resize.fb scroll.fb");
943 $(document).unbind('keydown.fb');
944
945 content.find('iframe').attr('src', isIE6 && /^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank');
946
947 if (currentOpts.titlePosition !== 'inside') {
948 title.empty();
949 }
950
951 wrap.stop();
952
953 function _cleanup() {
954 overlay.fadeOut('fast');
955
956 title.empty().hide();
957 wrap.hide();
958
959 $.event.trigger('fancybox-cleanup');
960
961 content.empty();
962
963 currentOpts.onClosed(currentArray, currentIndex, currentOpts);
964
965 currentArray = selectedOpts = [];
966 currentIndex = selectedIndex = 0;
967 currentOpts = selectedOpts = {};
968
969 busy = false;
970 }
971
972 if (currentOpts.transitionOut == 'elastic') {
973 start_pos = _get_zoom_from();
974
975 var pos = wrap.position();
976
977 final_pos = {
978 top : pos.top ,
979 left : pos.left,
980 width : wrap.width(),
981 height : wrap.height()
982 };
983
984 if (currentOpts.opacity) {
985 final_pos.opacity = 1;
986 }
987
988 title.empty().hide();
989
990 fx.prop = 1;
991
992 $(fx).animate({ prop: 0 }, {
993 duration : currentOpts.speedOut,
994 easing : currentOpts.easingOut,
995 step : _draw,
996 complete : _cleanup
997 });
998
999 } else {
1000 wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup);
1001 }
1002 };
1003
1004 $.fancybox.resize = function() {
1005 if (overlay.is(':visible')) {
1006 overlay.css('height', $(document).height());
1007 }
1008
1009 $.fancybox.center(true);
1010 };
1011
1012 $.fancybox.center = function() {
1013 var view, align;
1014
1015 if (busy) {
1016 return;
1017 }
1018
1019 align = arguments[0] === true ? 1 : 0;
1020 view = _get_viewport();
1021
1022 if (!align && (wrap.width() > view[0] || wrap.height() > view[1])) {
1023 return;
1024 }
1025
1026 wrap
1027 .stop()
1028 .animate({
1029 'top' : parseInt(Math.max(view[3] - 20, view[3] + ((view[1] - content.height() - 40) * 0.5) - currentOpts.padding)),
1030 'left' : parseInt(Math.max(view[2] - 20, view[2] + ((view[0] - content.width() - 40) * 0.5) - currentOpts.padding))
1031 }, typeof arguments[0] == 'number' ? arguments[0] : 200);
1032 };
1033
1034 $.fancybox.init = function() {
1035 if ($("#fancybox-wrap").length) {
1036 return;
1037 }
1038
1039 $('body').append(
1040 tmp = $('<div id="fancybox-tmp"></div>'),
1041 loading = $('<div id="fancybox-loading"><div></div></div>'),
1042 overlay = $('<div id="fancybox-overlay"></div>'),
1043 wrap = $('<div id="fancybox-wrap"></div>')
1044 );
1045
1046 outer = $('<div id="fancybox-outer"></div>')
1047 .append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>')
1048 .appendTo( wrap );
1049
1050 outer.append(
1051 content = $('<div id="fancybox-content"></div>'),
1052 close = $('<a id="fancybox-close"></a>'),
1053 title = $('<div id="fancybox-title"></div>'),
1054
1055 nav_left = $('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),
1056 nav_right = $('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')
1057 );
1058
1059 close.click($.fancybox.close);
1060 loading.click($.fancybox.cancel);
1061
1062 nav_left.click(function(e) {
1063 e.preventDefault();
1064 $.fancybox.prev();
1065 });
1066
1067 nav_right.click(function(e) {
1068 e.preventDefault();
1069 $.fancybox.next();
1070 });
1071
1072 if ($.fn.mousewheel) {
1073 wrap.bind('mousewheel.fb', function(e, delta) {
1074 if (busy) {
1075 e.preventDefault();
1076
1077 } else if ($(e.target).get(0).clientHeight == 0 || $(e.target).get(0).scrollHeight === $(e.target).get(0).clientHeight) {
1078 e.preventDefault();
1079 $.fancybox[ delta > 0 ? 'prev' : 'next']();
1080 }
1081 });
1082 }
1083
1084 if (!$.support.opacity) {
1085 wrap.addClass('fancybox-ie');
1086 }
1087
1088 if (isIE6) {
1089 loading.addClass('fancybox-ie6');
1090 wrap.addClass('fancybox-ie6');
1091
1092 $('<iframe id="fancybox-hide-sel-frame" src="' + (/^https/i.test(window.location.href || '') ? 'javascript:void(false)' : 'about:blank' ) + '" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(outer);
1093 }
1094 };
1095
1096 $.fn.fancybox.defaults = {
1097 padding : 10,
1098 margin : 40,
1099 opacity : false,
1100 modal : false,
1101 cyclic : false,
1102 scrolling : 'auto', // 'auto', 'yes' or 'no'
1103
1104 width : 560,
1105 height : 340,
1106
1107 autoScale : true,
1108 autoDimensions : true,
1109 centerOnScroll : false,
1110
1111 ajax : {},
1112 swf : { wmode: 'transparent' },
1113
1114 hideOnOverlayClick : true,
1115 hideOnContentClick : false,
1116
1117 overlayShow : true,
1118 overlayOpacity : 0.7,
1119 overlayColor : '#777',
1120
1121 titleShow : true,
1122 titlePosition : 'float', // 'float', 'outside', 'inside' or 'over'
1123 titleFormat : null,
1124 titleFromAlt : false,
1125
1126 transitionIn : 'fade', // 'elastic', 'fade' or 'none'
1127 transitionOut : 'fade', // 'elastic', 'fade' or 'none'
1128
1129 speedIn : 300,
1130 speedOut : 300,
1131
1132 changeSpeed : 300,
1133 changeFade : 'fast',
1134
1135 easingIn : 'swing',
1136 easingOut : 'swing',
1137
1138 showCloseButton : true,
1139 showNavArrows : true,
1140 enableEscapeButton : true,
1141 enableKeyboardNav : true,
1142
1143 onStart : function(){},
1144 onCancel : function(){},
1145 onComplete : function(){},
1146 onCleanup : function(){},
1147 onClosed : function(){},
1148 onError : function(){}
1149 };
1150
1151 $(document).ready(function() {
1152 $.fancybox.init();
1153 });
1154
1155 })(jQuery);
0 /*
1 * FancyBox - jQuery Plugin
2 * Simple and fancy lightbox alternative
3 *
4 * Examples and documentation at: http://fancybox.net
5 *
6 * Copyright (c) 2008 - 2010 Janis Skarnelis
7 * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
8 *
9 * Version: 1.3.4 (11/11/2010)
10 * Requires: jQuery v1.3+
11 *
12 * Dual licensed under the MIT and GPL licenses:
13 * http://www.opensource.org/licenses/mit-license.php
14 * http://www.gnu.org/licenses/gpl.html
15 */
16
17 ;(function(b){var m,t,u,f,D,j,E,n,z,A,q=0,e={},o=[],p=0,d={},l=[],G=null,v=new Image,J=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,W=/[^\.]\.(swf)\s*$/i,K,L=1,y=0,s="",r,i,h=false,B=b.extend(b("<div/>")[0],{prop:0}),M=b.browser.msie&&b.browser.version<7&&!window.XMLHttpRequest,N=function(){t.hide();v.onerror=v.onload=null;G&&G.abort();m.empty()},O=function(){if(false===e.onError(o,q,e)){t.hide();h=false}else{e.titleShow=false;e.width="auto";e.height="auto";m.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>');
18 F()}},I=function(){var a=o[q],c,g,k,C,P,w;N();e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));w=e.onStart(o,q,e);if(w===false)h=false;else{if(typeof w=="object")e=b.extend(e,w);k=e.title||(a.nodeName?b(a).attr("title"):a.title)||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(k===""&&e.orig&&e.titleFromAlt)k=e.orig.attr("alt");c=e.href||(a.nodeName?b(a).attr("href"):a.href)||null;if(/^(?:javascript)/i.test(c)||
19 c=="#")c=null;if(e.type){g=e.type;if(!c)c=e.content}else if(e.content)g="html";else if(c)g=c.match(J)?"image":c.match(W)?"swf":b(a).hasClass("iframe")?"iframe":c.indexOf("#")===0?"inline":"ajax";if(g){if(g=="inline"){a=c.substr(c.indexOf("#"));g=b(a).length>0?"inline":"ajax"}e.type=g;e.href=c;e.title=k;if(e.autoDimensions)if(e.type=="html"||e.type=="inline"||e.type=="ajax"){e.width="auto";e.height="auto"}else e.autoDimensions=false;if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick=
20 false;e.enableEscapeButton=false;e.showCloseButton=false}e.padding=parseInt(e.padding,10);e.margin=parseInt(e.margin,10);m.css("padding",e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(j.children())});switch(g){case "html":m.html(e.content);F();break;case "inline":if(b(a).parent().is("#fancybox-content")===true){h=false;break}b('<div class="fancybox-inline-tmp" />').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(j.children())}).bind("fancybox-cancel",
21 function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();v=new Image;v.onerror=function(){O()};v.onload=function(){h=true;v.onerror=v.onload=null;e.width=v.width;e.height=v.height;b("<img />").attr({id:"fancybox-img",src:v.src,alt:e.title}).appendTo(m);Q()};v.src=c;break;case "swf":e.scrolling="no";C='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+e.width+'" height="'+e.height+'"><param name="movie" value="'+c+
22 '"></param>';P="";b.each(e.swf,function(x,H){C+='<param name="'+x+'" value="'+H+'"></param>';P+=" "+x+'="'+H+'"'});C+='<embed src="'+c+'" type="application/x-shockwave-flash" width="'+e.width+'" height="'+e.height+'"'+P+"></embed></object>";m.html(C);F();break;case "ajax":h=false;b.fancybox.showActivity();e.ajax.win=e.ajax.success;G=b.ajax(b.extend({},e.ajax,{url:c,data:e.ajax.data||{},error:function(x){x.status>0&&O()},success:function(x,H,R){if((typeof R=="object"?R:G).status==200){if(typeof e.ajax.win==
23 "function"){w=e.ajax.win(c,x,H,R);if(w===false){t.hide();return}else if(typeof w=="string"||typeof w=="object")x=w}m.html(x);F()}}}));break;case "iframe":Q()}}else O()}},F=function(){var a=e.width,c=e.height;a=a.toString().indexOf("%")>-1?parseInt((b(window).width()-e.margin*2)*parseFloat(a)/100,10)+"px":a=="auto"?"auto":a+"px";c=c.toString().indexOf("%")>-1?parseInt((b(window).height()-e.margin*2)*parseFloat(c)/100,10)+"px":c=="auto"?"auto":c+"px";m.wrapInner('<div style="width:'+a+";height:"+c+
24 ";overflow: "+(e.scrolling=="auto"?"auto":e.scrolling=="yes"?"scroll":"hidden")+';position:relative;"></div>');e.width=m.width();e.height=m.height();Q()},Q=function(){var a,c;t.hide();if(f.is(":visible")&&false===d.onCleanup(l,p,d)){b.event.trigger("fancybox-cancel");h=false}else{h=true;b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");f.is(":visible")&&d.titlePosition!=="outside"&&f.css("height",f.height());l=o;p=q;d=e;if(d.overlayShow){u.css({"background-color":d.overlayColor,
25 opacity:d.overlayOpacity,cursor:d.hideOnOverlayClick?"pointer":"auto",height:b(document).height()});if(!u.is(":visible")){M&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});u.show()}}else u.hide();i=X();s=d.title||"";y=0;n.empty().removeAttr("style").removeClass();if(d.titleShow!==false){if(b.isFunction(d.titleFormat))a=d.titleFormat(s,l,p,d);else a=s&&s.length?
26 d.titlePosition=="float"?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+s+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+d.titlePosition+'">'+s+"</div>":false;s=a;if(!(!s||s==="")){n.addClass("fancybox-title-"+d.titlePosition).html(s).appendTo("body").show();switch(d.titlePosition){case "inside":n.css({width:i.width-d.padding*2,marginLeft:d.padding,marginRight:d.padding});
27 y=n.outerHeight(true);n.appendTo(D);i.height+=y;break;case "over":n.css({marginLeft:d.padding,width:i.width-d.padding*2,bottom:d.padding}).appendTo(D);break;case "float":n.css("left",parseInt((n.width()-i.width-40)/2,10)*-1).appendTo(f);break;default:n.css({width:i.width-d.padding*2,paddingLeft:d.padding,paddingRight:d.padding}).appendTo(f)}}}n.hide();if(f.is(":visible")){b(E.add(z).add(A)).hide();a=f.position();r={top:a.top,left:a.left,width:f.width(),height:f.height()};c=r.width==i.width&&r.height==
28 i.height;j.fadeTo(d.changeFade,0.3,function(){var g=function(){j.html(m.contents()).fadeTo(d.changeFade,1,S)};b.event.trigger("fancybox-change");j.empty().removeAttr("filter").css({"border-width":d.padding,width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2});if(c)g();else{B.prop=0;b(B).animate({prop:1},{duration:d.changeSpeed,easing:d.easingChange,step:T,complete:g})}})}else{f.removeAttr("style");j.css("border-width",d.padding);if(d.transitionIn=="elastic"){r=V();j.html(m.contents());
29 f.show();if(d.opacity)i.opacity=0;B.prop=0;b(B).animate({prop:1},{duration:d.speedIn,easing:d.easingIn,step:T,complete:S})}else{d.titlePosition=="inside"&&y>0&&n.show();j.css({width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2}).html(m.contents());f.css(i).fadeIn(d.transitionIn=="none"?0:d.speedIn,S)}}}},Y=function(){if(d.enableEscapeButton||d.enableKeyboardNav)b(document).bind("keydown.fb",function(a){if(a.keyCode==27&&d.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if((a.keyCode==
30 37||a.keyCode==39)&&d.enableKeyboardNav&&a.target.tagName!=="INPUT"&&a.target.tagName!=="TEXTAREA"&&a.target.tagName!=="SELECT"){a.preventDefault();b.fancybox[a.keyCode==37?"prev":"next"]()}});if(d.showNavArrows){if(d.cyclic&&l.length>1||p!==0)z.show();if(d.cyclic&&l.length>1||p!=l.length-1)A.show()}else{z.hide();A.hide()}},S=function(){if(!b.support.opacity){j.get(0).style.removeAttribute("filter");f.get(0).style.removeAttribute("filter")}e.autoDimensions&&j.css("height","auto");f.css("height","auto");
31 s&&s.length&&n.show();d.showCloseButton&&E.show();Y();d.hideOnContentClick&&j.bind("click",b.fancybox.close);d.hideOnOverlayClick&&u.bind("click",b.fancybox.close);b(window).bind("resize.fb",b.fancybox.resize);d.centerOnScroll&&b(window).bind("scroll.fb",b.fancybox.center);if(d.type=="iframe")b('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(b.browser.msie?'allowtransparency="true""':"")+' scrolling="'+e.scrolling+'" src="'+d.href+'"></iframe>').appendTo(j);
32 f.show();h=false;b.fancybox.center();d.onComplete(l,p,d);var a,c;if(l.length-1>p){a=l[p+1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}if(p>0){a=l[p-1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}},T=function(a){var c={width:parseInt(r.width+(i.width-r.width)*a,10),height:parseInt(r.height+(i.height-r.height)*a,10),top:parseInt(r.top+(i.top-r.top)*a,10),left:parseInt(r.left+(i.left-r.left)*a,10)};if(typeof i.opacity!=="undefined")c.opacity=a<0.5?0.5:a;f.css(c);
33 j.css({width:c.width-d.padding*2,height:c.height-y*a-d.padding*2})},U=function(){return[b(window).width()-d.margin*2,b(window).height()-d.margin*2,b(document).scrollLeft()+d.margin,b(document).scrollTop()+d.margin]},X=function(){var a=U(),c={},g=d.autoScale,k=d.padding*2;c.width=d.width.toString().indexOf("%")>-1?parseInt(a[0]*parseFloat(d.width)/100,10):d.width+k;c.height=d.height.toString().indexOf("%")>-1?parseInt(a[1]*parseFloat(d.height)/100,10):d.height+k;if(g&&(c.width>a[0]||c.height>a[1]))if(e.type==
34 "image"||e.type=="swf"){g=d.width/d.height;if(c.width>a[0]){c.width=a[0];c.height=parseInt((c.width-k)/g+k,10)}if(c.height>a[1]){c.height=a[1];c.width=parseInt((c.height-k)*g+k,10)}}else{c.width=Math.min(c.width,a[0]);c.height=Math.min(c.height,a[1])}c.top=parseInt(Math.max(a[3]-20,a[3]+(a[1]-c.height-40)*0.5),10);c.left=parseInt(Math.max(a[2]-20,a[2]+(a[0]-c.width-40)*0.5),10);return c},V=function(){var a=e.orig?b(e.orig):false,c={};if(a&&a.length){c=a.offset();c.top+=parseInt(a.css("paddingTop"),
35 10)||0;c.left+=parseInt(a.css("paddingLeft"),10)||0;c.top+=parseInt(a.css("border-top-width"),10)||0;c.left+=parseInt(a.css("border-left-width"),10)||0;c.width=a.width();c.height=a.height();c={width:c.width+d.padding*2,height:c.height+d.padding*2,top:c.top-d.padding-20,left:c.left-d.padding-20}}else{a=U();c={width:d.padding*2,height:d.padding*2,top:parseInt(a[3]+a[1]*0.5,10),left:parseInt(a[2]+a[0]*0.5,10)}}return c},Z=function(){if(t.is(":visible")){b("div",t).css("top",L*-40+"px");L=(L+1)%12}else clearInterval(K)};
36 b.fn.fancybox=function(a){if(!b(this).length)return this;b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(c){c.preventDefault();if(!h){h=true;b(this).blur();o=[];q=0;c=b(this).attr("rel")||"";if(!c||c==""||c==="nofollow")o.push(this);else{o=b("a[rel="+c+"], area[rel="+c+"]");q=o.index(this)}I()}});return this};b.fancybox=function(a,c){var g;if(!h){h=true;g=typeof c!=="undefined"?c:{};o=[];q=parseInt(g.index,10)||0;if(b.isArray(a)){for(var k=
37 0,C=a.length;k<C;k++)if(typeof a[k]=="object")b(a[k]).data("fancybox",b.extend({},g,a[k]));else a[k]=b({}).data("fancybox",b.extend({content:a[k]},g));o=jQuery.merge(o,a)}else{if(typeof a=="object")b(a).data("fancybox",b.extend({},g,a));else a=b({}).data("fancybox",b.extend({content:a},g));o.push(a)}if(q>o.length||q<0)q=0;I()}};b.fancybox.showActivity=function(){clearInterval(K);t.show();K=setInterval(Z,66)};b.fancybox.hideActivity=function(){t.hide()};b.fancybox.next=function(){return b.fancybox.pos(p+
38 1)};b.fancybox.prev=function(){return b.fancybox.pos(p-1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a);o=l;if(a>-1&&a<l.length){q=a;I()}else if(d.cyclic&&l.length>1){q=a>=l.length?0:l.length-1;I()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");N();e.onCancel(o,q,e);h=false}};b.fancybox.close=function(){function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger("fancybox-cleanup");j.empty();d.onClosed(l,p,d);l=e=[];p=q=0;d=e={};h=false}if(!(h||f.is(":hidden"))){h=
39 true;if(d&&false===d.onCleanup(l,p,d))h=false;else{N();b(E.add(z).add(A)).hide();b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");j.find("iframe").attr("src",M&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");d.titlePosition!=="inside"&&n.empty();f.stop();if(d.transitionOut=="elastic"){r=V();var c=f.position();i={top:c.top,left:c.left,width:f.width(),height:f.height()};if(d.opacity)i.opacity=1;n.empty().hide();B.prop=1;
40 b(B).animate({prop:0},{duration:d.speedOut,easing:d.easingOut,step:T,complete:a})}else f.fadeOut(d.transitionOut=="none"?0:d.speedOut,a)}}};b.fancybox.resize=function(){u.is(":visible")&&u.css("height",b(document).height());b.fancybox.center(true)};b.fancybox.center=function(a){var c,g;if(!h){g=a===true?1:0;c=U();!g&&(f.width()>c[0]||f.height()>c[1])||f.stop().animate({top:parseInt(Math.max(c[3]-20,c[3]+(c[1]-j.height()-40)*0.5-d.padding)),left:parseInt(Math.max(c[2]-20,c[2]+(c[0]-j.width()-40)*0.5-
41 d.padding))},typeof a=="number"?a:200)}};b.fancybox.init=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('<div id="fancybox-tmp"></div>'),t=b('<div id="fancybox-loading"><div></div></div>'),u=b('<div id="fancybox-overlay"></div>'),f=b('<div id="fancybox-wrap"></div>'));D=b('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(f);
42 D.append(j=b('<div id="fancybox-content"></div>'),E=b('<a id="fancybox-close"></a>'),n=b('<div id="fancybox-title"></div>'),z=b('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),A=b('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()});
43 b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(D)}}};
44 b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",
45 easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery);
0 /*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
1 * Licensed under the MIT License (LICENSE.txt).
2 *
3 * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
4 * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
5 * Thanks to: Seamus Leahy for adding deltaX and deltaY
6 *
7 * Version: 3.0.4
8 *
9 * Requires: 1.2.2+
10 */
11
12 (function(d){function g(a){var b=a||window.event,i=[].slice.call(arguments,1),c=0,h=0,e=0;a=d.event.fix(b);a.type="mousewheel";if(a.wheelDelta)c=a.wheelDelta/120;if(a.detail)c=-a.detail/3;e=c;if(b.axis!==undefined&&b.axis===b.HORIZONTAL_AXIS){e=0;h=-1*c}if(b.wheelDeltaY!==undefined)e=b.wheelDeltaY/120;if(b.wheelDeltaX!==undefined)h=-1*b.wheelDeltaX/120;i.unshift(a,c,h,e);return d.event.handle.apply(this,i)}var f=["DOMMouseScroll","mousewheel"];d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=
13 f.length;a;)this.addEventListener(f[--a],g,false);else this.onmousewheel=g},teardown:function(){if(this.removeEventListener)for(var a=f.length;a;)this.removeEventListener(f[--a],g,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
0 /*
1 * FancyBox - jQuery Plugin
2 * Simple and fancy lightbox alternative
3 *
4 * Examples and documentation at: http://fancybox.net
5 *
6 * Copyright (c) 2008 - 2010 Janis Skarnelis
7 * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
8 *
9 * Version: 1.3.4 (11/11/2010)
10 * Requires: jQuery v1.3+
11 *
12 * Dual licensed under the MIT and GPL licenses:
13 * http://www.opensource.org/licenses/mit-license.php
14 * http://www.gnu.org/licenses/gpl.html
15 */
16
17 #fancybox-loading {
18 position: fixed;
19 top: 50%;
20 left: 50%;
21 width: 40px;
22 height: 40px;
23 margin-top: -20px;
24 margin-left: -20px;
25 cursor: pointer;
26 overflow: hidden;
27 z-index: 1104;
28 display: none;
29 }
30
31 #fancybox-loading div {
32 position: absolute;
33 top: 0;
34 left: 0;
35 width: 40px;
36 height: 480px;
37 background-image: url('img/fancybox/fancybox.png');
38 }
39
40 #fancybox-overlay {
41 position: absolute;
42 top: 0;
43 left: 0;
44 width: 100%;
45 z-index: 1100;
46 display: none;
47 }
48
49 #fancybox-tmp {
50 padding: 0;
51 margin: 0;
52 border: 0;
53 overflow: auto;
54 display: none;
55 }
56
57 #fancybox-wrap {
58 position: absolute;
59 top: 0;
60 left: 0;
61 padding: 20px;
62 z-index: 1101;
63 outline: none;
64 display: none;
65 }
66
67 #fancybox-outer {
68 position: relative;
69 width: 100%;
70 height: 100%;
71 background: #fff;
72 }
73
74 #fancybox-wrap,
75 #fancybox-wrap *{
76 -webkit-box-sizing: content-box; /* Safari/Chrome, other WebKit */
77 -moz-box-sizing: content-box; /* Firefox, other Gecko */
78 box-sizing: content-box; /* Opera/IE 8+ */
79 }
80
81 #fancybox-content {
82 width: 0;
83 height: 0;
84 padding: 0;
85 outline: none;
86 position: relative;
87 overflow: hidden;
88 z-index: 1102;
89 border: 0 solid #fff;
90 }
91
92 #fancybox-hide-sel-frame {
93 position: absolute;
94 top: 0;
95 left: 0;
96 width: 100%;
97 height: 100%;
98 background: transparent;
99 z-index: 1101;
100 }
101
102 #fancybox-close {
103 position: absolute;
104 top: -15px;
105 right: -15px;
106 width: 30px;
107 height: 30px;
108 background: transparent url('img/fancybox/fancybox.png') -40px 0;
109 cursor: pointer;
110 z-index: 1103;
111 display: none;
112 }
113
114 #fancybox-error {
115 color: #444;
116 font: normal 12px/20px Arial;
117 padding: 14px;
118 margin: 0;
119 }
120
121 #fancybox-img {
122 width: 100%;
123 height: 100%;
124 padding: 0;
125 margin: 0;
126 border: none;
127 outline: none;
128 line-height: 0;
129 vertical-align: top;
130 }
131
132 #fancybox-frame {
133 width: 100%;
134 height: 100%;
135 border: none;
136 display: block;
137 }
138
139 #fancybox-left, #fancybox-right {
140 position: absolute;
141 bottom: 0;
142 height: 100%;
143 width: 35%;
144 cursor: pointer;
145 outline: none;
146 background: transparent url('img/fancybox/blank.gif');
147 z-index: 1102;
148 display: none;
149 }
150
151 #fancybox-left {
152 left: 0;
153 }
154
155 #fancybox-right {
156 right: 0;
157 }
158
159 #fancybox-left-ico, #fancybox-right-ico {
160 position: absolute;
161 top: 50%;
162 left: -9999px;
163 width: 30px;
164 height: 30px;
165 margin-top: -15px;
166 cursor: pointer;
167 z-index: 1102;
168 display: block;
169 }
170
171 #fancybox-left-ico {
172 background-image: url('img/fancybox/fancybox.png');
173 background-position: -40px -30px;
174 }
175
176 #fancybox-right-ico {
177 background-image: url('img/fancybox/fancybox.png');
178 background-position: -40px -60px;
179 }
180
181 #fancybox-left:hover, #fancybox-right:hover {
182 visibility: visible; /* IE6 */
183 }
184
185 #fancybox-left:hover span {
186 left: 20px;
187 }
188
189 #fancybox-right:hover span {
190 left: auto;
191 right: 20px;
192 }
193
194 .fancybox-bg {
195 position: absolute;
196 padding: 0;
197 margin: 0;
198 border: 0;
199 width: 20px;
200 height: 20px;
201 z-index: 1001;
202 }
203
204 #fancybox-bg-n {
205 top: -20px;
206 left: 0;
207 width: 100%;
208 background-image: url('img/fancybox/fancybox-x.png');
209 }
210
211 #fancybox-bg-ne {
212 top: -20px;
213 right: -20px;
214 background-image: url('img/fancybox/fancybox.png');
215 background-position: -40px -162px;
216 }
217
218 #fancybox-bg-e {
219 top: 0;
220 right: -20px;
221 height: 100%;
222 background-image: url('img/fancybox/fancybox-y.png');
223 background-position: -20px 0;
224 }
225
226 #fancybox-bg-se {
227 bottom: -20px;
228 right: -20px;
229 background-image: url('img/fancybox/fancybox.png');
230 background-position: -40px -182px;
231 }
232
233 #fancybox-bg-s {
234 bottom: -20px;
235 left: 0;
236 width: 100%;
237 background-image: url('img/fancybox/fancybox-x.png');
238 background-position: 0 -20px;
239 }
240
241 #fancybox-bg-sw {
242 bottom: -20px;
243 left: -20px;
244 background-image: url('img/fancybox/fancybox.png');
245 background-position: -40px -142px;
246 }
247
248 #fancybox-bg-w {
249 top: 0;
250 left: -20px;
251 height: 100%;
252 background-image: url('img/fancybox/fancybox-y.png');
253 }
254
255 #fancybox-bg-nw {
256 top: -20px;
257 left: -20px;
258 background-image: url('img/fancybox/fancybox.png');
259 background-position: -40px -122px;
260 }
261
262 #fancybox-title {
263 font-family: Helvetica;
264 font-size: 12px;
265 z-index: 1102;
266 }
267
268 .fancybox-title-inside {
269 padding-bottom: 10px;
270 text-align: center;
271 color: #333;
272 background: #fff;
273 position: relative;
274 }
275
276 .fancybox-title-outside {
277 padding-top: 10px;
278 color: #fff;
279 }
280
281 .fancybox-title-over {
282 position: absolute;
283 bottom: 0;
284 left: 0;
285 color: #FFF;
286 text-align: left;
287 }
288
289 #fancybox-title-over {
290 padding: 10px;
291 background-image: url('img/fancybox/fancy_title_over.png');
292 display: block;
293 }
294
295 .fancybox-title-float {
296 position: absolute;
297 left: 0;
298 bottom: -20px;
299 height: 32px;
300 }
301
302 #fancybox-title-float-wrap {
303 border: none;
304 border-collapse: collapse;
305 width: auto;
306 }
307
308 #fancybox-title-float-wrap td {
309 border: none;
310 white-space: nowrap;
311 }
312
313 #fancybox-title-float-left {
314 padding: 0 0 0 15px;
315 background: url('img/fancybox/fancybox.png') -40px -90px no-repeat;
316 }
317
318 #fancybox-title-float-main {
319 color: #FFF;
320 line-height: 29px;
321 font-weight: bold;
322 padding: 0 0 3px 0;
323 background: url('img/fancybox/fancybox-x.png') 0 -40px;
324 }
325
326 #fancybox-title-float-right {
327 padding: 0 0 0 15px;
328 background: url('img/fancybox/fancybox.png') -55px -90px no-repeat;
329 }
330
331 /* IE6 */
332
333 .fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_close.png', sizingMethod='scale'); }
334
335 .fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_nav_left.png', sizingMethod='scale'); }
336 .fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_nav_right.png', sizingMethod='scale'); }
337
338 .fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
339 .fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_title_left.png', sizingMethod='scale'); }
340 .fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_title_main.png', sizingMethod='scale'); }
341 .fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_title_right.png', sizingMethod='scale'); }
342
343 .fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame {
344 height: expression(this.parentNode.clientHeight + "px");
345 }
346
347 #fancybox-loading.fancybox-ie6 {
348 position: absolute; margin-top: 0;
349 top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px');
350 }
351
352 #fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_loading.png', sizingMethod='scale'); }
353
354 /* IE6, IE7, IE8 */
355
356 .fancybox-ie .fancybox-bg { background: transparent !important; }
357
358 .fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
359 .fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
360 .fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
361 .fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
362 .fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
363 .fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_sw.png', sizingMethod='scale'); }
364 .fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_w.png', sizingMethod='scale'); }
365 .fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='img/fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }
0 html,
1 body {
2 min-height: 100%;
3 min-height: 100vh;
4 margin: 0px;
5 padding: 0px;
6 }
7 .contents {
8 padding-top: 10px;
9 }
10 #chart_div {
11 margin: 0 auto;
12 }
13 .showConfigButton {
14 display: inline-block !important;
15 }
16 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .thumbnail {
17 display: block;
18 overflow-y: hidden;
19 overflow-x: hidden;
20 position: relative;
21 -webkit-transition: background-color 300ms linear;
22 -moz-transition: background-color 300ms linear;
23 -o-transition: background-color 300ms linear;
24 transition: background-color 300ms linear;
25 }
26 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .thumbnail > .thumbImg {
27 display: block;
28 margin-left: auto;
29 margin-right: auto;
30 background-color: white;
31 width: 100%;
32 }
33 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .subTitle {
34 display: block;
35 font-family: Georgia, "Times New Roman", Times, serif;
36 font-style: italic;
37 font-weight: 400;
38 color: gray;
39 font-size: 0.8em;
40 text-align: left;
41 }
42 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .title {
43 display: block;
44 margin-left: auto;
45 margin-right: auto;
46 margin-top: 2px;
47 text-align: left;
48 font-size: 0.9em;
49 font-family: 'Helvetica Neue Custom', 'Helvetica Neue', Helvetica, Arial, sans-serif;
50 font-weight: 700;
51 }
52 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem:hover .thumbImg {
53 box-shadow: 0px 0px 4px black;
54 }
55 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem[highlight=true] > .content .thumbnail {
56 background-color: orangered;
57 }
58 .pageTitle {
59 text-align: center;
60 padding-top: 10px;
61 font-family: 'Montserrat', sans-serif;
62 font-size: 1.8em;
63 text-shadow: 2px 2px 0px lightgray;
64 text-transform: capitalize;
65 }
66 .pageSubtitle {
67 text-align: center;
68 font-family: 'Montserrat', sans-serif;
69 padding-top: 10px;
70 padding-bottom: 5px;
71 font-size: 0.9em;
72 font-weight: 300;
73 line-height: 1.5em;
74 }
75 #infobox {
76 position: fixed;
77 left: 0px;
78 right: 0px;
79 bottom: 0px;
80 text-align: center;
81 font-weight: 300;
82 font-family: sans-serif;
83 font-size: 0.8em;
84 padding: 3px 120px 3px 120px;
85 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0d…g9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNsZXNzaGF0LWdlbmVyYXRlZCkiIC8+PC9zdmc+);
86 background-image: -webkit-linear-gradient(bottom, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
87 background-image: -moz-linear-gradient(bottom, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
88 background-image: -o-linear-gradient(bottom, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
89 background-image: linear-gradient(to top, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
90 }
91 #infobox a {
92 color: black;
93 font-weight: 500;
94 }
95 #infobox a:hover {
96 color: orangered;
97 }
98 #infobox .fa {
99 color: gray;
100 }
101 .keshif_logo {
102 position: absolute;
103 display: block;
104 top: 5px;
105 left: 5px;
106 width: 33px;
107 height: 33px;
108 font-size: 12px;
109 overflow: hidden;
110 cursor: auto;
111 -webkit-transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
112 -moz-transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
113 -o-transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
114 transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
115 border-radius: 5px;
116 cursor: pointer;
117 text-decoration: none;
118 }
119 .keshif_logo:hover {
120 background-color: #EEEEEE;
121 width: 200px;
122 }
123 .keshif_logo > .keshif_logo_img {
124 height: 33px;
125 float: left;
126 }
127 .keshif_logo > .keshif_logo_content {
128 display: block;
129 width: 300px;
130 font-family: Verdana, Arial, Helvetica, sans-serif;
131 letter-spacing: .12em;
132 color: #727365;
133 vertical-align: center;
134 }
135 .comment_popup {
136 position: fixed;
137 top: 5px;
138 left: 5px;
139 cursor: pointer;
140 }
141 .comment_popup .fa-stack {
142 float: left;
143 clear: left;
144 height: 1.5em;
145 margin-top: -15px;
146 margin-left: -15px;
147 font-size: 2em;
148 }
149 .comment_popup .fa-comment {
150 color: #ffcd2e;
151 }
152 .comment_popup .texttt {
153 font-family: sans-serif;
154 font-weight: 300;
155 font-size: 0.8em;
156 }
157 .comment_popup:hover .texttt {
158 color: orangered;
159 }
160 .comment_popup:hover .fa-comment {
161 color: orangered;
162 }
163 .forkongithub {
164 position: fixed;
165 display: block;
166 z-index: 0;
167 }
168 .forkongithub a.fork-ribbon {
169 background: #000;
170 color: #fff;
171 text-decoration: none;
172 font-family: arial, sans-serif;
173 text-align: center;
174 font-weight: bold;
175 padding: 5px 40px;
176 font-size: 0.8rem;
177 line-height: 1.5rem;
178 position: relative;
179 transition: 0.5s;
180 }
181 .forkongithub a.fork-ribbon::before,
182 .forkongithub a.fork-ribbon::after {
183 width: 100%;
184 display: block;
185 position: absolute;
186 top: 1px;
187 left: 0;
188 height: 1px;
189 background: #fff;
190 content: "";
191 }
192 .forkongithub a.fork-ribbon::after {
193 bottom: 1px;
194 top: auto;
195 }
196 .forkongithub a.fork-ribbon:hover {
197 background: orangered;
198 color: #fff;
199 }
200 @media screen and (min-width: 800px) {
201 .forkongithub {
202 width: 0px;
203 height: 150px;
204 }
205 .forkongithub.fork-bottom {
206 bottom: 0;
207 }
208 .forkongithub.fork-right {
209 right: 0;
210 }
211 .forkongithub.fork-right a.fork-ribbon {
212 font-size: 1.1em;
213 -webkit-transform: rotate(-45deg);
214 -moz-transform: rotate(-45deg);
215 -o-transform: rotate(-45deg);
216 -ms-transform: rotate(-45deg);
217 transform: rotate(-45deg);
218 }
219 .forkongithub.fork-left {
220 left: -60px;
221 }
222 .forkongithub.fork-left a.fork-ribbon {
223 -webkit-transform: rotate(45deg);
224 -moz-transform: rotate(45deg);
225 -o-transform: rotate(45deg);
226 -ms-transform: rotate(45deg);
227 transform: rotate(45deg);
228 right: auto;
229 left: 0px;
230 }
231 .forkongithub a.fork-ribbon {
232 width: 150px;
233 position: absolute;
234 top: 80px;
235 right: -60px;
236 box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
237 }
238 }
0 /*********************************
1 kshf library
2
3 Copyright (c) 20014-2015, University of Maryland
4 All rights reserved.
5
6 Redistribution and use in source and binary forms, with or without
7 modification, are permitted provided that the following conditions are met:
8
9 * Redistributions of source code must retain the above copyright notice, this
10 list of conditions and the following disclaimer.
11
12 * Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
15
16 * Neither the name of the University of Maryland nor the names of its contributors
17 may not be used to endorse or promote products derived from this software
18 without specific prior written permission.
19
20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23 DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
24 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
27 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
28 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
29 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
31 ************************************ */
32 .kshf {
33 display: -webkit-box;
34 display: -moz-box;
35 display: -webkit-flex;
36 display: -ms-flexbox;
37 display: flex;
38 -webkit-box-direction: normal;
39 -moz-box-direction: normal;
40 -webkit-box-orient: vertical;
41 -moz-box-orient: vertical;
42 -webkit-flex-direction: column;
43 -ms-flex-direction: column;
44 flex-direction: column;
45 position: relative;
46 left: 0px;
47 font-family: 'Roboto', Helvetica, Arial, sans-serif;
48 text-rendering: optimizeLegibility;
49 -webkit-transition: left 300ms ease-in-out;
50 -moz-transition: left 300ms ease-in-out;
51 -o-transition: left 300ms ease-in-out;
52 transition: left 300ms ease-in-out;
53 -webkit-box-sizing: border-box;
54 -moz-box-sizing: border-box;
55 box-sizing: border-box;
56 }
57 .kshf * {
58 -webkit-box-sizing: border-box;
59 -moz-box-sizing: border-box;
60 box-sizing: border-box;
61 }
62 .kshf[noanim=false] .aggr {
63 -webkit-transition: -webkit-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
64 -moz-transition: -moz-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
65 -o-transition: -o-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
66 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
67 }
68 .kshf[noanim=false] .chartAxis_Measure {
69 -webkit-transition: -webkit-transform 700ms ease-in-out, background-color 250ms ease-in-out;
70 -moz-transition: -moz-transform 700ms ease-in-out, background-color 250ms ease-in-out;
71 -o-transition: -o-transform 700ms ease-in-out, background-color 250ms ease-in-out;
72 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out, background-color 250ms ease-in-out;
73 }
74 .kshf[noanim=false] .chartAxis_Measure .tick {
75 -webkit-transition: -webkit-transform 500ms ease-out;
76 -moz-transition: -moz-transform 500ms ease-out;
77 -o-transition: -o-transform 500ms ease-out;
78 transition: -webkit-transform 500ms ease-out,-moz-transform 500ms ease-out,-o-transform 500ms ease-out,transform 500ms ease-out;
79 }
80 .kshf[noanim=false] .attrib {
81 -webkit-transition: all 700ms ease-in-out;
82 -moz-transition: all 700ms ease-in-out;
83 -o-transition: all 700ms ease-in-out;
84 transition: all 700ms ease-in-out;
85 }
86 .kshf[noanim=false] .wrapper {
87 -webkit-transition: height 700ms ease-in-out;
88 -moz-transition: height 700ms ease-in-out;
89 -o-transition: height 700ms ease-in-out;
90 transition: height 700ms ease-in-out;
91 }
92 .kshf[noanim=false] .panels_Above {
93 -webkit-transition: height 700ms ease-in-out;
94 -moz-transition: height 700ms ease-in-out;
95 -o-transition: height 700ms ease-in-out;
96 transition: height 700ms ease-in-out;
97 }
98 .kshf[noanim=false] .controlLine > .base {
99 -webkit-transition: -webkit-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
100 -moz-transition: -moz-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
101 -o-transition: -o-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
102 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
103 }
104 .kshf[noanim=false] .controlLine > .handle {
105 -webkit-transition: -webkit-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
106 -moz-transition: -moz-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
107 -o-transition: -o-transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
108 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out, background-color 100ms linear, opacity 200ms linear;
109 }
110 .kshf[drag_cursor="grab"] {
111 cursor: -moz-grab;
112 cursor: -webkit-grab;
113 cursor: grab;
114 }
115 .kshf[drag_cursor="grabbing"] {
116 cursor: -moz-grabbing;
117 cursor: -webkit-grabbing;
118 cursor: grabbing;
119 }
120 .kshf .panel[catLabelDragging=true] .kshfChart > .wrapper > .facetCategorical > .attribGroup > .chartCatLabelResize {
121 display: block;
122 border-left: solid lightgray 2px;
123 }
124 .kshf[attribsShown=true] {
125 left: 120px;
126 }
127 .kshf[attribsShown=true] > .attributePanel {
128 display: -webkit-box;
129 display: -moz-box;
130 display: -webkit-flex;
131 display: -ms-flexbox;
132 display: flex;
133 }
134 .kshf[attribsShown=true] .kshfChart:hover > .wrapper > .facetCategorical > .attribGroup > .chartCatLabelResize {
135 display: block;
136 }
137 .kshf[attribsShown=true] .recordDisplay .buttonRecordViewRemove {
138 visibility: visible;
139 }
140 .kshf[attribsShown=true] .recordDisplay:hover > .listItemGroup > .dragWidthHandle {
141 display: block;
142 }
143 .kshf[attribsShown=true] .recordDisplay--Header > .itemRank_control {
144 display: inline-block;
145 }
146 .kshf[attribsShown=true] .panel:hover > .panelAdjustWidth {
147 display: block;
148 }
149 .kshf[attribsShown=true] .editableTextContainer > .editTextButton {
150 display: inline-block;
151 }
152 .kshf[attribsShown=true] .editableTextContainer:hover > .editTextButton {
153 opacity: 1;
154 }
155 .kshf[attribsShown=true] .buttonSummaryRemove {
156 display: inline-block !important;
157 }
158 .kshf[percentview=true] .chartAxis_Measure > .percentSign::after {
159 content: "%";
160 }
161 .kshf[percentview=true] .chartAxis_Measure > .tick > .text:after {
162 content: "%";
163 }
164 .kshf[showdropzone=true]:not([dropattrtype~="unique"]) .kshfChart[collapsed=false] {
165 -webkit-flex-grow: 3;
166 flex-grow: 3;
167 -webkit-box-flex: 3;
168 -moz-box-flex: 3;
169 -webkit-flex: 3;
170 -ms-flex: 3;
171 flex: 3;
172 overflow: hidden;
173 }
174 .kshf[showdropzone=true]:not([dropattrtype~="unique"]) .panel[hassummaries="true"] > .dropZone_between_wrapper {
175 display: block;
176 }
177 .kshf[showdropzone=true]:not([dropattrtype~="unique"]) .panel[hassummaries="true"] > .dropZone_panel {
178 display: block;
179 width: 100%;
180 height: 100%;
181 background-color: #EEEEEE;
182 opacity: 0.3;
183 cursor: default;
184 border-width: 0px;
185 border-radius: 5px;
186 }
187 .kshf[showdropzone=true]:not([dropattrtype~="unique"]) .panel[hassummaries="true"] > .dropZone_panel > .dropIcon {
188 display: none;
189 }
190 .kshf[showdropzone=true]:not([dropattrtype~="unique"]) .panel[hassummaries="true"] > .dropZone_panel > .dropText {
191 display: none;
192 }
193 .kshf[showdropzone=true]:not([dropattrtype~="unique"]) .panel[hassummaries="false"] > .dropZone_panel {
194 display: block;
195 }
196 .kshf[showdropzone=true][dropSource="browser"] > .attributePanel > .attributeList > .dropZone_AttribList {
197 display: block;
198 }
199 .kshf[showdropzone=true][dropattrtype~="unique"] .recordDisplay[hasRecordView="false"] {
200 -webkit-box-flex: 1;
201 -moz-box-flex: 1;
202 -webkit-flex: 1;
203 -ms-flex: 1;
204 flex: 1;
205 min-height: 50px;
206 }
207 .kshf[showdropzone=true][dropattrtype~="unique"] .dropZone_recordView {
208 display: block !important;
209 }
210 .kshf[showdropzone=true][dropattrtype~="interval"] .dropZone_resultSort {
211 display: block !important;
212 }
213 .kshf[showdropzone=true][dropattrtype~="categorical"][dropattrtype~="singlevalue"] .dropZone_textSearch {
214 display: block !important;
215 }
216 .kshf[ratiomode=true] .chartAxis_Measure > .tick > .text::after {
217 content: "%";
218 }
219 .kshf[previewcompare="true"] .compare {
220 opacity: 1 !important;
221 }
222 .kshf[previewcompare="true"] .compareLine {
223 opacity: 1 !important;
224 }
225 .kshf[isfiltered=true] .panel_Basic > .filterClearAll {
226 opacity: 1;
227 pointer-events: all;
228 }
229 .kshf .compareButton {
230 display: block;
231 position: absolute;
232 font-size: 0.7em;
233 color: gray;
234 opacity: 0;
235 cursor: pointer;
236 pointer-events: none;
237 -webkit-transition: opacity 500ms ease-in-out;
238 -moz-transition: opacity 500ms ease-in-out;
239 -o-transition: opacity 500ms ease-in-out;
240 transition: opacity 500ms ease-in-out;
241 }
242 .kshf .compareButton:after {
243 content: "\f13e";
244 }
245 .kshf .compareButton:hover:after {
246 content: "\f023";
247 }
248 .kshf .compareButton[inside] {
249 color: white;
250 text-shadow: 0px 0px 1px #000000;
251 }
252 .kshf span[showlock="true"] .compareButton {
253 pointer-events: all;
254 opacity: 1;
255 }
256 .kshf span[compare="true"] .compareButton {
257 pointer-events: all;
258 opacity: 1;
259 }
260 .kshf span[compare="true"] .compareButton:not([inside]) {
261 color: #2f4f4f;
262 }
263 .kshf span[compare="true"] .compareButton:after {
264 content: "\f023";
265 }
266 .kshf span[compare="true"] .compareButton:hover:after {
267 content: "\f13e";
268 }
269 .kshf .unitName {
270 opacity: 0.6;
271 margin-left: 1px;
272 }
273 .kshf .sortButton {
274 cursor: pointer;
275 }
276 .kshf .sortButton:hover {
277 color: #ff4500;
278 }
279 .kshf .sortButton:before {
280 content: "\f161";
281 }
282 .kshf .sortButton[inverse='true']:before {
283 content: "\f160";
284 }
285 .kshf .AndOrNot {
286 color: white;
287 display: inline-block;
288 font-weight: 300;
289 font-size: 0.8em;
290 vertical-align: top;
291 border-radius: 3px;
292 padding: 0px 2px 0px 2px;
293 margin-top: 1px;
294 opacity: 0.7;
295 }
296 .kshf .AndOrNot.AndOrNot_And {
297 background-color: #1d4870;
298 }
299 .kshf .AndOrNot.AndOrNot_Or {
300 background-color: #1c737a;
301 }
302 .kshf .AndOrNot.AndOrNot_Not {
303 background-color: #808080;
304 }
305 .kshf .noselect {
306 -webkit-user-select: none;
307 -moz-user-select: none;
308 -ms-user-select: none;
309 user-select: none;
310 }
311 .kshf .editableTextContainer > .editableText:focus {
312 background-color: white;
313 box-shadow: 0 0 3px #2CABCF;
314 border-color: #2CABCF;
315 border-style: solid;
316 border-width: 1px;
317 outline: 0 none;
318 margin: 0px;
319 }
320 .kshf .editableTextContainer > .editTextButton {
321 display: none;
322 opacity: 0;
323 font-size: 0.8em;
324 color: gray;
325 margin-left: 2px;
326 vertical-align: top;
327 cursor: pointer;
328 }
329 .kshf .editableTextContainer > .editTextButton:before {
330 content: '\f040';
331 }
332 .kshf .editableTextContainer > .editTextButton:hover {
333 color: black;
334 }
335 .kshf .editableTextContainer[edittitle="true"] > .editTextButton::before {
336 content: "\f00c";
337 }
338 .kshf .editableTextContainer[state='edited'] > .editTextButton {
339 display: inline-block;
340 }
341 .kshf > .attributePanel {
342 display: none;
343 -webkit-box-direction: normal;
344 -moz-box-direction: normal;
345 -webkit-box-orient: vertical;
346 -moz-box-orient: vertical;
347 -webkit-flex-direction: column;
348 -ms-flex-direction: column;
349 flex-direction: column;
350 position: absolute;
351 left: -220px;
352 width: 215px;
353 top: 0px;
354 height: 100%;
355 }
356 .kshf > .attributePanel > .attributePanelHeader {
357 cursor: default;
358 text-align: center;
359 border-radius: 3px;
360 background-color: #efeadf;
361 text-shadow: 0px 1px lightgray;
362 padding-top: 3px;
363 box-shadow: 0px 0px 2px #B0A47D;
364 }
365 .kshf > .attributePanel > .attributePanelHeader > .addAttrib {
366 display: none;
367 color: gray;
368 position: absolute;
369 left: 5px;
370 cursor: pointer;
371 }
372 .kshf > .attributePanel > .attributePanelHeader > .addAttrib:hover {
373 color: orangered;
374 }
375 .kshf > .attributePanel > .attributePanelHeader > .hidePanel {
376 color: gray;
377 position: absolute;
378 right: 3px;
379 cursor: pointer;
380 }
381 .kshf > .attributePanel > .attributePanelHeader > .hidePanel:hover {
382 color: orangered;
383 }
384 .kshf > .attributePanel > .attributeList {
385 display: -webkit-box;
386 display: -moz-box;
387 display: -webkit-flex;
388 display: -ms-flexbox;
389 display: flex;
390 -webkit-box-direction: normal;
391 -moz-box-direction: normal;
392 -webkit-box-orient: vertical;
393 -moz-box-orient: vertical;
394 -webkit-flex-direction: column;
395 -ms-flex-direction: column;
396 flex-direction: column;
397 -webkit-box-flex: 1;
398 -moz-box-flex: 1;
399 -webkit-flex: 1;
400 -ms-flex: 1;
401 flex: 1;
402 overflow-y: auto;
403 overflow-x: hidden;
404 }
405 .kshf > .attributePanel > .attributeList > .dropZone_AttribList {
406 -webkit-box-flex: 1;
407 -moz-box-flex: 1;
408 -webkit-flex: 1;
409 -ms-flex: 1;
410 flex: 1;
411 -webkit-box-ordinal-group: 10;
412 -moz-box-ordinal-group: 10;
413 -ms-flex-order: 10;
414 -webkit-order: 10;
415 order: 10;
416 display: none;
417 border-radius: 10px;
418 border: solid 1px #d3dbe2;
419 box-shadow: 0px 0px 1px #bec8d1;
420 margin: 2px;
421 }
422 .kshf > .attributePanel .nugget {
423 display: block;
424 position: relative;
425 font-size: 0.8em;
426 padding: 2px;
427 margin: 2px;
428 min-height: 36px;
429 left: 0px;
430 border-radius: 3px;
431 background-color: #e8e8e8;
432 border: solid 1px lightgray;
433 cursor: -moz-grab;
434 cursor: -webkit-grab;
435 cursor: grab;
436 -webkit-user-select: none;
437 -moz-user-select: none;
438 -ms-user-select: none;
439 user-select: none;
440 -webkit-transition: opacity 400ms linear, -webkit-transform 400ms ease-in-out;
441 -moz-transition: opacity 400ms linear, -moz-transform 400ms ease-in-out;
442 -o-transition: opacity 400ms linear, -o-transform 400ms ease-in-out;
443 transition: opacity 400ms linear,-webkit-transform 400ms ease-in-out,-moz-transform 400ms ease-in-out,-o-transform 400ms ease-in-out,transform 400ms ease-in-out;
444 }
445 .kshf > .attributePanel .nugget > .summaryTitle {
446 display: inline;
447 margin: 1px;
448 }
449 .kshf > .attributePanel .nugget > .editCodeButton {
450 display: none;
451 font-size: 0.9em;
452 color: black;
453 cursor: pointer;
454 }
455 .kshf > .attributePanel .nugget > .editCodeButton:hover {
456 color: black;
457 }
458 .kshf > .attributePanel .nugget > .summaryTypeIcon {
459 float: right;
460 }
461 .kshf > .attributePanel .nugget .nuggetInfo {
462 display: inline-block;
463 width: 100%;
464 -webkit-box-flex: 1;
465 -moz-box-flex: 1;
466 -webkit-flex: 1;
467 -ms-flex: 1;
468 flex: 1;
469 -webkit-align-self: center;
470 -ms-flex-item-align: center;
471 align-self: center;
472 font-weight: 500;
473 font-size: 0.7em;
474 vertical-align: top;
475 text-align: center;
476 }
477 .kshf > .attributePanel .nugget .nuggetInfo > .num_left {
478 float: left;
479 margin-left: 2px;
480 }
481 .kshf > .attributePanel .nugget .nuggetInfo > .num_right {
482 float: right;
483 margin-right: 2px;
484 }
485 .kshf > .attributePanel .nugget .nuggetInfo > .fa {
486 color: gray;
487 }
488 .kshf > .attributePanel .nugget[aggr_initialized=false] > .nuggetViz > .nuggetInfo {
489 font-size: 2em;
490 text-align: center;
491 position: relative;
492 }
493 .kshf > .attributePanel .nugget[aggr_initialized=false] > .nuggetViz > .nuggetInfo:before {
494 content: "\f110";
495 }
496 .kshf > .attributePanel .nugget[aggr_initialized=false] > .nuggetViz > .nuggetChart {
497 display: none !important;
498 }
499 .kshf > .attributePanel .nugget[aggr_initialized=false] > .nuggetViz:hover > .nuggetInfo {
500 -webkit-animation: fa-spin 2s infinite linear;
501 animation: fa-spin 2s infinite linear;
502 }
503 .kshf > .attributePanel .nugget > .nuggetViz {
504 display: -webkit-box;
505 display: -moz-box;
506 display: -webkit-flex;
507 display: -ms-flexbox;
508 display: flex;
509 height: 30px;
510 background-color: rgba(255, 255, 255, 0.8);
511 width: 50px;
512 float: right;
513 width: 60px;
514 border-radius: 5px;
515 border: solid 1px rgba(255, 255, 255, 0.8);
516 }
517 .kshf > .attributePanel .nugget > .nuggetViz > .nuggetChart {
518 -webkit-box-flex: 1;
519 -moz-box-flex: 1;
520 -webkit-flex: 1;
521 -ms-flex: 1;
522 flex: 1;
523 height: 30px;
524 margin-right: 3px;
525 margin-left: 3px;
526 }
527 .kshf > .attributePanel .nugget > .nuggetViz > .nuggetChart > .nuggetBar {
528 -webkit-box-flex: 1;
529 -moz-box-flex: 1;
530 -webkit-flex: 1;
531 -ms-flex: 1;
532 flex: 1;
533 display: block;
534 background-color: #b8c7d2;
535 }
536 .kshf > .attributePanel .nugget:hover {
537 background-color: #E8E0CE;
538 border-color: #B8B6B1;
539 }
540 .kshf > .attributePanel .nugget:hover > .nuggetViz {
541 border-color: gray;
542 }
543 .kshf > .attributePanel .nugget[datatype~="interval"] > .nuggetViz {
544 -webkit-box-direction: normal;
545 -moz-box-direction: normal;
546 -webkit-box-orient: vertical;
547 -moz-box-orient: vertical;
548 -webkit-flex-direction: column;
549 -ms-flex-direction: column;
550 flex-direction: column;
551 }
552 .kshf > .attributePanel .nugget[datatype~="interval"] > .nuggetViz > .nuggetChart {
553 display: -webkit-box;
554 display: -moz-box;
555 display: -webkit-flex;
556 display: -ms-flexbox;
557 display: flex;
558 -webkit-box-direction: normal;
559 -moz-box-direction: normal;
560 -webkit-box-orient: horizontal;
561 -moz-box-orient: horizontal;
562 -webkit-flex-direction: row;
563 -ms-flex-direction: row;
564 flex-direction: row;
565 }
566 .kshf > .attributePanel .nugget[datatype~="interval"] > .nuggetViz > .nuggetChart > .nuggetBar {
567 -webkit-align-self: flex-end;
568 -ms-flex-item-align: end;
569 align-self: flex-end;
570 }
571 .kshf > .attributePanel .nugget[datatype~="interval"] .nuggetChart {
572 -webkit-box-ordinal-group: 1;
573 -moz-box-ordinal-group: 1;
574 -ms-flex-order: 1;
575 -webkit-order: 1;
576 order: 1;
577 }
578 .kshf > .attributePanel .nugget[datatype~="interval"] .nuggetInfo {
579 -webkit-box-ordinal-group: 2;
580 -moz-box-ordinal-group: 2;
581 -ms-flex-order: 2;
582 -webkit-order: 2;
583 order: 2;
584 max-height: 1em;
585 }
586 .kshf > .attributePanel .nugget[datatype~='time'] .nuggetInfo:before {
587 content: '\f017';
588 }
589 .kshf > .attributePanel .nugget[datatype~="categorical"] > .nuggetViz {
590 -webkit-box-direction: normal;
591 -moz-box-direction: normal;
592 -webkit-box-orient: horizontal;
593 -moz-box-orient: horizontal;
594 -webkit-flex-direction: row;
595 -ms-flex-direction: row;
596 flex-direction: row;
597 }
598 .kshf > .attributePanel .nugget[datatype~="categorical"] > .nuggetViz > .nuggetChart {
599 display: -webkit-box;
600 display: -moz-box;
601 display: -webkit-flex;
602 display: -ms-flexbox;
603 display: flex;
604 -webkit-box-direction: normal;
605 -moz-box-direction: normal;
606 -webkit-box-orient: vertical;
607 -moz-box-orient: vertical;
608 -webkit-flex-direction: column;
609 -ms-flex-direction: column;
610 flex-direction: column;
611 }
612 .kshf > .attributePanel .nugget[state='custom'] > .editCodeButton {
613 display: inline-block;
614 }
615 .kshf > .attributePanel .nugget[moved] {
616 opacity: 0.5 !important;
617 }
618 .kshf > .attributePanel .nugget[anim="disappear"] {
619 opacity: 0;
620 -webkit-transform: translateX(100px);
621 -moz-transform: translateX(100px);
622 -o-transform: translateX(100px);
623 -ms-transform: translateX(100px);
624 transform: translateX(100px);
625 }
626 .kshf > .attributePanel .nugget[anim="appear"] {
627 opacity: 1;
628 -webkit-transform: translateX(0px);
629 -moz-transform: translateX(0px);
630 -o-transform: translateX(0px);
631 -ms-transform: translateX(0px);
632 transform: translateX(0px);
633 }
634 .kshf .panel_Basic {
635 display: -webkit-box;
636 display: -moz-box;
637 display: -webkit-flex;
638 display: -ms-flexbox;
639 display: flex;
640 -webkit-box-direction: normal;
641 -moz-box-direction: normal;
642 -webkit-box-orient: horizontal;
643 -moz-box-orient: horizontal;
644 -webkit-flex-direction: row;
645 -ms-flex-direction: row;
646 flex-direction: row;
647 position: relative;
648 background-color: #efeadf;
649 box-shadow: 0px 0px 2px #B8AF9A;
650 margin-bottom: 4px;
651 padding-bottom: 2px;
652 }
653 .kshf .panel_Basic > .recordInfo {
654 vertical-align: top;
655 display: block;
656 white-space: nowrap;
657 cursor: default;
658 font-size: 1.2em;
659 font-weight: 700;
660 text-shadow: 1px 1px lightgray;
661 margin-bottom: -1px;
662 z-index: 10;
663 }
664 .kshf .panel_Basic > .recordInfo > .activeRecordCount {
665 display: inline-block;
666 text-align: right;
667 margin-right: 3px;
668 }
669 .kshf .panel_Basic > .filtercrumbs {
670 -webkit-box-flex: 1;
671 -moz-box-flex: 1;
672 -webkit-flex: 1;
673 -ms-flex: 1;
674 flex: 1;
675 padding: 4px 5px 0px 5px;
676 font-size: 0.8em;
677 vertical-align: top;
678 }
679 .kshf .panel_Basic > .filtercrumbs > .filter-block {
680 display: inline-block;
681 position: relative;
682 cursor: pointer;
683 color: #252112;
684 font-weight: 300;
685 box-shadow: 1px 1px 1px #4e472b;
686 background-color: rgba(255, 255, 255, 0.5);
687 margin-right: 5px;
688 padding-left: 2px;
689 max-width: 0px;
690 -webkit-transition: all 250ms linear;
691 -moz-transition: all 250ms linear;
692 -o-transition: all 250ms linear;
693 transition: all 250ms linear;
694 }
695 .kshf .panel_Basic > .filtercrumbs > .filter-block > .sdsdsds {
696 pointer-events: none;
697 /*
698 max-width: 300px;
699 max-width: 300px;
700 -o-text-overflow: ellipsis;
701 text-overflow: ellipsis;*/
702 display: block;
703 white-space: nowrap;
704 overflow: hidden;
705 }
706 .kshf .panel_Basic > .filtercrumbs > .filter-block > .sdsdsds > .filterHeader {
707 padding: 1px;
708 font-size: 1em;
709 font-weight: 700;
710 }
711 .kshf .panel_Basic > .filtercrumbs > .filter-block > .sdsdsds > .filterHeader:after {
712 content: ': ';
713 }
714 .kshf .panel_Basic > .filtercrumbs > .filter-block > .sdsdsds > .filterDetails {
715 padding: 1px 0px 1px 0px;
716 display: inline;
717 margin-right: 15px;
718 }
719 .kshf .panel_Basic > .filtercrumbs > .filter-block > .chartClearFilterButton.summary {
720 pointer-events: none;
721 }
722 .kshf .panel_Basic > .filtercrumbs > .filter-block[ready=true] {
723 max-width: 100%;
724 }
725 .kshf .panel_Basic > .filtercrumbs > .filter-block[ready=false] {
726 max-width: 0px;
727 }
728 .kshf .panel_Basic > .filtercrumbs > .filter-block[ready=false] .chartClearFilterButton {
729 display: none;
730 }
731 .kshf .panel_Basic > .filtercrumbs > .filter-block:hover {
732 background-color: #ffffff;
733 }
734 .kshf .panel_Basic > .filtercrumbs > .filter-block:hover .sdsdsds {
735 text-decoration: line-through;
736 }
737 .kshf .panel_Basic > .filtercrumbs > .filter-block:hover .chartClearFilterButton {
738 background-color: #B6AF96;
739 color: #635d46;
740 }
741 .kshf .panel_Basic > .filtercrumbs > .filter-block b {
742 font-weight: 700;
743 }
744 .kshf .panel_Basic > .filtercrumbs > .filter-block[filtered=false] {
745 display: none;
746 }
747 .kshf .panel_Basic > .filterClearAll {
748 opacity: 0;
749 pointer-events: none;
750 right: 41px;
751 height: 1.3em;
752 cursor: pointer;
753 color: #252112;
754 font-weight: 300;
755 border: 1px #685b2b solid;
756 background-color: #E9E2CE;
757 padding-left: 1px;
758 white-space: nowrap;
759 -webkit-transition: background-color 100ms linear, opacity 300ms linear;
760 -moz-transition: background-color 100ms linear, opacity 300ms linear;
761 -o-transition: background-color 100ms linear, opacity 300ms linear;
762 transition: background-color 100ms linear, opacity 300ms linear;
763 }
764 .kshf .panel_Basic > .filterClearAll:hover {
765 background-color: white;
766 box-shadow: none;
767 }
768 .kshf .panel_Basic > .filterClearAll .title {
769 font-size: 0.8em;
770 }
771 .kshf .panel_Basic > .rightBoxes {
772 font-size: 1.0em;
773 color: #635d46;
774 padding-right: 2px;
775 white-space: nowrap;
776 }
777 .kshf .panel_Basic > .rightBoxes > .fa {
778 cursor: pointer;
779 margin-left: 4px;
780 }
781 .kshf .panel_Basic > .rightBoxes > .fa:hover {
782 color: #cb5454;
783 }
784 .kshf .panel_Basic > .rightBoxes .showConfigButton {
785 display: none;
786 }
787 .kshf .panel_Basic > .rightBoxes .showConfigButton:hover {
788 animation: fa-spin 2s infinite linear;
789 -webkit-animation: fa-spin 2s infinite linear;
790 }
791 .kshf .panel_Basic > .rightBoxes .datasource {
792 display: none;
793 text-decoration: none;
794 color: #635d46;
795 }
796 .kshf .panel_Basic > .totalViz {
797 height: 3px;
798 margin-top: 1px;
799 position: absolute;
800 bottom: 0px;
801 left: 0px;
802 width: 100%;
803 }
804 .kshf .panel_Basic > .totalViz > .aggr {
805 cursor: default !important;
806 left: 0px;
807 top: 0px;
808 height: 100%;
809 -webkit-transition: all 200ms ease-in-out;
810 -moz-transition: all 200ms ease-in-out;
811 -o-transition: all 200ms ease-in-out;
812 transition: all 200ms ease-in-out;
813 }
814 .kshf .panel_Basic > .totalViz > .aggr.total {
815 width: 100%;
816 }
817 .kshf .panel_Basic > .totalViz > .aggr.preview {
818 transform: inherit;
819 }
820 .kshf .panels_Above {
821 display: -webkit-box;
822 display: -moz-box;
823 display: -webkit-flex;
824 display: -ms-flexbox;
825 display: flex;
826 -webkit-box-direction: normal;
827 -moz-box-direction: normal;
828 -webkit-box-orient: horizontal;
829 -moz-box-orient: horizontal;
830 -webkit-flex-direction: row;
831 -ms-flex-direction: row;
832 flex-direction: row;
833 }
834 .kshf .attribDragBox {
835 position: absolute;
836 top: 0px;
837 left: 0px;
838 min-height: 21px;
839 width: 200px;
840 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigyNDUsIDI0NSwgMjQ1KSIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIyMCUiIHN0b3AtY29sb3I9InJnYigyNDEsIDI0MSwgMjQxKSIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSI4MCUiIHN0b3AtY29sb3I9InJnYigyNDEsIDI0MSwgMjQxKSIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSJyZ2IoMjQ1LCAyNDUsIDI0NSkiIHN0b3Atb3BhY2l0eT0iMSIvPjwvbGluZWFyR3JhZGllbnQ+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNsZXNzaGF0LWdlbmVyYXRlZCkiIC8+PC9zdmc+);
841 background-image: -webkit-linear-gradient(right, rgba(245, 245, 245, 1) 0%, rgba(241, 241, 241, 1) 20%, rgba(241, 241, 241, 1) 80%, rgba(245, 245, 245, 1) 100%);;
842 background-image: -moz-linear-gradient(right, rgba(245, 245, 245, 1) 0%, rgba(241, 241, 241, 1) 20%, rgba(241, 241, 241, 1) 80%, rgba(245, 245, 245, 1) 100%);;
843 background-image: -o-linear-gradient(right, rgba(245, 245, 245, 1) 0%, rgba(241, 241, 241, 1) 20%, rgba(241, 241, 241, 1) 80%, rgba(245, 245, 245, 1) 100%);;
844 background-image: linear-gradient(to left, rgba(245, 245, 245, 1) 0%, rgba(241, 241, 241, 1) 20%, rgba(241, 241, 241, 1) 80%, rgba(245, 245, 245, 1) 100%);;
845 border-radius: 3px;
846 border: solid 1px lightgray;
847 box-shadow: 5px 5px 20px gray;
848 display: none;
849 z-index: 400;
850 text-align: center;
851 font-weight: 500;
852 font-size: 0.9em;
853 cursor: default;
854 text-rendering: initial;
855 pointer-events: none;
856 }
857 .kshf > .warningBox_wrapper {
858 position: absolute;
859 top: -20px;
860 opacity: 0;
861 margin: 0 auto;
862 width: 100%;
863 text-align: center;
864 z-index: 50;
865 pointer-events: none;
866 -webkit-transition: opacity 500ms ease-in-out, top 500ms;
867 -moz-transition: opacity 500ms ease-in-out, top 500ms;
868 -o-transition: opacity 500ms ease-in-out, top 500ms;
869 transition: opacity 500ms ease-in-out, top 500ms;
870 }
871 .kshf > .warningBox_wrapper > .warningBox {
872 background-color: #F8EE82;
873 border-radius: 5px;
874 font-size: 0.8em;
875 font-weight: 100;
876 padding: 2px 5px;
877 border: solid 1px #d6ce79;
878 box-shadow: 1px 1px 3px gray;
879 }
880 .kshf > .warningBox_wrapper > .warningBox > .warningText {
881 cursor: default;
882 }
883 .kshf > .warningBox_wrapper > .warningBox > .dismiss {
884 margin-left: 5px;
885 color: gray;
886 cursor: pointer;
887 text-decoration: underline;
888 font-size: 0.8em;
889 }
890 .kshf > .warningBox_wrapper > .warningBox > .dismiss:hover {
891 color: orangered;
892 }
893 .kshf > .warningBox_wrapper[shown=true] {
894 opacity: 1;
895 top: 5px;
896 pointer-events: all;
897 }
898 .kshf > .pointerBlock {
899 position: fixed;
900 left: 0px;
901 top: 0px;
902 width: 100%;
903 height: 100%;
904 z-index: -10;
905 pointer-events: none;
906 }
907 .kshf > .pointerBlock[active] {
908 z-index: 700;
909 pointer-events: all;
910 }
911 .kshf .panel > .dropZone_between_wrapper {
912 display: none;
913 -webkit-flex-grow: 1;
914 flex-grow: 1;
915 position: relative;
916 margin-top: 2px;
917 z-index: 340;
918 border-radius: 5px;
919 width: calc(100% - 3px);
920 -webkit-transition: flex-grow 450ms ease-in-out, background-color 250ms linear, width 500ms ease-in-out;
921 -moz-transition: flex-grow 450ms ease-in-out, background-color 250ms linear, width 500ms ease-in-out;
922 -o-transition: flex-grow 450ms ease-in-out, background-color 250ms linear, width 500ms ease-in-out;
923 transition: flex-grow 450ms ease-in-out, background-color 250ms linear, width 500ms ease-in-out;
924 }
925 .kshf .panel > .dropZone_between_wrapper > .dropZone_between {
926 border-radius: 5px;
927 border: solid 1px #adb4ba;
928 box-shadow: 1px 1px 1px #adb3b7;
929 position: relative;
930 height: 22px;
931 text-align: center;
932 overflow: hidden;
933 }
934 .kshf .panel > .dropZone_between_wrapper > .dropZone_between > .dropText {
935 vertical-align: top;
936 margin-top: 2px;
937 }
938 .kshf .panel > .dropZone_between_wrapper[hovered=true] {
939 -webkit-flex-grow: 4;
940 flex-grow: 4;
941 position: relative;
942 background-color: rgba(217, 224, 230, 0.7);
943 }
944 .kshf .panel > .dropZone_between_wrapper[hovered=true] > .dropZone_between > .dropIcon {
945 color: orangered;
946 }
947 .kshf .panel .dropZone {
948 background-color: rgba(217, 224, 230, 0.7);
949 text-align: center;
950 }
951 .kshf .panel .dropZone[readyToDrop=true] {
952 background-color: #ffbca3;
953 border-color: orangered;
954 cursor: s-resize;
955 }
956 .kshf .panel .dropZone[readyToDrop=true] > .dropText {
957 display: inline-block;
958 }
959 .kshf .panel .dropZone_summary {
960 z-index: 250;
961 position: relative;
962 cursor: default;
963 -webkit-transition: background-color 100ms linear, width 300ms ease-in-out;
964 -moz-transition: background-color 100ms linear, width 300ms ease-in-out;
965 -o-transition: background-color 100ms linear, width 300ms ease-in-out;
966 transition: background-color 100ms linear, width 300ms ease-in-out;
967 }
968 .kshf .panel .dropZone_summary:hover {
969 background-color: #ffbca3;
970 }
971 .kshf .panel .dropZone_summary > .dropIcon {
972 margin: 0px;
973 font-size: 1.5em;
974 font-weight: 700;
975 color: #7E8A96;
976 text-shadow: 1px 1px 1px #B6BCC2;
977 }
978 .kshf .panel > .dropZone_panel {
979 display: none;
980 border-color: gray;
981 border-style: solid;
982 border-width: 0px;
983 position: absolute;
984 z-index: 230;
985 }
986 .kshf .panel .dropIcon {
987 pointer-events: none;
988 margin: 0px;
989 font-size: 2em;
990 color: #7E8A96;
991 text-shadow: 1px 1px 1px #B6BCC2;
992 display: inline-block;
993 }
994 .kshf .panel .dropText {
995 display: none;
996 margin-left: 4px;
997 font-size: 1.0em;
998 font-weight: 300;
999 }
1000 .kshf .panel[hidebars=true] .kshf .attrib .aggr_Group {
1001 display: none;
1002 }
1003 .kshf .panel[hidebaraxis=true] .facetCategorical .chartAxis_Measure {
1004 display: none;
1005 }
1006 .kshf .panel[hidebaraxis=true] .facetCategorical .barChartMainInfo {
1007 display: none;
1008 }
1009 .kshf .panel > .panelAdjustWidth {
1010 display: none;
1011 opacity: 0;
1012 position: absolute;
1013 height: 100%;
1014 width: 0px;
1015 top: 0px;
1016 border-width: 0px 2px 0px 0px;
1017 border-style: dotted;
1018 border-color: lightgray;
1019 cursor: col-resize;
1020 opacity: 0.8;
1021 z-index: 10;
1022 pointer-events: all;
1023 }
1024 .kshf .panel > .panelAdjustWidth:hover {
1025 border-color: gray;
1026 border-style: dashed;
1027 }
1028 .kshf .panel > .panelAdjustWidth[dragging] {
1029 border-color: gray;
1030 border-style: dashed;
1031 display: block;
1032 }
1033 .kshf .panel.panel_bottom {
1034 display: -webkit-box;
1035 display: -moz-box;
1036 display: -webkit-flex;
1037 display: -ms-flexbox;
1038 display: flex;
1039 -webkit-box-direction: normal;
1040 -moz-box-direction: normal;
1041 -webkit-box-orient: vertical;
1042 -moz-box-orient: vertical;
1043 -webkit-flex-direction: column;
1044 -ms-flex-direction: column;
1045 flex-direction: column;
1046 width: 100%;
1047 position: relative;
1048 }
1049 .kshf .panel.panel_bottom > .dropZone_panel {
1050 bottom: 0px;
1051 height: 30px;
1052 width: 100%;
1053 border-radius: 30px 30px 0px 0px;
1054 border-top-width: 2px;
1055 }
1056 .kshf .panel.panel_bottom > .dropZone_between_wrapper > .dropZone_between > .dropIcon {
1057 display: inline-block;
1058 }
1059 .kshf .panel.panel_bottom > .dropZone_between_wrapper > .dropZone_between > .dropText {
1060 display: inline-block;
1061 vertical-align: top;
1062 }
1063 .kshf .panel.panel_side {
1064 display: -webkit-box;
1065 display: -moz-box;
1066 display: -webkit-flex;
1067 display: -ms-flexbox;
1068 display: flex;
1069 -webkit-box-direction: normal;
1070 -moz-box-direction: normal;
1071 -webkit-box-orient: vertical;
1072 -moz-box-orient: vertical;
1073 -webkit-flex-direction: column;
1074 -ms-flex-direction: column;
1075 flex-direction: column;
1076 vertical-align: top;
1077 position: relative;
1078 height: 100%;
1079 }
1080 .kshf .panel.panel_side > .dropZone_panel {
1081 top: 0px;
1082 height: 100%;
1083 width: 50px;
1084 z-index: 231;
1085 }
1086 .kshf .panel.panel_side > .dropZone_panel > .dropIcon {
1087 margin-top: 150px;
1088 top: 200px;
1089 }
1090 .kshf .panel.panel_left > .dropZone_panel {
1091 left: 0px;
1092 border-radius: 0px 40px 40px 0px;
1093 border-right-width: 2px;
1094 }
1095 .kshf .panel.panel_left > .panelAdjustWidth {
1096 right: -2px;
1097 }
1098 .kshf .panel.panel_right > .dropZone_panel {
1099 right: 0px;
1100 border-radius: 40px 0px 0px 40px;
1101 border-left-width: 2px;
1102 }
1103 .kshf .panel.panel_right > .panelAdjustWidth {
1104 left: -2px;
1105 }
1106 .kshf .panel.panel_middle {
1107 display: -webkit-box;
1108 display: -moz-box;
1109 display: -webkit-flex;
1110 display: -ms-flexbox;
1111 display: flex;
1112 -webkit-box-direction: normal;
1113 -moz-box-direction: normal;
1114 -webkit-box-orient: vertical;
1115 -moz-box-orient: vertical;
1116 -webkit-flex-direction: column;
1117 -ms-flex-direction: column;
1118 flex-direction: column;
1119 -webkit-box-flex: 1;
1120 -moz-box-flex: 1;
1121 -webkit-flex: 1;
1122 -ms-flex: 1;
1123 flex: 1;
1124 vertical-align: top;
1125 position: relative;
1126 }
1127 .kshf .panel.panel_middle > .dropZone_panel {
1128 bottom: 0px;
1129 height: 100%;
1130 width: 100%;
1131 left: 0px;
1132 border-radius: 40px 40px 0px 0px;
1133 border-top-width: 2px;
1134 }
1135 .kshf .panel.panel_resize {
1136 position: absolute;
1137 right: 0px;
1138 bottom: 0px;
1139 cursor: nwse-resize;
1140 width: 0;
1141 height: 0;
1142 z-index: 2500;
1143 border-right: 16px solid lightgray;
1144 border-top: 16px solid transparent;
1145 }
1146 .kshf .panel.panel_resize:hover {
1147 border-right: 16px solid orangered;
1148 }
1149 .kshf .panel.panel_resize[dragging="true"] {
1150 border-right: 16px solid orangered;
1151 }
1152 .kshf .panel.panel_infobox {
1153 position: absolute;
1154 height: 100%;
1155 width: 100%;
1156 z-index: 2000;
1157 transform: scale(1);
1158 text-align: center;
1159 -webkit-transition: -webkit-transform 500ms ease-in-out, opacity 500ms;
1160 -moz-transition: -moz-transform 500ms ease-in-out, opacity 500ms;
1161 -o-transition: -o-transform 500ms ease-in-out, opacity 500ms;
1162 transition: -webkit-transform 500ms ease-in-out,-moz-transform 500ms ease-in-out,-o-transform 500ms ease-in-out,transform 500ms ease-in-out, opacity 500ms;
1163 }
1164 .kshf .panel.panel_infobox lesshat-selector {
1165 -lh-property: 0; }
1166 @-webkit-keyframes itemZoom{ 0%{-webkit-transform: scale(0); opacity:1;} 100% {-webkit-transform: scale(1); opacity:1;}}
1167 @-moz-keyframes itemZoom{ 0%{-moz-transform: scale(0); opacity:1;} 100% {-moz-transform: scale(1); opacity:1;}}
1168 @-o-keyframes itemZoom{ 0%{-o-transform: scale(0); opacity:1;} 100% {-o-transform: scale(1); opacity:1;}}
1169 @keyframes itemZoom{ 0%{-webkit-transform: scale(0);-moz-transform: scale(0);-ms-transform: scale(0);transform: scale(0); opacity:1;} 100% {-webkit-transform: scale(1);-moz-transform: scale(1);-ms-transform: scale(1);transform: scale(1); opacity:1;};
1170 }
1171 .kshf .panel.panel_infobox .infobox_close_button {
1172 position: absolute;
1173 right: 3px;
1174 top: 3px;
1175 background-color: #979797;
1176 width: 20px;
1177 height: 20px;
1178 border-radius: 20px;
1179 text-align: center;
1180 cursor: pointer;
1181 line-height: 20px;
1182 color: white;
1183 }
1184 .kshf .panel.panel_infobox .infobox_close_button:hover {
1185 background-color: #6f6f6f;
1186 }
1187 .kshf .panel.panel_infobox > .background {
1188 width: 100%;
1189 height: 100%;
1190 z-index: -2;
1191 background: #0b0b0b;
1192 opacity: 0.8;
1193 position: absolute;
1194 -webkit-transition: all 0.5s;
1195 -moz-transition: all 0.5s;
1196 -o-transition: all 0.5s;
1197 transition: all 0.5s;
1198 border-radius: 5px;
1199 }
1200 .kshf .panel.panel_infobox > .infobox_content {
1201 display: none;
1202 margin: auto;
1203 box-shadow: 0px 0px 20px gray;
1204 border-radius: 15px;
1205 background-color: white;
1206 opacity: 1.0;
1207 z-index: 1043;
1208 max-height: 90%;
1209 max-width: 90%;
1210 overflow-y: auto;
1211 overflow-x: hidden;
1212 }
1213 .kshf .panel.panel_infobox > .infobox_source {
1214 background-color: white;
1215 width: 550px;
1216 height: 250px;
1217 position: absolute;
1218 top: 0;
1219 left: 0;
1220 bottom: 0;
1221 right: 0;
1222 }
1223 .kshf .panel.panel_infobox > .infobox_source .fa-info-circle {
1224 color: gray;
1225 cursor: pointer;
1226 padding: 0px 5px;
1227 }
1228 .kshf .panel.panel_infobox > .infobox_source .fa-info-circle:hover {
1229 color: black;
1230 }
1231 .kshf .panel.panel_infobox > .infobox_source > .sourceHeader {
1232 font-weight: 700;
1233 font-size: 1.3em;
1234 margin: 5px 5px 0px 5px;
1235 }
1236 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper {
1237 width: 430px;
1238 display: inline-block;
1239 margin: 5px;
1240 padding: 5px;
1241 border: solid 1px lightgray;
1242 border-radius: 5px;
1243 }
1244 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper > .offpoofff {
1245 margin-bottom: 3px;
1246 }
1247 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .gdocLink {
1248 width: 350px;
1249 }
1250 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .source_from {
1251 display: inline-block;
1252 border: solid 1px lightgray;
1253 padding: 2px 4px;
1254 border-radius: 7px;
1255 font-weight: 300;
1256 margin: 0px 5px;
1257 font-size: 0.8em;
1258 cursor: pointer;
1259 color: #a0a0a0;
1260 }
1261 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .source_from:hover {
1262 color: black;
1263 box-shadow: 0px 0px 1px gray;
1264 }
1265 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .gdocLink_ready {
1266 opacity: 0;
1267 pointer-events: none;
1268 }
1269 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .gdocLink_ready:before {
1270 content: "\f057";
1271 color: red;
1272 }
1273 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .gdocLink_ready[ready=true] {
1274 pointer-events: all;
1275 }
1276 .kshf .panel.panel_infobox > .infobox_source > .source_wrapper .gdocLink_ready[ready=true]:before {
1277 content: "\f058";
1278 color: green;
1279 }
1280 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="GoogleSheet"] .source_from[source_type="GoogleSheet"] {
1281 background-color: #EEE;
1282 color: black;
1283 cursor: default;
1284 }
1285 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="GoogleSheet"] .tableHeader:before {
1286 content: "Sheet";
1287 }
1288 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="Dropbox"] .source_from[source_type="Dropbox"] {
1289 background-color: #EEE;
1290 color: black;
1291 cursor: default;
1292 }
1293 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="Dropbox"] .tableHeader:before {
1294 content: "File";
1295 }
1296 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="Dropbox"] > .sheetInfo .fileType_wrapper {
1297 display: inline-block;
1298 }
1299 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="GoogleDrive"] .source_from[source_type="GoogleDrive"] {
1300 background-color: #EEE;
1301 color: black;
1302 cursor: default;
1303 }
1304 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="GoogleDrive"] .tableHeader:before {
1305 content: "File";
1306 }
1307 .kshf .panel.panel_infobox > .infobox_source[selected_source_type="GoogleDrive"] > .sheetInfo .fileType_wrapper {
1308 display: inline-block;
1309 }
1310 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo {
1311 border: solid 1px lightgray;
1312 border-radius: 5px;
1313 text-align: left;
1314 width: 300px;
1315 margin: 0 auto;
1316 padding-bottom: 5px;
1317 }
1318 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .tableHeader {
1319 font-weight: 700;
1320 text-align: center;
1321 border-bottom: solid 1px lightgray;
1322 margin-bottom: 2px;
1323 margin-top: 5px;
1324 }
1325 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo > .sheet_wrapper {
1326 margin: 0 auto;
1327 }
1328 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .sheetColumn_ID {
1329 width: 60px;
1330 }
1331 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .subheading {
1332 width: 110px;
1333 display: inline-block;
1334 text-align: right;
1335 cursor: default;
1336 }
1337 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .subheading:not(.tableHeader) {
1338 font-weight: 300;
1339 }
1340 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .sheetColumn_Splitter {
1341 width: 60px;
1342 }
1343 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .sheetName {
1344 width: 85px;
1345 }
1346 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .sheetColumn_Seperator {
1347 width: 30px;
1348 }
1349 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .fileType_wrapper {
1350 display: none;
1351 }
1352 .kshf .panel.panel_infobox > .infobox_source > .sheetInfo .sheetColumn_sep_wrapper {
1353 display: none;
1354 font-size: 0.8em;
1355 margin-left: 5px;
1356 cursor: default;
1357 }
1358 .kshf .panel.panel_infobox > .infobox_source > .actionButton {
1359 display: inline-block;
1360 border: solid 1px gray;
1361 padding: 5px;
1362 margin: 5px;
1363 border-radius: 5px;
1364 background-color: white;
1365 font-weight: 300;
1366 }
1367 .kshf .panel.panel_infobox > .infobox_source > .actionButton[disabled=true] {
1368 color: gray;
1369 border-color: lightgray;
1370 cursor: not-allowed;
1371 }
1372 .kshf .panel.panel_infobox > .infobox_source > .actionButton[disabled=false]:hover {
1373 cursor: pointer;
1374 box-shadow: 1px 1px 1px gray;
1375 background-color: #EEE;
1376 }
1377 .kshf .panel.panel_infobox > .infobox_loading {
1378 width: 300px;
1379 height: 35px;
1380 position: absolute;
1381 top: 0;
1382 left: 0;
1383 bottom: 0;
1384 right: 0;
1385 }
1386 .kshf .panel.panel_infobox > .infobox_loading .spinner {
1387 position: absolute;
1388 left: 20px;
1389 top: 3px;
1390 width: 50px;
1391 height: 30px;
1392 text-align: center;
1393 font-size: 10px;
1394 }
1395 .kshf .panel.panel_infobox > .infobox_loading .spinner > .spinner_x {
1396 margin-right: 2px;
1397 background-color: #a3bdd1;
1398 height: 100%;
1399 width: 6px;
1400 display: inline-block;
1401 -webkit-animation: stretchdelay 1.2s infinite ease-in-out;
1402 -moz-animation: stretchdelay 1.2s infinite ease-in-out;
1403 -o-animation: stretchdelay 1.2s infinite ease-in-out;
1404 animation: stretchdelay 1.2s infinite ease-in-out;
1405 }
1406 .kshf .panel.panel_infobox > .infobox_loading .spinner > .spinner_2 {
1407 -webkit-animation-delay: -1.1s;
1408 -moz-animation-delay: -1.1s;
1409 -o-animation-delay: -1.1s;
1410 animation-delay: -1.1s;
1411 }
1412 .kshf .panel.panel_infobox > .infobox_loading .spinner > .spinner_3 {
1413 -webkit-animation-delay: -1s;
1414 -moz-animation-delay: -1s;
1415 -o-animation-delay: -1s;
1416 animation-delay: -1s;
1417 }
1418 .kshf .panel.panel_infobox > .infobox_loading .spinner > .spinner_4 {
1419 -webkit-animation-delay: -0.9s;
1420 -moz-animation-delay: -0.9s;
1421 -o-animation-delay: -0.9s;
1422 animation-delay: -0.9s;
1423 }
1424 .kshf .panel.panel_infobox > .infobox_loading .spinner > .spinner_5 {
1425 -webkit-animation-delay: -0.8s;
1426 -moz-animation-delay: -0.8s;
1427 -o-animation-delay: -0.8s;
1428 animation-delay: -0.8s;
1429 }
1430 .kshf .panel.panel_infobox > .infobox_loading div.status_text {
1431 margin: auto;
1432 position: absolute;
1433 top: 10px;
1434 left: 70px;
1435 height: 20px;
1436 }
1437 .kshf .panel.panel_infobox > .infobox_loading div.status_text > .status_text_sub {
1438 margin-left: 5px;
1439 }
1440 .kshf .panel.panel_infobox > .infobox_credit {
1441 display: none;
1442 width: 390px;
1443 height: 260px;
1444 position: absolute;
1445 top: 0;
1446 left: 0;
1447 bottom: 0;
1448 right: 0;
1449 }
1450 .kshf .panel.panel_infobox > .infobox_credit div.all-the-credits {
1451 margin: auto;
1452 }
1453 .kshf .panel.panel_infobox > .infobox_credit div.header {
1454 background-color: #d8ddd4;
1455 width: 100%;
1456 padding-top: 5px;
1457 border-top-left-radius: 15px;
1458 border-top-right-radius: 15px;
1459 border-bottom: solid 2px #3c5e43;
1460 }
1461 .kshf .panel.panel_infobox > .infobox_credit span.libName {
1462 font-size: 1.4em;
1463 font-weight: 700;
1464 }
1465 .kshf .panel.panel_infobox > .infobox_credit div.project_fund {
1466 font-size: 0.8em;
1467 font-weight: 300;
1468 }
1469 .kshf .panel.panel_infobox > .infobox_itemZoom {
1470 position: relative;
1471 margin: 20px;
1472 padding: 10px;
1473 }
1474 .kshf .panel.panel_infobox[show=loading] > .infobox_loading {
1475 display: inline-block;
1476 }
1477 .kshf .panel.panel_infobox[show=credit] > .infobox_credit {
1478 display: inline-block;
1479 }
1480 .kshf .panel.panel_infobox[show=source] > .infobox_source {
1481 display: inline-block;
1482 }
1483 .kshf .panel.panel_infobox[show=none] {
1484 pointer-events: none;
1485 }
1486 .kshf .panel.panel_infobox[show=none] > .background {
1487 opacity: 0;
1488 }
1489 .kshf .panel.panel_infobox[show=itemZoom] > .infobox_itemZoom {
1490 -webkit-animation: itemZoom 500ms forwards;
1491 -moz-animation: itemZoom 500ms forwards;
1492 -o-animation: itemZoom 500ms forwards;
1493 animation: itemZoom 500ms forwards;
1494 -webkit-animation-iteration-count: 1;
1495 -moz-animation-iteration-count: 1;
1496 -o-animation-iteration-count: 1;
1497 animation-iteration-count: 1;
1498 -webkit-animation-timing-function: ease-in-out;
1499 -moz-animation-timing-function: ease-in-out;
1500 -o-animation-timing-function: ease-in-out;
1501 animation-timing-function: ease-in-out;
1502 display: inline-block;
1503 }
1504 .kshf .hasLabelWidth {
1505 text-align: right;
1506 }
1507 .kshf .attrib:not([selected="0"]) .attribLabel {
1508 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigyMjAsMjIwLDIyMCkiIHN0b3Atb3BhY2l0eT0iMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDIyMCwyMjAsMjIwKSIgc3RvcC1vcGFjaXR5PSIxIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);
1509 background-image: -webkit-linear-gradient(left, rgba(220,220,220,0) 0%, rgba(220,220,220,1) 20px);
1510 background-image: -moz-linear-gradient(left, rgba(220,220,220,0) 0%, rgba(220,220,220,1) 20px);
1511 background-image: -o-linear-gradient(left, rgba(220,220,220,0) 0%, rgba(220,220,220,1) 20px);
1512 background-image: linear-gradient(to right, rgba(220,220,220,0) 0%, rgba(220,220,220,1) 20px);
1513 }
1514 .kshf .attrib:not([selected="0"]) .item_count_wrapper {
1515 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigyMjAsMjIwLDIyMCkiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDIyMCwyMjAsMjIwKSIgc3RvcC1vcGFjaXR5PSIwIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);
1516 background-image: -webkit-linear-gradient(left, rgba(220,220,220,1) 0%, rgba(220,220,220,0) 100%);
1517 background-image: -moz-linear-gradient(left, rgba(220,220,220,1) 0%, rgba(220,220,220,0) 100%);
1518 background-image: -o-linear-gradient(left, rgba(220,220,220,1) 0%, rgba(220,220,220,0) 100%);
1519 background-image: linear-gradient(to right, rgba(220,220,220,1) 0%, rgba(220,220,220,0) 100%);
1520 }
1521 .kshf .kshfChart[collapsed=true] .headerGroup > .header_display_control > .fa.buttonSummaryCollapse {
1522 opacity: 1;
1523 }
1524 .kshf .kshfChart[collapsed=true] .headerGroup > .header_display_control > .fa.buttonSummaryCollapse::before {
1525 content: "\f065" !important;
1526 }
1527 .kshf .belowAttribs {
1528 direction: ltr;
1529 }
1530 .kshf .subFacets .kshfChart {
1531 margin-left: 17px;
1532 }
1533 .kshf .facetCategorical .scrollToTop {
1534 right: 1px;
1535 }
1536 .kshf .chartClearFilterButton {
1537 width: 14px;
1538 height: 100%;
1539 display: inline-block;
1540 cursor: pointer;
1541 font-weight: 700;
1542 font-size: 11px;
1543 text-align: center;
1544 -webkit-transition: background-color 100ms linear,color 100ms linear, opacity 400ms;
1545 -moz-transition: background-color 100ms linear,color 100ms linear, opacity 400ms;
1546 -o-transition: background-color 100ms linear,color 100ms linear, opacity 400ms;
1547 transition: background-color 100ms linear,color 100ms linear, opacity 400ms;
1548 background-color: #635d46;
1549 color: #eeebe0;
1550 border: solid 1px #635d46;
1551 }
1552 .kshf .chartClearFilterButton:hover {
1553 background-color: #B6AF96;
1554 color: #635d46;
1555 }
1556 .kshf .chartClearFilterButton.alone {
1557 display: none;
1558 vertical-align: top;
1559 pointer-events: all;
1560 box-shadow: 0px 0px 1px #474940;
1561 margin-top: 1px;
1562 font-size: 0.8em;
1563 }
1564 .kshf .chartClearFilterButton.alone > .fa-times {
1565 top: -1px;
1566 position: relative;
1567 }
1568 .kshf .chartClearFilterButton.summary {
1569 display: inline-block;
1570 position: absolute;
1571 right: 0px;
1572 margin-left: 2px;
1573 line-height: 0.9em;
1574 }
1575 .kshf .chartClearFilterButton.allFilter {
1576 display: inline-block;
1577 margin-left: 2px;
1578 height: 19px;
1579 vertical-align: top;
1580 border-width: 0px 0px 0px 1px;
1581 line-height: 19px;
1582 }
1583 .kshf .selection_bar rect {
1584 fill: #788890;
1585 fill-opacity: 0;
1586 cursor: col-resize;
1587 stroke-width: 1.5;
1588 pointer-events: none;
1589 }
1590 .kshf .selection_bar rect:hover {
1591 stroke: orangered;
1592 }
1593 .kshf .chartAxis_Measure {
1594 pointer-events: none;
1595 position: absolute;
1596 z-index: 2;
1597 top: 0px;
1598 }
1599 .kshf .chartAxis_Measure > .tick {
1600 opacity: 0;
1601 position: absolute;
1602 }
1603 .kshf .chartAxis_Measure > .tick > .text {
1604 display: block;
1605 position: relative;
1606 text-align: center;
1607 font-size: 0.6em;
1608 font-weight: 300;
1609 line-height: 9px;
1610 cursor: default;
1611 color: gray;
1612 }
1613 .kshf .chartAxis_Measure > .tick > .line {
1614 display: block;
1615 position: absolute;
1616 }
1617 .kshf .chartAxis_Measure > .percentSign {
1618 pointer-events: all;
1619 position: absolute;
1620 color: gray;
1621 font-size: 0.7em;
1622 font-weight: 700;
1623 cursor: pointer;
1624 line-height: 1em;
1625 padding: 0px 2px;
1626 border: solid 1px rgba(153, 171, 146, 0);
1627 border-radius: 5px;
1628 background-color: rgba(211, 217, 197, 0);
1629 -webkit-transition: background-color 250ms linear, border-color 250ms linear;
1630 -moz-transition: background-color 250ms linear, border-color 250ms linear;
1631 -o-transition: background-color 250ms linear, border-color 250ms linear;
1632 transition: background-color 250ms linear, border-color 250ms linear;
1633 }
1634 .kshf .chartAxis_Measure > .percentSign:after {
1635 content: '#';
1636 }
1637 .kshf .chartAxis_Measure > .percentSign[highlight=true] {
1638 color: black;
1639 background-color: #d3d9c5;
1640 border: solid 1px #99ab92;
1641 }
1642 .kshf .chartAxis_Measure > .chartAxis_Measure_background {
1643 position: absolute;
1644 left: 0px;
1645 top: 0px;
1646 cursor: pointer;
1647 pointer-events: all;
1648 background-color: #E0E4D7;
1649 border: solid 1px #B7CAAF;
1650 border-radius: 5px;
1651 opacity: 0;
1652 -webkit-transition: opacity 250ms linear;
1653 -moz-transition: opacity 250ms linear;
1654 -o-transition: opacity 250ms linear;
1655 transition: opacity 250ms linear;
1656 }
1657 .kshf .chartAxis_Measure > .chartAxis_Measure_background[highlight=true] {
1658 opacity: 1;
1659 }
1660 .kshf .border_line {
1661 position: relative;
1662 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigxOTAsIDE5MCwgMTkwKSIgc3RvcC1vcGFjaXR5PSIwIi8+PHN0b3Agb2Zmc2V0PSIxMCUiIHN0b3AtY29sb3I9InJnYigxOTAsIDE5MCwgMTkwKSIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSI5MCUiIHN0b3AtY29sb3I9InJnYigxOTAsIDE5MCwgMTkwKSIgc3RvcC1vcGFjaXR5PSIxIi8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSJyZ2IoMTkwLCAxOTAsIDE5MCkiIHN0b3Atb3BhY2l0eT0iMCIvPjwvbGluZWFyR3JhZGllbnQ+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNsZXNzaGF0LWdlbmVyYXRlZCkiIC8+PC9zdmc+);
1663 background-image: -webkit-linear-gradient(right, rgba(190, 190, 190, 0) 0%, rgba(190, 190, 190, 1) 10%, rgba(190, 190, 190, 1) 90%, rgba(190, 190, 190, 0) 100%);;
1664 background-image: -moz-linear-gradient(right, rgba(190, 190, 190, 0) 0%, rgba(190, 190, 190, 1) 10%, rgba(190, 190, 190, 1) 90%, rgba(190, 190, 190, 0) 100%);;
1665 background-image: -o-linear-gradient(right, rgba(190, 190, 190, 0) 0%, rgba(190, 190, 190, 1) 10%, rgba(190, 190, 190, 1) 90%, rgba(190, 190, 190, 0) 100%);;
1666 background-image: linear-gradient(to left, rgba(190, 190, 190, 0) 0%, rgba(190, 190, 190, 1) 10%, rgba(190, 190, 190, 1) 90%, rgba(190, 190, 190, 0) 100%);;
1667 height: 1px;
1668 margin-bottom: -2px;
1669 pointer-events: all;
1670 top: -1px;
1671 }
1672 .kshf .border_line.border_line_bottom {
1673 width: 100%;
1674 height: 1px;
1675 margin-bottom: 0px;
1676 }
1677 .kshf .dragWidthHandle {
1678 display: none;
1679 position: absolute;
1680 top: 0px;
1681 cursor: col-resize;
1682 border-left: dotted lightgray 2px;
1683 width: 4px;
1684 }
1685 .kshf .dragWidthHandle:hover {
1686 border-color: gray;
1687 }
1688 .kshf .dragWidthHandle[dragging] {
1689 display: block;
1690 border-color: lightgray;
1691 border-style: solid;
1692 border-left-width: 2px;
1693 border-right: none;
1694 border-top: none;
1695 border-bottom: none;
1696 }
1697 .kshf .headerGroup {
1698 position: relative;
1699 text-align: center;
1700 padding-top: 1px;
1701 border-radius: 3px;
1702 box-shadow: 0px 0px 2px #9b9b9b;
1703 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigxOTAsIDE5MCwgMTkwKSIgc3RvcC1vcGFjaXR5PSIwLjMiLz48c3RvcCBvZmZzZXQ9IjIwJSIgc3RvcC1jb2xvcj0icmdiKDE5MCwgMTkwLCAxOTApIiBzdG9wLW9wYWNpdHk9IjAuNCIvPjxzdG9wIG9mZnNldD0iODAlIiBzdG9wLWNvbG9yPSJyZ2IoMTkwLCAxOTAsIDE5MCkiIHN0b3Atb3BhY2l0eT0iMC40Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSJyZ2IoMTkwLCAxOTAsIDE5MCkiIHN0b3Atb3BhY2l0eT0iMC4zIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);
1704 background-image: -webkit-linear-gradient(right, rgba(190, 190, 190, 0.3) 0%, rgba(190, 190, 190, 0.4) 20%, rgba(190, 190, 190, 0.4) 80%, rgba(190, 190, 190, 0.3) 100%);;
1705 background-image: -moz-linear-gradient(right, rgba(190, 190, 190, 0.3) 0%, rgba(190, 190, 190, 0.4) 20%, rgba(190, 190, 190, 0.4) 80%, rgba(190, 190, 190, 0.3) 100%);;
1706 background-image: -o-linear-gradient(right, rgba(190, 190, 190, 0.3) 0%, rgba(190, 190, 190, 0.4) 20%, rgba(190, 190, 190, 0.4) 80%, rgba(190, 190, 190, 0.3) 100%);;
1707 background-image: linear-gradient(to left, rgba(190, 190, 190, 0.3) 0%, rgba(190, 190, 190, 0.4) 20%, rgba(190, 190, 190, 0.4) 80%, rgba(190, 190, 190, 0.3) 100%);;
1708 z-index: 6;
1709 }
1710 .kshf .headerGroup .summaryTitle {
1711 display: block;
1712 font-weight: 700;
1713 cursor: default;
1714 padding-top: 2px;
1715 text-rendering: initial;
1716 white-space: nowrap;
1717 text-align: center;
1718 margin: 0 auto;
1719 height: 20px;
1720 /*white-space: nowrap;
1721 overflow: hidden;
1722 text-overflow: ellipsis;*/
1723 }
1724 .kshf .headerGroup .summaryTitle > .summaryTitle_text {
1725 display: inline-block;
1726 max-width: calc(100% - 60px);
1727 white-space: nowrap;
1728 overflow: hidden;
1729 text-overflow: ellipsis;
1730 font-size: 0.9em;
1731 }
1732 .kshf .headerGroup .summaryTitle > .summaryTitle_text:focus {
1733 background-color: white;
1734 box-shadow: 0 0 3px #2CABCF;
1735 outline: 0 none;
1736 padding-left: 3px;
1737 padding-right: 3px;
1738 }
1739 .kshf .headerGroup .save_filter_as_set {
1740 display: none;
1741 position: absolute;
1742 cursor: pointer;
1743 margin-left: 4px;
1744 margin-top: 1px;
1745 width: 15px;
1746 color: gray;
1747 }
1748 .kshf .headerGroup .save_filter_as_set:hover {
1749 color: black;
1750 }
1751 .kshf .headerGroup .chartClearFilterButton.rowFilter {
1752 pointer-events: all;
1753 height: 14px;
1754 width: 14px;
1755 line-height: 13px;
1756 margin-right: 3px;
1757 }
1758 .kshf .headerGroup .facetIcons {
1759 top: 2px;
1760 right: 2px;
1761 position: absolute;
1762 font-size: 0.9em;
1763 color: gray;
1764 }
1765 .kshf .headerGroup .facetIcons .fa {
1766 cursor: pointer;
1767 margin-left: 2px;
1768 }
1769 .kshf .headerGroup .facetIcons .fa:hover {
1770 color: black;
1771 }
1772 .kshf .headerGroup .facetIcons .hasMultiMappings {
1773 display: none;
1774 }
1775 .kshf .headerGroup .facetIcons .summaryDescription {
1776 cursor: default;
1777 }
1778 .kshf .headerGroup > .header_display_control {
1779 display: block;
1780 position: absolute;
1781 font-size: 0.9em;
1782 top: 3px;
1783 left: 2px;
1784 -webkit-transition: color 250ms linear, opacity 100ms linear ;
1785 -moz-transition: color 250ms linear, opacity 100ms linear ;
1786 -o-transition: color 250ms linear, opacity 100ms linear ;
1787 transition: color 250ms linear, opacity 100ms linear ;
1788 -webkit-transform-origin: 50% 50%;
1789 -moz-transform-origin: 50% 50%;
1790 -o-transform-origin: 50% 50%;
1791 -ms-transform-origin: 50% 50%;
1792 transform-origin: 50% 50%;
1793 }
1794 .kshf .headerGroup > .header_display_control > .fa {
1795 display: inline-block;
1796 vertical-align: top;
1797 opacity: 0;
1798 color: black;
1799 cursor: pointer;
1800 margin-right: 2px;
1801 width: 14px;
1802 height: 14px;
1803 width: 13px;
1804 height: 13px;
1805 }
1806 .kshf .headerGroup > .header_display_control > .fa:hover {
1807 color: #cb5454;
1808 }
1809 .kshf .headerGroup > .header_display_control > .buttonSummaryCollapse::before {
1810 content: "\f066";
1811 }
1812 .kshf .headerGroup > .header_display_control > .buttonSummaryRemove {
1813 display: none;
1814 }
1815 .kshf .headerGroup > .header_display_control > .buttonSummaryExpand {
1816 display: none;
1817 }
1818 .kshf .aggr {
1819 display: block;
1820 position: absolute;
1821 background-color: #b8c7d2;
1822 -webkit-transform-origin: 0% 0%;
1823 -moz-transform-origin: 0% 0%;
1824 -o-transform-origin: 0% 0%;
1825 -ms-transform-origin: 0% 0%;
1826 transform-origin: 0% 0%;
1827 }
1828 .kshf .aggr.active {
1829 cursor: pointer;
1830 pointer-events: all;
1831 }
1832 .kshf .aggr.total {
1833 background-color: #dee2e6;
1834 pointer-events: none;
1835 }
1836 .kshf .aggr.preview {
1837 background-color: #ff6a33;
1838 pointer-events: none;
1839 -webkit-transform: scaleX(0);
1840 -moz-transform: scaleX(0);
1841 -o-transform: scaleX(0);
1842 -ms-transform: scaleX(0);
1843 transform: scaleX(0);
1844 }
1845 .kshf .aggr.preview[fast] {
1846 -webkit-transition: -webkit-transform 200ms ease-in-out;
1847 -moz-transition: -moz-transform 200ms ease-in-out;
1848 -o-transition: -o-transform 200ms ease-in-out;
1849 transition: -webkit-transform 200ms ease-in-out,-moz-transform 200ms ease-in-out,-o-transform 200ms ease-in-out,transform 200ms ease-in-out;
1850 }
1851 .kshf .aggr.compare {
1852 background-color: #2f4f4f;
1853 pointer-events: none;
1854 -webkit-transition: -webkit-transform 700ms ease-in-out, opacity 400ms ease-in-out;
1855 -moz-transition: -moz-transform 700ms ease-in-out, opacity 400ms ease-in-out;
1856 -o-transition: -o-transform 700ms ease-in-out, opacity 400ms ease-in-out;
1857 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out, opacity 400ms ease-in-out;
1858 opacity: 0;
1859 }
1860 .kshf .kshfChart {
1861 display: block;
1862 position: relative;
1863 -webkit-transition: max-height 700ms ease-in-out;
1864 -moz-transition: max-height 700ms ease-in-out;
1865 -o-transition: max-height 700ms ease-in-out;
1866 transition: max-height 700ms ease-in-out;
1867 /* &:before{
1868 content:''; width:100%; height:100%;
1869 position:absolute; top:0; left:0;
1870 pointer-events:none;
1871 }*/
1872 }
1873 .kshf .kshfChart > .wrapper {
1874 position: relative;
1875 overflow: hidden;
1876 -webkit-transition: height 700ms ease-in-out;
1877 -moz-transition: height 700ms ease-in-out;
1878 -o-transition: height 700ms ease-in-out;
1879 transition: height 700ms ease-in-out;
1880 }
1881 .kshf .kshfChart > .wrapper > .facetCategorical {
1882 overflow: hidden;
1883 }
1884 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls {
1885 border-bottom: dotted 1px lightgray;
1886 margin-bottom: -1px;
1887 position: relative;
1888 display: none;
1889 }
1890 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch {
1891 display: none;
1892 vertical-align: top;
1893 white-space: nowrap;
1894 position: relative;
1895 cursor: text;
1896 height: 18px;
1897 }
1898 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchInput {
1899 display: inline-block;
1900 width: calc(100% - 13px);
1901 height: 15px;
1902 font-size: 0.7em;
1903 font-weight: 700;
1904 border-width: 0px;
1905 color: #cb5454;
1906 background-color: rgba(244, 244, 244, 0);
1907 pointer-events: all;
1908 margin: 2px 0px 0px 0px;
1909 cursor: text;
1910 text-align: right;
1911 }
1912 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchInput:focus {
1913 outline-color: #cb5454;
1914 outline-width: 2px;
1915 }
1916 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchInput:hover {
1917 border: solid 1px #cb5454;
1918 padding: 0px 0px 0px 0px;
1919 }
1920 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchInput::-webkit-input-placeholder {
1921 font-weight: 500;
1922 color: #cb5454;
1923 text-align: right;
1924 }
1925 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchInput:focus::-webkit-input-placeholder {
1926 color: #F3CDCD;
1927 }
1928 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchInput:hover::-webkit-input-placeholder {
1929 color: #F3CDCD;
1930 }
1931 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchControl {
1932 position: relative;
1933 top: 0px;
1934 padding-left: 1px;
1935 font-size: 0.7em;
1936 pointer-events: none;
1937 color: #cb5454;
1938 cursor: default;
1939 }
1940 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchControl:before {
1941 content: "\f002";
1942 }
1943 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchControl[showClear=true] {
1944 cursor: pointer;
1945 pointer-events: all;
1946 color: gray;
1947 }
1948 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchControl[showClear=true]:hover {
1949 color: #cb5454;
1950 }
1951 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .attribTextSearch > .attribTextSearchControl[showClear=true]:before {
1952 content: "\f057";
1953 }
1954 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .catSortButton {
1955 opacity: 0;
1956 position: absolute;
1957 bottom: 1px;
1958 font-size: 0.7em;
1959 text-align: right;
1960 padding-right: 2px;
1961 -webkit-transition: opacity 200ms linear;
1962 -moz-transition: opacity 200ms linear;
1963 -o-transition: opacity 200ms linear;
1964 transition: opacity 200ms linear;
1965 }
1966 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .catSortButton:hover {
1967 color: #ff4500;
1968 }
1969 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .catSortButton:before {
1970 content: "\f161";
1971 }
1972 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .catSortButton[inverse='true']:before {
1973 content: "\f160";
1974 }
1975 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .sortOptionSelectGroup {
1976 display: block;
1977 vertical-align: top;
1978 white-space: nowrap;
1979 position: relative;
1980 font-weight: 300;
1981 }
1982 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .sortOptionSelectGroup > .optionSelect {
1983 width: 100%;
1984 height: 17px;
1985 font-size: 0.7em;
1986 -webkit-appearance: none;
1987 -moz-appearance: none;
1988 background: transparent;
1989 appearance: none;
1990 font-weight: 300;
1991 border-width: 0px;
1992 cursor: pointer;
1993 padding-right: 0px;
1994 margin: 0px;
1995 vertical-align: middle;
1996 }
1997 .kshf .kshfChart > .wrapper > .facetCategorical > .facetControls > .sortOptionSelectGroup > .optionSelect:hover {
1998 color: orangered;
1999 }
2000 .kshf .kshfChart > .wrapper > .facetCategorical .scrollToTop {
2001 margin-top: -13px;
2002 font-size: 0.8em;
2003 pointer-events: all;
2004 position: absolute;
2005 }
2006 .kshf .kshfChart > .wrapper > .facetCategorical .selectAllAttribsButton {
2007 font-size: 0.6em;
2008 float: left;
2009 margin-left: 2px;
2010 font-weight: 300;
2011 color: black;
2012 border: solid 1px lightgray;
2013 border-radius: 10px;
2014 padding: 1px 5px 0px 5px;
2015 background-color: rgba(150, 150, 100, 0.2);
2016 cursor: pointer;
2017 }
2018 .kshf .kshfChart > .wrapper > .facetCategorical .selectAllAttribsButton:hover {
2019 box-shadow: 0px 0px 1px black;
2020 }
2021 .kshf .kshfChart > .wrapper > .facetCategorical .selectAllAttribsButton::before {
2022 content: '+ Add Filter with All';
2023 }
2024 .kshf .kshfChart > .wrapper > .facetCategorical .scroll_display_more {
2025 font-size: 0.7em;
2026 line-height: 1.4em;
2027 vertical-align: top;
2028 cursor: pointer;
2029 color: #b4b4b4;
2030 opacity: 1;
2031 pointer-events: all;
2032 display: inline-block;
2033 padding-top: 2px;
2034 }
2035 .kshf .kshfChart > .wrapper > .facetCategorical .scroll_display_more:hover {
2036 color: #cb5454;
2037 }
2038 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup {
2039 position: relative;
2040 overflow-y: auto;
2041 overflow-x: hidden;
2042 display: block;
2043 z-index: 5;
2044 -webkit-transition: height 700ms ease-in-out;
2045 -moz-transition: height 700ms ease-in-out;
2046 -o-transition: height 700ms ease-in-out;
2047 transition: height 700ms ease-in-out;
2048 }
2049 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .chartBackground {
2050 opacity: 0;
2051 width: 1px;
2052 display: block;
2053 -webkit-transition: opacity 250ms;
2054 -moz-transition: opacity 250ms;
2055 -o-transition: opacity 250ms;
2056 transition: opacity 250ms;
2057 }
2058 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .chartCatLabelResize {
2059 display: none;
2060 z-index: 25;
2061 }
2062 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib {
2063 display: block;
2064 position: absolute;
2065 white-space: nowrap;
2066 top: 0px;
2067 height: 16px;
2068 }
2069 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .clickArea {
2070 z-index: 20;
2071 display: inline-block;
2072 vertical-align: top;
2073 pointer-events: all;
2074 margin-top: 4px;
2075 margin-bottom: 4px;
2076 height: 10px !important;
2077 position: absolute;
2078 font-size: 0.8em;
2079 font-weight: 300;
2080 width: 1px;
2081 left: 0px;
2082 }
2083 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .compareButton {
2084 width: 9px;
2085 text-align: right;
2086 top: 4px;
2087 z-index: 300;
2088 }
2089 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .compareButton[inside] {
2090 margin-left: -11px;
2091 }
2092 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .attribLabel {
2093 position: absolute;
2094 display: inline-block;
2095 vertical-align: top;
2096 line-height: 18px;
2097 pointer-events: none;
2098 z-index: 21;
2099 font-size: 0.8em;
2100 font-weight: 300;
2101 cursor: default;
2102 white-space: nowrap;
2103 text-overflow: ellipsis;
2104 overflow: hidden;
2105 }
2106 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .attribLabel > .theLabel:before {
2107 color: white;
2108 font-weight: 300;
2109 font-size: 0.7em;
2110 vertical-align: top;
2111 border-radius: 3px;
2112 padding: 1px 2px 0px 2px;
2113 margin: 0px 2px;
2114 opacity: 0.4;
2115 }
2116 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .attribLabel > .theLabel .AndOrNot {
2117 display: inline;
2118 }
2119 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .item_count_wrapper {
2120 position: absolute;
2121 display: inline-block;
2122 vertical-align: top;
2123 line-height: 19px;
2124 height: 18px;
2125 font-size: 0.7em;
2126 pointer-events: none;
2127 padding-right: 1px;
2128 text-align: right;
2129 }
2130 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .aggr_Group {
2131 display: inline-block;
2132 vertical-align: top;
2133 position: relative;
2134 pointer-events: none;
2135 }
2136 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .aggr_Group .aggr {
2137 -webkit-transform-origin: 0% 0%;
2138 -moz-transform-origin: 0% 0%;
2139 -o-transform-origin: 0% 0%;
2140 -ms-transform-origin: 0% 0%;
2141 transform-origin: 0% 0%;
2142 top: 4px;
2143 width: 1px;
2144 height: 10px;
2145 }
2146 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .aggr_Group .aggr.total_tip {
2147 right: -5px;
2148 /* right arrow */
2149 border-top: 5px solid transparent;
2150 border-bottom: 5px solid transparent;
2151 border-left: 5px solid #dee2e6;
2152 background-color: initial;
2153 /*
2154 // The sawtooth pattern
2155 width: 8px;
2156 left: 0px;
2157 height: 10px;
2158 top: 4px;
2159 opacity: 0px;
2160
2161 background: linear-gradient(-135deg, transparent 75%, @color_bars_background 75%) 0 50%,
2162 linear-gradient(-45deg, transparent 75%, @color_bars_background 75%) 0 50%;
2163
2164 background-position: top left, top left;
2165 background-repeat: repeat;
2166 background-size: 8px 8px;
2167 */
2168 }
2169 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib > .aggr_Group .aggr.compare {
2170 width: 1px;
2171 height: 5px;
2172 }
2173 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .filterButtons {
2174 white-space: nowrap;
2175 cursor: pointer;
2176 vertical-align: top;
2177 z-index: 100;
2178 pointer-events: all;
2179 }
2180 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .filterButtons > .filterButton {
2181 display: none;
2182 pointer-events: all;
2183 margin-right: 2px;
2184 border-radius: 4px;
2185 vertical-align: middle;
2186 padding: 1px 2px 0px 3px;
2187 line-height: 13px;
2188 color: white;
2189 font-weight: 300;
2190 font-size: 0.7em;
2191 }
2192 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .filterButtons > .orButton {
2193 background-color: #269aa3;
2194 }
2195 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .filterButtons > .orButton:hover {
2196 background-color: #1c737a;
2197 }
2198 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .filterButtons > .notButton {
2199 background-color: #a6a6a6;
2200 }
2201 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib .filterButtons > .notButton:hover {
2202 background-color: gray;
2203 }
2204 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[activeItems='0'] .measureLabel {
2205 visibility: hidden;
2206 }
2207 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[compare="true"] > .attribLabel > .theLabel {
2208 font-weight: 700;
2209 }
2210 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib:not([selected="0"]) > .attribLabel > .theLabel {
2211 font-weight: 700;
2212 }
2213 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib:not([selected="0"]) .clickArea {
2214 cursor: pointer;
2215 }
2216 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="-1"] > .attribLabel > .theLabel {
2217 text-decoration: line-through;
2218 }
2219 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="1"] {
2220 /* &[show-box=true]{
2221 > .attribLabel > .theLabel:before{
2222 content: "And";
2223 background-color: @color_query_and;
2224 }
2225 }*/
2226 }
2227 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="1"] > .attribLabel > .theLabel {
2228 color: #1d4870;
2229 }
2230 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="2"] > .attribLabel > .theLabel {
2231 color: #1c737a;
2232 }
2233 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="2"][show-box=true] > .attribLabel > .filterButtons > .orButton {
2234 display: inline;
2235 }
2236 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="-1"] {
2237 /*
2238 > .attribLabel > .theLabel{
2239 color: @color_query_not;
2240 &:before{
2241 content: "Not";
2242 background-color: @color_query_not;
2243 }
2244 }
2245 */
2246 }
2247 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="-1"] > .attribLabel > .theLabel {
2248 color: #808080;
2249 }
2250 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="-1"] > .attribLabel > .filterButtons > .notButton {
2251 display: inline;
2252 background-color: #808080;
2253 }
2254 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=false][highlight^="selected"] > .attribLabel > .theLabel {
2255 font-weight: 700 !important;
2256 }
2257 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=false][highlight^="selected"][selected="0"] .clickArea {
2258 cursor: pointer;
2259 }
2260 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=false][highlight^="selected"][selected="0"][selecttype="and"] > .attribLabel > .theLabel {
2261 color: #1d4870;
2262 }
2263 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=false][highlight^="selected"][selected="0"][selecttype="or"] > .attribLabel > .theLabel {
2264 color: #1c737a;
2265 }
2266 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=false][highlight^="selected"][selected="0"][selecttype="not"] > .attribLabel > .theLabel {
2267 color: #808080;
2268 text-decoration: line-through;
2269 }
2270 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=false][highlight=true] > .attribLabel > .theLabel {
2271 color: #ff6a33;
2272 font-weight: 700;
2273 }
2274 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=true] {
2275 color: gray;
2276 }
2277 .kshf .kshfChart > .wrapper > .facetCategorical > .attribGroup > .attrib[noitems=true] .measureLabel {
2278 display: none;
2279 }
2280 .kshf .kshfChart > .wrapper > .facetCategorical:hover > .facetControls > .catSortButton {
2281 opacity: 1;
2282 }
2283 .kshf .kshfChart > .wrapper > .facetInterval {
2284 padding: 7px 11px 0px 6px;
2285 overflow: hidden;
2286 }
2287 .kshf .kshfChart > .wrapper > .facetInterval[scaletype="time"] span.aggr {
2288 opacity: 0 !important;
2289 }
2290 .kshf .kshfChart > .wrapper > .facetInterval[scaletype="step"] .zoomControl[sign="plus"] {
2291 display: none !important;
2292 }
2293 .kshf .kshfChart > .wrapper > .facetInterval[zoomed="true"] .zoomControl[sign="minus"] {
2294 display: block !important;
2295 }
2296 .kshf .kshfChart > .wrapper > .facetInterval > .histogram {
2297 position: relative;
2298 pointer-events: all;
2299 -webkit-transition: height 700ms ease-in-out;
2300 -moz-transition: height 700ms ease-in-out;
2301 -o-transition: height 700ms ease-in-out;
2302 transition: height 700ms ease-in-out;
2303 }
2304 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .lineTrend.total {
2305 fill: #EEF0F2;
2306 stroke: none;
2307 stroke-width: 1.5px;
2308 }
2309 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .lineTrend.active {
2310 fill: #d7e0e6;
2311 stroke: #b8c7d2;
2312 stroke-width: 1.5px;
2313 }
2314 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .activeLine {
2315 stroke: #b8c7d2;
2316 stroke-width: 2px;
2317 }
2318 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .lineTrend.preview {
2319 fill: rgba(255, 106, 51, 0.3);
2320 stroke: #ff6a33;
2321 stroke-width: 2px;
2322 opacity: 0;
2323 -webkit-transition: opacity 500ms linear;
2324 -moz-transition: opacity 500ms linear;
2325 -o-transition: opacity 500ms linear;
2326 transition: opacity 500ms linear;
2327 }
2328 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .previewLine {
2329 stroke: #ff6a33;
2330 stroke-width: 2px;
2331 opacity: 0;
2332 }
2333 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .lineTrend.compare {
2334 fill: none;
2335 stroke: #2f4f4f;
2336 stroke-width: 1.5px;
2337 opacity: 0;
2338 -webkit-transition: opacity 500ms linear;
2339 -moz-transition: opacity 500ms linear;
2340 -o-transition: opacity 500ms linear;
2341 transition: opacity 500ms linear;
2342 }
2343 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .timeSVG .compareLine {
2344 stroke: #2f4f4f;
2345 stroke-width: 2px;
2346 opacity: 0;
2347 }
2348 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins {
2349 position: absolute;
2350 top: 0px;
2351 z-index: 3;
2352 height: 100%;
2353 -webkit-transition: -webkit-transform 700ms ease-in-out, background-color 250ms ease-in-out;
2354 -moz-transition: -moz-transform 700ms ease-in-out, background-color 250ms ease-in-out;
2355 -o-transition: -o-transform 700ms ease-in-out, background-color 250ms ease-in-out;
2356 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out, background-color 250ms ease-in-out;
2357 }
2358 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group {
2359 position: absolute;
2360 display: block;
2361 height: 100%;
2362 pointer-events: none;
2363 }
2364 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group > .aggr {
2365 width: 1px;
2366 height: 1px;
2367 -webkit-transform-origin: 0% 100%;
2368 -moz-transform-origin: 0% 100%;
2369 -o-transform-origin: 0% 100%;
2370 -ms-transform-origin: 0% 100%;
2371 transform-origin: 0% 100%;
2372 }
2373 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group > .aggr.total_tip {
2374 content: " ";
2375 display: block;
2376 position: absolute;
2377 top: -7px;
2378 width: 100%;
2379 left: 0px;
2380 height: 8px;
2381 opacity: 0;
2382 background: linear-gradient(-135deg, transparent 75%, #dee2e6 75%) 0 50%, linear-gradient(135deg, transparent 75%, #dee2e6 75%) 0 50%;
2383 background-position: top left, top left;
2384 background-repeat: repeat;
2385 background-size: 8px 8px;
2386 }
2387 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group > .compareButton {
2388 position: absolute;
2389 width: 100%;
2390 text-align: center;
2391 }
2392 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group > .compareButton[inside] {
2393 margin-top: 12px;
2394 }
2395 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group > .measureLabel {
2396 top: 1px;
2397 display: block;
2398 position: relative;
2399 width: 100%;
2400 font-size: 0.7em;
2401 text-align: center;
2402 cursor: pointer;
2403 pointer-events: all;
2404 -webkit-transition: -webkit-transform 700ms ease-in-out;
2405 -moz-transition: -moz-transform 700ms ease-in-out;
2406 -o-transition: -o-transform 700ms ease-in-out;
2407 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out;
2408 }
2409 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .bins > .aggr_Group[noitems=true] > .measureLabel {
2410 display: none;
2411 }
2412 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .chartAxis_Measure {
2413 top: 0px;
2414 width: 100%;
2415 height: 100%;
2416 }
2417 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .chartAxis_Measure > .percentSign {
2418 bottom: -1px;
2419 left: 0px;
2420 width: 20px;
2421 text-align: right;
2422 }
2423 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .chartAxis_Measure > .chartAxis_Measure_background {
2424 width: 21px;
2425 height: calc(100% - 12px);
2426 top: 0px;
2427 }
2428 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .chartAxis_Measure > .tick {
2429 left: 21px;
2430 width: 100%;
2431 }
2432 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .chartAxis_Measure > .tick > .line {
2433 border-bottom: dotted 1px #b6b3b3;
2434 width: 100%;
2435 left: 0px;
2436 pointer-events: none;
2437 }
2438 .kshf .kshfChart > .wrapper > .facetInterval > .histogram > .chartAxis_Measure > .tick > .text {
2439 position: relative;
2440 width: 25px;
2441 left: -25px;
2442 top: -3px;
2443 text-align: right;
2444 padding-right: 1px;
2445 }
2446 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup {
2447 height: 12px;
2448 margin-top: 1px;
2449 position: relative;
2450 border-style: solid;
2451 border-color: lightgray;
2452 border-width: 1px 0px;
2453 }
2454 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .percentileTitle {
2455 font-size: 0.6em;
2456 position: absolute;
2457 display: inline-block;
2458 font-weight: 300;
2459 top: 0px;
2460 left: -9px;
2461 text-shadow: 0px 0px 2px white;
2462 z-index: 120;
2463 color: gray;
2464 pointer-events: none;
2465 display: none;
2466 }
2467 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup:hover > .percentileTitle {
2468 display: block;
2469 }
2470 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile {
2471 display: inline-block;
2472 position: absolute;
2473 height: 10px;
2474 left: 0px;
2475 width: 1px;
2476 -webkit-transition: -webkit-transform 700ms ease-in-out;
2477 -moz-transition: -moz-transform 700ms ease-in-out;
2478 -o-transition: -o-transform 700ms ease-in-out;
2479 transition: -webkit-transform 700ms ease-in-out,-moz-transform 700ms ease-in-out,-o-transform 700ms ease-in-out,transform 700ms ease-in-out;
2480 -webkit-transform-origin: 0% 0%;
2481 -moz-transform-origin: 0% 0%;
2482 -o-transform-origin: 0% 0%;
2483 -ms-transform-origin: 0% 0%;
2484 transform-origin: 0% 0%;
2485 }
2486 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_pos {
2487 background-color: #1b6f61;
2488 margin-left: -0.5px;
2489 z-index: 101;
2490 pointer-events: none;
2491 }
2492 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_pos.q_50 {
2493 width: 4px;
2494 background-color: #1b6f61;
2495 margin-left: -2px;
2496 pointer-events: all;
2497 }
2498 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_range:hover {
2499 border-color: #1b6f61;
2500 border-style: solid;
2501 border-width: 1px 0px 1px 0px;
2502 z-index: 100;
2503 }
2504 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_40_60 {
2505 background-color: #2aad97;
2506 }
2507 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_30_70 {
2508 background-color: #78decd;
2509 }
2510 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_20_80 {
2511 background-color: #caf2eb;
2512 }
2513 .kshf .kshfChart > .wrapper > .facetInterval > .percentileGroup > .quantile.q_10_90 {
2514 background-color: #f3fcfb;
2515 }
2516 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider {
2517 position: relative;
2518 pointer-events: all;
2519 }
2520 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .zoomControl {
2521 display: none;
2522 position: absolute;
2523 left: -20px;
2524 top: -1px;
2525 font-size: 0.8em;
2526 color: gray;
2527 cursor: pointer;
2528 }
2529 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .zoomControl:hover {
2530 color: black;
2531 }
2532 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .zoomControl[sign="plus"]:before {
2533 content: "\f00e";
2534 }
2535 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .zoomControl[sign="minus"]:before {
2536 content: "\f010";
2537 }
2538 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine {
2539 height: 11px;
2540 cursor: ew-resize;
2541 }
2542 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .selectedItemValue {
2543 position: absolute;
2544 z-index: 20;
2545 top: 1px;
2546 display: none;
2547 -webkit-transition: all 450ms ease-in-out;
2548 -moz-transition: all 450ms ease-in-out;
2549 -o-transition: all 450ms ease-in-out;
2550 transition: all 450ms ease-in-out;
2551 }
2552 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .selectedItemValue > .circlee {
2553 display: block;
2554 border-radius: 20px;
2555 width: 8px;
2556 height: 8px;
2557 background-color: orangered;
2558 left: -4px;
2559 position: relative;
2560 }
2561 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .selectedItemValue > .selected-item-value-text {
2562 position: relative;
2563 top: 0px;
2564 color: #ff6a33;
2565 font-size: 0.8em;
2566 white-space: nowrap;
2567 }
2568 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .selectedItemValue > .selected-item-value-text > .selected-item-value-text-v {
2569 position: relative;
2570 left: -50%;
2571 top: -2px;
2572 background-color: white;
2573 border-radius: 4px;
2574 border: solid 1px #DDDDDD;
2575 padding: 0px 1px;
2576 font-size: 0.9em;
2577 }
2578 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .base {
2579 display: block;
2580 position: absolute;
2581 box-shadow: inset 0px 0px 2px gray;
2582 -webkit-transform-origin: 0% 0%;
2583 -moz-transform-origin: 0% 0%;
2584 -o-transform-origin: 0% 0%;
2585 -ms-transform-origin: 0% 0%;
2586 transform-origin: 0% 0%;
2587 }
2588 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .base.total {
2589 width: 100%;
2590 height: 3px;
2591 top: 3px;
2592 background-color: lightgray;
2593 }
2594 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .base.active {
2595 height: 8px;
2596 top: 1px;
2597 width: 1px;
2598 opacity: 0;
2599 pointer-events: none;
2600 background-color: #30b8c4;
2601 -webkit-transition: opacity 500ms;
2602 -moz-transition: opacity 500ms;
2603 -o-transition: opacity 500ms;
2604 transition: opacity 500ms;
2605 }
2606 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .base.active[filtered=true] {
2607 opacity: 1;
2608 pointer-events: all;
2609 }
2610 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .base.active:hover {
2611 background-color: orangered !important;
2612 }
2613 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle {
2614 display: block;
2615 position: absolute;
2616 width: 6px;
2617 height: 8px;
2618 background-color: white;
2619 border-width: 1px;
2620 border-color: black;
2621 border-style: solid;
2622 cursor: ew-resize;
2623 z-index: 10;
2624 top: 1px;
2625 }
2626 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle:hover {
2627 background-color: orangered !important;
2628 }
2629 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle.min {
2630 left: -5px;
2631 border-top-left-radius: 10px;
2632 border-bottom-left-radius: 10px;
2633 }
2634 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle.min > .rangeLimitOnChart {
2635 left: 3px;
2636 }
2637 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle.max {
2638 border-top-right-radius: 10px;
2639 border-bottom-right-radius: 10px;
2640 }
2641 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle.max > .rangeLimitOnChart {
2642 left: -2px;
2643 }
2644 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle > .rangeLimitOnChart {
2645 position: absolute;
2646 display: none;
2647 width: 2px;
2648 border-left: dotted 2px #30b8c4;
2649 cursor: ew-resize;
2650 box-shadow: 0px 0px 2px white;
2651 }
2652 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle > .rangeLimitOnChart:hover {
2653 border-left: solid 2px #30b8c4;
2654 }
2655 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .labelGroup {
2656 cursor: default;
2657 position: relative;
2658 }
2659 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .labelGroup > .tick {
2660 position: absolute;
2661 }
2662 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .labelGroup > .tick > .text {
2663 top: -1px;
2664 font-size: 0.7em;
2665 font-weight: 300;
2666 position: relative;
2667 left: -50%;
2668 display: block;
2669 text-align: center;
2670 white-space: nowrap;
2671 }
2672 .kshf .kshfChart > .wrapper > .facetInterval > .intervalSlider > .labelGroup > .tick > .line {
2673 position: absolute;
2674 top: -10px;
2675 height: 10px;
2676 border-left: solid 1px #a0a0a0;
2677 display: block;
2678 pointer-events: none;
2679 }
2680 .kshf .kshfChart .subFacets {
2681 position: relative;
2682 height: 100%;
2683 }
2684 .kshf .kshfChart .facetGroupBar {
2685 display: inline-block;
2686 position: absolute;
2687 height: 100%;
2688 width: 17px;
2689 border-right: solid 2px #ccc3c3;
2690 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjAlIiB5MT0iMCUiIHgyPSIxMDAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigyMDQsMTk1LDE5NSkiIHN0b3Atb3BhY2l0eT0iMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0icmdiKDIwNCwxOTUsMTk1KSIgc3RvcC1vcGFjaXR5PSIwLjUiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxIiBoZWlnaHQ9IjEiIGZpbGw9InVybCgjbGVzc2hhdC1nZW5lcmF0ZWQpIiAvPjwvc3ZnPg==);
2691 background-image: -webkit-linear-gradient(left, rgba(204,195,195,0) 0%, rgba(204,195,195,0.5) 100%);
2692 background-image: -moz-linear-gradient(left, rgba(204,195,195,0) 0%, rgba(204,195,195,0.5) 100%);
2693 background-image: -o-linear-gradient(left, rgba(204,195,195,0) 0%, rgba(204,195,195,0.5) 100%);
2694 background-image: linear-gradient(to right, rgba(204,195,195,0) 0%, rgba(204,195,195,0.5) 100%);
2695 }
2696 .kshf .kshfChart .facetGroupBar > .facetGroupBarSub {
2697 height: 100%;
2698 width: 1px;
2699 margin: auto;
2700 background-color: black;
2701 }
2702 .kshf .kshfChart[collapsed=true] > .headerGroup .summaryTitle {
2703 cursor: pointer;
2704 }
2705 .kshf .kshfChart[collapsed=true] > .wrapper .facetCategorical > .facetControls {
2706 display: none;
2707 }
2708 .kshf .kshfChart[collapsed=true] > .wrapper .facetCategorical > .scrollToTop {
2709 display: none;
2710 }
2711 .kshf .kshfChart[collapsed=true] > .wrapper .facetCategorical > .attribGroup {
2712 display: none;
2713 }
2714 .kshf .kshfChart[collapsed=true] > .wrapper .facetCategorical > .belowAttribs {
2715 display: none;
2716 }
2717 .kshf .kshfChart[collapsed=true] > .wrapper .facetInterval > .histogram {
2718 display: none;
2719 }
2720 .kshf .kshfChart[collapsed=true] > .wrapper .facetInterval > .intervalSlider {
2721 display: none;
2722 }
2723 .kshf .kshfChart[filtered=true] > .headerGroup .chartClearFilterButton {
2724 display: inline-block;
2725 }
2726 .kshf .kshfChart[filtered=true]:hover > .wrapper > .facetInterval > .intervalSlider > .zoomControl {
2727 display: block;
2728 }
2729 .kshf .kshfChart[filtered=true]:hover > .wrapper > .facetInterval > .intervalSlider > .controlLine > .handle > .rangeLimitOnChart {
2730 display: block;
2731 }
2732 .kshf .kshfChart[hasmultivalueitem=false][filtered_or="0"][filtered_and="0"] > .wrapper > .facetCategorical > .attribGroup > .attrib:hover[selected="0"] .notButton {
2733 display: inline;
2734 }
2735 .kshf .kshfChart[hasmultivalueitem=false][filtered_or="0"] > .wrapper > .facetCategorical > .attribGroup > .attrib:hover[selected="-1"] {
2736 cursor: pointer;
2737 }
2738 .kshf .kshfChart:not([filtered_or="0"]) > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="0"]:hover .orButton {
2739 display: inline;
2740 }
2741 .kshf .kshfChart:not([filtered_and="0"]) > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="0"]:hover .orButton {
2742 display: inline;
2743 }
2744 .kshf .kshfChart[hasmultivalueitem=true] > .wrapper > .facetCategorical > .attribGroup > .attrib[selected="0"][highlight="selected"] .notButton {
2745 display: inline;
2746 }
2747 .kshf .kshfChart[filtered_range=true] .chartClearFilterButton.rangeFilter {
2748 display: inline-block;
2749 }
2750 .kshf .kshfChart[refreshSorting="true"] .catSortButton:before {
2751 content: "\f175" !important;
2752 }
2753 .kshf .kshfChart:hover > .headerGroup {
2754 box-shadow: 0px 0px 2px #646464;
2755 }
2756 .kshf .kshfChart:hover > .headerGroup > .header_display_control > .fa {
2757 opacity: 1;
2758 }
2759 .kshf .kshfChart:hover[hasmultivalueitem=true] > .headerGroup .hasMultiMappings {
2760 display: inline-block;
2761 }
2762 .kshf .kshfChart[hasFacets=true] > .headerGroup {
2763 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigxNTEsIDE1MSwgMTUxKSIgc3RvcC1vcGFjaXR5PSIwLjIiLz48c3RvcCBvZmZzZXQ9IjIwJSIgc3RvcC1jb2xvcj0icmdiKDE1MSwgMTUxLCAxNTEpIiBzdG9wLW9wYWNpdHk9IjAuNCIvPjxzdG9wIG9mZnNldD0iODAlIiBzdG9wLWNvbG9yPSJyZ2IoMTUxLCAxNTEsIDE1MSkiIHN0b3Atb3BhY2l0eT0iMC40Ii8+PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSJyZ2IoMTUxLCAxNTEsIDE1MSkiIHN0b3Atb3BhY2l0eT0iMC4yIi8+PC9saW5lYXJHcmFkaWVudD48cmVjdCB4PSIwIiB5PSIwIiB3aWR0aD0iMSIgaGVpZ2h0PSIxIiBmaWxsPSJ1cmwoI2xlc3NoYXQtZ2VuZXJhdGVkKSIgLz48L3N2Zz4=);
2764 background-image: -webkit-linear-gradient(right, rgba(151, 151, 151, 0.2) 0%, rgba(151, 151, 151, 0.4) 20%, rgba(151, 151, 151, 0.4) 80%, rgba(151, 151, 151, 0.2) 100%);;
2765 background-image: -moz-linear-gradient(right, rgba(151, 151, 151, 0.2) 0%, rgba(151, 151, 151, 0.4) 20%, rgba(151, 151, 151, 0.4) 80%, rgba(151, 151, 151, 0.2) 100%);;
2766 background-image: -o-linear-gradient(right, rgba(151, 151, 151, 0.2) 0%, rgba(151, 151, 151, 0.4) 20%, rgba(151, 151, 151, 0.4) 80%, rgba(151, 151, 151, 0.2) 100%);;
2767 background-image: linear-gradient(to left, rgba(151, 151, 151, 0.2) 0%, rgba(151, 151, 151, 0.4) 20%, rgba(151, 151, 151, 0.4) 80%, rgba(151, 151, 151, 0.2) 100%);;
2768 }
2769 .kshf .kshfChart[hasFacets=true] > .headerGroup .summaryTitle {
2770 font-size: 1.3em;
2771 }
2772 .kshf .belowAttribs {
2773 position: relative;
2774 height: 18px;
2775 }
2776 .kshf .belowAttribs .border_line {
2777 opacity: 0.6;
2778 }
2779 .kshf .belowAttribs > .chartAxis_Measure > .percentSign {
2780 right: 0px;
2781 }
2782 .kshf .belowAttribs > .chartAxis_Measure > .chartAxis_Measure_background {
2783 height: 12px;
2784 }
2785 .kshf .belowAttribs > .chartAxis_Measure > .tick > .text {
2786 width: 20px;
2787 left: -10px;
2788 top: 2px;
2789 -webkit-transition: top 700ms ease-in-out;
2790 -moz-transition: top 700ms ease-in-out;
2791 -o-transition: top 700ms ease-in-out;
2792 transition: top 700ms ease-in-out;
2793 }
2794 .kshf .belowAttribs > .chartAxis_Measure > .tick > .line {
2795 width: 0px;
2796 border-left: dotted 1px #b6b3b3;
2797 -webkit-transition: top 700ms ease-in-out, height 700ms ease-in-out;
2798 -moz-transition: top 700ms ease-in-out, height 700ms ease-in-out;
2799 -o-transition: top 700ms ease-in-out, height 700ms ease-in-out;
2800 transition: top 700ms ease-in-out, height 700ms ease-in-out;
2801 }
2802 .kshf .measureLabel {
2803 color: #969da3;
2804 }
2805 .kshf[resultpreview="true"] .measureLabel {
2806 color: orangered;
2807 }
2808 .kshf[resultpreview="true"] .kshfChart:not([hasmultivalueitem="true"]):hover .attrib:not([highlight="selected"]) .measureLabel {
2809 color: #969da3;
2810 }
2811 .kshf[resultpreview="true"] .kshfChart:not([hasmultivalueitem="true"]):hover .aggr_Group:not([highlight="selected"]) .measureLabel {
2812 color: #969da3;
2813 }
2814 .kshf[resultpreview="true"] .lineTrend.preview {
2815 opacity: 1 !important;
2816 }
2817 .kshf[resultpreview="true"] .previewLine {
2818 opacity: 1 !important;
2819 }
2820 .kshf .selectVertLine {
2821 display: inline-block;
2822 background-color: #EEDDDE;
2823 width: 2px;
2824 display: none;
2825 position: absolute;
2826 }
2827 .kshf .middleColumn {
2828 display: -webkit-box;
2829 display: -moz-box;
2830 display: -webkit-inline-flex;
2831 display: -ms-inline-flexbox;
2832 display: inline-flex;
2833 -webkit-box-direction: normal;
2834 -moz-box-direction: normal;
2835 -webkit-box-orient: vertical;
2836 -moz-box-orient: vertical;
2837 -webkit-flex-direction: column;
2838 -ms-flex-direction: column;
2839 flex-direction: column;
2840 -webkit-box-flex: 1;
2841 -moz-box-flex: 1;
2842 -webkit-flex: 1;
2843 -ms-flex: 1;
2844 flex: 1;
2845 position: relative;
2846 }
2847 .kshf .recordDisplay {
2848 position: relative;
2849 top: 0px;
2850 overflow: hidden;
2851 display: -webkit-box;
2852 display: -moz-box;
2853 display: -webkit-flex;
2854 display: -ms-flexbox;
2855 display: flex;
2856 -webkit-box-direction: normal;
2857 -moz-box-direction: normal;
2858 -webkit-box-orient: vertical;
2859 -moz-box-orient: vertical;
2860 -webkit-flex-direction: column;
2861 -ms-flex-direction: column;
2862 flex-direction: column;
2863 -webkit-transition: margin-top 700ms ease-in-out;
2864 -moz-transition: margin-top 700ms ease-in-out;
2865 -o-transition: margin-top 700ms ease-in-out;
2866 transition: margin-top 700ms ease-in-out;
2867 }
2868 .kshf .recordDisplay > .dropZone_recordView {
2869 display: none;
2870 position: relative;
2871 height: 100%;
2872 width: 100%;
2873 z-index: 50;
2874 cursor: s-resize;
2875 background-color: #efecde;
2876 border-radius: 0px 0px 40px 40px;
2877 border-style: solid;
2878 border-width: 0px 0px 2px 0px;
2879 border-color: #918e7b;
2880 text-align: center;
2881 margin-bottom: 5px;
2882 }
2883 .kshf .recordDisplay > .dropZone_recordView > .dropIcon {
2884 margin: 10px 0px 0px 0px;
2885 font-size: 2em;
2886 color: #918E7B;
2887 text-shadow: 1px 1px 1px #B8B6AB;
2888 }
2889 .kshf .recordDisplay > .dropZone_recordView:hover {
2890 background-color: #ffbca3;
2891 }
2892 .kshf .recordDisplay > .dropZone_recordView[readyToDrop=true] {
2893 background-color: #ffbca3;
2894 }
2895 .kshf .recordDisplay > .listItemGroup {
2896 width: 100%;
2897 overflow-y: scroll;
2898 overflow-x: hidden;
2899 position: relative;
2900 background-color: white;
2901 -webkit-transition: height 700ms ease-in-out;
2902 -moz-transition: height 700ms ease-in-out;
2903 -o-transition: height 700ms ease-in-out;
2904 transition: height 700ms ease-in-out;
2905 }
2906 .kshf .recordDisplay > .listItemGroup > .dragWidthHandle {
2907 z-index: 200;
2908 height: 100%;
2909 }
2910 .kshf .recordDisplay > .listItemGroup > .listItem {
2911 opacity: 1;
2912 cursor: default;
2913 overflow: hidden;
2914 vertical-align: top;
2915 padding: 1px 0px;
2916 position: relative;
2917 -webkit-transition: opacity 500ms ease;
2918 -moz-transition: opacity 500ms ease;
2919 -o-transition: opacity 500ms ease;
2920 transition: opacity 500ms ease;
2921 }
2922 .kshf .recordDisplay > .listItemGroup > .listItem > .recordRank {
2923 font-size: 0.6em;
2924 color: gray;
2925 font-weight: 300;
2926 font-style: italic;
2927 text-align: right;
2928 }
2929 .kshf .recordDisplay > .listItemGroup > .listItem > .content {
2930 vertical-align: top;
2931 border: solid 0px lightgray;
2932 position: relative;
2933 }
2934 .kshf .recordDisplay > .listItemGroup > .listItem > .content > .iteminfo {
2935 float: none;
2936 clear: left;
2937 font-weight: normal;
2938 margin-bottom: 2px;
2939 }
2940 .kshf .recordDisplay > .listItemGroup > .listItem > .content > .iteminfo_0 {
2941 font-size: 1.0em;
2942 color: black;
2943 }
2944 .kshf .recordDisplay > .listItemGroup > .listItem > .content > .iteminfo_1 {
2945 font-size: 0.9em;
2946 color: #555555;
2947 }
2948 .kshf .recordDisplay > .listItemGroup > .listItem > .content > .iteminfo_2 {
2949 font-size: 0.8em;
2950 color: #555555;
2951 font-style: italic;
2952 font-weight: 300;
2953 }
2954 .kshf .recordDisplay > .listItemGroup > .listItem > .content > .iteminfo_3 {
2955 font-size: 0.8em;
2956 color: #a71f1f;
2957 font-style: italic;
2958 font-weight: 300;
2959 }
2960 .kshf .recordDisplay > .listItemGroup > .listItem > .recordToggleDetail {
2961 display: none;
2962 vertical-align: top;
2963 width: 18px;
2964 cursor: pointer;
2965 font-weight: 700;
2966 }
2967 .kshf .recordDisplay > .listItemGroup > .listItem > .recordToggleDetail > .item_details_toggle {
2968 -webkit-transition: -webkit-transform 500ms;
2969 -moz-transition: -moz-transform 500ms;
2970 -o-transition: -o-transform 500ms;
2971 transition: -webkit-transform 500ms,-moz-transform 500ms,-o-transform 500ms,transform 500ms;
2972 color: gray;
2973 position: relative;
2974 }
2975 .kshf .recordDisplay > .listItemGroup > .listItem > .recordToggleDetail > .item_details_toggle:hover {
2976 color: black;
2977 }
2978 .kshf .recordDisplay > .listItemGroup > .listItem[animst="open"] {
2979 opacity: 0;
2980 }
2981 .kshf .recordDisplay > .listItemGroup > .listItem[animst="closed"] {
2982 max-height: 0px !important;
2983 padding: 0px !important;
2984 opacity: 0;
2985 }
2986 .kshf .recordDisplay > .listItemGroup > .listItem[animst="visible"] {
2987 display: block;
2988 }
2989 .kshf .recordDisplay > .listItemGroup > .listItem[details="true"] {
2990 max-height: none;
2991 }
2992 .kshf .recordDisplay > .listItemGroup > .listItem[details="true"] .item_details_toggle {
2993 display: inline-block;
2994 -webkit-transform: rotate(180deg);
2995 -moz-transform: rotate(180deg);
2996 -o-transform: rotate(180deg);
2997 -ms-transform: rotate(180deg);
2998 transform: rotate(180deg);
2999 }
3000 .kshf .recordDisplay > .listItemGroup > .listItem[details="true"] .item_details {
3001 display: block;
3002 }
3003 .kshf .recordDisplay > .listItemGroup > .listItem[details="false"] .item_details_toggle {
3004 display: inline-block;
3005 }
3006 .kshf .recordDisplay > .listItemGroup > .listItem[details="false"] .item_details {
3007 display: none;
3008 }
3009 .kshf .recordDisplay > .listItemGroup > .listItem[highlight^="selected"] {
3010 box-shadow: inset 0px 0px 2px black;
3011 }
3012 .kshf .recordDisplay > .listItemGroup > .listItem[highlight^="selected"][selectedForLink=true] {
3013 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMTAwJSIgaGVpZ2h0PSIxMDAlIiB2aWV3Qm94PSIwIDAgMSAxIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJub25lIj48bGluZWFyR3JhZGllbnQgaWQ9Imxlc3NoYXQtZ2VuZXJhdGVkIiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeDE9IjEwMCUiIHkxPSIwJSIgeDI9IjAlIiB5Mj0iMCUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9InJnYigyNTUsMTkzLDE1NykiIHN0b3Atb3BhY2l0eT0iMSIvPjxzdG9wIG9mZnNldD0iNTAlIiBzdG9wLWNvbG9yPSJyZ2IoMjU1LDE5MywxNTcpIiBzdG9wLW9wYWNpdHk9IjAiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9InJnYigyNTUsMTkzLDE1NykiIHN0b3Atb3BhY2l0eT0iMCIvPjwvbGluZWFyR3JhZGllbnQ+PHJlY3QgeD0iMCIgeT0iMCIgd2lkdGg9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNsZXNzaGF0LWdlbmVyYXRlZCkiIC8+PC9zdmc+);
3014 background-image: -webkit-linear-gradient(right, rgba(255,193,157,1), rgba(255,193,157,0) 30px, rgba(255,193,157,0) 100%);
3015 background-image: -moz-linear-gradient(right, rgba(255,193,157,1), rgba(255,193,157,0) 30px, rgba(255,193,157,0) 100%);
3016 background-image: -o-linear-gradient(right, rgba(255,193,157,1), rgba(255,193,157,0) 30px, rgba(255,193,157,0) 100%);
3017 background-image: linear-gradient(to left, rgba(255,193,157,1), rgba(255,193,157,0) 30px, rgba(255,193,157,0) 100%);
3018 }
3019 .kshf .recordDisplay > .listItemGroup > .listItem[highlight^="selected"][selectedForLink=true] > .itemLinkStateColumn > .itemLinkIcon {
3020 display: inline;
3021 color: #cc3700;
3022 }
3023 .kshf .recordDisplay > .listItemGroup > .listItem[highlight^="selected"][selectedForLink=true] > .itemLinkStateColumn > .itemLinkIcon:hover {
3024 color: orangered;
3025 }
3026 .kshf .recordDisplay > .listItemGroup > .listItem[highlight=true] {
3027 box-shadow: inset 0px 0px 5px #BBBBBB;
3028 background-color: #F8F8F8;
3029 }
3030 .kshf .recordDisplay > .listItemGroup > .listItem[highlight=true] > .itemLinkStateColumn > .itemLinkIcon {
3031 display: inline;
3032 color: gray;
3033 }
3034 .kshf .recordDisplay > .listItemGroup > .listItem[selectedForLink=true] .itemLinkStateColumn > .itemSelectCheckbox:before {
3035 content: "\f046";
3036 }
3037 .kshf .recordDisplay > .listItemGroup > .listItem[selectedForLink=false] .itemLinkStateColumn > .itemSelectCheckbox:before {
3038 content: "\f096";
3039 }
3040 .kshf .recordDisplay > .showMore {
3041 display: block;
3042 cursor: pointer;
3043 border: solid 1px lightgray;
3044 border-radius: 9px;
3045 box-shadow: 2px 2px 2px #D8D8D8;
3046 font-weight: 300;
3047 font-size: 0.8em;
3048 background-color: #eee;
3049 height: 20px;
3050 width: calc(100% - 23px);
3051 text-align: center;
3052 position: absolute;
3053 left: 4px;
3054 -webkit-transition: bottom 700ms ease 50ms;
3055 -moz-transition: bottom 700ms ease 50ms;
3056 -o-transition: bottom 700ms ease 50ms;
3057 transition: bottom 700ms ease 50ms;
3058 }
3059 .kshf .recordDisplay > .showMore lesshat-selector {
3060 -lh-property: 0; }
3061 @-webkit-keyframes fade{ 0%{opacity:1;} 50%{opacity:0;} 100% {opacity:1;}}
3062 @-moz-keyframes fade{ 0%{opacity:1;} 50%{opacity:0;} 100% {opacity:1;}}
3063 @-o-keyframes fade{ 0%{opacity:1;} 50%{opacity:0;} 100% {opacity:1;}}
3064 @keyframes fade{ 0%{opacity:1;} 50%{opacity:0;} 100% {opacity:1;};
3065 }
3066 .kshf .recordDisplay > .showMore > .MoreText {
3067 display: inline-block;
3068 vertical-align: top;
3069 top: 2px;
3070 position: relative;
3071 }
3072 .kshf .recordDisplay > .showMore > .Count {
3073 font-size: 0.9em;
3074 top: 3px;
3075 position: relative;
3076 color: gray;
3077 }
3078 .kshf .recordDisplay > .showMore > .Count.CountAbove {
3079 float: left;
3080 margin-left: 3px;
3081 }
3082 .kshf .recordDisplay > .showMore > .Count.CountBelow {
3083 float: right;
3084 margin-right: 3px;
3085 }
3086 .kshf .recordDisplay > .showMore:hover {
3087 box-shadow: 2px 2px 2px gray;
3088 }
3089 .kshf .recordDisplay > .showMore:hover span.MoreText {
3090 text-decoration: underline;
3091 }
3092 .kshf .recordDisplay > .showMore[showMoreVisible=true] {
3093 opacity: 1;
3094 bottom: 4px;
3095 }
3096 .kshf .recordDisplay > .showMore[showMoreVisible=false] {
3097 bottom: -27px;
3098 opacity: 0;
3099 }
3100 .kshf .recordDisplay[showRank=true] .recordRank {
3101 display: inline-block;
3102 }
3103 .kshf .recordDisplay[showRank=true] .itemRank_control {
3104 color: black;
3105 }
3106 .kshf .recordDisplay[showRank=false] .recordRank {
3107 display: none;
3108 }
3109 .kshf .recordDisplay[showRank=false] .itemRank_control {
3110 color: gray;
3111 }
3112 .kshf .recordDisplay[displaytype="grid"][hasrecordview="true"] > .listItemGroup {
3113 display: -webkit-box;
3114 display: -moz-box;
3115 display: -webkit-flex;
3116 display: -ms-flexbox;
3117 display: flex;
3118 -webkit-box-direction: normal;
3119 -moz-box-direction: normal;
3120 -webkit-box-orient: horizontal;
3121 -moz-box-orient: horizontal;
3122 -webkit-flex-direction: row;
3123 -ms-flex-direction: row;
3124 flex-direction: row;
3125 -webkit-flex-wrap: wrap;
3126 -ms-flex-wrap: wrap;
3127 flex-wrap: wrap;
3128 justify-content: space-around;
3129 -webkit-justify-content: space-around;
3130 }
3131 .kshf .recordDisplay[displaytype="grid"][hasrecordview="true"] > .listItemGroup > .listItem {
3132 display: block;
3133 -webkit-align-self: flex-start;
3134 -ms-flex-item-align: start;
3135 align-self: flex-start;
3136 }
3137 .kshf .recordDisplay[displaytype="grid"][hasrecordview="true"] > .listItemGroup > .listItem > .recordRank {
3138 vertical-align: top;
3139 margin-right: 2px;
3140 }
3141 .kshf .recordDisplay[displaytype="grid"][hasrecordview="true"] > .listItemGroup > .listItem > .content {
3142 display: block;
3143 }
3144 .kshf .recordDisplay[displaytype="grid"][hasrecordview="true"] > .listItemGroup > .listItem > .recordToggleDetail {
3145 display: block;
3146 position: absolute;
3147 z-index: 10;
3148 }
3149 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"] > .listItemGroup > .listItem {
3150 display: -webkit-box;
3151 display: -moz-box;
3152 display: -webkit-flex;
3153 display: -ms-flexbox;
3154 display: flex;
3155 -webkit-box-direction: normal;
3156 -moz-box-direction: normal;
3157 -webkit-box-orient: horizontal;
3158 -moz-box-orient: horizontal;
3159 -webkit-flex-direction: row;
3160 -ms-flex-direction: row;
3161 flex-direction: row;
3162 width: 100%;
3163 }
3164 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"] > .listItemGroup > .listItem > .recordSortCol {
3165 padding-right: 3px;
3166 padding-top: 2px;
3167 font-weight: 300;
3168 text-align: right;
3169 font-size: 0.8em;
3170 cursor: default;
3171 vertical-align: top;
3172 white-space: nowrap;
3173 text-overflow: ellipsis;
3174 overflow: hidden;
3175 }
3176 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"] > .listItemGroup > .listItem > .recordRank {
3177 float: left;
3178 margin-top: 4px;
3179 width: 15px;
3180 padding-right: 2px;
3181 }
3182 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"] > .listItemGroup > .listItem > .recordToggleDetail {
3183 width: 18px;
3184 text-align: center;
3185 }
3186 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"] > .listItemGroup > .listItem > .content {
3187 -webkit-box-flex: 1;
3188 -moz-box-flex: 1;
3189 -webkit-flex: 1;
3190 -ms-flex: 1;
3191 flex: 1;
3192 }
3193 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"][detailsToggle="zoom"] > .listItemGroup > .listItem > .recordToggleDetail {
3194 display: inline-block;
3195 }
3196 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"][detailsToggle="one"] > .listItemGroup > .listItem > .recordToggleDetail {
3197 display: inline-block;
3198 }
3199 .kshf .recordDisplay[displaytype="list"][hasrecordview="true"][detailsToggle="one"] > .listItemGroup > .listItem > .recordToggleDetail > .item_details_toggle:before {
3200 content: "\f078";
3201 }
3202 .kshf .recordDisplay[detailsToggle="zoom"] > .listItemGroup > .listItem > .recordToggleDetail > .item_details_toggle:before {
3203 content: "\f140";
3204 }
3205 .kshf .recordDisplay[hasRecordView="false"] > .recordDisplay--Header {
3206 display: none;
3207 }
3208 .kshf .recordDisplay[hasRecordView="false"] > .dropZone_recordView {
3209 -webkit-box-flex: 1;
3210 -moz-box-flex: 1;
3211 -webkit-flex: 1;
3212 -ms-flex: 1;
3213 flex: 1;
3214 position: absolute;
3215 }
3216 .kshf .recordDisplay[hasRecordView="false"] > .listItemGroup {
3217 display: none;
3218 }
3219 .kshf .recordDisplay[hasRecordView="true"] {
3220 box-shadow: 0px 0px 2px #89713c;
3221 margin: 0px 2px 2px 2px;
3222 }
3223 .kshf .recordDisplay[hasRecordView="true"] > .recordDisplay--Header {
3224 display: -webkit-box;
3225 display: -moz-box;
3226 display: -webkit-flex;
3227 display: -ms-flexbox;
3228 display: flex;
3229 }
3230 .kshf .recordDisplay[hasRecordView="true"] > .dropZone_recordView {
3231 position: absolute;
3232 }
3233 .kshf .recordDisplay:hover > .recordDisplay--Header > .sortColumn {
3234 opacity: 1;
3235 pointer-events: all;
3236 }
3237 .kshf .scrollToTop {
3238 display: inline-block;
3239 visibility: hidden;
3240 color: red;
3241 cursor: pointer;
3242 color: #aaaaaa;
3243 -webkit-transition: color 300ms ease-in-out;
3244 -moz-transition: color 300ms ease-in-out;
3245 -o-transition: color 300ms ease-in-out;
3246 transition: color 300ms ease-in-out;
3247 }
3248 .kshf .scrollToTop:hover {
3249 color: #cb5454;
3250 }
3251 .kshf .recordDisplay--Header {
3252 font-size: 0.9em;
3253 position: relative;
3254 background-color: #EBE5DF;
3255 -webkit-box-direction: normal;
3256 -moz-box-direction: normal;
3257 -webkit-box-orient: horizontal;
3258 -moz-box-orient: horizontal;
3259 -webkit-flex-direction: row;
3260 -ms-flex-direction: row;
3261 flex-direction: row;
3262 min-height: 18px;
3263 }
3264 .kshf .recordDisplay--Header > .itemRank_control {
3265 display: none;
3266 width: 13px;
3267 text-align: right;
3268 font-weight: 100;
3269 font-size: 0.9em;
3270 cursor: pointer;
3271 }
3272 .kshf .recordDisplay--Header > .itemRank_control:before {
3273 content: "\f102";
3274 }
3275 .kshf .recordDisplay--Header > .itemRank_control:hover {
3276 color: orangered;
3277 }
3278 .kshf .recordDisplay--Header > .removeSortOption_wrapper {
3279 display: none;
3280 }
3281 .kshf .recordDisplay--Header .removeSortOption {
3282 cursor: pointer;
3283 width: 14px;
3284 height: 14px;
3285 display: inline-block;
3286 color: gray;
3287 }
3288 .kshf .recordDisplay--Header .removeSortOption:before {
3289 content: "\f00d";
3290 }
3291 .kshf .recordDisplay--Header .removeSortOption:hover {
3292 color: black;
3293 }
3294 .kshf .recordDisplay--Header > .header_listSortColumn {
3295 display: inline-block;
3296 -webkit-align-self: flex-end;
3297 -ms-flex-item-align: end;
3298 align-self: flex-end;
3299 white-space: nowrap;
3300 text-align: right;
3301 padding-right: 1px;
3302 position: relative;
3303 }
3304 .kshf .recordDisplay--Header > .header_listSortColumn > .sortColumnName {
3305 font-weight: 300;
3306 font-size: 0.9em;
3307 margin: 0px 0px 1px 3px;
3308 display: inline-block;
3309 cursor: default;
3310 -webkit-user-select: none;
3311 -moz-user-select: none;
3312 -ms-user-select: none;
3313 user-select: none;
3314 pointer-events: none;
3315 }
3316 .kshf .recordDisplay--Header > .header_listSortColumn > .listSortOptionSelect {
3317 width: 100%;
3318 bottom: 0px;
3319 }
3320 .kshf .recordDisplay--Header > .header_listSortColumn > .dropZone_resultSort {
3321 display: none;
3322 cursor: s-resize;
3323 position: absolute;
3324 height: 100%;
3325 width: 100%;
3326 z-index: 50;
3327 background-color: #eaeaea;
3328 border-radius: 5px;
3329 border-style: solid;
3330 border-width: 2px;
3331 border-color: gray;
3332 text-align: center;
3333 }
3334 .kshf .recordDisplay--Header > .header_listSortColumn > .dropZone_resultSort > .dropZone_resultSort_text {
3335 pointer-events: none;
3336 font-size: 0.8em;
3337 display: block;
3338 font-weight: 300;
3339 }
3340 .kshf .recordDisplay--Header > .header_listSortColumn > .dropZone_resultSort > .dropZone_resultSort_text:before {
3341 content: "Sort by";
3342 }
3343 .kshf .recordDisplay--Header > .header_listSortColumn > .dropZone_resultSort:hover {
3344 background-color: #ffbca3;
3345 }
3346 .kshf .recordDisplay--Header > .sortColumn {
3347 opacity: 0;
3348 -webkit-align-self: flex-end;
3349 -ms-flex-item-align: end;
3350 align-self: flex-end;
3351 width: 17px;
3352 font-size: 0.8em;
3353 margin-bottom: 2px;
3354 vertical-align: bottom;
3355 -webkit-transition: opacity 250ms linear;
3356 -moz-transition: opacity 250ms linear;
3357 -o-transition: opacity 250ms linear;
3358 transition: opacity 250ms linear;
3359 }
3360 .kshf .recordDisplay--Header > .buttonRecordViewRemove {
3361 display: inline-block;
3362 visibility: hidden;
3363 }
3364 .kshf .recordDisplay--Header > .buttonRecordViewRemove:hover {
3365 cursor: pointer;
3366 color: orangered;
3367 }
3368 .kshf .recordDisplay--Header > .scrollToTop {
3369 padding-top: 2px;
3370 }
3371 .kshf .recordDisplay--Header > .recordTextSearch {
3372 -webkit-box-flex: 1;
3373 -moz-box-flex: 1;
3374 -webkit-flex: 1;
3375 -ms-flex: 1;
3376 flex: 1;
3377 -webkit-align-self: flex-end;
3378 -ms-flex-item-align: end;
3379 align-self: flex-end;
3380 white-space: nowrap;
3381 display: inline-block;
3382 vertical-align: bottom;
3383 position: relative;
3384 height: 18px;
3385 margin-left: 4px;
3386 }
3387 .kshf .recordDisplay--Header > .recordTextSearch > .dropZone_textSearch {
3388 display: none;
3389 position: absolute;
3390 height: 100%;
3391 width: 100%;
3392 z-index: 50;
3393 background-color: #eaeaea;
3394 border-radius: 5px;
3395 border-style: solid;
3396 border-width: 2px;
3397 border-color: gray;
3398 text-align: center;
3399 }
3400 .kshf .recordDisplay--Header > .recordTextSearch > .dropZone_textSearch > .dropZone_textSearch_text {
3401 pointer-events: none;
3402 font-size: 0.7em;
3403 display: block;
3404 font-weight: 300;
3405 }
3406 .kshf .recordDisplay--Header > .recordTextSearch > .dropZone_textSearch:hover {
3407 background-color: #ffbca3;
3408 }
3409 .kshf .recordDisplay--Header > .recordTextSearch > .mainTextSearch_input {
3410 display: none;
3411 font-size: 0.8em;
3412 font-weight: 700;
3413 color: #cb5454;
3414 padding: 0px 2px;
3415 background-color: rgba(255, 255, 255, 0);
3416 pointer-events: all;
3417 border-width: 0px;
3418 border-style: solid;
3419 border-color: #cb5454;
3420 margin: 1px;
3421 width: calc(100% - 17px);
3422 }
3423 .kshf .recordDisplay--Header > .recordTextSearch > .mainTextSearch_input:focus {
3424 outline-color: #cb5454;
3425 outline-width: 2px;
3426 }
3427 .kshf .recordDisplay--Header > .recordTextSearch > .mainTextSearch_input:hover {
3428 border-width: 1px;
3429 background-color: white;
3430 margin: 0px;
3431 }
3432 .kshf .recordDisplay--Header > .recordTextSearch > .mainTextSearch_input::-webkit-input-placeholder {
3433 color: #cb5454;
3434 font-weight: 300;
3435 }
3436 .kshf .recordDisplay--Header > .recordTextSearch > .mainTextSearch_input:focus::-webkit-input-placeholder {
3437 color: #F3CDCD;
3438 }
3439 .kshf .recordDisplay--Header > .recordTextSearch > .searchIcon {
3440 display: none;
3441 padding-left: 1px;
3442 color: #cb5454;
3443 }
3444 .kshf .recordDisplay--Header > .recordTextSearch > .clearText {
3445 display: none;
3446 position: absolute;
3447 right: 4px;
3448 top: 1px;
3449 cursor: pointer;
3450 color: gray;
3451 }
3452 .kshf .recordDisplay--Header > .recordTextSearch > .clearText:hover {
3453 color: #cb5454;
3454 }
3455 .kshf .recordDisplay--Header > .recordTextSearch[isActive="true"] > .mainTextSearch_input {
3456 display: inline-block;
3457 }
3458 .kshf .recordDisplay--Header > .recordTextSearch[isActive="true"] > .searchIcon {
3459 display: inline-block;
3460 }
3461 .kshf .boxinbox {
3462 margin-top: 10px;
3463 }
3464 .kshf .boxinbox:hover {
3465 background-color: #EFEFEF;
3466 }
3467 .kshf .boxinbox ul {
3468 margin: 5px 0px 5px 0px;
3469 }
3470 .kshf .boxinbox.features {
3471 width: 500px;
3472 text-align: left;
3473 border: solid 0px lightgray;
3474 box-shadow: 0px 0px 0px gray;
3475 }
3476 .kshf .boxinbox.features .credits_features {
3477 margin-top: 4px;
3478 padding-left: 20px;
3479 }
3480 .kshf .boxinbox.project_credits {
3481 font-size: 0.9em;
3482 font-style: italic;
3483 }
3484 .kshf .boxinbox.project_credits a.myName {
3485 display: inline-block;
3486 margin: 17px 10px;
3487 vertical-align: top;
3488 color: black;
3489 font-weight: 700;
3490 font-style: normal;
3491 text-decoration: none;
3492 }
3493 .kshf .boxinbox.project_3rdparty img {
3494 position: relative;
3495 }
3496 @-webkit-keyframes stretchdelay {
3497 0%,
3498 40%,
3499 100% {
3500 -webkit-transform: scaleY(0.4);
3501 -moz-transform: scaleY(0.4);
3502 -o-transform: scaleY(0.4);
3503 -ms-transform: scaleY(0.4);
3504 transform: scaleY(0.4);
3505 }
3506 20% {
3507 -webkit-transform: scaleY(0.8);
3508 -moz-transform: scaleY(0.8);
3509 -o-transform: scaleY(0.8);
3510 -ms-transform: scaleY(0.8);
3511 transform: scaleY(0.8);
3512 background-color: #fa7746;
3513 }
3514 }
3515 @-moz-keyframes stretchdelay {
3516 0%,
3517 40%,
3518 100% {
3519 -webkit-transform: scaleY(0.4);
3520 -moz-transform: scaleY(0.4);
3521 -o-transform: scaleY(0.4);
3522 -ms-transform: scaleY(0.4);
3523 transform: scaleY(0.4);
3524 }
3525 20% {
3526 -webkit-transform: scaleY(0.8);
3527 -moz-transform: scaleY(0.8);
3528 -o-transform: scaleY(0.8);
3529 -ms-transform: scaleY(0.8);
3530 transform: scaleY(0.8);
3531 background-color: #fa7746;
3532 }
3533 }
3534 @-ms-keyframes stretchdelay {
3535 0%,
3536 40%,
3537 100% {
3538 -webkit-transform: scaleY(0.4);
3539 -moz-transform: scaleY(0.4);
3540 -o-transform: scaleY(0.4);
3541 -ms-transform: scaleY(0.4);
3542 transform: scaleY(0.4);
3543 }
3544 20% {
3545 -webkit-transform: scaleY(0.8);
3546 -moz-transform: scaleY(0.8);
3547 -o-transform: scaleY(0.8);
3548 -ms-transform: scaleY(0.8);
3549 transform: scaleY(0.8);
3550 background-color: #fa7746;
3551 }
3552 }
3553 @-o-keyframes stretchdelay {
3554 0%,
3555 40%,
3556 100% {
3557 -webkit-transform: scaleY(0.4);
3558 -moz-transform: scaleY(0.4);
3559 -o-transform: scaleY(0.4);
3560 -ms-transform: scaleY(0.4);
3561 transform: scaleY(0.4);
3562 }
3563 20% {
3564 -webkit-transform: scaleY(0.8);
3565 -moz-transform: scaleY(0.8);
3566 -o-transform: scaleY(0.8);
3567 -ms-transform: scaleY(0.8);
3568 transform: scaleY(0.8);
3569 background-color: #fa7746;
3570 }
3571 }
3572 @keyframes stretchdelay {
3573 0%,
3574 40%,
3575 100% {
3576 -webkit-transform: scaleY(0.4);
3577 -moz-transform: scaleY(0.4);
3578 -o-transform: scaleY(0.4);
3579 -ms-transform: scaleY(0.4);
3580 transform: scaleY(0.4);
3581 }
3582 20% {
3583 -webkit-transform: scaleY(0.8);
3584 -moz-transform: scaleY(0.8);
3585 -o-transform: scaleY(0.8);
3586 -ms-transform: scaleY(0.8);
3587 transform: scaleY(0.8);
3588 background-color: #fa7746;
3589 }
3590 }
3591 .tipsy {
3592 font-size: 10px;
3593 position: absolute;
3594 padding: 5px;
3595 z-index: 100000;
3596 pointer-events: none;
3597 }
3598 .tipsy .tipsy-inner {
3599 font-family: Helvetica, Arial, sans-serif;
3600 padding: 3px;
3601 font-size: 1.2em;
3602 background-color: #000;
3603 color: #FFF;
3604 max-width: 200px;
3605 text-align: center;
3606 font-weight: 300px;
3607 border-radius: 3px;
3608 }
3609 .tipsy .tipsy-inner span.big {
3610 font-size: 1.4em;
3611 }
3612 .tipsy .tipsy-inner span.action {
3613 font-weight: 700;
3614 }
3615 .tipsy.tipsyFilterAnd .tipsy-inner {
3616 background-color: #1d4870;
3617 }
3618 .tipsy.tipsyFilterAnd .tipsy-arrow {
3619 border-color: #1d4870;
3620 }
3621 .tipsy.tipsyFilterOr .tipsy-inner {
3622 background-color: #1c737a;
3623 }
3624 .tipsy.tipsyFilterOr .tipsy-arrow {
3625 border-color: #1c737a;
3626 }
3627 .tipsy.tipsyFilterNot .tipsy-inner {
3628 background-color: #808080;
3629 }
3630 .tipsy.tipsyFilterNot .tipsy-arrow {
3631 border-color: #808080;
3632 }
3633 .tipsy.tipsyFilterLock .tipsy-inner {
3634 background-color: #2f4f4f;
3635 }
3636 .tipsy.tipsyFilterLock .tipsy-arrow {
3637 border-color: #2f4f4f;
3638 }
3639 /* Uncomment for shadow */
3640 /*.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }*/
3641 .tipsy-arrow {
3642 position: absolute;
3643 width: 0;
3644 height: 0;
3645 line-height: 0;
3646 border: 5px dashed #000;
3647 }
3648 .tipsy-n .tipsy-arrow {
3649 top: 0px;
3650 left: 50%;
3651 margin-left: -5px;
3652 border-bottom-style: solid;
3653 border-top: none;
3654 border-left-color: transparent !important;
3655 border-right-color: transparent !important;
3656 }
3657 .tipsy-nw .tipsy-arrow {
3658 top: 0;
3659 left: 10px;
3660 border-bottom-style: solid;
3661 border-top: none;
3662 border-left-color: transparent !important;
3663 border-right-color: transparent !important;
3664 }
3665 .tipsy-ne .tipsy-arrow {
3666 top: 0;
3667 right: 10px;
3668 border-bottom-style: solid;
3669 border-top: none;
3670 border-left-color: transparent !important;
3671 border-right-color: transparent !important;
3672 }
3673 .tipsy-s .tipsy-arrow {
3674 bottom: 0;
3675 left: 50%;
3676 margin-left: -5px;
3677 border-top-style: solid;
3678 border-bottom: none;
3679 border-left-color: transparent !important;
3680 border-right-color: transparent !important;
3681 }
3682 .tipsy-sw .tipsy-arrow {
3683 bottom: 0;
3684 left: 10px;
3685 border-top-style: solid;
3686 border-bottom: none;
3687 border-left-color: transparent !important;
3688 border-right-color: transparent !important;
3689 }
3690 .tipsy-se .tipsy-arrow {
3691 bottom: 0;
3692 right: 10px;
3693 border-top-style: solid;
3694 border-bottom: none;
3695 border-left-color: transparent !important;
3696 border-right-color: transparent !important;
3697 }
3698 .tipsy-e .tipsy-arrow {
3699 right: 0;
3700 top: 50%;
3701 margin-top: -5px;
3702 border-left-style: solid;
3703 border-right: none;
3704 border-top-color: transparent !important;
3705 border-bottom-color: transparent !important;
3706 }
3707 .tipsy-w .tipsy-arrow {
3708 left: 0;
3709 top: 50%;
3710 margin-top: -5px;
3711 border-right-style: solid;
3712 border-left: none;
3713 border-top-color: transparent !important;
3714 border-bottom-color: transparent !important;
3715 }
3716 @-webkit-keyframes shrink {
3717 from {
3718 -webkit-transform: scale(1);
3719 -moz-transform: scale(1);
3720 -o-transform: scale(1);
3721 -ms-transform: scale(1);
3722 transform: scale(1);
3723 }
3724 to {
3725 -webkit-transform: scale(0.5);
3726 -moz-transform: scale(0.5);
3727 -o-transform: scale(0.5);
3728 -ms-transform: scale(0.5);
3729 transform: scale(0.5);
3730 }
3731 }
3732 @-moz-keyframes shrink {
3733 from {
3734 -webkit-transform: scale(1);
3735 -moz-transform: scale(1);
3736 -o-transform: scale(1);
3737 -ms-transform: scale(1);
3738 transform: scale(1);
3739 }
3740 to {
3741 -webkit-transform: scale(0.5);
3742 -moz-transform: scale(0.5);
3743 -o-transform: scale(0.5);
3744 -ms-transform: scale(0.5);
3745 transform: scale(0.5);
3746 }
3747 }
3748 @-ms-keyframes shrink {
3749 from {
3750 -webkit-transform: scale(1);
3751 -moz-transform: scale(1);
3752 -o-transform: scale(1);
3753 -ms-transform: scale(1);
3754 transform: scale(1);
3755 }
3756 to {
3757 -webkit-transform: scale(0.5);
3758 -moz-transform: scale(0.5);
3759 -o-transform: scale(0.5);
3760 -ms-transform: scale(0.5);
3761 transform: scale(0.5);
3762 }
3763 }
3764 @-o-keyframes shrink {
3765 from {
3766 -webkit-transform: scale(1);
3767 -moz-transform: scale(1);
3768 -o-transform: scale(1);
3769 -ms-transform: scale(1);
3770 transform: scale(1);
3771 }
3772 to {
3773 -webkit-transform: scale(0.5);
3774 -moz-transform: scale(0.5);
3775 -o-transform: scale(0.5);
3776 -ms-transform: scale(0.5);
3777 transform: scale(0.5);
3778 }
3779 }
3780 @keyframes shrink {
3781 from {
3782 -webkit-transform: scale(1);
3783 -moz-transform: scale(1);
3784 -o-transform: scale(1);
3785 -ms-transform: scale(1);
3786 transform: scale(1);
3787 }
3788 to {
3789 -webkit-transform: scale(0.5);
3790 -moz-transform: scale(0.5);
3791 -o-transform: scale(0.5);
3792 -ms-transform: scale(0.5);
3793 transform: scale(0.5);
3794 }
3795 }
0 /*
1 99Lime.com HTML KickStart by Joshua Gatcke
2 kickstart-buttons.css
3
4 Super Easy Cross Browser CSS3 Gradients
5 http://www.colorzilla.com/gradient-editor/
6 */
7
8 /*---------------------------------
9 BUTTONS
10 -----------------------------------*/
11 button,
12 a.btn,
13 a.btn:visited,
14 a.button,
15 a.button:visited,
16 input[type="submit"],
17 input[type="reset"],
18 input[type="button"]{
19 position:relative;
20 top:0;
21 left:0;
22 vertical-align: middle;
23 margin:0;
24 padding:10px 15px;
25 line-height:100%;
26 -moz-border-radius:5px;
27 -webkit-border-radius:5px;
28 border-radius:5px;
29 cursor: pointer;
30 width:auto;
31 overflow:visible;
32 font-weight:normal;
33 font-size:14px; /*Pixels for consistancy*/
34 text-shadow:0 1px 0 #fff;
35 color:#666;
36 text-decoration:none;
37 vertical-align: middle;
38 -webkit-box-sizing: border-box;
39 -moz-box-sizing: border-box;
40 box-sizing: border-box;
41 display:inline-block;
42 *display:inline;/*IE ONLY*/
43 zoom:1;
44 border:1px solid #ccc;
45 background: rgb(252,252,252); /* Old browsers */
46 background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(224,224,224,1) 100%); /* FF3.6+ */
47 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(224,224,224,1))); /* Chrome,Safari4+ */
48 background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* Chrome10+,Safari5.1+ */
49 background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* Opera11.10+ */
50 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#e0e0e0',GradientType=0 ); /* IE6-9 */
51 background: linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* W3C */
52 }
53
54 button:active,
55 a.btn:active,
56 a.btn:visited:active,
57 a.button:active,
58 a.button:visited:active,
59 input[type="submit"]:active,
60 input[type="reset"]:active,
61 input[type="button"]:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.2),inset 0 -10px 20px rgba(0,0,0,0.07);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.2),inset 0 -10px 20px rgba(0,0,0,0.07);box-shadow:inset 0 3px 5px rgba(0,0,0,0.2),inset 0 -10px 20px rgba(0,0,0,0.07);}
62 button[disabled],.disabled:active{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;}
63
64 button,
65 input[type="submit"],
66 input[type="reset"],
67 input[type="button"]{*padding:7px 15px;}/*IE 7 ONLY*/
68
69 a.btn,a.button{}/*overrides*/
70 button.small, a.btn.small, a.button.small{font-size:0.8em;padding:5px 10px;}
71 button.medium, a.btn.medium, a.button.medium{}/*default*/
72 button.large, a.btn.large, a.button.large{font-size:1.3em;padding:10px 20px;}
73 button.disabled, a.btn.disabled, a.button.disabled{color:#ccc;cursor:default;background:#efefef;}
74 button.disabled:hover, a.btn.disabled:hover, a.button.disabled:hover{border:1px solid #ccc;background:#efefef;}
75
76 button:hover,
77 a.btn:hover,
78 a.button:hover,
79 input[type="submit"]:hover,
80 input[type="reset"]:hover,
81 input[type="button"]:hover{
82 border:1px solid #bbb;
83 background: rgb(252,252,252); /* Old browsers */
84 background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(237,237,237,1) 100%); /* FF3.6+ */
85 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(237,237,237,1))); /* Chrome,Safari4+ */
86 background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Chrome10+,Safari5.1+ */
87 background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Opera11.10+ */
88 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#ededed',GradientType=0 ); /* IE6-9 */
89 background: linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* W3C */
90 }
91
92
93 /*---------------------------------
94 BUTTON BAR
95 -----------------------------------*/
96 ul.button-bar{
97 display:inline-block;
98 *display:inline;
99 margin:0;
100 padding:0;
101 font-size:0;
102 position:relative;
103 top:0;
104 left:0;
105 zoom:1;
106 border:0;
107 background:0;
108 }
109
110 ul.button-bar li{
111 display:inline-block;
112 *display:inline;
113 position:relative;
114 top:0;
115 left:0;
116 zoom:1;
117 margin:0 -1px 0 0;
118 padding:0;
119 line-height:100%;
120 font-size:0px;
121 border:1px solid #ccc;
122 background: rgb(252,252,252); /* Old browsers */
123 background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(224,224,224,1) 100%); /* FF3.6+ */
124 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(224,224,224,1))); /* Chrome,Safari4+ */
125 background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* Chrome10+,Safari5.1+ */
126 background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* Opera11.10+ */
127 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#e0e0e0',GradientType=0 ); /* IE6-9 */
128 background: linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* W3C */
129 }
130
131 ul.button-bar li a{
132 margin:0;
133 display:inline-block;
134 *display:inline;
135 padding:7px 10px;
136 position:relative;
137 top:0;
138 left:0;
139 zoom:1;
140 font-weight:normal;
141 font-size:14px; /*Pixels for consistancy*/
142 text-shadow:0 1px 0 #fff;
143 color:#666;
144 text-decoration:none;
145 vertical-align: middle;
146 line-height:100%;
147 border-left:1px solid #fff;
148 }
149
150 ul.button-bar li.first,
151 ul.button-bar li.first a{
152 -moz-border-radius-bottomleft: 5px;
153 -moz-border-radius-topleft: 5px;
154 -webkit-border-bottom-left-radius: 5px;
155 -webkit-border-top-left-radius: 5px;
156 border-top-left-radius: 5px;
157 border-bottom-left-radius: 5px;
158 -moz-background-clip:content-box;
159 -webkit-background-clip: border;
160 background-clip: content-box;
161 }
162
163 ul.button-bar li.last,
164 ul.button-bar li.last a{
165 -moz-border-radius-bottomright: 5px;
166 -moz-border-radius-topright: 5px;
167 -webkit-border-bottom-right-radius: 5px;
168 -webkit-border-top-right-radius: 5px;
169 border-top-right-radius: 5px;
170 border-bottom-right-radius: 5px;
171 -moz-background-clip:content-box;
172 -webkit-background-clip: border;
173 }
174
175 ul.button-bar li a:hover{
176 background: rgb(252,252,252); /* Old browsers */
177 background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(237,237,237,1) 100%); /* FF3.6+ */
178 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(237,237,237,1))); /* Chrome,Safari4+ */
179 background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Chrome10+,Safari5.1+ */
180 background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Opera11.10+ */
181 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#ededed',GradientType=0 ); /* IE6-9 */
182 background: linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* W3C */
183 }
184
185 ul.button-bar li a:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.2),inset 0 -10px 20px rgba(0,0,0,0.07);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,0.2),inset 0 -10px 20px rgba(0,0,0,0.07);box-shadow:inset 0 3px 5px rgba(0,0,0,0.2),inset 0 -10px 20px rgba(0,0,0,0.07);border-left:1px solid #ccc;}
186
187 /*---------------------------------
188 STYLES
189 -----------------------------------*/
190 .pill{-webkit-border-radius:200em;-moz-border-radius:200em;border-radius:200em;}
191 .pop{-webkit-box-shadow:0px 1px 5px rgba(0,0,0,0.2);-moz-box-shadow:0px 1px 5px rgba(0,0,0,0.2);box-shadow:0px 1px 5px rgba(0,0,0,0.2);}
192 .inset{-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,0.3);-moz-box-shadow:inset 0 1px 3px rgba(0,0,0,0.3);box-shadow:inset 0 1px 3px rgba(0,0,0,0.3);}
193 .square{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;}
194
195 /*---------------------------------
196 ORANGE
197 -----------------------------------*/
198 button.orange,
199 a.btn.orange,
200 a.button.orange,
201 input[type=submit].orange,
202 input[type=reset].orange,
203 input[type=button].orange{
204 text-shadow:0 -1px 0 #FC730A;
205 color:#fff;
206 border:1px solid #FC730A;
207 background: rgb(255,168,76); /* Old browsers */
208 background: -moz-linear-gradient(top, rgba(255,168,76,1) 0%, rgba(255,123,13,1) 100%); /* FF3.6+ */
209 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,168,76,1)), color-stop(100%,rgba(255,123,13,1))); /* Chrome,Safari4+ */
210 background: -webkit-linear-gradient(top, rgba(255,168,76,1) 0%,rgba(255,123,13,1) 100%); /* Chrome10+,Safari5.1+ */
211 background: -o-linear-gradient(top, rgba(255,168,76,1) 0%,rgba(255,123,13,1) 100%); /* Opera 11.10+ */
212 background: linear-gradient(top, rgba(255,168,76,1) 0%,rgba(255,123,13,1) 100%); /* W3C */
213 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffa84c', endColorstr='#ff7b0d',GradientType=0 ); /* IE6-9 */
214 }
215
216 button.orange:hover,
217 a.btn.orange:hover,
218 a.button.orange:hover{
219 text-shadow:0 1px 0 #FC730A;
220 border:1px solid #FC730A;
221 background: rgb(249,191,74); /* Old browsers */
222 background: -moz-linear-gradient(top, rgba(249,191,74,1) 0%, rgba(249,181,9,1) 100%); /* FF3.6+ */
223 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(249,191,74,1)), color-stop(100%,rgba(249,181,9,1))); /* Chrome,Safari4+ */
224 background: -webkit-linear-gradient(top, rgba(249,191,74,1) 0%,rgba(249,181,9,1) 100%); /* Chrome10+,Safari5.1+ */
225 background: -o-linear-gradient(top, rgba(249,191,74,1) 0%,rgba(249,181,9,1) 100%); /* Opera 11.10+ */
226 background: linear-gradient(top, rgba(249,191,74,1) 0%,rgba(249,181,9,1) 100%); /* W3C */
227 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#f9bf4a', endColorstr='#f9b509',GradientType=0 ); /* IE6-9 */
228 }
229
230 /*---------------------------------
231 BLUE
232 -----------------------------------*/
233 button.blue,
234 a.btn.blue,
235 a.button.blue,
236 input[type=submit].blue,
237 input[type=reset].blue,
238 input[type=button].blue{
239 text-shadow:0 -1px 0 #1D6DC1;
240 color:#fff;
241 border:1px solid #1D6DC1;
242 background: rgb(122,188,255); /* Old browsers */
243 background: -moz-linear-gradient(top, rgba(122,188,255,1) 0%, rgba(96,171,248,1) 44%, rgba(64,150,238,1) 100%); /* FF3.6+ */
244 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(122,188,255,1)), color-stop(44%,rgba(96,171,248,1)), color-stop(100%,rgba(64,150,238,1))); /* Chrome,Safari4+ */
245 background: -webkit-linear-gradient(top, rgba(122,188,255,1) 0%,rgba(96,171,248,1) 44%,rgba(64,150,238,1) 100%); /* Chrome10+,Safari5.1+ */
246 background: -o-linear-gradient(top, rgba(122,188,255,1) 0%,rgba(96,171,248,1) 44%,rgba(64,150,238,1) 100%); /* Opera11.10+ */
247 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7abcff', endColorstr='#4096ee',GradientType=0 ); /* IE6-9 */
248 background: linear-gradient(top, rgba(122,188,255,1) 0%,rgba(96,171,248,1) 44%,rgba(64,150,238,1) 100%); /* W3C */
249 }
250
251 button.blue:hover,
252 a.btn.blue:hover,
253 a.button.blue:hover{
254 text-shadow:0 1px 0 #1D6DC1;
255 border:1px solid #1D6DC1;
256 background: rgb(155,205,255); /* Old browsers */
257 background: -moz-linear-gradient(top, rgba(155,205,255,1) 0%, rgba(134,192,250,1) 44%, rgba(110,176,242,1) 100%); /* FF3.6+ */
258 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(155,205,255,1)), color-stop(44%,rgba(134,192,250,1)), color-stop(100%,rgba(110,176,242,1))); /* Chrome,Safari4+ */
259 background: -webkit-linear-gradient(top, rgba(155,205,255,1) 0%,rgba(134,192,250,1) 44%,rgba(110,176,242,1) 100%); /* Chrome10+,Safari5.1+ */
260 background: -o-linear-gradient(top, rgba(155,205,255,1) 0%,rgba(134,192,250,1) 44%,rgba(110,176,242,1) 100%); /* Opera 11.10+ */
261 background: linear-gradient(top, rgba(155,205,255,1) 0%,rgba(134,192,250,1) 44%,rgba(110,176,242,1) 100%); /* W3C */
262 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#9bcdff', endColorstr='#6eb0f2',GradientType=0 ); /* IE6-9 */
263 }
264
265 /*---------------------------------
266 PINK
267 -----------------------------------*/
268 button.pink,
269 a.btn.pink,
270 a.button.pink,
271 input[type=submit].pink,
272 input[type=reset].pink,
273 input[type=button].pink{
274 text-shadow:0 -1px 0 #EF0251;
275 color:#fff;
276 border:1px solid #EF0251;
277 background: rgb(255,93,177); /* Old browsers */
278 background: -moz-linear-gradient(top, rgba(255,93,177,1) 0%, rgba(239,1,124,1) 100%); /* FF3.6+ */
279 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,93,177,1)), color-stop(100%,rgba(239,1,124,1))); /* Chrome,Safari4+ */
280 background: -webkit-linear-gradient(top, rgba(255,93,177,1) 0%,rgba(239,1,124,1) 100%); /* Chrome10+,Safari5.1+ */
281 background: -o-linear-gradient(top, rgba(255,93,177,1) 0%,rgba(239,1,124,1) 100%); /* Opera 11.10+ */
282 background: linear-gradient(top, rgba(255,93,177,1) 0%,rgba(239,1,124,1) 100%); /* W3C */
283 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ff5db1', endColorstr='#ef017c',GradientType=0 ); /* IE6-9 */
284 }
285
286 button.pink:hover,
287 a.btn.pink:hover,
288 a.button.pink:hover{
289 text-shadow:0 1px 0 #EF0251;
290 border:1px solid #EF0251;
291 background: rgb(255,169,213); /* Old browsers */
292 background: -moz-linear-gradient(top, rgba(255,169,213,1) 0%, rgba(254,112,185,1) 100%); /* FF3.6+ */
293 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,169,213,1)), color-stop(100%,rgba(254,112,185,1))); /* Chrome,Safari4+ */
294 background: -webkit-linear-gradient(top, rgba(255,169,213,1) 0%,rgba(254,112,185,1) 100%); /* Chrome10+,Safari5.1+ */
295 background: -o-linear-gradient(top, rgba(255,169,213,1) 0%,rgba(254,112,185,1) 100%); /* Opera 11.10+ */
296 background: linear-gradient(top, rgba(255,169,213,1) 0%,rgba(254,112,185,1) 100%); /* W3C */
297 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffa9d5', endColorstr='#fe70b9',GradientType=0 ); /* IE6-9 */
298 }
299
300 /*---------------------------------
301 GREEN
302 -----------------------------------*/
303 button.green,
304 a.btn.green,
305 a.button.green,
306 input[type=submit].green,
307 input[type=reset].green,
308 input[type=button].green{
309 text-shadow:0 -1px 0 #669E00;
310 color:#fff;
311 border:1px solid #669E00;
312 background: rgb(143,196,0); /* Old browsers */
313 background: -moz-linear-gradient(top, rgba(143,196,0,1) 0%, rgba(107,165,0,1) 100%); /* FF3.6+ */
314 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(143,196,0,1)), color-stop(100%,rgba(107,165,0,1))); /* Chrome,Safari4+ */
315 background: -webkit-linear-gradient(top, rgba(143,196,0,1) 0%,rgba(107,165,0,1) 100%); /* Chrome10+,Safari5.1+ */
316 background: -o-linear-gradient(top, rgba(143,196,0,1) 0%,rgba(107,165,0,1) 100%); /* Opera 11.10+ */
317 background: linear-gradient(top, rgba(143,196,0,1) 0%,rgba(107,165,0,1) 100%); /* W3C */
318 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#8fc400', endColorstr='#6ba500',GradientType=0 ); /* IE6-9 */
319 }
320
321 button.green:hover,
322 a.btn.green:hover,
323 a.button.green:hover{
324 text-shadow:0 1px 0 #669E00;
325 border:1px solid #669E00;
326 background: rgb(198,226,120); /* Old browsers */
327 background: -moz-linear-gradient(top, rgba(198,226,120,1) 0%, rgba(167,211,44,1) 100%); /* FF3.6+ */
328 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(198,226,120,1)), color-stop(100%,rgba(167,211,44,1))); /* Chrome,Safari4+ */
329 background: -webkit-linear-gradient(top, rgba(198,226,120,1) 0%,rgba(167,211,44,1) 100%); /* Chrome10+,Safari5.1+ */
330 background: -o-linear-gradient(top, rgba(198,226,120,1) 0%,rgba(167,211,44,1) 100%); /* Opera 11.10+ */
331 background: linear-gradient(top, rgba(198,226,120,1) 0%,rgba(167,211,44,1) 100%); /* W3C */
332 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#c6e278', endColorstr='#a7d32c',GradientType=0 ); /* IE6-9 */
333 }
334
335 /*---------------------------------
336 RED
337 -----------------------------------*/
338 button.red,
339 a.btn.red,
340 a.button.red,
341 input[type=submit].red,
342 input[type=reset].red,
343 input[type=button].red{
344 text-shadow:0 -1px 0 #B21203;
345 color:#fff;
346 border:1px solid #B21203;
347 background: rgb(229,60,22); /* Old browsers */
348 background: -moz-linear-gradient(top, rgba(229,60,22,1) 0%, rgba(207,4,4,1) 100%); /* FF3.6+ */
349 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(229,60,22,1)), color-stop(100%,rgba(207,4,4,1))); /* Chrome,Safari4+ */
350 background: -webkit-linear-gradient(top, rgba(229,60,22,1) 0%,rgba(207,4,4,1) 100%); /* Chrome10+,Safari5.1+ */
351 background: -o-linear-gradient(top, rgba(229,60,22,1) 0%,rgba(207,4,4,1) 100%); /* Opera 11.10+ */
352 background: linear-gradient(top, rgba(229,60,22,1) 0%,rgba(207,4,4,1) 100%); /* W3C */
353 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#e53c16', endColorstr='#cf0404',GradientType=0 ); /* IE6-9 */
354 }
355
356 button.red:hover,
357 a.btn.red:hover,
358 a.button.red:hover{
359 text-shadow:0 1px 0 #B21203;
360 border:1px solid #B21203;
361 background: rgb(238,106,76); /* Old browsers */
362 background: -moz-linear-gradient(top, rgba(238,106,76,1) 0%, rgba(251,33,33,1) 100%); /* FF3.6+ */
363 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(238,106,76,1)), color-stop(100%,rgba(251,33,33,1))); /* Chrome,Safari4+ */
364 background: -webkit-linear-gradient(top, rgba(238,106,76,1) 0%,rgba(251,33,33,1) 100%); /* Chrome10+,Safari5.1+ */
365 background: -o-linear-gradient(top, rgba(238,106,76,1) 0%,rgba(251,33,33,1) 100%); /* Opera 11.10+ */
366 background: linear-gradient(top, rgba(238,106,76,1) 0%,rgba(251,33,33,1) 100%); /* W3C */
367 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ee6a4c', endColorstr='#fb2121',GradientType=0 ); /* IE6-9 */
368 }
0 /*---------------------------------
1 FORMS
2 -----------------------------------*/
3 form{
4 padding:0;
5 margin:0;
6 }
7
8 fieldset{
9 margin:30px 0 20px 0;
10 padding:5px 15px 15px 15px;
11 border:1px solid #ccc;
12 background:#f5f5f5;
13 -moz-border-radius:5px;
14 -webkit-border-radius:5px;
15 border-radius:5px;
16 position: relative;
17 top:0;
18 left:0;
19 }
20
21 legend{
22 -moz-border-radius:5px;
23 -webkit-border-radius:5px;
24 border-radius:5px;
25 border:1px solid #ccc;
26 background:#f5f5f5;
27 padding:2px 10px;
28 margin:0 0 0 0;
29 display:block;
30 position: relative;
31 top:0;
32 left:0;
33 }
34
35 /*IE ONLY - I know, this is a stop gap*/
36 .msie fieldset{padding-top:25px;}
37 .msie legend{position:absolute;top:-0.7em;left:10px;}
38
39 label{
40 display:inline-block;
41 *display:inline;
42 vertical-align: middle;
43 margin:0;
44 padding:0;
45 position:relative;
46 top:0;
47 left:0;
48 zoom:1;
49 -moz-box-sizing: border-box;
50 -webkit-box-sizing: border-box;
51 box-sizing: border-box;
52 }
53
54 label.inline{
55 display:inline;
56 margin:0;
57 }
58
59 label span{
60 color:#999;
61 font-size:0.9em;
62 }
63
64 label span.right{
65 position:absolute;
66 bottom:0;
67 right:0;
68 text-align:right;
69 display:inline-block;
70 *display:inline;
71 }
72
73 label.disabled{
74 color:#ccc;
75 }
76
77 input{
78 display:inline-block;
79 *display:inline;
80 vertical-align: middle;
81 width:auto;
82 zoom:1;
83 margin:0;
84 border:1px solid #ccc;
85 font-size:1em;
86 padding:5px 0;
87 text-indent: 5px;
88 -moz-border-radius:5px;
89 -webkit-border-radius:5px;
90 border-radius:5px;
91 background:#fff;
92 -moz-box-shadow:inset 0 0 6px #ccc;
93 -webkit-box-shadow:inset 0 1px 6px #ccc;
94 box-shadow:inset 0 1px 6px #ccc;
95 -moz-box-sizing: border-box;
96 -webkit-box-sizing: border-box;
97 box-sizing: border-box;
98 }
99
100 input::-webkit-input-placeholder,
101 input:-moz-placeholder,
102 .placeholder{
103 color:#bbb;
104 }
105
106 input::-moz-focus-inner {border:0;}
107
108 input[disabled="disabled"], input.disabled{
109 color:#999;
110 background:#f5f5f5;
111 -moz-box-shadow:inset 0 0 2px #ddd;
112 -webkit-box-shadow:inset 0 1px 2px #ddd;
113 box-shadow:inset 0 1px 2px #ddd;
114 }
115
116 /* FOCUS STATES */
117 input[type="text"]:focus,
118 textarea:focus,
119 button:focus,
120 a.button:focus,
121 select:focus,
122 input[type="file"]:focus,
123 input[type="password"]:focus{
124 -webkit-box-shadow: 0 0 7px #6DB9FF;
125 -moz-box-shadow : 0 0 7px #6DB9FF;
126 box-shadow : 0 0 7px #6DB9FF;
127 border: 1px solid #50B1FE;
128 outline: none;
129 }
130
131 /* TRANSITION */
132 input[type="text"],
133 textarea,
134 button,
135 a.button,
136 a,
137 input[type="file"]{
138 -moz-transition: -moz-box-shadow 0.5s, border 0.5s, background 0.5s;
139 -webkit-transition: -webkit-box-shadow 0.5s, border 0.5s, background 0.5s;
140 -o-transition: box-shadow 0.5s, border 0.5s, background 0.5s;
141 transition: box-shadow 0.5s, border 0.5s, background 0.5s;
142 }
143
144 input.checkbox,
145 input[type="checkbox"]{
146 display:inline;
147 width:auto;
148 margin:0;
149 padding:0;
150 border:0;
151 background:none;
152 vertical-align:center;
153 *vertical-align: top;
154 }
155
156 input.radio,
157 input[type="radio"]{
158 display:inline;
159 width:auto;
160 margin:0;
161 padding:0;
162 border:0;
163 background:none;
164 vertical-align:center;
165 *vertical-align: top;
166 }
167
168 input[type="radio"]:focus,
169 input[ type="checkbox"]:focus{
170 -webkit-box-shadow: 0 0 5px #6DB9FF;
171 -moz-box-shadow : 0 0 5px #6DB9FF;
172 box-shadow : 0 0 5px #6DB9FF;
173 outline-color: #6DB9FF;
174 }
175
176 input.file,
177 input[type="file"]{
178 /*font-size:0.8em;*/
179 -moz-box-shadow:none;
180 -webkit-box-shadow:none;
181 box-shadow:none;
182 border:none;
183 }
184
185 select{
186 display:inline;
187 width:auto;
188 margin:0;
189 border:1px solid #ccc;
190 line-height:100%;
191 padding:3px;
192 vertical-align: middle;
193 }
194
195 select[disabled="disabled"], select.disabled{
196 color:#999;
197 background:#f5f5f5;
198 -moz-box-shadow:inset 0 0 2px #ddd;
199 -webkit-box-shadow:inset 0 1px 2px #ddd;
200 box-shadow:inset 0 1px 2px #ddd;
201 }
202
203 textarea{
204 width:auto;
205 height:200px;
206 margin:0;
207 border:1px solid #ccc;
208 padding:5px;
209 vertical-align: middle;
210 font-family:inherit;
211 font-size:0.9em;
212 -moz-border-radius:5px;
213 -webkit-border-radius:5px;
214 border-radius:5px;
215 -moz-box-shadow:inset 0 0 6px #ccc;
216 -webkit-box-shadow:inset 0 1px 6px #ccc;
217 box-shadow:inset 0 1px 6px #ccc;
218 -moz-box-sizing: border-box;
219 -webkit-box-sizing: border-box;
220 box-sizing: border-box;
221 }
222
223 /*---------------------------------
224 COLUMN SIZES
225 -----------------------------------*/
226
227 /* sizes */
228 input[class*="col_"],
229 select[class*="col_"],
230 label[class*="col_"]{
231 float:none;display:inline-block;*display:inline;margin-bottom:0;
232 *margin-left: 0.5%;*margin-right: 0.5%;/* this is for IE 7 Only and is not a good fix - work needed here */
233 }
234
235 /*---------------------------------
236 FORMS VERTICAL
237 -----------------------------------*/
238 form.vertical{
239
240 }
241
242 form.vertical label{display:block;}
243 form.vertical input,
244 form.vertical select,
245 form.vertical textarea{width:100%;display:block;margin-bottom:10px;}
246 form.vertical .chzn-container{display:block;margin-bottom:10px;}
247 form.vertical .chzn-choices{display:block;margin-bottom:10px;}
248
249 /* radios & checks */
250 form.vertical input.checkbox,
251 form.vertical input[type="checkbox"],
252 form.vertical input.radio,
253 form.vertical input[type="radio"],
254 form.vertical label.inline{display:inline;width:auto;margin:0;}
255 /*---------------------------------
256 FORM VALIDATION
257 -----------------------------------*/
258 label.error{color:red;}
259 input.error{border:1px solid red;}
260 select.error{border:1px solid red;}
261
262 /*---------------------------------
263 NOTICES
264 -----------------------------------*/
265 .notice{
266 border:1px solid gold;
267 background:lightyellow;
268 padding:10px 20px 10px 40px;
269 margin:10px 0;
270 -moz-border-radius:5px;
271 -webkit-border-radius:5px;
272 border-radius:5px;
273 color:#DEAE00;
274 line-height:120%;
275 vertical-align: center;
276 text-shadow:0px 1px rgba(255,255,255,0.5);
277 position:relative;
278 top:0;
279 left:0;
280 clear:both;
281 }
282
283 .notice.warning{}/*default*/
284 .notice.error{border:1px solid red;background:pink;color:red;}
285 .notice.success{border:1px solid green;background:lightgreen;color:green;}
286 .notice i[class*='fa-']{position:absolute;top:50%;left:0.8em;margin-top:-0.6em;}
287 .notice a[class*='fa-remove'],
288 .notice a[class*='fa-remove']:active,
289 .notice a[class*='fa-remove']:visited{text-decoration:none;font-size:12px;position:absolute;top:5px;right:5px;left:auto;color:inherit;margin-top:0;left:auto;}
0 /*
1 99Lime.com HTML KickStart by Joshua Gatcke
2 kickstart-grids.css
3
4 DO NOT EDIT THIS FILE unless you know what you are doing.
5 */
6 /*---------------------------------
7 GRID/COLUMNS
8 -----------------------------------
9 tinyfluidgrid.com
10 & girlfriendnyc.com
11 with changes by 99Lime
12 -----------------------------------*/
13 /*
14 & Columns : 12
15 & Gutter %: 20%
16 & MaxWidth: 1280px
17 */
18
19 .grid{
20 max-width:1600px;
21 margin:0 auto;
22 padding:0 2em;
23 }
24
25 .grid.flex{
26 width:100%;
27 max-width:100%;
28 padding:0 2%;
29 padding:2em;
30 }
31
32 .row{
33 display:block;
34 overflow:hidden;
35 clear:both;
36 }
37
38 *[class*="col_"].alpha{margin-left:0;}
39 *[class*="col_"].omega{margin-right:0;}
40
41 .col_1 { width: 6.6666666666667%; }
42 .col_2 { width: 15%; }
43 .col_3 { width: 23.333333333333%; }
44 .col_4 { width: 31.666666666667%; }
45 .col_5 { width: 40%; }
46 .col_6 { width: 48.333333333333%; }
47 .col_7 { width: 56.666666666667%; }
48 .col_8 { width: 65%; }
49 .col_9 { width: 73.333333333333%; }
50 .col_10 { width: 81.666666666667%; }
51 .col_11 { width: 90%; }
52 .col_12 { width: 98.333333333333%; }
53
54 *[class*="col_"]{
55 margin-left: 0.83333333333333%;
56 margin-right: 0.83333333333333%;
57 margin-top:0.5em;
58 margin-bottom:0.5em;
59 float: left;
60 display: block;
61 }
62
63 .grid img{
64 max-width: 100%;
65 height:auto;
66 }
67
68 .clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}
69 .clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}
70 * html .clearfix, *:first-child+html .clearfix{zoom:1}
71
72 /* Viewable Grids
73 To view your grids, add the class .visible to any grid container.
74 This will add a background color so you can see the layout of your grids.
75 */
76 *[class*="col_"].visible{
77 background:#eee;
78 border:1px dotted #ccc;
79 }
80
81
82 /*---------------------------------
83 Responsive Grid Media Queries - 1280, 1024, 768, 480
84 1280-1024 - desktop (default grid)
85 1024-768 - tablet landscape
86 768-480 - tablet
87 480-less - phone landscape & smaller
88 -----------------------------------*/
89 @media all and (min-width: 1024px) and (max-width: 1280px) {
90
91 .grid *[class*="col_"]{}
92 .grid{max-width: 1024px;}
93 .show-desktop {display:block;}
94 .hide-desktop {display:none;}
95 .show-tablet {display:none;}
96 .hide-tablet {display:block;}
97 .show-phone {display:none;}
98 .hide-phone {display:block;}
99
100 }
101
102 @media all and (min-width: 768px) and (max-width: 1024px) {
103
104 .grid *[class*="col_"]{}
105 .grid{max-width: 768px;}
106 .show-desktop {display:none;}
107 .hide-desktop {display:block;}
108 .show-tablet {display:block;}
109 .hide-tablet {display:none;}
110 .show-phone {display:none;}
111 .hide-phone {display:block;}
112
113 }
114
115
116 @media all and (min-width: 480px) and (max-width: 768px) {
117
118 .grid *[class*="col_"]{
119 float:none;
120 width:auto;
121 clear:both;
122 display:block;
123 }
124
125 /* columns inside of columns */
126 .grid *[class*="col_"] [class*="col_"]{
127 margin-left:0;
128 margin-right:0;
129 width:100%;
130 }
131
132 .grid{max-width: 480px;}
133 .show-desktop {display:none;}
134 .hide-desktop {display:block;}
135 .show-tablet {display:block;}
136 .hide-tablet {display:none;}
137 .show-phone {display:none;}
138 .hide-phone {display:block;}
139
140 }
141
142 @media all and (max-width: 480px) {
143
144 .grid *[class*="col_"]{
145 float:none;
146 width:auto;
147 clear:both;
148 display:block;
149 }
150
151 /* columns inside of columns */
152 .grid *[class*="col_"] [class*="col_"]{
153 margin-left:0;
154 margin-right:0;
155 width:100%;
156 }
157
158 .grid{max-width: 100%;/*320*/}
159 .show-desktop {display:none;}
160 .hide-desktop {display:block;}
161 .show-tablet {display:none;}
162 .hide-tablet {display:block;}
163 .show-phone {display:block;}
164 .hide-phone {display:none;}
165
166 }
0 /*
1 99Lime.com HTML KickStart by Joshua Gatcke
2 kickstart-menus.css
3 */
4
5 /*---------------------------------
6 MENU LAYOUT
7 DO NOT EDIT This Section (unless you know what you are doing)
8 -----------------------------------*/
9 .menu{margin:0;padding:0;line-height:100%;
10 font-size:0; /* Kill white space gap between LI elements */
11 position:relative;z-index:1000;}
12
13 .menu:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}
14 .menu li{margin:0;padding:0;list-style-type:none;display:inline-block;*display:inline;position:relative;zoom:1;line-height:inherit;
15 top:0;left:0;font-size:16px; /* fixed font-size to replace font-size:0 in parent .menu 1em/16px default */}
16 .menu li a{margin:0;padding:0;display:block;display:inline;display:inline-block;position:relative;zoom:1;line-height:100%;top:0;left:0;}
17
18
19 /*--------------Sub Menus-------------------*/
20 /*.menu li:hover > ul{display:block;}*/
21 .menu ul{margin:0;padding:0;position: absolute;top:100%;left:0;display:none;min-width:150px;max-width:150%;*width:150px;}
22 .menu ul li{display:block;width:100%;}
23 .menu ul li a{display:block;}
24 .menu ul ul{top:0;left:100%;}
25
26 /*--------------Dividers-------------------*/
27 .menu ul li.divider{border-top:1px solid #ccc;}
28 .menu ul li.divider a{border-top:1px solid #fff;}
29
30
31 /*--------------Right---------------------*/
32 .menu li.right{float:right;}
33
34
35 /*--------------Arrows-------------------*/
36 .menu li.has-menu a{padding-right:25px;}
37 .menu li.has-menu span.arrow{border-style:solid;border-width:5px;
38 display:block;position:absolute;top:50%;right:5px;font-size:0;line-height:0;height:0;width:0;}
39 .menu li li.has-menu span.arrow{margin-top:-4px;}
40
41 /*--------------Vertical Menu Layout-------------------*/
42 .menu.vertical{}
43 .menu.vertical li{display:block;}
44 .menu.vertical li a{display:block;}
45 .menu.vertical ul{top:0;left:100%;}
46 .menu.vertical li.has-menu span.arrow{margin-top:-4px;}
47
48 /*--------------Vertical Right Menu Layout-------------------*/
49 .menu.vertical.right{text-align:left;}
50 .menu.vertical.right ul{top:0;right:100%;left:auto;}
51 .menu.vertical.right li a{padding-left:25px;padding-right:20px;}
52 .menu.vertical.right li.has-menu span.arrow{right:auto;left:5px;margin-top:-4px;}
53
54
55 /*---------------------------------
56 MENU STYLES
57 EDIT BELOW THIS LINE TO CUSTOMIZE
58 -----------------------------------*/
59 .menu{
60 border:1px solid #ccc;
61 background: #eee; /* Old browsers */
62 background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(224,224,224,1) 100%); /* FF3.6+ */
63 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(224,224,224,1))); /* Chrome,Safari4+ */
64 background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* Chrome10+,Safari5.1+ */
65 background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* Opera11.10+ */
66 background: linear-gradient(top, rgba(252,252,252,1) 0%,rgba(224,224,224,1) 100%); /* W3C */
67 z-index:600;
68 }
69
70 .menu li{}
71
72 .menu li a{
73 text-shadow:0px 1px 1px #fff;
74 padding:15px 20px;
75 text-decoration:none;
76 font-size:0.9em;
77 color: #777;
78 }
79
80 .menu li.current>a,
81 .menu li.current>a:hover,
82 .menu li.current.hover>a{
83 background: rgb(122,188,255); /* Old browsers */
84 background: -moz-linear-gradient(top, rgba(122,188,255,1) 0%, rgba(96,171,248,1) 44%, rgba(64,150,238,1) 100%); /* FF3.6+ */
85 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(122,188,255,1)), color-stop(44%,rgba(96,171,248,1)), color-stop(100%,rgba(64,150,238,1))); /* Chrome,Safari4+ */
86 background: -webkit-linear-gradient(top, rgba(122,188,255,1) 0%,rgba(96,171,248,1) 44%,rgba(64,150,238,1) 100%); /* Chrome10+,Safari5.1+ */
87 background: -o-linear-gradient(top, rgba(122,188,255,1) 0%,rgba(96,171,248,1) 44%,rgba(64,150,238,1) 100%); /* Opera11.10+ */
88 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#7abcff', endColorstr='#4096ee',GradientType=0 ); /* IE6-9 */
89 background: linear-gradient(top, rgba(122,188,255,1) 0%,rgba(96,171,248,1) 44%,rgba(64,150,238,1) 100%); /* W3C */
90 color:#fff;
91 text-shadow:0px -1px 0 rgba(0,0,0,0.2);
92 cursor: default;
93 }
94
95 .menu li a:hover,
96 .menu li.hover>a{
97 background:#f5f5f5;
98 }
99
100 /* sub menus */
101 .menu ul{
102 background: #efefef;
103 border:1px solid #ccc;
104 }
105
106 .menu ul li{}
107 .menu ul li a{}
108
109 /* sub-sub menus */
110 .menu ul ul{}
111 .menu ul ul li{}
112 .menu ul ul li a{}
113
114 /* arrows */
115 /* arrow down */ .menu li.has-menu span.arrow{border-color-top:#ccc;border-color:#ccc transparent transparent transparent;}
116 /* arrow left */ .menu li li.has-menu span.arrow, .menu.vertical li.has-menu span.arrow
117 {border-color-left:#ccc;border-color:transparent transparent transparent #ccc;}
118 /* arrow right */ .menu.vertical.right li.has-menu span.arrow{border-color-right:#ccc;border-color:transparent #ccc transparent transparent;}
119
120 /* dividers */ .menu ul li.divider{border-top:1px solid #ccc;}
121 .menu ul li.divider a{border-top:1px solid #fff;}
122
123
124
125 /*---------------------------------
126 RESPONSIVE MENU STYLES
127 DO NOT EDIT unless you know what you are doing
128 -----------------------------------*/
129
130 .menu li.menu-toggle{display:none;}
131
132
133 @media all and (max-width: 768px) {
134
135 .grid .menu li,
136 .grid .menu.vertical li,
137 .grid .menu.vertical.right li{
138 display:block;
139 display:none;
140 }
141
142 .grid .menu li.menu-toggle,
143 .grid .menu.vertical li.menu-toggle,
144 .grid .menu.vertical.right li.menu-toggle{
145 display:block;
146 }
147
148 .grid .menu:hover li,
149 .grid .menu.vertical:hover li,
150 .grid .menu.vertical.right:hover li{
151 display:block;
152 }
153
154 /* arrows */
155 .grid .menu li.has-menu span.arrow,
156 .grid .menu.vertical li.has-menu span.arrow,
157 .grid .menu.vertical.right li.has-menu span.arrow,
158 .grid .menu li li.has-menu span.arrow, .menu.vertical li.has-menu span.arrow
159 {border-color-top:#ccc;border-color:#ccc transparent transparent transparent;}
160
161 .grid .menu.vertical.right li.has-menu span.arrow{
162 right:5px;left:auto;
163 }
164
165 .grid .menu li a{
166 display:block;
167 }
168
169 .grid .menu ul,
170 .grid .menu ul ul,
171 .grid .menu.vertical ul,
172 .grid .menu.vertical.right ul{
173 position:relative;
174 top:0;
175 left:0;
176 margin:10px;
177 }
178
179 }
0 /*---------------------------------
1 SLIDESHOW2 - Slight Fixes for the slideshow layout *needs work
2 -----------------------------------*/
3
4 .slideshow{
5 clear:both;
6 margin:0;
7 padding:0;
8 width:auto;
9 height:auto;
10 overflow:hidden;
11 }
12
13 .slideshow li{
14 list-style-type:none;
15 margin:0;
16 padding:0;
17 float:left;
18 display:block;
19 }
20
21 /**
22 * BxSlider v4.0 - Fully loaded, responsive content slider
23 * http://bxslider.com
24 *
25 * Written by: Steven Wanderski, 2012
26 * http://stevenwanderski.com
27 * (while drinking Belgian ales and listening to jazz)
28 *
29 * CEO and founder of bxCreative, LTD
30 * http://bxcreative.com
31 */
32
33
34 /** RESET AND LAYOUT
35 ===================================*/
36 .bx-wrapper, .bx-wrapper *{
37 -webkit-box-sizing: content-box; /* Safari/Chrome, other WebKit */
38 -moz-box-sizing: content-box; /* Firefox, other Gecko */
39 box-sizing: content-box; /* Opera/IE 8+ */
40 }
41
42 .bx-wrapper {
43 position: relative;
44 margin: 0 0 60px;
45 padding: 0;
46 *zoom: 1;
47 }
48
49 .bx-wrapper img {
50 width: 100%;
51 display: block;
52 }
53
54 /** THEME
55 ===================================*/
56
57 .bx-wrapper .bx-viewport {
58 -moz-box-shadow: 0 0 5px #ccc;
59 -webkit-box-shadow: 0 0 5px #ccc;
60 box-shadow: 0 0 5px #ccc;
61 border: solid #fff 5px;
62 left: 0;
63 background: #fff;
64 }
65
66 .bx-wrapper .bx-pager,
67 .bx-wrapper .bx-controls-auto {
68 position: absolute;
69 bottom: -30px;
70 width: 100%;
71 }
72
73 /* LOADER */
74
75 .bx-wrapper .bx-loading {
76 min-height: 50px;
77 background: url(img/bx_loader.gif) center center no-repeat #fff;
78 height: 100%;
79 width: 100%;
80 position: absolute;
81 top: 0;
82 left: 0;
83 z-index: 2000;
84 }
85
86 /* PAGER */
87
88 .bx-wrapper .bx-pager {
89 text-align: center;
90 font-size: .85em;
91 font-family: Arial;
92 font-weight: bold;
93 color: #666;
94 padding-top: 20px;
95 }
96
97 .bx-wrapper .bx-pager .bx-pager-item,
98 .bx-wrapper .bx-controls-auto .bx-controls-auto-item {
99 display: inline-block;
100 *zoom: 1;
101 *display: inline;
102 }
103
104 .bx-wrapper .bx-pager.bx-default-pager a {
105 background: #666;
106 text-indent: -9999px;
107 display: block;
108 width: 10px;
109 height: 10px;
110 margin: 0 5px;
111 outline: 0;
112 -moz-border-radius: 5px;
113 -webkit-border-radius: 5px;
114 border-radius: 5px;
115 }
116
117 .bx-wrapper .bx-pager.bx-default-pager a:hover,
118 .bx-wrapper .bx-pager.bx-default-pager a.active {
119 background: #000;
120 }
121
122 /* DIRECTION CONTROLS (NEXT / PREV) */
123
124 .bx-wrapper .bx-prev {
125 left: 10px;
126 background: url(img/controls.png) no-repeat 0 -32px;
127 }
128
129 .bx-wrapper .bx-next {
130 right: 10px;
131 background: url(img/controls.png) no-repeat -43px -32px;
132 }
133
134 .bx-wrapper .bx-prev:hover {
135 background-position: 0 0;
136 }
137
138 .bx-wrapper .bx-next:hover {
139 background-position: -43px 0;
140 }
141
142 .bx-wrapper .bx-controls-direction a {
143 position: absolute;
144 top: 50%;
145 margin-top: -16px;
146 outline: 0;
147 width: 32px;
148 height: 32px;
149 text-indent: -9999px;
150 z-index: 9999;
151 }
152
153 .bx-wrapper .bx-controls-direction a.disabled {
154 display: none;
155 }
156
157 /* AUTO CONTROLS (START / STOP) */
158
159 .bx-wrapper .bx-controls-auto {
160 text-align: center;
161 }
162
163 .bx-wrapper .bx-controls-auto .bx-start {
164 display: block;
165 text-indent: -9999px;
166 width: 10px;
167 height: 11px;
168 outline: 0;
169 background: url(img/controls.png) -86px -11px no-repeat;
170 margin: 0 3px;
171 }
172
173 .bx-wrapper .bx-controls-auto .bx-start:hover,
174 .bx-wrapper .bx-controls-auto .bx-start.active {
175 background-position: -86px 0;
176 }
177
178 .bx-wrapper .bx-controls-auto .bx-stop {
179 display: block;
180 text-indent: -9999px;
181 width: 9px;
182 height: 11px;
183 outline: 0;
184 background: url(img/controls.png) -86px -44px no-repeat;
185 margin: 0 3px;
186 }
187
188 .bx-wrapper .bx-controls-auto .bx-stop:hover,
189 .bx-wrapper .bx-controls-auto .bx-stop.active {
190 background-position: -86px -33px;
191 }
192
193 /* PAGER WITH AUTO-CONTROLS HYBRID LAYOUT */
194
195 .bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-pager {
196 text-align: left;
197 width: 80%;
198 }
199
200 .bx-wrapper .bx-controls.bx-has-controls-auto.bx-has-pager .bx-controls-auto {
201 right: 0;
202 width: 35px;
203 }
204
205 /* IMAGE CAPTIONS */
206
207 .bx-wrapper .bx-caption {
208 position: absolute;
209 bottom: 0;
210 left: 0;
211 background: #666\9;
212 background: rgba(80, 80, 80, 0.75);
213 width: 100%;
214 }
215
216 .bx-wrapper .bx-caption span {
217 color: #fff;
218 font-family: Arial;
219 display: block;
220 font-size: .85em;
221 padding: 10px;
222 }
0 /*
1 99Lime.com HTML KickStart by Joshua Gatcke
2 style.css
3
4 */
5
6 /*---------------------------------
7 IMPORTS
8 -----------------------------------*/
9 @import url(https://fonts.googleapis.com/css?family=Arimo:400,700);
10
11 /*---------------------------------
12 OVERRIDES
13 -----------------------------------*/
14 h1,h2,h3,h4,h5,h6{
15 font-family: "Arimo", arial, verdana, sans-serif;
16 font-weight:normal;
17 }
18
19 thead th,
20 tbody th{
21 font-family: "Arimo", arial, verdana, sans-serif;
22 }
23
24 button,
25 a.btn,
26 input[type="submit"],
27 input[type="reset"],
28 input[type="button"]{
29 font-family: "Arimo", arial, verdana, sans-serif;
30 }
31
32 .menu{
33 font-family: "Arimo", arial, verdana, sans-serif;
34 }
35
36 blockquote{
37 font-family: "Arimo", arial, verdana, sans-serif;
38 }
39
40 /*---------------------------------
41 LAYOUT
42 -----------------------------------*/
43 body{
44 margin:0;
45 padding:0 0 0 0;
46 color:#000;
47 background:#efefef url(css/img/gray_jean.png);
48 font:normal 0.9em/150% 'Arimo', arial, verdana, sans-serif;
49 text-shadow: 0 0 1px transparent; /* google font pixelation fix */
50 }
51
52 #wrap{
53 width:100%;
54 background:#fff;
55 margin:30px auto 30px auto;
56 padding:0 2%;
57 border:1px solid #ccc;
58 }
59
60
61 #footer{
62 text-align:center;
63 padding:20px;
64 margin:0;
65 border-top:1px solid #ddd;
66 color:#999;
67 font-size:0.8em;
68 text-shadow:0px 1px 1px #fff;
69 position: relative;
70 top:0;
71 left:0;
72 background:#fff;
73 }
74
75 #link-top{
76 display:none;
77 }
78
79 /* NAV BAR*/
80 .navbar{
81 position:fixed;
82 top:0;
83 left:0;
84 width: 100%;
85 background:#000;
86 color:#fff;
87 z-index:1000;
88 }
89
90 .navbar #logo{
91 position:absolute;
92 top:0;
93 right:0;
94 padding:0.5em 1em;
95 font-size: 1.7em;
96 color:#efefef;
97 text-decoration:none;
98 }
99
100 .navbar span{
101 color:#86dc00;
102 }
103
104
105 .navbar ul{
106 display:inline-block;
107 margin:0;
108 padding:0;
109 }
110
111 .navbar li{
112 margin:0;
113 padding:0;
114 list-style-type:0;
115 display:inline-block;
116 }
117
118 .navbar li a{
119 display:inline-block;
120 color:#efefef;
121 padding:1em 1.3em;
122 text-decoration:none;
123 text-transform: uppercase;
124 line-height:100%;
125 font-size: 1.2em;
126 }
127
128 .callout{
129 background:#4598ef;/*#86dc00;*/
130 padding:3em 0;
131 color:#fff;
132 box-shadow:inset 0 0 10px rgba(0,0,0,0.2);
133 text-align: center;
134 text-shadow:0px 1px 3px rgba(0,0,0,0.2);
135 display:block;
136 }
137 .callout + div.grid{margin-top:50px;}
138 a.callout{cursor:pointer;}
139 .callout i.icon-4x{font-size:6em;}
140 .callout h4{margin-bottom:30px;}
141 .callout-top{margin:50px 0 0 0;}
142 .callout p{margin-bottom:0;}
143 .callout .button{margin-top:10px;}
144 .callout.green{background:#19ad0b;/*#86dc00;*/}
145
146 #mc_embed_signup{
147 padding:30px 0;
148 }
149
150 #ui-preview{
151 border:5px solid #ddd;
152 margin:30px 0;
153 display:block;
154 }
0 /*
1 99Lime.com HTML KickStart by Joshua Gatcke
2 kickstart.css
3
4 Don't edit the file if you want HTML KickStart to be upgradeable.
5 Instead, copy any CSS selectors you want to modify to your style.css file.
6
7 // Colors
8 blue: #4D99E0;
9 */
10 /*---------------------------------
11 IMPORTS
12 -----------------------------------*/
13 @import url(kickstart-buttons.css);
14 @import url(kickstart-forms.css);
15 @import url(kickstart-menus.css);
16 @import url(kickstart-grid.css);
17 @import url(jquery.fancybox-1.3.4.css);
18 @import url(kickstart-slideshow.css);
19 @import url(prettify.css);
20 @import url(tiptip.css);
21 @import url(fonts/font-awesome-4.2.0/css/font-awesome.min.css);
22
23 /*---------------------------------
24 HTML ELEMENTS
25 -----------------------------------*/
26 *{
27 -webkit-box-sizing: border-box; /* Safari/Chrome, other WebKit */
28 -moz-box-sizing: border-box; /* Firefox, other Gecko */
29 box-sizing: border-box; /* Opera/IE 8+ */
30 }
31 a{color:#4D99E0;outline:0;}
32 a:active{color:inherit;}
33 a:visited{}
34 a:hover{}
35 a img{border:0;}
36 a [class^="icon-"]{color:inherit;text-decoration:none;}
37 strong,b{color:#000;font-weight:bold;}
38 strike{}
39 em,i{}
40 .hide{display:none;}
41 .show{display:block;}
42
43 /*---------------------------------
44 UTILITY
45 -----------------------------------*/
46 .center{text-align:center;}
47 .left{text-align:left;}
48 .right{text-align:right;}
49
50 /*---------------------------------
51 HR
52 -----------------------------------*/
53 hr{clear:both;border-bottom:0;border-top:1px dotted #ccc;border-right:0;border-left:0;margin:30px 0;min-height: 0;height:1px;}
54 hr.alt1{border-style: solid;}
55 hr.alt2{border-style: dashed;}
56
57 /*---------------------------------
58 HTML5 ELEMENTS (shim)
59 -----------------------------------*/
60 article,aside,details,figcaption,figure,
61 footer,header,hgroup,menu,nav,section {
62 display:block;
63 }
64
65 /*---------------------------------
66 HEADINGS
67 -----------------------------------*/
68 h1,h2,h3,h4,h5,h6{
69 font-weight:bold;
70 line-height:140%;
71 }
72
73 h1{
74 font-size:3.5em;
75 margin:10px 0 10px 0;
76 }
77
78 h2{
79 font-size:3em;
80 margin:10px 0 10px 0;
81 }
82
83 h3{
84 font-size:2.5em;
85 margin:10px 0 10px 0;
86 line-height:130%;
87 }
88
89 h4{
90 font-size:2em;
91 margin:10px 0 10px 0;
92 }
93
94 h5{
95 font-size:1.5em;
96 margin:10px 0 10px 0;
97 }
98
99 h6{
100 font-size:1.2em;
101 margin:10px 0 5px 0;
102 }
103
104 /*---------------------------------
105 PARAGRAPHS
106 -----------------------------------*/
107 p{
108 margin:10px 0;
109 }
110
111 /*---------------------------------
112 BLOCKQUOTES
113 -----------------------------------*/
114 blockquote{
115 font-size:1.5em;
116 line-height:1.5em;
117 font-style: italic;
118 margin:30px 30px 30px 0;
119 padding:0 0 0 20px;
120 border-left:1px solid #ccc;
121 }
122
123 blockquote span{font-size:0.7em;display:block;}
124 blockquote.small{font-size:1.2em;}
125
126 /*---------------------------------
127 LISTS
128 -----------------------------------*/
129 ul, ol{
130 padding:0;
131 margin:0 0 20px 25px;
132 }
133
134 li{
135 padding:5px 0;
136 margin:0;
137 }
138
139 ul.list-unstyled{
140 padding:0;
141 margin:0 0 20px 0;
142 }
143
144 ul.list-unstyled li{
145 padding:5px 0;
146 margin:0;
147 list-style-type:none;
148
149 }
150
151 ul.alt{
152 padding:0;
153 margin:0 0 20px 0;
154 }
155
156 ul.alt li{
157 list-style-type:none;
158 border-top:1px dotted #ccc;
159 border-bottom:1px dotted #ccc;
160 margin:0 0 -1px 0;
161 background:url(img/icon-arrow-right.png) no-repeat 5px 0.7em;
162 padding-left:20px;
163 }
164
165 ul.icons{
166 margin:0 0 20px 0;
167 padding:0;
168 }
169
170 ul.icons li{
171 list-style-type:none;
172 margin:0;
173 padding:5px 0;
174 }
175
176 /*---------------------------------
177 PRE & CODE
178 -----------------------------------*/
179 code{
180 font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace;
181 font-size:0.9em;
182 border:1px solid lightblue;
183 padding:3px;
184 -moz-border-radius:3px;
185 -webkit-border-radius:3px;
186 border-radius:3px;
187 color:#518BAB;
188 }
189
190 pre{
191 white-space: pre-wrap; /* css-3 */
192 white-space: -moz-pre-wrap !important; /* Mozilla, since 1999 */
193 white-space: -pre-wrap; /* Opera 4-6 */
194 white-space: -o-pre-wrap; /* Opera 7 */
195 word-wrap: break-word; /* Internet Explorer 5.5+ */
196 margin: 0 0 0 0;
197 padding:5px 5px 3px 5px;
198 background:#fff;
199 -moz-border-radius:5px;
200 -webkit-border-radius:5px;
201 border-radius:5px;
202 -webkit-box-shadow:inset 0 0 7px rgba(0,0,0,0.2);
203 -moz-box-shadow:inset 0 0 7px rgba(0,0,0,0.2);
204 box-shadow:inset 0 0 7px rgba(0,0,0,0.2);
205 padding:10px;
206 margin:0 0;
207 border:1px solid #ddd;
208 font-family: Consolas, "Andale Mono WT", "Andale Mono", "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace;
209 font-size:0.9em;
210 }
211
212 /*---------------------------------
213 TABLES
214 -----------------------------------*/
215 table{width:100%;margin:0 0 10px 0;text-align:left;border-collapse: collapse;}
216 thead, tbody{margin:0;padding:0;}
217 th, td{padding:7px 10px;font-size:0.9em;border-bottom:1px dotted #ddd;text-align:left;}
218 thead th{font-size:0.9em;padding:3px 10px;border-bottom:1px solid #ddd;}
219 tbody tr.last th,
220 tbody tr.last td{border-bottom:0;}
221
222 /* striped */
223 table.striped{}
224 table.striped tr.alt{background:#f5f5f5;}
225 table.striped thead th{background:#fff;}
226 table.striped tbody th{background:#f5f5f5;text-align:right;padding-right:15px;border-right:1px dotted #e5e5e5;}
227 table.striped tbody tr.alt th{background:#efefef;}
228
229 /* tight */
230 table.tight{}
231 table.tight th, .tight td{padding:2px 10px;}
232
233 /* sortable */
234 table.sortable{border:1px solid #ddd;}
235 table.sortable thead th{cursor: pointer;position:relative;top:0;left:0;border-right:1px solid #ddd;}
236 table.sortable thead th:hover{background:#efefef;}
237 table.sortable span.arrow{border-style:solid;border-width:5px;
238 display:block;position:absolute;top:50%;right:5px;font-size:0;
239 border-color:#ccc transparent transparent transparent;
240 line-height:0;height:0;width:0;margin-top:-2px;}
241 table.sortable span.arrow.up{border-color:transparent transparent #ccc transparent;margin-top:-7px;}
242
243 /*---------------------------------
244 TABS
245 -----------------------------------*/
246 ul.tabs{
247 margin:10px 0 -1px 0;
248 padding:0;
249 width:100%;
250 border-bottom:1px solid #e5e5e5;
251 float:left;
252 font-size:0;
253 }
254
255 ul.tabs.left{text-align:left;}
256 ul.tabs.center{text-align:center;}
257 ul.tabs.right{text-align:right;}
258 ul.tabs.right li{margin:0 0 0 -2px;}
259
260 ul.tabs li{
261 font-size:14px;
262 list-style-type:none;
263 margin:0 -2px 0 0;
264 padding:0;
265 display:inline-block;
266 *display:inline;/*IE ONLY*/
267 position:relative;
268 top:0;
269 left:0;
270 *top:1px;/*IE 7 ONLY*/
271 zoom:1;
272 }
273
274 ul.tabs li a{
275 text-decoration:none;
276 color:#666;
277 display:inline-block;
278 padding:9px 15px;
279 position: relative;
280 top:0;
281 left:0;
282 line-height:100%;
283 background:#f5f5f5;
284 -webkit-box-shadow: inset 0 -3px 3px rgba(0,0,0,0.03);
285 -moz-box-shadow: inset 0 -3px 3px rgba(0,0,0,0.03);
286 box-shadow: inset 0 -3px 3px rgba(0,0,0,0.03);
287 border:1px solid #e5e5e5;
288 border-bottom:0;
289 font-size:0.9em;
290 zoom:1;
291 }
292
293 ul.tabs li a:hover{
294 background:#fff;
295 }
296
297 ul.tabs li.current a{
298 position:relative;
299 top:1px;
300 left:0;
301 background:#fff;
302 -webkit-box-shadow: none;
303 -moz-box-shadow: none;
304 box-shadow: none;
305 color:#222;
306 }
307
308 .tab-content{
309 border:1px solid #efefef;
310 border:1px solid #e5e5e5;
311 background:#fff;
312 clear:both;
313 padding:20px;
314 margin:0 0 40px 0;
315 }
316
317
318 /*---------------------------------
319 BREADCRUMBS
320 -----------------------------------*/
321 ul.breadcrumbs{
322 margin:10px 0;
323 padding:0;
324 line-height:0%;
325 font-size:0;
326 }
327
328 ul.breadcrumbs li{
329 list-style-type:none;
330 margin:0;
331 padding:0;
332 display:inline-block;
333 *display:inline; /* IE ONLY*/
334 position:relative;
335 zoom:1;
336 line-height:100%;
337 font-size:14px; /* 0.8em default to override font-size:0; on parent*/
338 }
339
340 ul.breadcrumbs li a{
341 display:inline-block;
342 *display:inline; /* IE ONLY*/
343 position:relative;
344 padding:5px 15px 5px 5px;
345 font-size:0.9em;
346 zoom:1;
347 margin:0;
348 background:url(img/icon-arrow-right.png) no-repeat right center;
349 }
350
351 ul.breadcrumbs li.last a{
352 color:#333;
353 cursor: default;
354 text-decoration:none;
355 background:none;
356 }
357
358 ul.breadcrumbs li.last a:hover{
359 text-decoration:none;
360 }
361
362 /* Alternative Style */
363 ul.breadcrumbs.alt1{
364 border:1px solid transparent;
365 font-size:0;
366 }
367
368 ul.breadcrumbs.alt1 li a{
369 padding:10px 25px 10px 15px;
370 background:url(img/breadcrumbs-bg.gif) no-repeat right center;
371 text-decoration:none;
372 border-top:1px solid #efefef;
373 border-bottom:1px solid #efefef;
374 font-size:12px;
375 }
376
377 ul.breadcrumbs.alt1 a:hover{
378 text-decoration:underline;
379 }
380
381 ul.breadcrumbs.alt1 li.first a{
382 border-left:1px solid #efefef;
383 }
384
385 ul.breadcrumbs.alt1 li.last a{
386 background:none;
387 border-right:1px solid #efefef;
388 }
389
390 /*---------------------------------
391 IMAGES
392 -----------------------------------*/
393 /*
394 for img .style1, .style2, .style3
395 view js/kickstart.js Image Style Helpers
396 */
397 img{
398 margin:0;
399 padding:0;
400 display:inline-block;
401 position:relative;
402 zoom:1;
403 vertical-align: bottom;
404 }
405
406 img.align-left, .img-wrap.align-left{float:left;margin:0 10px 5px 0;}
407 img.align-right, .img-wrap.align-right{float:right;margin:0 0 5px 10px;}
408 img.full-width{clear:both;display:block;width:100%;height:auto;margin:0 0 10px 0;}
409
410 div.caption{
411 background:#f5f5f5;
412 border:1px solid #ddd;
413 padding:3px;
414 max-width:100%;
415 display:inline-block;
416 height:auto;
417 }
418
419 div.caption img{
420 display:block;
421 padding:0;
422 margin:0;
423 width:100%;
424 height:auto;
425 }
426
427 div.caption span{
428 display:block;
429 margin-top:3px;
430 font-size:0.8em;
431 color:#666;
432 padding:0px 5px;
433 }
434
435 .gallery{}
436
437 .gallery a{
438 display:inline-block;
439 position:relative;
440 border:1px solid #ddd;
441 background:#fff;
442 padding:3px;
443 margin:5px;
444 -moz-border-radius:5px;
445 -webkit-border-radius:5px;
446 border-radius:5px;
447 }
448
449 .gallery a img{
450 display: block;
451 position: relative;
452 margin:0;
453 padding:0;
454 }
455
456 /*---------------------------------
457 SLIDESHOW2
458 -----------------------------------*/
459 .slideshow-wrap{
460 clear:both;
461 margin:0;
462 padding:0;
463 position:relative;
464 top:0;
465 left:0;
466 overflow:hidden;
467 clear:both;
468 }
469
470 .slideshow-inner{
471 overflow:hidden;
472 clear:both;
473 position:relative;
474 top:0;
475 left:0;
476 border:1px solid #efefef;
477 }
478
479 .slideshow{
480 clear:both;
481 margin:0;
482 padding:0;
483 width:auto;
484 height:auto;
485 overflow:hidden;
486 }
487
488 .slideshow li{
489 list-style-type:none;
490 margin:0;
491 padding:0;
492 float:left;
493 display:block;
494 }
495
496 .slideshow img{vertical-align: bottom;}
497
498 .slideshow-buttons{
499 text-align:right;
500 margin:3px 0 0 0;
501 padding:0;
502 }
503
504 .slideshow-buttons li{display:inline;position:relative;top:0;left:0;line-height:100%;margin:0;padding:0;}
505 .slideshow-buttons li.current a{background:#ddd;}
506
507 .slideshow-buttons a{
508 display:inline;
509 position:relative;
510 top:0;
511 left:0;
512 padding:1px 3px;
513 margin:0 1px;
514 line-height:100%;
515 border:1px solid #efefef;
516 text-decoration:none;
517 font-size:0.8em;
518 }
0 .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee}
0 html,
1 body {
2 min-height: 100%;
3 min-height: 100vh;
4 margin: 0px;
5 padding: 0px;
6 }
7 .contents {
8 padding-top: 10px;
9 }
10 #chart_div {
11 margin: 0 auto;
12 }
13 .showConfigButton {
14 display: inline-block !important;
15 }
16 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .thumbnail {
17 display: block;
18 overflow-y: hidden;
19 overflow-x: hidden;
20 position: relative;
21 -webkit-transition: background-color 300ms linear;
22 -moz-transition: background-color 300ms linear;
23 -o-transition: background-color 300ms linear;
24 transition: background-color 300ms linear;
25 }
26 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .thumbnail > .thumbImg {
27 display: block;
28 margin-left: auto;
29 margin-right: auto;
30 background-color: white;
31 width: 100%;
32 }
33 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .subTitle {
34 display: block;
35 font-family: Georgia, "Times New Roman", Times, serif;
36 font-style: italic;
37 font-weight: 400;
38 color: gray;
39 font-size: 0.8em;
40 text-align: left;
41 }
42 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem > .content .title {
43 display: block;
44 margin-left: auto;
45 margin-right: auto;
46 margin-top: 2px;
47 text-align: left;
48 font-size: 0.9em;
49 font-family: 'Helvetica Neue Custom', 'Helvetica Neue', Helvetica, Arial, sans-serif;
50 font-weight: 700;
51 }
52 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem:hover .thumbImg {
53 box-shadow: 0px 0px 4px black;
54 }
55 .recordDisplay[displaytype="grid"] > .listItemGroup > .listItem[highlight=true] > .content .thumbnail {
56 background-color: orangered;
57 }
58 .pageTitle {
59 text-align: center;
60 padding-top: 10px;
61 font-family: 'Montserrat', sans-serif;
62 font-size: 1.8em;
63 text-shadow: 2px 2px 0px lightgray;
64 text-transform: capitalize;
65 }
66 .pageSubtitle {
67 text-align: center;
68 font-family: 'Montserrat', sans-serif;
69 padding-top: 10px;
70 padding-bottom: 5px;
71 font-size: 0.9em;
72 font-weight: 300;
73 line-height: 1.5em;
74 }
75 #infobox {
76 position: fixed;
77 left: 0px;
78 right: 0px;
79 bottom: 0px;
80 text-align: center;
81 font-weight: 300;
82 font-family: sans-serif;
83 font-size: 0.8em;
84 padding: 3px 120px 3px 120px;
85 background-image: url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiA/PjxzdmcgeG1sbnM9Imh0d…g9IjEiIGhlaWdodD0iMSIgZmlsbD0idXJsKCNsZXNzaGF0LWdlbmVyYXRlZCkiIC8+PC9zdmc+);
86 background-image: -webkit-linear-gradient(bottom, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
87 background-image: -moz-linear-gradient(bottom, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
88 background-image: -o-linear-gradient(bottom, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
89 background-image: linear-gradient(to top, #dfd2a9 0%, rgba(255, 255, 255, 0) 80%);
90 }
91 #infobox a {
92 color: black;
93 font-weight: 500;
94 }
95 #infobox a:hover {
96 color: orangered;
97 }
98 #infobox .fa {
99 color: gray;
100 }
101 .keshif_logo {
102 position: absolute;
103 display: block;
104 top: 5px;
105 left: 5px;
106 width: 33px;
107 height: 33px;
108 font-size: 12px;
109 overflow: hidden;
110 cursor: auto;
111 -webkit-transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
112 -moz-transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
113 -o-transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
114 transition: width 500ms ease-in-out, background-color 500ms ease-in-out;
115 border-radius: 5px;
116 cursor: pointer;
117 text-decoration: none;
118 }
119 .keshif_logo:hover {
120 background-color: #EEEEEE;
121 width: 200px;
122 }
123 .keshif_logo > .keshif_logo_img {
124 height: 33px;
125 float: left;
126 }
127 .keshif_logo > .keshif_logo_content {
128 display: block;
129 width: 300px;
130 font-family: Verdana, Arial, Helvetica, sans-serif;
131 letter-spacing: .12em;
132 color: #727365;
133 vertical-align: center;
134 }
135 .comment_popup {
136 position: fixed;
137 top: 5px;
138 left: 5px;
139 cursor: pointer;
140 }
141 .comment_popup .fa-stack {
142 float: left;
143 clear: left;
144 height: 1.5em;
145 margin-top: -15px;
146 margin-left: -15px;
147 font-size: 2em;
148 }
149 .comment_popup .fa-comment {
150 color: #ffcd2e;
151 }
152 .comment_popup .texttt {
153 font-family: sans-serif;
154 font-weight: 300;
155 font-size: 0.8em;
156 }
157 .comment_popup:hover .texttt {
158 color: orangered;
159 }
160 .comment_popup:hover .fa-comment {
161 color: orangered;
162 }
163 .forkongithub {
164 position: fixed;
165 display: block;
166 z-index: 0;
167 }
168 .forkongithub a.fork-ribbon {
169 background: #000;
170 color: #fff;
171 text-decoration: none;
172 font-family: arial, sans-serif;
173 text-align: center;
174 font-weight: bold;
175 padding: 5px 40px;
176 font-size: 0.8rem;
177 line-height: 1.5rem;
178 position: relative;
179 transition: 0.5s;
180 }
181 .forkongithub a.fork-ribbon::before,
182 .forkongithub a.fork-ribbon::after {
183 width: 100%;
184 display: block;
185 position: absolute;
186 top: 1px;
187 left: 0;
188 height: 1px;
189 background: #fff;
190 content: "";
191 }
192 .forkongithub a.fork-ribbon::after {
193 bottom: 1px;
194 top: auto;
195 }
196 .forkongithub a.fork-ribbon:hover {
197 background: orangered;
198 color: #fff;
199 }
200 @media screen and (min-width: 800px) {
201 .forkongithub {
202 width: 0px;
203 height: 150px;
204 }
205 .forkongithub.fork-bottom {
206 bottom: 0;
207 }
208 .forkongithub.fork-right {
209 right: 0;
210 }
211 .forkongithub.fork-right a.fork-ribbon {
212 font-size: 1.1em;
213 -webkit-transform: rotate(-45deg);
214 -moz-transform: rotate(-45deg);
215 -o-transform: rotate(-45deg);
216 -ms-transform: rotate(-45deg);
217 transform: rotate(-45deg);
218 }
219 .forkongithub.fork-left {
220 left: -60px;
221 }
222 .forkongithub.fork-left a.fork-ribbon {
223 -webkit-transform: rotate(45deg);
224 -moz-transform: rotate(45deg);
225 -o-transform: rotate(45deg);
226 -ms-transform: rotate(45deg);
227 transform: rotate(45deg);
228 right: auto;
229 left: 0px;
230 }
231 .forkongithub a.fork-ribbon {
232 width: 150px;
233 position: absolute;
234 top: 80px;
235 right: -60px;
236 box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
237 }
238 }
0 /*
1 TipTip CSS - Version 1.2
2 http://code.drewwilson.com/entry/tiptip-jquery-plugin
3 */
4
5 #tiptip_holder { display: none; position: absolute; top: 0; left: 0; z-index: 99999; }
6 #tiptip_holder.tip_top { padding-bottom: 5px; }
7 #tiptip_holder.tip_bottom { padding-top: 5px; }
8 #tiptip_holder.tip_right { padding-left: 5px; }
9 #tiptip_holder.tip_left { padding-right: 5px; }
10
11 #tiptip_content {
12 font-size: 11px;
13 color: #fff;
14 text-shadow: 0 0 2px #000;
15 padding: 4px 8px;
16 border: 1px solid rgba(255,255,255,0.25);
17 background:#212121;
18 background-color: rgba(25,25,25,0.92);
19 background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, from(transparent), to(#000));
20 -webkit-border-radius: 3px;
21 -moz-border-radius: 3px;
22 border-radius: 3px;
23 -webkit-box-shadow: 0 0 3px #555;
24 -moz-box-shadow: 0 0 3px #555;
25 box-shadow: 0 0 3px #555;
26 *background:#212121;
27 }
28
29 #tiptip_arrow, #tiptip_arrow_inner {
30 position: absolute;
31 border-color: transparent;
32 border-style: solid;
33 border-width: 6px;
34 height: 0;
35 width: 0;
36 }
37
38 #tiptip_holder.tip_top #tiptip_arrow {
39 border-top-color: #fff;
40 border-top-color: rgba(255,255,255,0.35);
41 }
42
43 #tiptip_holder.tip_bottom #tiptip_arrow {
44 border-bottom-color: #fff;
45 border-bottom-color: rgba(255,255,255,0.35);
46 }
47
48 #tiptip_holder.tip_right #tiptip_arrow {
49 border-right-color: #fff;
50 border-right-color: rgba(255,255,255,0.35);
51 }
52
53 #tiptip_holder.tip_left #tiptip_arrow {
54 border-left-color: #fff;
55 border-left-color: rgba(255,255,255,0.35);
56 }
57
58 #tiptip_holder.tip_top #tiptip_arrow_inner {
59 margin-top: -7px;
60 margin-left: -6px;
61 border-top-color: rgb(25,25,25);
62 border-top-color: rgba(25,25,25,0.92);
63 }
64
65 #tiptip_holder.tip_bottom #tiptip_arrow_inner {
66 margin-top: -5px;
67 margin-left: -6px;
68 border-bottom-color: rgb(25,25,25);
69 border-bottom-color: rgba(25,25,25,0.92);
70 }
71
72 #tiptip_holder.tip_right #tiptip_arrow_inner {
73 margin-top: -6px;
74 margin-left: -5px;
75 border-right-color: rgb(25,25,25);
76 border-right-color: rgba(25,25,25,0.92);
77 }
78
79 #tiptip_holder.tip_left #tiptip_arrow_inner {
80 margin-top: -6px;
81 margin-left: -7px;
82 border-left-color: rgb(25,25,25);
83 border-left-color: rgba(25,25,25,0.92);
84 }
85
86 /* Webkit Hacks */
87 @media screen and (-webkit-min-device-pixel-ratio:0) {
88 #tiptip_content {
89 padding: 4px 8px 5px 8px;
90 background-color: rgba(45,45,45,0.88);
91 }
92 #tiptip_holder.tip_bottom #tiptip_arrow_inner {
93 border-bottom-color: rgba(45,45,45,0.88);
94 }
95 #tiptip_holder.tip_top #tiptip_arrow_inner {
96 border-top-color: rgba(20,20,20,0.92);
97 }
98 }
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 ;window.Modernizr=function(a,b,c){function A(a){j.cssText=a}function B(a,b){return A(m.join(a+";")+(b||""))}function C(a,b){return typeof a===b}function D(a,b){return!!~(""+a).indexOf(b)}function E(a,b){for(var d in a){var e=a[d];if(!D(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function F(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:C(f,"function")?f.bind(d||b):f}return!1}function G(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+o.join(d+" ")+d).split(" ");return C(b,"string")||C(b,"undefined")?E(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),F(e,b,c))}var d="2.7.1",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={svg:"http://www.w3.org/2000/svg"},r={},s={},t={},u=[],v=u.slice,w,x=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["&#173;",'<style id="s',h,'">',a,"</style>"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},y={}.hasOwnProperty,z;!C(y,"undefined")&&!C(y.call,"undefined")?z=function(a,b){return y.call(a,b)}:z=function(a,b){return b in a&&C(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=v.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(v.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(v.call(arguments)))};return e}),r.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:x(["@media (",m.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},r.cssanimations=function(){return G("animationName")},r.csstransitions=function(){return G("transition")},r.svg=function(){return!!b.createElementNS&&!!b.createElementNS(q.svg,"svg").createSVGRect},r.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==q.svg};for(var H in r)z(r,H)&&(w=H.toLowerCase(),e[w]=r[H](),u.push((e[w]?"":"no-")+w));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)z(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},A(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e<g;e++)d.createElement(f[e]);return d}function q(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return s.shivMethods?o(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/[\w\-]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(s,b.frag)}function r(a){a||(a=b);var c=n(a);return s.shivCSS&&!g&&!c.hasCSS&&(c.hasCSS=!!l(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),k||q(a,c),a}var c="3.7.0",d=a.html5||{},e=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,f=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,g,h="_html5shiv",i=0,j={},k;(function(){try{var a=b.createElement("a");a.innerHTML="<xyz></xyz>",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return E([a])},e.testAllProps=G,e.testStyles=x,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+u.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,h){var i=b(a),j=i.autoCallback;i.url.split(".").pop().split("?").shift(),i.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]),i.instead?i.instead(a,e,f,g,h):(y[i.url]?i.noexec=!0:y[i.url]=1,f.load(i.url,i.forceCSS||!i.forceJS&&"css"==i.url.split(".").pop().split("?").shift()?"c":c,i.noexec,i.attrs,i.timeout),(d(e)||d(j))&&f.load(function(){k(),e&&e(i.origUrl,h,g),j&&j(i.origUrl,h,g),y[i.url]=2})))}function h(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var i,j,l=this.yepnope.loader;if(e(a))g(a,0,l,0);else if(w(a))for(i=0;i<a.length;i++)j=a[i],e(j)?g(j,0,l,0):w(j)?B(j):Object(j)===j&&h(j,l);else Object(a)===a&&h(a,l)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,null==b.readyState&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))};
1
2 // turn on social share by default
3 var socialShare = false;
4 // turn on rubbon by default
5 var noRibbon = false;
6 var showLogo = false;
7 var githubButton = false;
8
9 function resizeBrowser(minWidth, minHeight){
10 if(minWidth) $('#chart_div').width($(window).width()-minWidth);
11 if(minHeight) $('#chart_div').height($(window).height()-minHeight);
12 };
13
14 var getIcon = function(v){
15 var iconName="";
16 switch(v.toLowerCase()){
17 case "male":
18 case "m":
19 iconName = "male"; break;
20 case "female":
21 case "f":
22 iconName = "female"; break;
23 case "organization":
24 iconName = "university"; break;
25 case "medicine":
26 iconName = "stethoscope"; break;
27 case "economics":
28 iconName = "money"; break;
29 case "literature":
30 iconName = "book"; break;
31 case "physics":
32 iconName = "bolt"; break;
33 case "chemistry":
34 iconName = "flask"; break;
35 case "peace":
36 iconName = "flag-o"; break;
37 }
38 return "<span class='fa fa-"+iconName+"'></span>";
39 };
40
41 var getStateName = function(v){
42 switch(v){
43 case 'AL': return 'Alabama';
44 case 'AK': return 'Alaska';
45 case 'AZ': return 'Arizona';
46 case 'AR': return 'Arkansas';
47 case 'CA': return 'California';
48 case 'CO': return 'Colorado';
49 case 'CT': return 'Connecticut';
50 case 'DE': return 'Delaware';
51 case 'DC': return 'District of Columbia';
52 case 'FL': return 'Florida';
53 case 'GA': return 'Georgia';
54 case 'HI': return 'Hawaii';
55 case 'ID': return 'Idaho';
56 case 'IL': return 'Illinois';
57 case 'IN': return 'Indiana';
58 case 'IA': return 'Iowa';
59 case 'KS': return 'Kansas';
60 case 'KY': return 'Kentucky';
61 case 'LA': return 'Louisiana';
62 case 'ME': return 'Maine';
63 case 'MD': return 'Maryland';
64 case 'MA': return 'Massachusetts';
65 case 'MI': return 'Michigan';
66 case 'MN': return 'Minnesota';
67 case 'MS': return 'Mississippi';
68 case 'MO': return 'Missouri';
69 case 'MT': return 'Montana';
70 case 'NE': return 'Nebraska';
71 case 'NV': return 'Nevada';
72 case 'NH': return 'New Hampshire';
73 case 'NJ': return 'New Jersey';
74 case 'NM': return 'New Mexico';
75 case 'NY': return 'New York';
76 case 'NC': return 'North Carolina';
77 case 'ND': return 'North Dakota';
78 case 'OH': return 'Ohio';
79 case 'OK': return 'Oklahoma';
80 case 'OR': return 'Oregon';
81 case 'PA': return 'Pennsylvania';
82 case 'RI': return 'Rhode Island';
83 case 'SC': return 'South Carolina';
84 case 'SD': return 'South Dakota';
85 case 'TN': return 'Tennessee';
86 case 'TX': return 'Texas';
87 case 'UT': return 'Utah';
88 case 'VT': return 'Vermont';
89 case 'VA': return 'Virginia';
90 case 'WA': return 'Washington';
91 case 'WV': return 'West Virginia';
92 case 'WI': return 'Wisconsin';
93 case 'WY': return 'Wyoming';
94 case 'PR': return 'Puerto-Rico';
95 case 'VI': return 'Virgin Islands';
96 case 'GU': return 'GUAM';
97 default : return 'Unknown: '+v;
98 }
99 };
100
101 function getMonthNameFromNumber(v){
102 switch(v){
103 case 0: return "January";
104 case 1: return "February";
105 case 2: return "March";
106 case 3: return "April";
107 case 4: return "May";
108 case 5: return "June";
109 case 6: return "July";
110 case 7: return "August";
111 case 8: return "September";
112 case 9: return "October";
113 case 10: return "November";
114 case 11: return "December";
115 }
116 return "?";
117 };
118
119
120 function getDayNameFromNumber(v){
121 switch(v){
122 case 1: return "Monday";
123 case 2: return "Tuesday";
124 case 3: return "Wednesday";
125 case 4: return "Thursday";
126 case 5: return "Friday";
127 case 6: return "Saturday";
128 case 0: return "Sunday";
129 }
130 return "?";
131 };
132
133 function getMonthNumberFromName(v){
134 switch(v){
135 case "January" : return 0;
136 case "February" : return 1;
137 case "March" : return 2;
138 case "April" : return 3;
139 case "May" : return 4;
140 case "June" : return 5;
141 case "July" : return 6;
142 case "August" : return 7;
143 case "September": return 8;
144 case "October" : return 9;
145 case "November" : return 10;
146 case "December" : return 11;
147 default : return 12;
148 }
149 };
150
151 // Based on ISO_3166 codes
152 function getCountryName(v){
153 switch(v){
154 case 'AD': return "Andorra";
155 case 'AE': return "United Arab Emirates";
156 case 'AF': return "Afghanistan";
157 case 'AG': return "Antigua and Barbuda";
158 case 'AI': return "Anguilla";
159 case 'AL': return "Albania";
160 case 'AM': return "Armenia";
161 case 'AO': return "Angola";
162 case 'AQ': return "Antarctica";
163 case 'AR': return "Argentina";
164 case 'AS': return "American Samoa";
165 case 'AT': return "Austria";
166 case 'AU': return "Australia";
167 case 'AW': return "Aruba";
168 case 'AX': return "Åland Islands";
169 case 'AZ': return "Azerbaijan";
170 case 'BA': return "Bosnia and Herzegovina";
171 case 'BB': return "Barbados";
172 case 'BD': return "Bangladesh";
173 case 'BE': return "Belgium";
174 case 'BF': return "Burkina Faso";
175 case 'BG': return "Bulgaria";
176 case 'BH': return "Bahrain";
177 case 'BI': return "Burundi";
178 case 'BJ': return "Benin";
179 case 'BL': return "Saint Barthélemy";
180 case 'BM': return "Bermuda";
181 case 'BN': return "Brunei Darussalam";
182 case 'BO': return "Bolivia, Plurinational State of";
183 case 'BQ': return "Bonaire, Sint Eustatius and Saba";
184 case 'BR': return "Brazil";
185 case 'BS': return "Bahamas";
186 case 'BT': return "Bhutan";
187 case 'BV': return "Bouvet Island";
188 case 'BW': return "Botswana";
189 case 'BY': return "Belarus";
190 case 'BZ': return "Belize";
191 case 'CA': return "Canada";
192 case 'CC': return "Cocos (Keeling) Islands";
193 case 'CD': return "Congo, the Democratic Republic of the";
194 case 'CF': return "Central African Republic";
195 case 'CG': return "Congo";
196 case 'CH': return "Switzerland";
197 case 'CI': return "Côte d'Ivoire";
198 case 'CK': return "Cook Islands";
199 case 'CL': return "Chile";
200 case 'CM': return "Cameroon";
201 case 'CN': return "China";
202 case 'CO': return "Colombia";
203 case 'CR': return "Costa Rica";
204 case 'CU': return "Cuba";
205 case 'CV': return "Cabo Verde";
206 case 'CW': return "Curaçao";
207 case 'CX': return "Christmas Island";
208 case 'CY': return "Cyprus";
209 case 'CZ': return "Czech Republic";
210 case 'DE': return "Germany";
211 case 'DJ': return "Djibouti";
212 case 'DK': return "Denmark";
213 case 'DM': return "Dominica";
214 case 'DO': return "Dominican Republic";
215 case 'DZ': return "Algeria";
216 case 'EC': return "Ecuador";
217 case 'EE': return "Estonia";
218 case 'EG': return "Egypt";
219 case 'EH': return "Western Sahara";
220 case 'ER': return "Eritrea";
221 case 'ES': return "Spain";
222 case 'ET': return "Ethiopia";
223 case 'FI': return "Finland";
224 case 'FJ': return "Fiji";
225 case 'FK': return "Falkland Islands (Malvinas)";
226 case 'FM': return "Micronesia, Federated States of";
227 case 'FO': return "Faroe Islands";
228 case 'FR': return "France";
229 case 'GA': return "Gabon";
230 case 'GB': return "United Kingdom of Great Britain and Northern Ireland";
231 case 'GD': return "Grenada";
232 case 'GE': return "Georgia";
233 case 'GF': return "French Guiana";
234 case 'GG': return "Guernsey";
235 case 'GH': return "Ghana";
236 case 'GI': return "Gibraltar";
237 case 'GL': return "Greenland";
238 case 'GM': return "Gambia";
239 case 'GN': return "Guinea";
240 case 'GP': return "Guadeloupe";
241 case 'GQ': return "Equatorial Guinea";
242 case 'GR': return "Greece";
243 case 'GS': return "South Georgia and the South Sandwich Islands";
244 case 'GT': return "Guatemala";
245 case 'GU': return "Guam";
246 case 'GW': return "Guinea-Bissau";
247 case 'GY': return "Guyana";
248 case 'HK': return "Hong Kong";
249 case 'HM': return "Heard Island and McDonald Islands";
250 case 'HN': return "Honduras";
251 case 'HR': return "Croatia";
252 case 'HT': return "Haiti";
253 case 'HU': return "Hungary";
254 case 'ID': return "Indonesia";
255 case 'IE': return "Ireland";
256 case 'IL': return "Israel";
257 case 'IM': return "Isle of Man";
258 case 'IN': return "India";
259 case 'IO': return "British Indian Ocean Territory";
260 case 'IQ': return "Iraq";
261 case 'IR': return "Iran, Islamic Republic of";
262 case 'IS': return "Iceland";
263 case 'IT': return "Italy";
264 case 'JE': return "Jersey";
265 case 'JM': return "Jamaica";
266 case 'JO': return "Jordan";
267 case 'JP': return "Japan";
268 case 'KE': return "Kenya";
269 case 'KG': return "Kyrgyzstan";
270 case 'KH': return "Cambodia";
271 case 'KI': return "Kiribati";
272 case 'KM': return "Comoros";
273 case 'KN': return "Saint Kitts and Nevis";
274 case 'KP': return "Korea, Democratic People's Republic of";
275 case 'KR': return "Korea, Republic of";
276 case 'KW': return "Kuwait";
277 case 'KY': return "Cayman Islands";
278 case 'KZ': return "Kazakhstan";
279 case 'LA': return "Lao People's Democratic Republic";
280 case 'LB': return "Lebanon";
281 case 'LC': return "Saint Lucia";
282 case 'LI': return "Liechtenstein";
283 case 'LK': return "Sri Lanka";
284 case 'LR': return "Liberia";
285 case 'LS': return "Lesotho";
286 case 'LT': return "Lithuania";
287 case 'LU': return "Luxembourg";
288 case 'LV': return "Latvia";
289 case 'LY': return "Libya";
290 case 'MA': return "Morocco";
291 case 'MC': return "Monaco";
292 case 'MD': return "Moldova, Republic of";
293 case 'ME': return "Montenegro";
294 case 'MF': return "Saint Martin (French part)";
295 case 'MG': return "Madagascar";
296 case 'MH': return "Marshall Islands";
297 case 'MK': return "Macedonia, the former Yugoslav Republic of";
298 case 'ML': return "Mali";
299 case 'MM': return "Myanmar";
300 case 'MN': return "Mongolia";
301 case 'MO': return "Macao";
302 case 'MP': return "Northern Mariana Islands";
303 case 'MQ': return "Martinique";
304 case 'MR': return "Mauritania";
305 case 'MS': return "Montserrat";
306 case 'MT': return "Malta";
307 case 'MU': return "Mauritius";
308 case 'MV': return "Maldives";
309 case 'MW': return "Malawi";
310 case 'MX': return "Mexico";
311 case 'MY': return "Malaysia";
312 case 'MZ': return "Mozambique";
313 case 'NA': return "Namibia";
314 case 'NC': return "New Caledonia";
315 case 'NE': return "Niger";
316 case 'NF': return "Norfolk Island";
317 case 'NG': return "Nigeria";
318 case 'NI': return "Nicaragua";
319 case 'NL': return "Netherlands";
320 case 'NO': return "Norway";
321 case 'NP': return "Nepal";
322 case 'NR': return "Nauru";
323 case 'NU': return "Niue";
324 case 'NZ': return "New Zealand";
325 case 'OM': return "Oman";
326 case 'PA': return "Panama";
327 case 'PE': return "Peru";
328 case 'PF': return "French Polynesia";
329 case 'PG': return "Papua New Guinea";
330 case 'PH': return "Philippines";
331 case 'PK': return "Pakistan";
332 case 'PL': return "Poland";
333 case 'PM': return "Saint Pierre and Miquelon";
334 case 'PN': return "Pitcairn";
335 case 'PR': return "Puerto Rico";
336 case 'PS': return "Palestine, State of";
337 case 'PT': return "Portugal";
338 case 'PW': return "Palau";
339 case 'PY': return "Paraguay";
340 case 'QA': return "Qatar";
341 case 'RE': return "Réunion";
342 case 'RO': return "Romania";
343 case 'RS': return "Serbia";
344 case 'RU': return "Russian Federation";
345 case 'RW': return "Rwanda";
346 case 'SA': return "Saudi Arabia";
347 case 'SB': return "Solomon Islands";
348 case 'SC': return "Seychelles";
349 case 'SD': return "Sudan";
350 case 'SE': return "Sweden";
351 case 'SG': return "Singapore";
352 case 'SH': return "Saint Helena, Ascension and Tristan da Cunha";
353 case 'SI': return "Slovenia";
354 case 'SJ': return "Svalbard and Jan Mayen";
355 case 'SK': return "Slovakia";
356 case 'SL': return "Sierra Leone";
357 case 'SM': return "San Marino";
358 case 'SN': return "Senegal";
359 case 'SO': return "Somalia";
360 case 'SR': return "Suriname";
361 case 'SS': return "South Sudan";
362 case 'ST': return "Sao Tome and Principe";
363 case 'SV': return "El Salvador";
364 case 'SX': return "Sint Maarten (Dutch part)";
365 case 'SY': return "Syrian Arab Republic";
366 case 'SZ': return "Swaziland";
367 case 'TC': return "Turks and Caicos Islands";
368 case 'TD': return "Chad";
369 case 'TF': return "French Southern Territories";
370 case 'TG': return "Togo";
371 case 'TH': return "Thailand";
372 case 'TJ': return "Tajikistan";
373 case 'TK': return "Tokelau";
374 case 'TL': return "Timor-Leste";
375 case 'TM': return "Turkmenistan";
376 case 'TN': return "Tunisia";
377 case 'TO': return "Tonga";
378 case 'TR': return "Turkey";
379 case 'TT': return "Trinidad and Tobago";
380 case 'TV': return "Tuvalu";
381 case 'TW': return "Taiwan, Province of China";
382 case 'TZ': return "Tanzania, United Republic of";
383 case 'UA': return "Ukraine";
384 case 'UG': return "Uganda";
385 case 'UM': return "United States Minor Outlying Islands";
386 case 'US': return "United States of America";
387 case 'UY': return "Uruguay";
388 case 'UZ': return "Uzbekistan";
389 case 'VA': return "Holy See";
390 case 'VC': return "Saint Vincent and the Grenadines";
391 case 'VE': return "Venezuela, Bolivarian Republic of";
392 case 'VG': return "Virgin Islands, British";
393 case 'VI': return "Virgin Islands, U.S.";
394 case 'VN': return "Viet Nam";
395 case 'VU': return "Vanuatu";
396 case 'WF': return "Wallis and Futuna";
397 case 'WS': return "Samoa";
398 case 'YE': return "Yemen";
399 case 'YT': return "Mayotte";
400 case 'ZA': return "South Africa";
401 case 'ZM': return "Zambia";
402 case 'ZW': return "Zimbabwe";
403 default : return "Unkown: "+v;
404 }
405 }
406
407 function writeCookie(name,value,days){
408 var date, expires;
409 if (days) {
410 date = new Date();
411 date.setTime(date.getTime()+(days*24*60*60*1000));
412 expires = "; expires=" + date.toGMTString();
413 }else{
414 expires = "";
415 }
416 document.cookie = name + "=" + value + expires + "; path=/";
417 };
418
419 function readCookie(name){
420 var i, c, ca, nameEQ = name + "=";
421 ca = document.cookie.split(';');
422 for(i=0;i < ca.length;i++) {
423 c = ca[i];
424 while (c.charAt(0)==' ') {
425 c = c.substring(1,c.length);
426 }
427 if (c.indexOf(nameEQ) == 0) {
428 return c.substring(nameEQ.length,c.length);
429 }
430 }
431 return '';
432 };
433
434 var printPeopleIcons = function(){
435 var str="";
436 for(var i=0; i<this.id; i++) str+="<i class='fa fa-male'></i>";
437 return str;
438 };
439
440 function noop(){};
441
442 // Logging
443 var isMobile = {
444 Android : function() { return navigator.userAgent.match(/Android/i); },
445 BlackBerry : function() { return navigator.userAgent.match(/BlackBerry/i); },
446 iOS : function() { return navigator.userAgent.match(/iPhone|iPad|iPod/i); },
447 Opera : function() { return navigator.userAgent.match(/Opera Mini/i); },
448 Windows : function() { return navigator.userAgent.match(/IEMobile/i); },
449 any : function() {
450 return (isMobile.Android() || isMobile.BlackBerry() || isMobile.iOS() || isMobile.Opera() || isMobile.Windows());
451 }
452 };
453 var logIf = {
454 WindowSize : function(){ // minimum 950 x 500 (timeline is shown with 4 categories)
455 // Using HTML document size (Device screen.width & screen.height is not important)
456 var w=this.dom.width();
457 var h=this.dom.height();
458 return (w>950) && (h>500) /* && (w>h)*/;
459 },
460 Desktop : function(){ // skip: Android, Blackberry, iPhone, iPad, iPod, Opera Mini, IEMobile
461 return isMobile.any()===null;
462 },
463 NoTouch : function(){ // skip browsers supporting touch events.
464 return !Modernizr.touch;
465 },
466 setSessionID : function(t){
467 if(this.Check!==undefined) return;
468 if(t!==undefined){
469 this.dom = $(t);
470 }
471 document.getElementsByTagName("body")[0].onmousemove = null;
472 this.sessionID_Cookie = readCookie('sessionId');
473 if(this.sessionID_Cookie === '') {
474 var ran = window.event.clientX*Math.random();
475 var ran2 = window.event.clientY*Math.random();
476 this.sessionID_Cookie = Math.floor((ran+ran2)*10000000000000);
477 writeCookie('sessionId', this.sessionID_Cookie, 365);
478 } else {
479 this.sessionID_Cookie = parseInt(this.sessionID_Cookie);
480 }
481 this.sessionID_Now = Math.floor(Math.random()*10000000000000);
482 this.All();
483 },
484 host : function(){
485 switch(document.location.hostname){
486 case "localhost": return true;
487 /*case "adilyalcin.github.io": return true;
488 case "www.cs.umd.edu": return true;
489 case "cs.umd.edu": return true;
490 case "www.keshif.me": return true;
491 case "keshif.me": return true;*/
492 }
493 return false;
494 },
495 All : function(){
496 var tmp = this.Check;
497 this.Check =
498 (typeof demoID === 'number') &&
499 this.WindowSize() &&
500 this.Desktop() &&
501 this.NoTouch() &&
502 this.host()===true &&
503 (this.sessionID_Cookie!==null)
504 ;
505 if(this.Check===true && tmp === undefined) {
506 this.loadTs = Date.now();
507 sendLog(kshf.LOG.CONFIG,
508 { height:this.dom.height(),width:this.dom.width(),agent:navigator.userAgent}, this.loadTs);
509 }
510 return this.Check;
511 },
512 dom: $(window),
513 sessionID_Cookie: null,
514 sessionID_Now: null,
515 Check : undefined,
516 loadTs: null,
517 };
518
519 var sendLog = function(actID, dt, ts){
520 if(logIf.Check!==true) return;
521 if(ts===undefined){ ts = Date.now()-logIf.loadTs; }
522 var _dt = {
523 'demoID': demoID,
524 'actID' : actID,
525 'ses_Cki' : logIf.sessionID_Cookie,
526 'ses_Now': logIf.sessionID_Now,
527 'ts' : ts,
528 };
529 // custom data to be sent
530 if(dt){ for (var key in dt) { _dt[key]=dt[key]; } }
531 $.ajax({
532 type: "GET",
533 dataType: "jsonp",
534 cache: true,
535 jsonp: false,
536 url: (document.location.hostname!=="localhost")?"http://keshiftracker.appspot.com":"http://localhost:9090/",
537 data: _dt
538 });
539 };;
540
541 $(window).load(function(){
542
543 if(document.location.hostname!=="localhost"){
544 /*(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
545 ga('create', 'UA-54042831-2', 'auto');
546 ga('send', 'pageview');*/
547 }
548
549 if(showLogo){
550 /*var keshif_logo = d3.select("body").append("a").attr("class","keshif_logo")
551 .attr("href","http://www.keshif.me").attr("target","_blank");
552 keshif_logo.append("img").attr("class","keshif_logo_img").attr("src","./img/logo.png");
553 keshif_logo.append("span").attr("class","keshif_logo_content").html(
554 "<strong>Keshif</strong></br>Data Made Explorable"
555 );*/
556 }
557
558 if(!noRibbon){
559 /*var githubDemoRoot = "https://github.com/adilyalcin/Keshif/blob/master/demo/";
560 var pageName = window.location.pathname.split("/");
561 pageName = pageName[pageName.length-1];
562 if(pageName.indexOf("html")===-1) pageName+=".html";
563
564 /*d3.select("body").append("span").attr("class","forkongithub fork-bottom fork-right")
565 .append("a").attr("href","http://www.keshif.me").attr("target","_blank")
566 .attr("class","fork-ribbon").html("More <span class='fa fa-bar-chart'></span> ...");
567
568 d3.select("body").append("span").attr("class",'forkongithub fork-bottom fork-left').html(
569 "<a class='fork-ribbon' href='"+githubDemoRoot+pageName+"' target='_blank'>"+
570 //'<span class="github-button" href="https://github.com/adilyalcin/keshif" data-icon="octicon-star" aria-label="Star adilyalcin/keshif on GitHub"></span>'+
571 "<span class='fa fa-star' style='font-size: 1.5em'></span>"+
572 " Open Source "+
573 "<span class='fa fa-github fa' style='font-size: 1.5em'></span>"+
574 "</a>"
575 );*/
576 }
577
578 if(socialShare===true){
579 var s = document.createElement("script");
580 s.type = "text/javascript";
581 s.src = "//s7.addthis.com/js/300/addthis_widget.js#pubid=ra-534742f736ae906e";
582 s.async = "async";
583 $("body").append(s);
584 }
585
586 d3.select("head").append("link")
587 .attr("rel","icon")
588 .attr("href","./img/favicon.png")
589 .attr("type","image/png");
590
591
592 if($("body").fancybox && false){
593
594 var com_dom = d3.select("body").append("span").attr("class","comment_popup").attr("href",
595 "https://docs.google.com/forms/d/1OohNaCzV42jHFtqTxVaci3CISGiR6znYTvEozFm2z7k/viewform?embedded=true");
596
597 var com_dom_stack = com_dom.append("span").attr("class","fa-stack");
598 com_dom_stack.append("i").attr("class","fa fa-stack-1x fa-comment");
599 com_dom_stack.append("i").attr("class","fa fa-stack-1x fa-comment-o");
600 com_dom.append("br");
601 com_dom.append("span").attr("class","texttt").html("Share<br>your<br>feedback");
602
603 $(".comment_popup").fancybox({
604 type: 'iframe',
605 width: 600,
606 height: 300,
607 closeBtn: true,
608 iframe: {
609 preload: true
610 }
611 });
612 }
613
614 if(githubButton===true){
615 var s = document.createElement("script");
616 s.src = "https://buttons.github.io/buttons.js";
617 s.id = "github-bjs";
618 s.async = "async";
619 $("body").append(s);
620 }
621
622
623
624 });
625
0 /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
1 //@ sourceMappingURL=jquery.min.map
2 */(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav></:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;
3 return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="<select></select>";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="<a name='"+x+"'></a><div name='"+x+"'></div>",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="<a href='#'></a>",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="<input type='hidden' i=''/>",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&&gt(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Nt=/^(?:checkbox|radio)$/i,Ct=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l)
4 }b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=ln(e,t),Pt.detach()),Gt[e]=n),n}function ln(e,t){var n=b(t.createElement(e)).appendTo(t.body),r=b.css(n[0],"display");return n.remove(),r}b.each(["height","width"],function(e,n){b.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(b.css(e,"display"))?b.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,i),i):0)}}}),b.support.opacity||(b.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=b.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===b.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),b(function(){b.support.reliableMarginRight||(b.cssHooks.marginRight={get:function(e,n){return n?b.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!b.support.pixelPosition&&b.fn.position&&b.each(["top","left"],function(e,n){b.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?b(e).position()[n]+"px":r):t}}})}),b.expr&&b.expr.filters&&(b.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!b.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||b.css(e,"display"))},b.expr.filters.visible=function(e){return!b.expr.filters.hidden(e)}),b.each({margin:"",padding:"",border:"Width"},function(e,t){b.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(b.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;b.fn.extend({serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=b.prop(this,"elements");return e?b.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!b(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Nt.test(e))}).map(function(e,t){var n=b(this).val();return null==n?null:b.isArray(n)?b.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),b.param=function(e,n){var r,i=[],o=function(e,t){t=b.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=b.ajaxSettings&&b.ajaxSettings.traditional),b.isArray(e)||e.jquery&&!b.isPlainObject(e))b.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(b.isArray(t))b.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==b.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}b.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){b.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),b.fn.hover=function(e,t){return this.mouseenter(e).mouseleave(t||e)};var mn,yn,vn=b.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Nn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Cn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=b.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=a.href}catch(Ln){yn=o.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(w)||[];if(b.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(u){var l;return o[u]=!0,b.each(e[u]||[],function(e,u){var c=u(n,r,i);return"string"!=typeof c||a||o[c]?a?!(l=c):t:(n.dataTypes.unshift(c),s(c),!1)}),l}return s(n.dataTypes[0])||!o["*"]&&s("*")}function Mn(e,n){var r,i,o=b.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&b.extend(!0,e,r),e}b.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,u=e.indexOf(" ");return u>=0&&(i=e.slice(u,e.length),e=e.slice(0,u)),b.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&b.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?b("<div>").append(b.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},b.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){b.fn[t]=function(e){return this.on(t,e)}}),b.each(["get","post"],function(e,n){b[n]=function(e,r,i,o){return b.isFunction(r)&&(o=o||i,i=r,r=t),b.ajax({url:e,type:n,dataType:o,data:r,success:i})}}),b.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Nn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":e.String,"text html":!0,"text json":b.parseJSON,"text xml":b.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Mn(Mn(e,b.ajaxSettings),t):Mn(b.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,u,l,c,p=b.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?b(f):b.event,h=b.Deferred(),g=b.Callbacks("once memory"),m=p.statusCode||{},y={},v={},x=0,T="canceled",N={readyState:0,getResponseHeader:function(e){var t;if(2===x){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===x?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return x||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return x||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>x)for(t in e)m[t]=[m[t],e[t]];else N.always(e[N.status]);return this},abort:function(e){var t=e||T;return l&&l.abort(t),k(0,t),this}};if(h.promise(N).complete=g.add,N.success=N.done,N.error=N.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=b.trim(p.dataType||"*").toLowerCase().match(w)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?80:443))==(mn[3]||("http:"===mn[1]?80:443)))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=b.param(p.data,p.traditional)),qn(An,p,n,N),2===x)return N;u=p.global,u&&0===b.active++&&b.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Cn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(b.lastModified[o]&&N.setRequestHeader("If-Modified-Since",b.lastModified[o]),b.etag[o]&&N.setRequestHeader("If-None-Match",b.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&N.setRequestHeader("Content-Type",p.contentType),N.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)N.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,N,p)===!1||2===x))return N.abort();T="abort";for(i in{success:1,error:1,complete:1})N[i](p[i]);if(l=qn(jn,p,n,N)){N.readyState=1,u&&d.trigger("ajaxSend",[N,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){N.abort("timeout")},p.timeout));try{x=1,l.send(y,k)}catch(C){if(!(2>x))throw C;k(-1,C)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,C=n;2!==x&&(x=2,s&&clearTimeout(s),l=t,a=i||"",N.readyState=e>0?4:0,r&&(w=_n(p,N,r)),e>=200&&300>e||304===e?(p.ifModified&&(T=N.getResponseHeader("Last-Modified"),T&&(b.lastModified[o]=T),T=N.getResponseHeader("etag"),T&&(b.etag[o]=T)),204===e?(c=!0,C="nocontent"):304===e?(c=!0,C="notmodified"):(c=Fn(p,w),C=c.state,y=c.data,v=c.error,c=!v)):(v=C,(e||!C)&&(C="error",0>e&&(e=0))),N.status=e,N.statusText=(n||C)+"",c?h.resolveWith(f,[y,C,N]):h.rejectWith(f,[N,C,v]),N.statusCode(m),m=t,u&&d.trigger(c?"ajaxSuccess":"ajaxError",[N,p,c?y:v]),g.fireWith(f,[N,C]),u&&(d.trigger("ajaxComplete",[N,p]),--b.active||b.event.trigger("ajaxStop")))}return N},getScript:function(e,n){return b.get(e,t,n,"script")},getJSON:function(e,t,n){return b.get(e,t,n,"json")}});function _n(e,n,r){var i,o,a,s,u=e.contents,l=e.dataTypes,c=e.responseFields;for(s in c)s in r&&(n[c[s]]=r[s]);while("*"===l[0])l.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in u)if(u[s]&&u[s].test(o)){l.unshift(s);break}if(l[0]in r)a=l[0];else{for(s in r){if(!l[0]||e.converters[s+" "+l[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==l[0]&&l.unshift(a),r[a]):t}function Fn(e,t){var n,r,i,o,a={},s=0,u=e.dataTypes.slice(),l=u[0];if(e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u[1])for(i in e.converters)a[i.toLowerCase()]=e.converters[i];for(;r=u[++s];)if("*"!==r){if("*"!==l&&l!==r){if(i=a[l+" "+r]||a["* "+r],!i)for(n in a)if(o=n.split(" "),o[1]===r&&(i=a[l+" "+o[0]]||a["* "+o[0]])){i===!0?i=a[n]:a[n]!==!0&&(r=o[0],u.splice(s--,0,r));break}if(i!==!0)if(i&&e["throws"])t=i(t);else try{t=i(t)}catch(c){return{state:"parsererror",error:i?c:"No conversion from "+l+" to "+r}}}l=r}return{state:"success",data:t}}b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return b.globalEval(e),e}}}),b.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),b.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=o.head||b("head")[0]||o.documentElement;return{send:function(t,i){n=o.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var On=[],Bn=/(=)\?(?=&|$)|\?\?/;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=On.pop()||b.expando+"_"+vn++;return this[e]=!0,e}}),b.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,u=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return u||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=b.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,u?n[u]=n[u].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||b.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,On.push(o)),s&&b.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}b.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=b.ajaxSettings.xhr(),b.support.cors=!!Rn&&"withCredentials"in Rn,Rn=b.support.ajax=!!Rn,Rn&&b.ajaxTransport(function(n){if(!n.crossDomain||b.support.cors){var r;return{send:function(i,o){var a,s,u=n.xhr();if(n.username?u.open(n.type,n.url,n.async,n.username,n.password):u.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)u[s]=n.xhrFields[s];n.mimeType&&u.overrideMimeType&&u.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)u.setRequestHeader(s,i[s])}catch(l){}u.send(n.hasContent&&n.data||null),r=function(e,i){var s,l,c,p;try{if(r&&(i||4===u.readyState))if(r=t,a&&(u.onreadystatechange=b.noop,$n&&delete Pn[a]),i)4!==u.readyState&&u.abort();else{p={},s=u.status,l=u.getAllResponseHeaders(),"string"==typeof u.responseText&&(p.text=u.responseText);try{c=u.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,l)},n.async?4===u.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},b(e).unload($n)),Pn[a]=r),u.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+x+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n,r,i=this.createTween(e,t),o=Yn.exec(t),a=i.cur(),s=+a||0,u=1,l=20;if(o){if(n=+o[2],r=o[3]||(b.cssNumber[e]?"":"px"),"px"!==r&&s){s=b.css(i.elem,e,!0)||n||1;do u=u||".5",s/=u,b.style(i.elem,e,s+r);while(u!==(u=i.cur()/a)&&1!==u&&--l)}i.unit=r,i.start=s,i.end=o[1]?s+(o[1]+1)*n:n}return i}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=b.now()}function Zn(e,t){b.each(t,function(t,n){var r=(Qn[t]||[]).concat(Qn["*"]),i=0,o=r.length;for(;o>i;i++)if(r[i].call(e,t,n))return})}function er(e,t,n){var r,i,o=0,a=Gn.length,s=b.Deferred().always(function(){delete u.elem}),u=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,l.startTime+l.duration-t),r=n/l.duration||0,o=1-r,a=0,u=l.tweens.length;for(;u>a;a++)l.tweens[a].run(o);return s.notifyWith(e,[l,o,n]),1>o&&u?n:(s.resolveWith(e,[l]),!1)},l=s.promise({elem:e,props:b.extend({},t),opts:b.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=b.Tween(e,l.opts,t,n,l.opts.specialEasing[t]||l.opts.easing);return l.tweens.push(r),r},stop:function(t){var n=0,r=t?l.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)l.tweens[n].run(1);return t?s.resolveWith(e,[l,t]):s.rejectWith(e,[l,t]),this}}),c=l.props;for(tr(c,l.opts.specialEasing);a>o;o++)if(r=Gn[o].call(l,e,c,l.opts))return r;return Zn(l,c),b.isFunction(l.opts.start)&&l.opts.start.call(e,l),b.fx.timer(b.extend(u,{elem:e,anim:l,queue:l.opts.queue})),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always)}function tr(e,t){var n,r,i,o,a;for(i in e)if(r=b.camelCase(i),o=t[r],n=e[i],b.isArray(n)&&(o=n[1],n=e[i]=n[0]),i!==r&&(e[r]=n,delete e[i]),a=b.cssHooks[r],a&&"expand"in a){n=a.expand(n),delete e[r];for(i in n)i in e||(e[i]=n[i],t[i]=o)}else t[r]=o}b.Animation=b.extend(er,{tweener:function(e,t){b.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,u,l,c,p,f=this,d=e.style,h={},g=[],m=e.nodeType&&nn(e);n.queue||(c=b._queueHooks(e,"fx"),null==c.unqueued&&(c.unqueued=0,p=c.empty.fire,c.empty.fire=function(){c.unqueued||p()}),c.unqueued++,f.always(function(){f.always(function(){c.unqueued--,b.queue(e,"fx").length||c.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[d.overflow,d.overflowX,d.overflowY],"inline"===b.css(e,"display")&&"none"===b.css(e,"float")&&(b.support.inlineBlockNeedsLayout&&"inline"!==un(e.nodeName)?d.zoom=1:d.display="inline-block")),n.overflow&&(d.overflow="hidden",b.support.shrinkWrapBlocks||f.always(function(){d.overflow=n.overflow[0],d.overflowX=n.overflow[1],d.overflowY=n.overflow[2]}));for(i in t)if(a=t[i],Vn.exec(a)){if(delete t[i],u=u||"toggle"===a,a===(m?"hide":"show"))continue;g.push(i)}if(o=g.length){s=b._data(e,"fxshow")||b._data(e,"fxshow",{}),"hidden"in s&&(m=s.hidden),u&&(s.hidden=!m),m?b(e).show():f.done(function(){b(e).hide()}),f.done(function(){var t;b._removeData(e,"fxshow");for(t in h)b.style(e,t,h[t])});for(i=0;o>i;i++)r=g[i],l=f.createTween(r,m?s[r]:0),h[r]=s[r]||b.style(e,r),r in s||(s[r]=l.start,m&&(l.end=l.start,l.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}b.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(b.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?b.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=b.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){b.fx.step[e.prop]?b.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[b.cssProps[e.prop]]||b.cssHooks[e.prop])?b.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},b.each(["toggle","show","hide"],function(e,t){var n=b.fn[t];b.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),b.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=b.isEmptyObject(e),o=b.speed(t,n,r),a=function(){var t=er(this,b.extend({},e),o);a.finish=function(){t.stop(!0)},(i||b._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=b.timers,a=b._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&b.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=b._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=b.timers,a=r?r.length:0;for(n.finish=!0,b.queue(this,e,[]),i&&i.cur&&i.cur.finish&&i.cur.finish.call(this),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}b.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){b.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),b.speed=function(e,t,n){var r=e&&"object"==typeof e?b.extend({},e):{complete:n||!n&&t||b.isFunction(e)&&e,duration:e,easing:n&&t||t&&!b.isFunction(t)&&t};return r.duration=b.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in b.fx.speeds?b.fx.speeds[r.duration]:b.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){b.isFunction(r.old)&&r.old.call(this),r.queue&&b.dequeue(this,r.queue)},r},b.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},b.timers=[],b.fx=rr.prototype.init,b.fx.tick=function(){var e,n=b.timers,r=0;for(Xn=b.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||b.fx.stop(),Xn=t},b.fx.timer=function(e){e()&&b.timers.push(e)&&b.fx.start()},b.fx.interval=13,b.fx.start=function(){Un||(Un=setInterval(b.fx.tick,b.fx.interval))},b.fx.stop=function(){clearInterval(Un),Un=null},b.fx.speeds={slow:600,fast:200,_default:400},b.fx.step={},b.expr&&b.expr.filters&&(b.expr.filters.animated=function(e){return b.grep(b.timers,function(t){return e===t.elem}).length}),b.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){b.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,b.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},b.offset={setOffset:function(e,t,n){var r=b.css(e,"position");"static"===r&&(e.style.position="relative");var i=b(e),o=i.offset(),a=b.css(e,"top"),s=b.css(e,"left"),u=("absolute"===r||"fixed"===r)&&b.inArray("auto",[a,s])>-1,l={},c={},p,f;u?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),b.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(l.top=t.top-o.top+p),null!=t.left&&(l.left=t.left-o.left+f),"using"in t?t.using.call(e,l):i.css(l)}},b.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===b.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),b.nodeName(e[0],"html")||(n=e.offset()),n.top+=b.css(e[0],"borderTopWidth",!0),n.left+=b.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-b.css(r,"marginTop",!0),left:t.left-n.left-b.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||o.documentElement;while(e&&!b.nodeName(e,"html")&&"static"===b.css(e,"position"))e=e.offsetParent;return e||o.documentElement})}}),b.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);b.fn[e]=function(i){return b.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?b(a).scrollLeft():o,r?o:b(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return b.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}b.each({Height:"height",Width:"width"},function(e,n){b.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){b.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return b.access(this,function(n,r,i){var o;return b.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?b.css(n,r,s):b.style(n,r,i,s)},n,a?i:t,a,null)}})}),e.jQuery=e.$=b,"function"==typeof define&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return b})})(window);
0 if(!window['googleLT_']){window['googleLT_']=(new Date()).getTime();}if (!window['google']) {
1 window['google'] = {};
2 }
3 if (!window['google']['loader']) {
4 window['google']['loader'] = {};
5 google.loader.ServiceBase = 'https://www.google.com/uds';
6 google.loader.GoogleApisBase = 'https://ajax.googleapis.com/ajax';
7 google.loader.ApiKey = 'notsupplied';
8 google.loader.KeyVerified = true;
9 google.loader.LoadFailure = false;
10 google.loader.Secure = true;
11 google.loader.GoogleLocale = 'www.google.com';
12 google.loader.ClientLocation = null;
13 google.loader.AdditionalParams = '';
14 (function() {var d=window,g=encodeURIComponent,h=document;function l(a,b){return a.load=b}var m="join",n="name",q="prototype",r="ServiceBase",u="indexOf",v="setTimeout",w="replace",x="substring",y="charAt",z="push",A="loader",B="length",C="toLowerCase",D="getTime";function E(a){return a in F?F[a]:F[a]=-1!=navigator.userAgent[C]()[u](a)}var F={};function G(a,b){var c=function(){};c.prototype=b[q];a.ca=b[q];a.prototype=new c}
15 function H(a,b,c){var e=Array[q].slice.call(arguments,2)||[];return function(){return a.apply(b,e.concat(Array[q].slice.call(arguments)))}}function I(a){a=Error(a);a.toString=function(){return this.message};return a}function J(a,b){for(var c=a.split(/\./),e=d,f=0;f<c[B]-1;f++)e[c[f]]||(e[c[f]]={}),e=e[c[f]];e[c[c[B]-1]]=b}function K(a,b,c){a[b]=c}if(!L)var L=J;if(!M)var M=K;google[A].F={};L("google.loader.callbacks",google[A].F);var N={},O={};google[A].eval={};L("google.loader.eval",google[A].eval);
16 l(google,function(a,b,c){function e(a){var b=a.split(".");if(2<b[B])throw I("Module: '"+a+"' not found!");"undefined"!=typeof b[1]&&(f=b[0],c.packages=c.packages||[],c.packages[z](b[1]))}var f=a;c=c||{};if(a instanceof Array||a&&"object"==typeof a&&"function"==typeof a[m]&&"function"==typeof a.reverse)for(var k=0;k<a[B];k++)e(a[k]);else e(a);if(a=N[":"+f]){c&&!c.language&&c.locale&&(c.language=c.locale);c&&"string"==typeof c.callback&&(k=c.callback,k.match(/^[[\]A-Za-z0-9._]+$/)&&(k=d.eval(k),c.callback=
17 k));if((k=c&&null!=c.callback)&&!a.D(b))throw I("Module: '"+f+"' must be loaded before DOM onLoad!");k?a.u(b,c)?d[v](c.callback,0):a.load(b,c):a.u(b,c)||a.load(b,c)}else throw I("Module: '"+f+"' not found!");});L("google.load",google.load);
18 google.ba=function(a,b){b?(0==P[B]&&(Q(d,"load",R),!E("msie")&&!E("safari")&&!E("konqueror")&&E("mozilla")||d.opera?d.addEventListener("DOMContentLoaded",R,!1):E("msie")?h.write("<script defer onreadystatechange='google.loader.domReady()' src=//:>\x3c/script>"):(E("safari")||E("konqueror"))&&d[v](aa,10)),P[z](a)):Q(d,"load",a)};L("google.setOnLoadCallback",google.ba);
19 function Q(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var e=a["on"+b];a["on"+b]=null!=e?ba([c,e]):c}}function ba(a){return function(){for(var b=0;b<a[B];b++)a[b]()}}var P=[];google[A].W=function(){var a=d.event.srcElement;"complete"==a.readyState&&(a.onreadystatechange=null,a.parentNode.removeChild(a),R())};L("google.loader.domReady",google[A].W);var ca={loaded:!0,complete:!0};function aa(){ca[h.readyState]?R():0<P[B]&&d[v](aa,10)}
20 function R(){for(var a=0;a<P[B];a++)P[a]();P.length=0}google[A].f=function(a,b,c){if(c){var e;"script"==a?(e=h.createElement("script"),e.type="text/javascript",e.src=b):"css"==a&&(e=h.createElement("link"),e.type="text/css",e.href=b,e.rel="stylesheet");(a=h.getElementsByTagName("head")[0])||(a=h.body.parentNode.appendChild(h.createElement("head")));a.appendChild(e)}else"script"==a?h.write('<script src="'+b+'" type="text/javascript">\x3c/script>'):"css"==a&&h.write('<link href="'+b+'" type="text/css" rel="stylesheet"></link>')};
21 L("google.loader.writeLoadTag",google[A].f);google[A].Z=function(a){O=a};L("google.loader.rfm",google[A].Z);google[A].aa=function(a){for(var b in a)"string"==typeof b&&b&&":"==b[y](0)&&!N[b]&&(N[b]=new T(b[x](1),a[b]))};L("google.loader.rpl",google[A].aa);google[A].$=function(a){if((a=a.specs)&&a[B])for(var b=0;b<a[B];++b){var c=a[b];"string"==typeof c?N[":"+c]=new U(c):(c=new V(c[n],c.baseSpec,c.customSpecs),N[":"+c[n]]=c)}};L("google.loader.rm",google[A].$);google[A].loaded=function(a){N[":"+a.module].o(a)};
22 L("google.loader.loaded",google[A].loaded);google[A].V=function(){return"qid="+((new Date)[D]().toString(16)+Math.floor(1E7*Math.random()).toString(16))};L("google.loader.createGuidArg_",google[A].V);J("google_exportSymbol",J);J("google_exportProperty",K);google[A].a={};L("google.loader.themes",google[A].a);google[A].a.K="//www.google.com/cse/style/look/bubblegum.css";M(google[A].a,"BUBBLEGUM",google[A].a.K);google[A].a.M="//www.google.com/cse/style/look/greensky.css";M(google[A].a,"GREENSKY",google[A].a.M);
23 google[A].a.L="//www.google.com/cse/style/look/espresso.css";M(google[A].a,"ESPRESSO",google[A].a.L);google[A].a.O="//www.google.com/cse/style/look/shiny.css";M(google[A].a,"SHINY",google[A].a.O);google[A].a.N="//www.google.com/cse/style/look/minimalist.css";M(google[A].a,"MINIMALIST",google[A].a.N);google[A].a.P="//www.google.com/cse/style/look/v2/default.css";M(google[A].a,"V2_DEFAULT",google[A].a.P);function U(a){this.b=a;this.B=[];this.A={};this.l={};this.g={};this.s=!0;this.c=-1}
24 U[q].i=function(a,b){var c="";void 0!=b&&(void 0!=b.language&&(c+="&hl="+g(b.language)),void 0!=b.nocss&&(c+="&output="+g("nocss="+b.nocss)),void 0!=b.nooldnames&&(c+="&nooldnames="+g(b.nooldnames)),void 0!=b.packages&&(c+="&packages="+g(b.packages)),null!=b.callback&&(c+="&async=2"),void 0!=b.style&&(c+="&style="+g(b.style)),void 0!=b.noexp&&(c+="&noexp=true"),void 0!=b.other_params&&(c+="&"+b.other_params));if(!this.s){google[this.b]&&google[this.b].JSHash&&(c+="&sig="+g(google[this.b].JSHash));
25 var e=[],f;for(f in this.A)":"==f[y](0)&&e[z](f[x](1));for(f in this.l)":"==f[y](0)&&this.l[f]&&e[z](f[x](1));c+="&have="+g(e[m](","))}return google[A][r]+"/?file="+this.b+"&v="+a+google[A].AdditionalParams+c};U[q].H=function(a){var b=null;a&&(b=a.packages);var c=null;if(b)if("string"==typeof b)c=[a.packages];else if(b[B])for(c=[],a=0;a<b[B];a++)"string"==typeof b[a]&&c[z](b[a][w](/^\s*|\s*$/,"")[C]());c||(c=["default"]);b=[];for(a=0;a<c[B];a++)this.A[":"+c[a]]||b[z](c[a]);return b};
26 l(U[q],function(a,b){var c=this.H(b),e=b&&null!=b.callback;if(e)var f=new W(b.callback);for(var k=[],p=c[B]-1;0<=p;p--){var t=c[p];e&&f.R(t);if(this.l[":"+t])c.splice(p,1),e&&this.g[":"+t][z](f);else k[z](t)}if(c[B]){b&&b.packages&&(b.packages=c.sort()[m](","));for(p=0;p<k[B];p++)t=k[p],this.g[":"+t]=[],e&&this.g[":"+t][z](f);if(b||null==O[":"+this.b]||null==O[":"+this.b].versions[":"+a]||google[A].AdditionalParams||!this.s)b&&b.autoloaded||google[A].f("script",this.i(a,b),e);else{c=O[":"+this.b];
27 google[this.b]=google[this.b]||{};for(var S in c.properties)S&&":"==S[y](0)&&(google[this.b][S[x](1)]=c.properties[S]);google[A].f("script",google[A][r]+c.path+c.js,e);c.css&&google[A].f("css",google[A][r]+c.path+c.css,e)}this.s&&(this.s=!1,this.c=(new Date)[D](),1!=this.c%100&&(this.c=-1));for(p=0;p<k[B];p++)t=k[p],this.l[":"+t]=!0}});
28 U[q].o=function(a){-1!=this.c&&(da("al_"+this.b,"jl."+((new Date)[D]()-this.c),!0),this.c=-1);this.B=this.B.concat(a.components);google[A][this.b]||(google[A][this.b]={});google[A][this.b].packages=this.B.slice(0);for(var b=0;b<a.components[B];b++){this.A[":"+a.components[b]]=!0;this.l[":"+a.components[b]]=!1;var c=this.g[":"+a.components[b]];if(c){for(var e=0;e<c[B];e++)c[e].U(a.components[b]);delete this.g[":"+a.components[b]]}}};U[q].u=function(a,b){return 0==this.H(b)[B]};U[q].D=function(){return!0};
29 function W(a){this.T=a;this.v={};this.C=0}W[q].R=function(a){this.C++;this.v[":"+a]=!0};W[q].U=function(a){this.v[":"+a]&&(this.v[":"+a]=!1,this.C--,0==this.C&&d[v](this.T,0))};function V(a,b,c){this.name=a;this.S=b;this.w=c;this.G=this.j=!1;this.m=[];google[A].F[this[n]]=H(this.o,this)}G(V,U);l(V[q],function(a,b){var c=b&&null!=b.callback;c?(this.m[z](b.callback),b.callback="google.loader.callbacks."+this[n]):this.j=!0;b&&b.autoloaded||google[A].f("script",this.i(a,b),c)});V[q].u=function(a,b){return b&&null!=b.callback?this.G:this.j};V[q].o=function(){this.G=!0;for(var a=0;a<this.m[B];a++)d[v](this.m[a],0);this.m=[]};
30 var X=function(a,b){return a.string?g(a.string)+"="+g(b):a.regex?b[w](/(^.*$)/,a.regex):""};V[q].i=function(a,b){return this.X(this.I(a),a,b)};
31 V[q].X=function(a,b,c){var e="";a.key&&(e+="&"+X(a.key,google[A].ApiKey));a.version&&(e+="&"+X(a.version,b));b=google[A].Secure&&a.ssl?a.ssl:a.uri;if(null!=c)for(var f in c)a.params[f]?e+="&"+X(a.params[f],c[f]):"other_params"==f?e+="&"+c[f]:"base_domain"==f&&(b="http://"+c[f]+a.uri[x](a.uri[u]("/",7)));google[this[n]]={};-1==b[u]("?")&&e&&(e="?"+e[x](1));return b+e};V[q].D=function(a){return this.I(a).deferred};V[q].I=function(a){if(this.w)for(var b=0;b<this.w[B];++b){var c=this.w[b];if((new RegExp(c.pattern)).test(a))return c}return this.S};function T(a,b){this.b=a;this.h=b;this.j=!1}G(T,U);l(T[q],function(a,b){this.j=!0;google[A].f("script",this.i(a,b),!1)});T[q].u=function(){return this.j};T[q].o=function(){};T[q].i=function(a,b){if(!this.h.versions[":"+a]){if(this.h.aliases){var c=this.h.aliases[":"+a];c&&(a=c)}if(!this.h.versions[":"+a])throw I("Module: '"+this.b+"' with version '"+a+"' not found!");}return google[A].GoogleApisBase+"/libs/"+this.b+"/"+a+"/"+this.h.versions[":"+a][b&&b.uncompressed?"uncompressed":"compressed"]};
32 T[q].D=function(){return!1};var ea=!1,Y=[],fa=(new Date)[D](),ha=function(){ea||(Q(d,"unload",ga),ea=!0)},ia=function(a,b){ha();if(!(google[A].Secure||google[A].Options&&!1!==google[A].Options.csi)){for(var c=0;c<a[B];c++)a[c]=g(a[c][C]()[w](/[^a-z0-9_.]+/g,"_"));for(c=0;c<b[B];c++)b[c]=g(b[c][C]()[w](/[^a-z0-9_.]+/g,"_"));d[v](H(Z,null,"//gg.google.com/csi?s=uds&v=2&action="+a[m](",")+"&it="+b[m](",")),1E4)}},da=function(a,b,c){c?ia([a],[b]):(ha(),Y[z]("r"+Y[B]+"="+g(a+(b?"|"+b:""))),d[v](ga,5<Y[B]?0:15E3))},ga=function(){if(Y[B]){var a=
33 google[A][r];0==a[u]("http:")&&(a=a[w](/^http:/,"https:"));Z(a+"/stats?"+Y[m]("&")+"&nc="+(new Date)[D]()+"_"+((new Date)[D]()-fa));Y.length=0}},Z=function(a){var b=new Image,c=Z.Y++;Z.J[c]=b;b.onload=b.onerror=function(){delete Z.J[c]};b.src=a;b=null};Z.J={};Z.Y=0;J("google.loader.recordCsiStat",ia);J("google.loader.recordStat",da);J("google.loader.createImageForLogging",Z);
34
35 }) ();google.loader.rm({"specs":["visualization","payments",{"name":"annotations","baseSpec":{"uri":"http://www.google.com/reviews/scripts/annotations_bootstrap.js","ssl":null,"key":{"string":"key"},"version":{"string":"v"},"deferred":true,"params":{"country":{"string":"gl"},"callback":{"string":"callback"},"language":{"string":"hl"}}}},"language","gdata","wave","spreadsheets","search","orkut","feeds","annotations_v2","picker","identitytoolkit",{"name":"maps","baseSpec":{"uri":"http://maps.google.com/maps?file\u003dgoogleapi","ssl":"https://maps-api-ssl.google.com/maps?file\u003dgoogleapi","key":{"string":"key"},"version":{"string":"v"},"deferred":true,"params":{"callback":{"regex":"callback\u003d$1\u0026async\u003d2"},"language":{"string":"hl"}}},"customSpecs":[{"uri":"http://maps.googleapis.com/maps/api/js","ssl":"https://maps.googleapis.com/maps/api/js","version":{"string":"v"},"deferred":true,"params":{"callback":{"string":"callback"},"language":{"string":"hl"}},"pattern":"^(3|3..*)$"}]},{"name":"friendconnect","baseSpec":{"uri":"http://www.google.com/friendconnect/script/friendconnect.js","ssl":"https://www.google.com/friendconnect/script/friendconnect.js","key":{"string":"key"},"version":{"string":"v"},"deferred":false,"params":{}}},{"name":"sharing","baseSpec":{"uri":"http://www.google.com/s2/sharing/js","ssl":null,"key":{"string":"key"},"version":{"string":"v"},"deferred":false,"params":{"language":{"string":"hl"}}}},"ads",{"name":"books","baseSpec":{"uri":"http://books.google.com/books/api.js","ssl":"https://encrypted.google.com/books/api.js","key":{"string":"key"},"version":{"string":"v"},"deferred":true,"params":{"callback":{"string":"callback"},"language":{"string":"hl"}}}},"elements","earth","ima"]});
36 google.loader.rfm({":search":{"versions":{":1":"1",":1.0":"1"},"path":"/api/search/1.0/56f70d816baa48bdfe9284ebc883ad41/","js":"default+es.I.js","css":"default+es.css","properties":{":Version":"1.0",":NoOldNames":false,":JSHash":"56f70d816baa48bdfe9284ebc883ad41"}},":language":{"versions":{":1":"1",":1.0":"1"},"path":"/api/language/1.0/cddd1e0315f352539fc3732010bda57f/","js":"default+es.I.js","properties":{":Version":"1.0",":JSHash":"cddd1e0315f352539fc3732010bda57f"}},":annotations":{"versions":{":1":"1",":1.0":"1"},"path":"/api/annotations/1.0/69e4c522bede40545878d7b96b100995/","js":"default+es.I.js","properties":{":Version":"1.0",":JSHash":"69e4c522bede40545878d7b96b100995"}},":wave":{"versions":{":1":"1",":1.0":"1"},"path":"/api/wave/1.0/3b6f7573ff78da6602dda5e09c9025bf/","js":"default.I.js","properties":{":Version":"1.0",":JSHash":"3b6f7573ff78da6602dda5e09c9025bf"}},":earth":{"versions":{":1":"1",":1.0":"1"},"path":"/api/earth/1.0/db22e5693e0a8de1f62f3536f5a8d7d3/","js":"default.I.js","properties":{":Version":"1.0",":JSHash":"db22e5693e0a8de1f62f3536f5a8d7d3"}},":feeds":{"versions":{":1":"1",":1.0":"1"},"path":"/api/feeds/1.0/482f2817cdf8982edf2e5669f9e3a627/","js":"default+es.I.js","css":"default+es.css","properties":{":Version":"1.0",":JSHash":"482f2817cdf8982edf2e5669f9e3a627"}},":picker":{"versions":{":1":"1",":1.0":"1"},"path":"/api/picker/1.0/1c635e91b9d0c082c660a42091913907/","js":"default.I.js","css":"default.css","properties":{":Version":"1.0",":JSHash":"1c635e91b9d0c082c660a42091913907"}},":ima":{"versions":{":3":"1",":3.0":"1"},"path":"/api/ima/3.0/28a914332232c9a8ac0ae8da68b1006e/","js":"default.I.js","properties":{":Version":"3.0",":JSHash":"28a914332232c9a8ac0ae8da68b1006e"}}});
37 google.loader.rpl({":chrome-frame":{"versions":{":1.0.0":{"uncompressed":"CFInstall.js","compressed":"CFInstall.min.js"},":1.0.1":{"uncompressed":"CFInstall.js","compressed":"CFInstall.min.js"},":1.0.2":{"uncompressed":"CFInstall.js","compressed":"CFInstall.min.js"}},"aliases":{":1":"1.0.2",":1.0":"1.0.2"}},":swfobject":{"versions":{":2.1":{"uncompressed":"swfobject_src.js","compressed":"swfobject.js"},":2.2":{"uncompressed":"swfobject_src.js","compressed":"swfobject.js"}},"aliases":{":2":"2.2"}},":ext-core":{"versions":{":3.1.0":{"uncompressed":"ext-core-debug.js","compressed":"ext-core.js"},":3.0.0":{"uncompressed":"ext-core-debug.js","compressed":"ext-core.js"}},"aliases":{":3":"3.1.0",":3.0":"3.0.0",":3.1":"3.1.0"}},":webfont":{"versions":{":1.0.12":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.13":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.14":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.15":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.10":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.11":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.27":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.28":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.29":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.23":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.24":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.25":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.26":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.21":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.22":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.3":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.4":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.5":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.6":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.9":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.16":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.17":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.0":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.18":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.1":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.19":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"},":1.0.2":{"uncompressed":"webfont_debug.js","compressed":"webfont.js"}},"aliases":{":1":"1.0.29",":1.0":"1.0.29"}},":scriptaculous":{"versions":{":1.8.3":{"uncompressed":"scriptaculous.js","compressed":"scriptaculous.js"},":1.9.0":{"uncompressed":"scriptaculous.js","compressed":"scriptaculous.js"},":1.8.1":{"uncompressed":"scriptaculous.js","compressed":"scriptaculous.js"},":1.8.2":{"uncompressed":"scriptaculous.js","compressed":"scriptaculous.js"}},"aliases":{":1":"1.9.0",":1.8":"1.8.3",":1.9":"1.9.0"}},":jqueryui":{"versions":{":1.8.17":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.16":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.15":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.14":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.4":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.13":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.5":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.12":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.6":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.11":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.7":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.10":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.8":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.9":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.6.0":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.7.0":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.5.2":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.0":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.7.1":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.5.3":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.1":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.7.2":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.8.2":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"},":1.7.3":{"uncompressed":"jquery-ui.js","compressed":"jquery-ui.min.js"}},"aliases":{":1":"1.8.17",":1.8.3":"1.8.4",":1.5":"1.5.3",":1.6":"1.6.0",":1.7":"1.7.3",":1.8":"1.8.17"}},":mootools":{"versions":{":1.3.0":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.2.1":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.1.2":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.4.0":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.3.1":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.2.2":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.4.1":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.3.2":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.2.3":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.4.2":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.2.4":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.2.5":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"},":1.1.1":{"uncompressed":"mootools.js","compressed":"mootools-yui-compressed.js"}},"aliases":{":1":"1.1.2",":1.1":"1.1.2",":1.2":"1.2.5",":1.3":"1.3.2",":1.4":"1.4.2",":1.11":"1.1.1"}},":yui":{"versions":{":2.8.0r4":{"uncompressed":"build/yuiloader/yuiloader.js","compressed":"build/yuiloader/yuiloader-min.js"},":2.9.0":{"uncompressed":"build/yuiloader/yuiloader.js","compressed":"build/yuiloader/yuiloader-min.js"},":2.8.1":{"uncompressed":"build/yuiloader/yuiloader.js","compressed":"build/yuiloader/yuiloader-min.js"},":2.6.0":{"uncompressed":"build/yuiloader/yuiloader.js","compressed":"build/yuiloader/yuiloader-min.js"},":2.7.0":{"uncompressed":"build/yuiloader/yuiloader.js","compressed":"build/yuiloader/yuiloader-min.js"},":3.3.0":{"uncompressed":"build/yui/yui.js","compressed":"build/yui/yui-min.js"},":2.8.2r1":{"uncompressed":"build/yuiloader/yuiloader.js","compressed":"build/yuiloader/yuiloader-min.js"}},"aliases":{":2":"2.9.0",":3":"3.3.0",":2.8.2":"2.8.2r1",":2.8.0":"2.8.0r4",":3.3":"3.3.0",":2.6":"2.6.0",":2.7":"2.7.0",":2.8":"2.8.2r1",":2.9":"2.9.0"}},":prototype":{"versions":{":1.6.1.0":{"uncompressed":"prototype.js","compressed":"prototype.js"},":1.6.0.2":{"uncompressed":"prototype.js","compressed":"prototype.js"},":1.7.0.0":{"uncompressed":"prototype.js","compressed":"prototype.js"},":1.6.0.3":{"uncompressed":"prototype.js","compressed":"prototype.js"}},"aliases":{":1":"1.7.0.0",":1.6.0":"1.6.0.3",":1.6.1":"1.6.1.0",":1.7.0":"1.7.0.0",":1.6":"1.6.1.0",":1.7":"1.7.0.0"}},":jquery":{"versions":{":1.3.0":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.4.0":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.3.1":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.5.0":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.4.1":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.3.2":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.2.3":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.6.0":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.5.1":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.4.2":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.7.0":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.6.1":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.5.2":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.4.3":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.7.1":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.6.2":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.4.4":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.2.6":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.6.3":{"uncompressed":"jquery.js","compressed":"jquery.min.js"},":1.6.4":{"uncompressed":"jquery.js","compressed":"jquery.min.js"}},"aliases":{":1":"1.7.1",":1.2":"1.2.6",":1.3":"1.3.2",":1.4":"1.4.4",":1.5":"1.5.2",":1.6":"1.6.4",":1.7":"1.7.1"}},":dojo":{"versions":{":1.3.0":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.4.0":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.3.1":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.5.0":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.4.1":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.3.2":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.2.3":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.6.0":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.5.1":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.7.0":{"uncompressed":"dojo/dojo.js.uncompressed.js","compressed":"dojo/dojo.js"},":1.6.1":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.4.3":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.7.1":{"uncompressed":"dojo/dojo.js.uncompressed.js","compressed":"dojo/dojo.js"},":1.7.2":{"uncompressed":"dojo/dojo.js.uncompressed.js","compressed":"dojo/dojo.js"},":1.2.0":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"},":1.1.1":{"uncompressed":"dojo/dojo.xd.js.uncompressed.js","compressed":"dojo/dojo.xd.js"}},"aliases":{":1":"1.6.1",":1.1":"1.1.1",":1.2":"1.2.3",":1.3":"1.3.2",":1.4":"1.4.3",":1.5":"1.5.1",":1.6":"1.6.1",":1.7":"1.7.2"}}});
38 }
39
0 /*********************************
1
2 keshif library
3
4 Copyright (c) 2014-2015, University of Maryland
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
9
10 * Redistributions of source code must retain the above copyright notice, this
11 list of conditions and the following disclaimer.
12
13 * Redistributions in binary form must reproduce the above copyright notice,
14 this list of conditions and the following disclaimer in the documentation
15 and/or other materials provided with the distribution.
16
17 * Neither the name of the University of Maryland nor the names of its contributors
18 may not be used to endorse or promote products derived from this software
19 without specific prior written permission.
20
21 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24 DISCLAIMED. IN NO EVENT SHALL MICHAEL BOSTOCK BE LIABLE FOR ANY DIRECT,
25 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
28 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
30 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
32 ************************************ */
33
34
35 // load google visualization library only if google scripts were included
36 if(typeof google !== 'undefined'){
37 google.load('visualization', '1', {'packages': []});
38 }
39
40 if(typeof sendLog !== 'function'){
41 sendLog = null;
42 }
43
44 // kshf namespace
45 var kshf = {
46 surrogateCtor: function() {},
47 // http://stackoverflow.com/questions/4152931/javascript-inheritance-call-super-constructor-or-use-prototype-chain
48 extendClass: function(base, sub) {
49 // Copy the prototype from the base to setup inheritance
50 this.surrogateCtor.prototype = base.prototype;
51 // Tricky huh?
52 sub.prototype = new this.surrogateCtor();
53 // Remember the constructor property was set wrong, let's fix it
54 sub.prototype.constructor = sub;
55 },
56 summaryCount: 0,
57 maxVisibleItems_Default: 100,
58 scrollWidth: 19,
59 previewTimeoutMS: 250,
60 dt: {},
61 dt_id: {},
62 lang: {
63 en: {
64 ModifyBrowser: "Modify browser",
65 OpenDataSource: "Open data source",
66 ShowInfoCredits: "Show info &amp; credits",
67 ShowFullscreen: "Fullscreen",
68 RemoveFilter: "Remove filter",
69 RemoveAllFilters: "Remove all filters",
70 MinimizeSummary: "Close summary",
71 OpenSummary: "Open summary",
72 MaximizeSummary: "Maximize summary",
73 RemoveSummary: "Remove summary",
74 ReverseOrder: "Reverse order",
75 Reorder: "Reorder",
76 GetMoreInfo: "Get more info",
77 Percentiles: "Percentiles",
78 LockToCompare: "Lock to compare",
79 Unlock: "Unlock",
80 Search: "Search",
81 CreatingBrowser: "Creating browser",
82 Rows: "Rows",
83 More: "More",
84 LoadingData: "Loading data sources",
85 ShowAll: "All",
86 ScrollToTop: "Top",
87 Absolute: "Absolute",
88 Percent: "Percent",
89 Relative: "Relative",
90 Width: "Length",
91 DragToFilter: "Drag to filter",
92 And: "And",
93 Or: "Or",
94 Not: "Not",
95 EditTitle: "Edit",
96 ResizeBrowser: "Resize Browser",
97 RemoveRecords: "Remove Record View"
98 },
99 tr: {
100 ModifyBrowser: "Tarayıcıyı düzenle",
101 OpenDataSource: "Veri kaynağını aç",
102 ShowInfoCredits: "Bilgi",
103 ShowFullscreen: "Tam ekran",
104 RemoveFilter: "Filtreyi kaldır",
105 RemoveAllFilters: "Tüm filtreleri kaldır",
106 MinimizeSummary: "Özeti ufalt",
107 OpenSummary: "Özeti aç",
108 MaximizeSummary: "Özeti büyüt",
109 RemoveSummary: "Özeti kaldır",
110 ReverseOrder: "Ters sırala",
111 Reorder: "Yeniden sırala",
112 GetMoreInfo: "Daha fazla bilgi",
113 Percentiles: "Yüzdeler",
114 LockToCompare: "Kilitle ve karşılaştır",
115 Unlock: "Kilidi kaldır",
116 Search: "Ara",
117 LoadingData: "Veriler yükleniyor...",
118 CreatingBrowser: "Arayüz oluşturuluyor...",
119 Rows: "Satır",
120 More: "Daha",
121 ShowAll: "Tüm",
122 ScrollToTop: "Yukarı",
123 Absolute: "Net",
124 Percent: "Yüzde",
125 Relative: "Görece",
126 Width: "Genişlik",
127 DragToFilter: "Sürükle ve filtre",
128 And: "Ve",
129 Or: "Veya",
130 Not: "Değil",
131 EditTitle: "Değiştir",
132 ResizeBrowser: "Boyutlandır",
133 RemoveRecords: "Kayıtları kaldır"
134 },
135 fr: {
136 ModifyBrowser: "Modifier le navigateur",
137 OpenDataSource: "Ouvrir la source de données",
138 ShowInfoCredits: "Afficher les credits",
139 RemoveFilter: "Supprimer le filtre",
140 RemoveAllFilters: "Supprimer tous les filtres",
141 MinimizeSummary: "Réduire le sommaire",
142 OpenSummary: "Ouvrir le sommaire",
143 MaximizeSummary: "Agrandir le sommaire",
144 RemoveSummary: "??",
145 ReverseOrder: "Inverser l'ordre",
146 Reorder: "Réorganiser",
147 GetMoreInfo: "Plus d'informations",
148 Percentiles: "Percentiles",
149 LockToCompare: "Bloquer pour comparer",
150 Unlock: "Débloquer",
151 Search: "Rechercher",
152 CreatingBrowser: "Création du navigateur",
153 Rows: "Lignes",
154 More: "Plus",
155 LoadingData: "Chargement des données",
156 ShowAll: "Supprimer les filtres",
157 ScrollToTop: "Début",
158 Absolute: "Absolue",
159 Percent: "Pourcentage",
160 Relative: "Relative",
161 Width: "Largeur",
162 DragToFilter: "??",
163 And: "??",
164 Or: "??",
165 Not: "??",
166 },
167 es: {
168 ModifyBrowser: "Modificar navegador",
169 OpenDataSource: "Abrir fuente de datos",
170 ShowInfoCredits: "Mostrar información y créditos",
171 ShowFullscreen: "Pantalla completa",
172 RemoveFilter: "Eliminar filtro",
173 RemoveAllFilters: "Eliminar todos los filtros",
174 MinimizeSummary: "Cerrar resumen",
175 OpenSummary: "Abrir resumen",
176 MaximizeSummary: "Maximizar resumen",
177 RemoveSummary: "Eliminar resumen",
178 ReverseOrder: "Invertir orden",
179 Reorder: "Reordenar",
180 GetMoreInfo: "Obtener más información",
181 Percentiles: "Percentiles",
182 LockToCompare: "Bloquear para comparar",
183 Unlock: "Desbloquear",
184 Search: "Buscar",
185 CreatingBrowser: "Creando explorador",
186 Rows: "Filas",
187 More: "Más",
188 LoadingData: "Cargando fuentes de datos",
189 ShowAll: "Todos",
190 ScrollToTop: "Superior",
191 Absolute: "Absoluto",
192 Percent: "Porcentaje",
193 Relative: "Relativo",
194 Width: "Longitud",
195 DragToFilter: "Arrastrar para filtrar",
196 And: "Y",
197 Or: "O",
198 Not: "No",
199 EditTitle: "Editar",
200 ResizeBrowser: "Ajustar tamño del explorador",
201 RemoveRecords: "Eliminar registros"
202 },
203 cur: null // Will be set to en if not defined before a browser is loaded
204 },
205
206 LOG: {
207 // Note: id parameter is integer alwats, info is string
208 CONFIG : 1,
209 // Filtering state
210 // param: resultCt, selected(selected # of attribs, sep by x), filtered(filtered filter ids)
211 FILTER_ADD : 10,
212 FILTER_CLEAR : 11,
213 // Filtering extra information, send in addition to filtering state messages above
214 FILTER_CLEAR_ALL : 12, // param: -
215 FILTER_ATTR_ADD_AND : 13, // param: id (filterID), info (attribID)
216 FILTER_ATTR_ADD_OR : 14, // param: id (filterID), info (attribID)
217 FILTER_ATTR_ADD_ONE : 15,
218 FILTER_ATTR_ADD_OR_ALL : 16, // param: id (filterID)
219 FILTER_ATTR_ADD_NOT : 17, // param: id (filterID), info (attribID)
220 FILTER_ATTR_EXACT : 18, // param: id (filterID), info (attribID)
221 FILTER_ATTR_UNSELECT : 19, // param: id (filterID), info (attribID)
222 FILTER_TEXTSEARCH : 20, // param: id (filterID), info (query text)
223 FILTER_INTRVL_HANDLE : 21, // param: id (filterID) (TODO: Include range)
224 FILTER_INTRVL_BIN : 22, // param: id (filterID)
225 FILTER_CLEAR_X : 23, // param: id (filterID)
226 FILTER_CLEAR_CRUMB : 24, // param: id (filterID)
227 FILTER_PREVIEW : 25, // param: id (filterID), info (attribID for cat, histogram range (AxB) for interval)
228 // Facet specific non-filtering interactions
229 FACET_COLLAPSE : 40, // param: id (facetID)
230 FACET_SHOW : 41, // param: id (facetID)
231 FACET_SORT : 42, // param: id (facetID), info (sortID)
232 FACET_SCROLL_TOP : 43, // param: id (facetID)
233 FACET_SCROLL_MORE : 44, // param: id (facetID)
234 // List specific interactions
235 LIST_SORT : 50, // param: info (sortID)
236 LIST_SCROLL_TOP : 51, // param: -
237 LIST_SHOWMORE : 52, // param: info (itemCount)
238 LIST_SORT_INV : 53, // param: -
239 // Item specific interactions
240 ITEM_DETAIL_ON : 60, // param: info (itemID)
241 ITEM_DETAIL_OFF : 61, // param: info (itemID)
242 // Generic interactions
243 DATASOURCE : 70, // param: -
244 INFOBOX : 71, // param: -
245 CLOSEPAGE : 72, // param: -
246 BARCHARTWIDTH : 73, // param: info (width)
247 RESIZE : 74, // param: -
248 },
249 Util: {
250 sortFunc_List_String: function(a, b){
251 return a.localeCompare(b);
252 },
253 sortFunc_List_Date: function(a, b){
254 if(a===null) return -1;
255 if(b===null) return 1;
256 return a.getTime() - b.getTime();
257 },
258 sortFunc_List_Number: function(a, b){
259 return b - a;
260 },
261 /** Given a list of columns which hold multiple IDs, breaks them into an array */
262 cellToArray: function(dt, columns, splitExpr){
263 if(splitExpr===undefined){
264 splitExpr = /\b\s+/;
265 }
266 var j;
267 dt.forEach(function(p){
268 p = p.data;
269 columns.forEach(function(column){
270 var list = p[column];
271 if(list===null) return;
272 if(typeof list==="number") {
273 p[column] = ""+list;
274 return;
275 }
276 var list2 = list.split(splitExpr);
277 list = [];
278 // remove empty "" items
279 for(j=0; j<list2.length; j++){
280 list2[j] = list2[j].trim();
281 if(list2[j]!=="") list.push(list2[j]);
282 }
283 p[column] = list;
284 });
285 });
286 },
287 /** You should only display at most 3 digits + k/m/etc */
288 formatForItemCount: function(n){
289 if(n<1000) {
290 return n;
291 }
292 if(n<1000000) {
293 // 1,000-999,999
294 var thousands=n/1000;
295 if(thousands<10){
296 return (Math.floor(n/100)/10)+"k";
297 }
298 return Math.floor(thousands)+"k";
299 }
300 if(n<1000000000) return Math.floor(n/1000000)+"m";
301 return n;
302 },
303 nearestYear: function(d){
304 var dr = new Date(Date.UTC(d.getUTCFullYear(),0,1));
305 if(d.getUTCMonth()>6) dr.setUTCFullYear(dr.getUTCFullYear()+1);
306 return dr;
307 },
308 nearestMonth: function(d){
309 var dr = new Date(Date.UTC(d.getUTCFullYear(),d.getUTCMonth(),1));
310 if(d.getUTCDate()>15) dr.setUTCMonth(dr.getUTCMonth()+1);
311 return dr;
312 },
313 nearestDay: function(d){
314 var dr = new Date(Date.UTC(d.getUTCFullYear(),d.getUTCMonth(),d.getUTCDate()));
315 if(d.getUTCHours()>12) dr.setUTCDate(dr.getUTCDate()+1);
316 return dr;
317 },
318 nearestHour: function(d){
319 },
320 nearestMinute: function(d){
321 },
322 clearArray: function(arr){
323 while (arr.length > 0) {
324 arr.pop();
325 }
326 },
327 ignoreScrollEvents: false,
328 scrollToPos_do: function(scrollDom, targetPos){
329 kshf.Util.ignoreScrollEvents = true;
330 // scroll to top
331 var startTime = null;
332 var scrollInit = scrollDom.scrollTop;
333 var easeFunc = d3.ease('cubic-in-out');
334 var scrollTime = 500;
335 var animateToTop = function(timestamp){
336 var progress;
337 if(startTime===null) startTime = timestamp;
338 // complete animation in 500 ms
339 progress = (timestamp - startTime)/scrollTime;
340 var m=easeFunc(progress);
341 scrollDom.scrollTop = (1-m)*scrollInit+m*targetPos;
342 if(scrollDom.scrollTop!==targetPos){
343 window.requestAnimationFrame(animateToTop);
344 } else {
345 kshf.Util.ignoreScrollEvents = false;
346 }
347 };
348 window.requestAnimationFrame(animateToTop);
349 },
350 toProperCase: function(str){
351 return str.toLowerCase().replace(/\b[a-z]/g,function(f){return f.toUpperCase()});
352 },
353 setTransform: function(dom,transform){
354 dom.style.webkitTransform = transform;
355 dom.style.MozTransform = transform;
356 dom.style.msTransform = transform;
357 dom.style.OTransform = transform;
358 dom.style.transform = transform;
359 },
360 // http://stackoverflow.com/questions/13627308/add-st-nd-rd-and-th-ordinal-suffix-to-a-number
361 ordinal_suffix_of: function(i) {
362 var j = i % 10,
363 k = i % 100;
364 if (j == 1 && k != 11) {
365 return i + "st";
366 }
367 if (j == 2 && k != 12) {
368 return i + "nd";
369 }
370 if (j == 3 && k != 13) {
371 return i + "rd";
372 }
373 return i + "th";
374 },
375 },
376 style: {
377 color_chart_background_highlight: "rgb(194, 146, 124)"
378 },
379 fontLoaded: false,
380 loadFont: function(){
381 if(this.fontLoaded===true) return;
382 WebFontConfig = {
383 google: { families: [ 'Roboto:400,500,300,100,700:latin' ] }
384 };
385 var wf = document.createElement('script');
386 wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
387 '://ajax.googleapis.com/ajax/libs/webfont/1/webfont.js';
388 wf.type = 'text/javascript';
389 wf.async = 'true';
390 var s = document.getElementsByTagName('script')[0];
391 s.parentNode.insertBefore(wf, s);
392 this.fontLoaded = true;
393 }
394 };
395
396 // tipsy, facebook style tooltips for jquery
397 // Modified / simplified version for internal Keshif use
398 // version 1.0.0a
399 // (c) 2008-2010 jason frame [[email protected]]
400 // released under the MIT license
401 var activeTipsy = undefined;
402
403 function Tipsy(element, options) {
404 this.jq_element = $(element);
405 this.options = $.extend({}, this.defaults, options);
406 };
407 Tipsy.prototype = {
408 defaults: {
409 className: null,
410 delayOut: 0,
411 fade: true,
412 fallback: '',
413 gravity: 'n',
414 offset: 0,
415 offset_x: 0,
416 offset_y: 0,
417 opacity: 1
418 },
419 show: function() {
420 var maybeCall = function(thing, ctx) {
421 return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
422 };
423 if(activeTipsy) {
424 activeTipsy.hide();
425 }
426
427 activeTipsy=this;
428
429 var title = this.getTitle();
430 if(!title) return;
431 var jq_tip = this.tip();
432
433 jq_tip.find('.tipsy-inner')['html'](title);
434 jq_tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity
435 jq_tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);
436
437 var pos = $.extend({}, this.jq_element.offset(), {
438 width: this.jq_element[0].offsetWidth,
439 height: this.jq_element[0].offsetHeight
440 });
441
442 var actualWidth = jq_tip[0].offsetWidth,
443 actualHeight = jq_tip[0].offsetHeight,
444 gravity = maybeCall(this.options.gravity, this.jq_element[0]);
445
446 var tp;
447 switch (gravity.charAt(0)) {
448 case 'n':
449 tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
450 break;
451 case 's':
452 tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};
453 break;
454 case 'e':
455 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};
456 break;
457 case 'w':
458 tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};
459 break;
460 }
461 tp.top+=this.options.offset_y;
462 tp.left+=this.options.offset_x;
463
464 if (gravity.length == 2) {
465 if (gravity.charAt(1) == 'w') {
466 tp.left = pos.left + pos.width / 2 - 15;
467 } else {
468 tp.left = pos.left + pos.width / 2 - actualWidth + 15;
469 }
470 }
471
472 jq_tip.css(tp).addClass('tipsy-' + gravity);
473 jq_tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);
474 if (this.options.className) {
475 jq_tip.addClass(maybeCall(this.options.className, this.jq_element[0]));
476 }
477
478 if (this.options.fade) {
479 jq_tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity},200);
480 } else {
481 jq_tip.css({visibility: 'visible', opacity: this.options.opacity});
482 }
483 },
484 hide: function(){
485 activeTipsy = undefined;
486 if (this.options.fade) {
487 this.tip().stop().fadeOut(200,function() { $(this).remove(); });
488 } else {
489 this.tip().remove();
490 }
491 },
492 getTitle: function() {
493 var title, jq_e = this.jq_element, o = this.options;
494 var title, o = this.options;
495 if (typeof o.title == 'string') {
496 title = jq_e.attr(o.title == 'title' ? 'original-title' : o.title);
497 } else if (typeof o.title == 'function') {
498 title = o.title.call(jq_e[0]);
499 }
500 title = ('' + title).replace(/(^\s*|\s*$)/, "");
501 return title || o.fallback;
502 },
503 tip: function() {
504 if(this.jq_tip) return this.jq_tip;
505 this.jq_tip = $('<div class="tipsy"></div>').html('<div class="tipsy-arrow"></div><div class="tipsy-inner"></div>');
506 this.jq_tip;
507 this.jq_tip.data('tipsy-pointee', this.jq_element[0]);
508 return this.jq_tip;
509 },
510 };
511
512 /**
513 * @constructor
514 */
515 kshf.Item = function(d, idIndex){
516 // the main data within item
517 this.data = d;
518 this.idIndex = idIndex; // TODO: Items don't need to have ID index, only one per table is enough??
519 // Selection state
520 // 1: selected for inclusion (AND)
521 // 2: selected for inclusion (OR)
522 // -1: selected for removal (NOT query)
523 // 0: not selected
524 this.selected = 0;
525 // Items which are mapped/related to this item
526 this.items = [];
527
528 // By default, each item is aggregated as 1
529 // You can modify this with a non-negative value
530 // Note that the aggregation currently works by summation only.
531 this.aggregate_Self = 1;
532
533 this.aggregate_Active = 0; // Active aggregate value
534 this.aggregate_Preview = 0; // Previewed aggregate value
535 this.aggregate_Total = 0; // Total aggregate value
536
537 // If true, filter/wanted state is dirty and needs to be updated.
538 this._filterCacheIsDirty = true;
539 // Cacheing filter state per eact facet in the system
540 this.filterCache = [];
541 // Wanted item / not filtered out
542 this.isWanted = true;
543 // Used by listDisplay to adjust animations. Only used by primary entity type for now.
544 this.visibleOrder = 0;
545 this.visibleOrder_pre = -1;
546 // The data that's used for mapping this item, used as a cache.
547 // This is accessed by filterID
548 // Through this, you can also reach mapped DOM items
549 // DOM elements that this item is mapped to
550 // - If this is a paper, it can be paper type. If this is author, it can be author affiliation.
551 this.mappedDataCache = []; // caching the values this item was mapped to
552 // If true, item is currently selected to be included in link computation
553 this.selectedForLink = false;
554
555 this.DOM = {};
556 // If item is primary type, this will be set
557 this.DOM.record = undefined;
558 // If item is used as a filter (can be primary if looking at links), this will be set
559 this.DOM.facet = undefined;
560 // If true, updatePreview has propogated changes above
561 this.updatePreview_Cache = false;
562 };
563 kshf.Item.prototype = {
564 /** Returns unique ID of the item. */
565 id: function(){
566 return this.data[this.idIndex];
567 },
568 /** -- */
569 setFilterCache: function(index,v){
570 if(this.filterCache[index]===v) return;
571 this.filterCache[index] = v;
572 this._filterCacheIsDirty = true;
573 },
574
575 /** -- */
576 f_selected: function(){ return this.selected!==0; },
577 f_included: function(){ return this.selected>0; },
578
579 is_NONE:function(){ return this.selected===0; },
580 is_NOT: function(){ return this.selected===-1; },
581 is_AND: function(){ return this.selected===1; },
582 is_OR : function(){ return this.selected===2; },
583
584 set_NONE: function(){
585 if(this.inList!==undefined) {
586 this.inList.splice(this.inList.indexOf(this),1);
587 }
588 this.inList = undefined;
589 this.selected = 0; this.refreshFacetDOMSelected();
590 },
591 set_NOT: function(l){
592 if(this.is_NOT()) return;
593 this._insertToList(l);
594 this.selected =-1; this.refreshFacetDOMSelected();
595 },
596 set_AND: function(l){
597 if(this.is_AND()) return;
598 this._insertToList(l);
599 this.selected = 1; this.refreshFacetDOMSelected();
600 },
601 set_OR: function(l){
602 if(this.is_OR()) return;
603 this._insertToList(l);
604 this.selected = 2; this.refreshFacetDOMSelected();
605 },
606
607 _insertToList: function(l){
608 if(this.inList!==undefined) {
609 this.inList.splice(this.inList.indexOf(this),1);
610 }
611 this.inList = l;
612 l.push(this);
613 },
614
615 refreshFacetDOMSelected: function(){
616 if(this.DOM.facet) this.DOM.facet.setAttribute("selected",this.selected);
617 },
618
619 /** -- */
620 addItem: function(item){
621 this.items.push(item);
622 this.aggregate_Total+=item.aggregate_Self;
623 this.aggregate_Active+=item.aggregate_Self;
624 },
625 /**
626 * Updates isWanted state, and notifies all related filter attributes of the change.
627 * With recursive parameter, you avoid updating status under facet passed in as recursive
628 */
629 updateWanted: function(recursive){
630 if(!this._filterCacheIsDirty) return false;
631
632 var me=this;
633 var oldWanted = this.isWanted;
634
635 // Checks if all filter results are true. At first "false", breaks the loop
636 this.isWanted=true;
637 this.filterCache.every(function(f){
638 me.isWanted=me.isWanted&&f;
639 return me.isWanted;
640 });
641
642 if(this.isWanted===true && oldWanted===false){
643 // wanted now
644 this.mappedDataCache.forEach(function(m){
645 if(m===null) return;
646 if(m.h){ // interval
647 if(m.b) m.b.aggregate_Active+=this.aggregate_Self;
648 } else { // categorical
649 m.forEach(function(attrib){
650 var oldVal = attrib.aggregate_Active;
651 attrib.aggregate_Active+=this.aggregate_Self;
652 if(oldVal===0 && attrib.facet){
653 if(attrib.facet!==recursive && !attrib.facet.isLinked){
654 // it is now selected, see other DOM items it has and increment their count too
655 attrib.mappedDataCache.forEach(function(m){
656 if(m===null) return;
657 if(m.h) { // interval
658 if(m.b) m.b.aggregate_Active+=attrib.aggregate_Self;
659 } else { // categorical
660 m.forEach(function(item){
661 item.aggregate_Active+=attrib.aggregate_Self;
662 });
663 }
664 });
665 }
666 }
667 },this);
668 }
669 },this);
670 } else if(this.isWanted===false && oldWanted===true){
671 // unwanted now
672 this.mappedDataCache.forEach(function(m){
673 if(m===null) return;
674 if(m.h){ // interval
675 if(m.b) m.b.aggregate_Active-=this.aggregate_Self;
676 } else { // categorical
677 m.forEach(function(attrib){
678 attrib.aggregate_Active-=this.aggregate_Self;
679 if(attrib.aggregate_Active===0 && attrib.facet){
680 if(attrib.facet!==recursive && !attrib.facet.isLinked){
681 // it is now not selected. see other DOM items it has and decrement their count too
682 attrib.mappedDataCache.forEach(function(m){
683 if(m===null) return;
684 if(m.h) { // interval
685 if(m.b) m.b.aggregate_Active-=attrib.aggregate_Self;
686 } else { // categorical
687 m.forEach(function(item){
688 item.aggregate_Active-=attrib.aggregate_Self;
689 });
690 }
691 });
692 }
693 }
694 },this);
695 }
696 },this);
697 }
698
699 this._filterCacheIsDirty = false;
700 return this.isWanted !== oldWanted;
701 },
702 /** Only updates wanted state if it is currently not wanted (resulting in More wanted items) */
703 updateWanted_More: function(recursive){
704 if(this.isWanted) return false;
705 return this.updateWanted(recursive);
706 },
707 /** Only updates wanted state if it is currently wanted (resulting in Less wanted items) */
708 updateWanted_Less: function(recursive){
709 if(!this.isWanted) return false;
710 return this.updateWanted(recursive);
711 },
712 updatePreview: function(parentFacet){
713 if(!this.isWanted) return;
714
715 if(this.updatePreview_Cache===false){
716 this.updatePreview_Cache = true;
717 } else {
718 return;
719 }
720
721 if(this.DOM.record) this.DOM.record.setAttribute("highlight",true);
722
723 // This is where you pass highlight information to through parent facet (which is primary entity)
724 // if this item appears in a facet, it means it's used as a filter itself, propogate above
725 if(this.facet && this.facet===parentFacet){
726 // If this is the main item type, don't!
727 // If this has no active item count, don't!
728 if(!this.facet.isLinked && this.aggregate_Active>0){
729 // see the main items stored under this one...
730 this.items.forEach(function(item){ item.updatePreview(this.facet); },this);
731 }
732 }
733
734 if(parentFacet && this.facet && this.aggregate_Preview===0) return;
735 this.mappedDataCache.forEach(function(m){
736 if(m===null) return;
737 if(m.h) {
738 if(m.b && m.b.aggregate_Active>0) m.b.aggregate_Preview+=this.aggregate_Self;
739 } else {
740 // if you are a sub-filter, go over the l
741 m.forEach(function(item){
742 item.aggregate_Preview+=this.aggregate_Self;
743 if(item.aggregate_Preview===1 && item.facet){
744 if(!item.facet.isLinked && item.facet!==parentFacet){
745 // TODO: Don't go under the current one, if any
746 item.updatePreview(parentFacet);
747 }
748 }
749 },this);
750 }
751 },this);
752 },
753 /**
754 * Called on mouse-over on a primary item type, then recursively on all summaries and their sub-summaries
755 * Higlights all relevant UI parts to this UI item
756 */
757 highlightAll: function(recurse){
758 if(this.DOM.record) this.DOM.record.setAttribute("highlight",recurse?"selected":true);
759 if(this.DOM.facet) this.DOM.facet.setAttribute("highlight",recurse?"selected":true);
760 if(this.cliqueRow) this.cliqueRow.setAttribute("highlight","selected");
761
762 if(this.DOM.record && !recurse) return;
763 this.mappedDataCache.forEach(function(d){
764 if(d===null) return; // no mapping for this index
765 if(d.h){ // interval facet
766 d.h.setSelectedPosition(d.v);
767 } else { // categorical facet
768 d.forEach(function(item){
769 // skip going through main items that contain a link TO this item
770 if(this.DOM.record && item.DOM.record)
771 return;
772 item.highlightAll(false);
773 },this);
774 }
775 },this);
776 },
777 /** Removes higlight from all relevant UI parts to this UI item */
778 nohighlightAll: function(recurse){
779 if(this.DOM.record) this.DOM.record.setAttribute("highlight",false);
780 if(this.DOM.facet) this.DOM.facet .setAttribute("highlight",false);
781 if(this.cliqueRow) this.cliqueRow.setAttribute("highlight",false);
782
783 if(this.DOM.record && !recurse) return;
784 this.mappedDataCache.forEach(function(d,i){
785 if(d===null) return; // no mapping for this index
786 if(d.h){ // interval facet
787 d.h.hideSelectedPosition(d.v);
788 } else { // categorical facet
789 d.forEach(function(item){
790 // skip going through main items that contain a link TO this item
791 if(this.DOM.record && item.DOM.record) return;
792 item.nohighlightAll(false);
793 },this);
794 }
795 },this);
796 },
797 setSelectedForLink: function(v){
798 this.selectedForLink = v;
799 if(this.DOM.record){
800 this.DOM.record.setAttribute("selectedForLink",v);
801 }
802 if(v===false){
803 this.set_NONE();
804 }
805 }
806 };
807
808 kshf.Filter = function(id, opts){
809 this.isFiltered = false;
810
811 this.browser = opts.browser;
812 this.parentSummary = opts.parentSummary;
813
814 this.onClear = opts.onClear;
815 this.onFilter = opts.onFilter;
816 this.hideCrumb = opts.hideCrumb || false;
817 this.filterView_Detail = opts.filterView_Detail; // must be a function
818 this.filterHeader = opts.filterHeader;
819
820 this.id = id;
821 this.parentSummary.items.forEach(function(item){
822 item.setFilterCache(this.id,true);
823 },this);
824 this.how = "All";
825 this.filterSummaryBlock = null;
826 };
827 kshf.Filter.prototype = {
828 addFilter: function(forceUpdate,recursive){
829 var parentFacet=this.parentSummary.parentFacet;
830 this.isFiltered = true;
831
832 if(this.onFilter) this.onFilter.call(this,this.parentSummary);
833
834 var stateChanged = false;
835 if(recursive===undefined) recursive=true;
836
837 var how=0;
838 if(this.how==="LessResults") how = -1;
839 if(this.how==="MoreResults") how = 1;
840
841 this.parentSummary.items.forEach(function(item){
842 // if you will show LESS results and item is not wanted, skip
843 // if you will show MORE results and item is wanted, skip
844 if(!(how<0 && !item.isWanted) && !(how>0 && item.isWanted)){
845 var changed = item.updateWanted(recursive);
846 stateChanged = stateChanged || changed;
847 }
848 if(parentFacet && parentFacet.hasCategories()){
849 if(item.isWanted)
850 item.set_OR(parentFacet.summaryFilter.selected_OR);
851 else
852 item.set_NONE();
853 }
854 },this);
855
856 // if this has a parent facet (multi-level), link selection from this to the parent facet
857 if(parentFacet && parentFacet.hasCategories()){
858 parentFacet.updateCatCount_Wanted();
859 parentFacet.summaryFilter.how = "All";
860 // re-run the parents attribute filter...
861 parentFacet.summaryFilter.linkFilterSummary = "";
862 parentFacet.summaryFilter.addFilter(false,parentFacet); // This filter will update the browser later if forceUpdate===true
863 parentFacet._update_Selected();
864 }
865
866 this._refreshFilterSummary();
867
868 if(forceUpdate===true){
869 this.browser.update_itemsWantedCount();
870 this.browser.refresh_filterClearAll();
871 if(stateChanged) this.browser.updateAfterFilter(-1);
872 if(sendLog) sendLog(kshf.LOG.FILTER_ADD,this.browser.getFilterState());
873 }
874 },
875 clearFilter: function(forceUpdate,recursive, updateWanted){
876 if(!this.isFiltered) return;
877 var parentFacet=this.parentSummary.parentFacet;
878 var hasEntityParent = false;
879 if(this.parentSummary.hasEntityParent)
880 hasEntityParent = this.parentSummary.hasEntityParent();
881
882 this.isFiltered = false;
883
884 // clear filter cache - no other logic is necessary
885 this.parentSummary.items.forEach(function(item){ item.setFilterCache(this.id,true); },this);
886
887 if(recursive===undefined) recursive=true;
888
889 if(updateWanted!==false){
890 this.parentSummary.items.forEach(function(item){
891 if(!item.isWanted){
892 item.updateWanted(recursive);
893 }
894 if(parentFacet && parentFacet.hasCategories()){
895 if(item.isWanted)
896 item.set_OR(parentFacet.summaryFilter.selected_OR);
897 else
898 item.set_NONE();
899 }
900 });
901 }
902
903 this._refreshFilterSummary();
904
905 if(this.onClear) this.onClear.call(this,this.parentSummary);
906
907 if(forceUpdate!==false){
908 if(hasEntityParent){
909 parentFacet.updateCatCount_Wanted();
910 parentFacet.summaryFilter.how = "All";
911 if(parentFacet.catCount_Wanted===parentFacet.catCount_Total){
912 parentFacet.summaryFilter.clearFilter(false,parentFacet); // force update
913 } else {
914 // re-run the parents attribute filter...
915 parentFacet.summaryFilter.linkFilterSummary = "";
916 parentFacet.summaryFilter.addFilter(false,parentFacet); // force update
917 }
918 }
919
920 if(this.parentSummary.subFacets){
921 this.parentSummary.subFacets.forEach(function(summary){
922 summary.summaryFilter.clearFilter(false,false,false);
923 });
924 // if this has sub-facets, it means this also maintains an isWanted state.
925 // Sub facets are cleared, but the attribs isWanted state is NOT updated
926 // Fix that, now.
927 if(this.parentSummary.subFacets.length>0){
928 this.parentSummary._cats.forEach(function(item){
929 item.isWanted = true;
930 item._filterCacheIsDirty = false;
931 });
932 }
933 }
934
935 this.browser.update_itemsWantedCount();
936 this.browser.refresh_filterClearAll();
937 this.browser.updateAfterFilter(1); // more results
938
939 if(sendLog) {
940 sendLog(kshf.LOG.FILTER_CLEAR,this.browser.getFilterState());
941 }
942 }
943 },
944
945 /** Don't call this directly */
946 _refreshFilterSummary: function(){
947 if(this.hideCrumb===true) return;
948 if(!this.isFiltered){
949 var root = this.filterSummaryBlock;
950 if(root===null || root===undefined) return;
951 root.attr("ready",false);
952 setTimeout(function(){ root[0][0].parentNode.removeChild(root[0][0]); }, 350);
953 this.filterSummaryBlock = null;
954 } else {
955 // insert DOM
956 if(this.filterSummaryBlock===null) {
957 this.filterSummaryBlock = this.insertFilterSummaryBlock();
958 if(this.filterSummaryBlock===false){
959 this.filterSummaryBlock=null;
960 return;
961 }
962 }
963 if(this.parentSummary!==undefined) this.filterHeader = this.parentSummary.summaryTitle;
964 this.filterSummaryBlock.select(".filterHeader").html(this.filterHeader);
965 this.filterSummaryBlock.select(".filterDetails").html(this.filterView_Detail.call(this, this.parentSummary));
966 }
967 },
968 /** Inserts a summary block to the list breadcrumb DOM */
969 /** Don't call this directly */
970 insertFilterSummaryBlock: function(){
971 var x;
972 var me=this;
973 if(this.browser.DOM.filtercrumbs===undefined) return false;
974 x = this.browser.DOM.filtercrumbs
975 .append("span").attr("class","filter-block")
976 .each(function(d){
977 this.tipsy = new Tipsy(this, {
978 gravity: 'n',
979 title: function(){ return kshf.lang.cur.RemoveFilter; }
980 })
981 })
982 .on("mouseenter",function(){
983 this.tipsy.show();
984 d3.event.stopPropagation();
985 })
986 .on("mouseleave",function(){
987 this.tipsy.hide();
988 d3.event.stopPropagation();
989 })
990 .on("click",function(){
991 this.tipsy.hide();
992 me.clearFilter();
993 // delay layout height update
994 setTimeout( function(){ me.browser.updateLayout_Height();}, 1000);
995 if(sendLog) sendLog(kshf.LOG.FILTER_CLEAR_CRUMB, {id: this.id});
996 })
997 ;
998 x.append("span").attr("class","chartClearFilterButton summary")
999 .append("span").attr("class","fa fa-times")
1000 ;
1001 var y = x.append("span").attr("class","sdsdsds");
1002 y.append("span").attr("class","filterHeader");
1003 y.append("span").attr("class","filterDetails");
1004 // animate appear
1005 window.getComputedStyle(x[0][0]).opacity;
1006 x.attr("ready",true);
1007 return x;
1008 }
1009 };
1010
1011 /**
1012 * The list UI
1013 * @constructor
1014 */
1015 kshf.RecordDisplay = function(kshf_, config, root){
1016 var me = this;
1017 this.browser = kshf_;
1018 this.DOM = {};
1019
1020 this.config = config;
1021
1022 this.scrollTop_cache=0;
1023
1024 this.linkColumnWidth = 85;
1025 this.linkColumnWidth_ItemCount = 25;
1026 this.linkColumnWidth_BarMax = this.linkColumnWidth-this.linkColumnWidth_ItemCount-3;
1027 this.selectColumnWidth = 17;
1028
1029 this.items = this.browser.items;
1030
1031 this.autoExpandMore = true;
1032 if(config.autoExpandMore===false) this.autoExpandMore = false;
1033
1034 this.maxVisibleItems_Default = config.maxVisibleItems_Default || kshf.maxVisibleItems_Default;
1035 this.maxVisibleItems = this.maxVisibleItems_Default; // This is the dynamic property
1036
1037 this.sortingOpts = config.sortingOpts || [ {title:this.browser.items[0].idIndex} ];
1038 if(!Array.isArray(this.sortingOpts)){
1039 this.sortingOpts = [this.sortingOpts];
1040 }
1041 this.prepSortingOpts();
1042 this.sortingOpt_Active = this.sortingOpts[0];
1043
1044 this.displayType = config.displayType || 'list'; // 'grid', 'list'
1045 this.detailsToggle = config.detailsToggle || 'zoom'; // 'one', 'zoom', 'off' (any other string counts as off practically)
1046 this.linkText = config.linkText || "Related To";
1047
1048 this.visibleCb = config.visibleCb;
1049 this.detailCb = config.detailCb;
1050
1051 this.showRank = config.showRank || false;
1052
1053 this.textSearchSummary = null; // no text search summary by default
1054 this.recordViewSummary = null;
1055
1056 this.DOM.root = root.select(".recordDisplay")
1057 .attr('detailsToggle',this.detailsToggle)
1058 .attr('displayType',this.displayType)
1059 .attr('showRank',this.showRank)
1060 .attr('hasRecordView',false);
1061
1062 var zone=this.DOM.root.append("div").attr("class","dropZone dropZone_recordView")
1063 .on("mouseenter",function(){ this.setAttribute("readyToDrop",true); })
1064 .on("mouseleave",function(){ this.setAttribute("readyToDrop",false); })
1065 .on("mouseup",function(event){
1066 var movedSummary = me.browser.movedSummary;
1067 if(movedSummary===null || movedSummary===undefined) return;
1068
1069 movedSummary.refreshNuggetDisplay();
1070
1071 me.setRecordViewSummary(movedSummary);
1072
1073 me.updateVisibleIndex();
1074 me.updateItemVisibility(false,true);
1075
1076 if(me.textSearchSummary===null) me.setTextSearchSummary(movedSummary);
1077
1078 me.browser.updateLayout();
1079 });
1080 zone.append("div").attr("class","dropIcon fa fa-list-ul");
1081
1082 this.DOM.recordViewHeader=this.DOM.root.append("div").attr("class","recordDisplay--Header");
1083 this.initDOM_RecordViewHeader();
1084
1085 this.DOM.listItemGroup = this.DOM.root.append("div").attr("class","listItemGroup")
1086 .on("scroll",function(d){
1087 if(this.scrollHeight-this.scrollTop-this.offsetHeight<10){
1088 if(me.autoExpandMore===false){
1089 me.DOM.showMore.attr("showMoreVisible",true);
1090 } else {
1091 me.showMore(); // automatically add more records
1092 }
1093 } else{
1094 me.DOM.showMore.attr("showMoreVisible",false);
1095 }
1096 me.DOM.scrollToTop.style("visibility", this.scrollTop>0?"visible":"hidden");
1097 me.DOM.adjustSortColumnWidth.style("top",(this.scrollTop-2)+"px")
1098 });
1099
1100 this.DOM.adjustSortColumnWidth = this.DOM.listItemGroup.append("div")
1101 .attr("class","adjustSortColumnWidth dragWidthHandle")
1102 .on("mousedown", function (d, i) {
1103 if(d3.event.which !== 1) return; // only respond to left-click
1104 root.style('cursor','ew-resize');
1105 var _this = this;
1106 var mouseDown_x = d3.mouse(document.body)[0];
1107 var mouseDown_width = me.sortColWidth;
1108
1109 me.browser.DOM.pointerBlock.attr("active","");
1110
1111 root.on("mousemove", function() {
1112 _this.setAttribute("dragging","");
1113 me.setSortColumnWidth(mouseDown_width+(d3.mouse(document.body)[0]-mouseDown_x));
1114 }).on("mouseup", function(){
1115 root.style('cursor','default');
1116 me.browser.DOM.pointerBlock.attr("active",null);
1117 root.on("mousemove", null).on("mouseup", null);
1118 _this.removeAttribute("dragging");
1119 });
1120 d3.event.preventDefault();
1121 });
1122
1123 this.DOM.showMore = this.DOM.root.append("div").attr("class","showMore")
1124 .attr("showMoreVisible",false)
1125 .on("mouseenter",function(){ d3.select(this).selectAll(".loading_dots").attr("anim",true); })
1126 .on("mouseleave",function(){ d3.select(this).selectAll(".loading_dots").attr("anim",null); })
1127 .on("click",function(){ me.showMore(); })
1128 ;
1129 this.DOM.showMore.append("span").attr("class","MoreText").html("Show More");
1130 this.DOM.showMore.append("span").attr("class","Count CountAbove");
1131 this.DOM.showMore.append("span").attr("class","Count CountBelow");
1132 this.DOM.showMore.append("span").attr("class","loading_dots loading_dots_1");
1133 this.DOM.showMore.append("span").attr("class","loading_dots loading_dots_2");
1134 this.DOM.showMore.append("span").attr("class","loading_dots loading_dots_3");
1135
1136 if(config.recordView!==undefined){
1137 if(typeof config.recordView === 'string'){
1138 this.setRecordViewSummary(this.browser.summaries_by_name[config.recordView]);
1139 }
1140 if(typeof config.recordView === 'function'){
1141 this.setRecordViewSummary(this.browser.createSummary('_RecordView_',config.recordView,'categorical'));
1142 }
1143 }
1144
1145 if(config.textSearch){
1146 // Find the summary. If it is not there, create it
1147 if(typeof(config.textSearch)==="string"){
1148 this.setTextSearchSummary( this.browser.summaries_by_name[config.textSearch] );
1149 } else {
1150 var title = config.textSearch.title;
1151 var value = config.textSearch.value;
1152 if(title!==undefined){
1153 var summary = this.browser.summaries_by_name[config.textSearch];
1154 if(summary){
1155 this.setTextSearchSummary(summary);
1156 } else {
1157 if(typeof(value)==="function"){
1158 this.setTextSearchSummary(browser.createSummary(title,value,'categorical'));
1159 } else if(typeof(value)==="string"){
1160 this.setTextSearchSummary(browser.changeSummaryName(value,title));
1161 };
1162 }
1163 }
1164 }
1165 }
1166 };
1167
1168 kshf.RecordDisplay.prototype = {
1169 /** -- */
1170 setDetailsToggle: function(v){
1171 this.detailsToggle = v;
1172 this.DOM.root.attr('detailsToggle',this.detailsToggle)
1173 },
1174 /** -- */
1175 initDOM_RecordViewHeader: function(){
1176 var me=this;
1177 this.DOM.recordViewHeader.append("div").attr("class","itemRank_control fa")
1178 .each(function(){
1179 this.tipsy = new Tipsy(this, {gravity: 'n', title: function(){
1180 return (me.showRank?"Hide":"Show")+" ranking";
1181 }});
1182 })
1183 .on("mouseover",function(){ this.tipsy.show(); })
1184 .on("mouseout" ,function(){ this.tipsy.hide(); })
1185 .on("click",function(){
1186 me.setShowRank(!me.showRank);
1187 d3.event.preventDefault();
1188 d3.event.stopPropagation();
1189 });
1190
1191 this.initDOM_SortSelect();
1192 this.initDOM_GlobalTextSearch();
1193
1194 this.DOM.recordViewHeader.append("div").attr("class","buttonRecordViewRemove fa fa-times")
1195 .each(function(){
1196 this.tipsy = new Tipsy(this, {gravity: 'ne', title: function(){ return kshf.lang.cur.RemoveRecords; }});
1197 })
1198 .on("mouseover",function(){ this.tipsy.show(); })
1199 .on("mouseout", function(){ this.tipsy.hide(); })
1200 .on("click",function(){
1201 me.removeRecordViewSummary();
1202 });
1203
1204 this.DOM.scrollToTop = this.DOM.recordViewHeader.append("div").attr("class","scrollToTop fa fa-arrow-up")
1205 .each(function(){
1206 this.tipsy = new Tipsy(this, {gravity: 'e', title: function(){ return kshf.lang.cur.ScrollToTop; }});
1207 })
1208 .on("mouseover",function(){ this.tipsy.show(); })
1209 .on("mouseout", function(){ this.tipsy.hide(); })
1210 .on("click",function(d){
1211 kshf.Util.scrollToPos_do(me.DOM.listItemGroup[0][0],0);
1212 if(sendLog) sendLog(kshf.LOG.LIST_SCROLL_TOP);
1213 });
1214 },
1215 /* -- */
1216 initDOM_GlobalTextSearch: function(){
1217 var me=this;
1218
1219 this.textFilter = this.browser.createFilter({
1220 parentSummary: this.browser,
1221 hideCrumb: true,
1222 onClear: function(){
1223 me.DOM.recordTextSearch.select(".clearText").style('display','none');
1224 me.DOM.recordTextSearch.select("input")[0][0].value = "";
1225 },
1226 onFilter: function(){
1227 me.DOM.recordTextSearch.select(".clearText").style('display','inline-block');
1228
1229 var query = [];
1230
1231 // split the input by " character
1232 var processed = this.filterStr.split('"');
1233 processed.forEach(function(block,i){
1234 if(i%2===0) {
1235 block.split(/\s+/).forEach(function(q){ query.push(q)});
1236 } else {
1237 query.push(block);
1238 }
1239 });
1240
1241 // Remove the empty strings
1242 query = query.filter(function(v){ return v!==""});
1243
1244 // go over all the items in the list, search each keyword separately
1245 // If some search matches, return true (any function)
1246 var summaryFunc = me.textSearchSummary.summaryFunc;
1247 me.items.forEach(function(item){
1248 var f = ! query.every(function(v_i){
1249 var v = summaryFunc.call(item.data,item);
1250 if(v===null || v===undefined) return true;
1251 return (""+v).toLowerCase().indexOf(v_i)===-1;
1252 });
1253 item.setFilterCache(this.id,f);
1254 },this);
1255 },
1256 });
1257
1258 this.DOM.recordTextSearch = this.DOM.recordViewHeader.append("span").attr("class","recordTextSearch");
1259
1260 var x= this.DOM.recordTextSearch.append("div").attr("class","dropZone_textSearch")
1261 .on("mouseenter",function(){
1262 this.style.backgroundColor = "rgb(255, 188, 163)";
1263 })
1264 .on("mouseleave",function(){
1265 this.style.backgroundColor = "";
1266 })
1267 .on("mouseup",function(){
1268 me.setTextSearchSummary(me.movedSummary);
1269 });
1270 x.append("div").attr("class","dropZone_textSearch_text").text("Text search");
1271
1272 this.DOM.recordTextSearch.append("i").attr("class","fa fa-search searchIcon");
1273 this.DOM.recordTextSearch.append("input").attr("class","mainTextSearch_input")
1274 .on("keydown",function(){
1275 var x = this;
1276 if(this.timer){
1277 clearTimeout(this.timer);
1278 this.timer = null;
1279 }
1280 this.timer = setTimeout( function(){
1281 me.textFilter.filterStr = x.value.toLowerCase();
1282 if(me.textFilter.filterStr!=="") {
1283 me.textFilter.addFilter(true);
1284 } else {
1285 me.textFilter.clearFilter();
1286 }
1287 if(sendLog) sendLog(kshf.LOG.FILTER_TEXTSEARCH, {id: me.textFilter.id, info: me.textFilter.filterStr});
1288 x.timer = null;
1289 }, 750);
1290 });
1291 this.DOM.recordTextSearch.append("i").attr("class","fa fa-times-circle clearText")
1292 .on("click",function() { me.textFilter.clearFilter(); });
1293 },
1294 /** -- */
1295 setRecordViewSummary: function(summary){
1296 if(summary===undefined || summary===null) return;
1297 if(this.recordViewSummary===summary) return;
1298 if(this.recordViewSummary){
1299 this.removeRecordViewSummary();
1300 }
1301 this.DOM.root.attr('hasRecordView',true);
1302 this.recordViewSummary = summary;
1303 this.recordViewSummary.isRecordView = true;
1304 this.recordViewSummary.refreshNuggetDisplay();
1305
1306 this.sortRecords();
1307 this.insertRecords();
1308 this.setSortColumnWidth(this.config.sortColWidth || 50); // default: 50px;
1309 this.refreshRecordContent(this.DOM.recordsContent);
1310 },
1311 /** -- */
1312 removeRecordViewSummary: function(){
1313 if(this.recordViewSummary===null) return;
1314 this.DOM.root.attr("hasRecordView",false);
1315 this.recordViewSummary.isRecordView = false;
1316 this.recordViewSummary.refreshNuggetDisplay()
1317 this.recordViewSummary = null;
1318 },
1319 /** -- */
1320 setTextSearchSummary: function(summary){
1321 if(summary===undefined || summary===null) return;
1322 //if(this.textSearchSummary===summary) return;
1323 this.textSearchSummary = summary;
1324 this.textSearchSummary.isTextSearch = true;
1325 this.DOM.recordTextSearch
1326 .attr("isActive",true)
1327 .select("input").attr("placeholder", kshf.lang.cur.Search+": "+summary.summaryTitle);
1328 },
1329 /** -- */
1330 addSortingOption: function(summary){
1331 // If parameter summary is already a sorting option, nothing else to do
1332 if(this.sortingOpts.some(function(o){ return o===summary; })) return;
1333
1334 this.sortingOpts.push(summary);
1335
1336 summary.sortLabel = summary.summaryFunc;
1337 summary.sortInverse = false;
1338 summary.sortFunc = this.getSortFunc(summary.summaryFunc);
1339
1340 this.prepSortingOpts();
1341 this.refreshSortingOptions();
1342 if(sendLog) sendLog(kshf.LOG.LIST_SORT, {info: this.selectedIndex});
1343 },
1344 /** -- */
1345 initDOM_SortSelect: function(){
1346 var me=this;
1347
1348 this.DOM.header_listSortColumn = this.DOM.recordViewHeader.append("div")
1349 .attr("class","header_listSortColumn");
1350 var x=this.DOM.header_listSortColumn.append("div").attr("class","dropZone_resultSort")
1351 .on("mouseenter",function(){
1352 this.style.backgroundColor = "rgb(255, 188, 163)";
1353 })
1354 .on("mouseleave",function(event){
1355 this.style.backgroundColor = "";
1356 })
1357 .on("mouseup",function(event){
1358 me.addSortingOption(me.browser.movedSummary);
1359 me.setSortingOpt_Active(me.sortingOpts.length-1);
1360 me.DOM.listSortOptionSelect[0][0].selectedIndex = me.sortingOpts.length-1;
1361 })
1362 ;
1363 x.append("span").attr("class","dropZone_resultSort_text");
1364
1365 this.DOM.listSortOptionSelect = this.DOM.header_listSortColumn.append("select")
1366 .attr("class","listSortOptionSelect")
1367 .on("change", function(){
1368 me.setSortingOpt_Active(this.selectedIndex);
1369 if(sendLog) sendLog(kshf.LOG.LIST_SORT, {info: this.selectedIndex});
1370 })
1371 ;
1372
1373 this.refreshSortingOptions();
1374
1375 this.DOM.removeSortOption = this.DOM.recordViewHeader
1376 .append("span").attr("class","removeSortOption_wrapper")
1377 .append("span").attr("class","removeSortOption fa")
1378 .each(function(){
1379 this.tipsy = new Tipsy(this, {gravity: 'n', title: function(){ return "Remove current sorting option"; }});
1380 })
1381 .style("display",(this.sortingOpts.length<2)?"none":"inline-block")
1382 .on("mouseover",function(){ this.tipsy.show(); })
1383 .on("mouseout",function(d,i){ this.tipsy.hide(); })
1384 .on("click",function(){
1385 var index=-1;
1386 me.sortingOpts.forEach(function(o,i){ if(o===me.sortingOpt_Active) index=i; })
1387 if(index!==-1){
1388 me.sortingOpts.splice(index,1);
1389 if(index===me.sortingOpts.length) index--;
1390 me.prepSortingOpts();
1391 me.setSortingOpt_Active(index);
1392 me.refreshSortingOptions();
1393 me.DOM.listSortOptionSelect[0][0].selectedIndex = index;
1394 }
1395 })
1396
1397 this.DOM.recordViewHeader.append("span").attr("class","sortColumn sortButton fa")
1398 .on("click",function(d){
1399 me.sortingOpt_Active.inverse = me.sortingOpt_Active.inverse?false:true;
1400 this.setAttribute("inverse",me.sortingOpt_Active.inverse);
1401 me.browser.items.reverse();
1402 me.DOM.listItems = me.DOM.listItemGroup.selectAll(".listItem")
1403 .data(me.browser.items, function(d){ return d.id(); })
1404 .order();
1405 me.updateVisibleIndex();
1406 me.updateItemVisibility(false,true);
1407 kshf.Util.scrollToPos_do(me.DOM.listItemGroup[0][0],0);
1408 if(sendLog) sendLog(kshf.LOG.LIST_SORT_INV);
1409 })
1410 .each(function(){
1411 this.tipsy = new Tipsy(this, {
1412 gravity: 'w', title: function(){ return kshf.lang.cur.ReverseOrder; }
1413 })
1414 })
1415 .on("mouseover",function(){ this.tipsy.show(); })
1416 .on("mouseout",function(){ this.tipsy.hide(); });
1417 },
1418 /** -- */
1419 refreshRecordContent: function(d3_selection){
1420 var me=this;
1421 d3_selection.html(function(d){ return me.recordViewSummary.summaryFunc.call(d.data,d); });
1422 },
1423 /** -- */
1424 refreshRecordRanks: function(d3_selection){
1425 if(!this.showRank) return; // Do not refresh if not shown...
1426 d3_selection.text(function(d){
1427 if(d.visibleOrder<0) return "";
1428 return d.visibleOrder+1;
1429 });
1430 },
1431 /** -- */
1432 refreshRecordSortLabels: function(d3_selection){
1433 if(this.displayType!=="list") return;
1434 var labelFunc=this.sortingOpt_Active.sortLabel;
1435 var unitName =this.sortingOpt_Active.unitName;
1436 var sortColformat = d3.format(".s");
1437 if(this.sortingOpt_Active.hasTime){
1438 sortColformat = d3.time.format("%Y");
1439 }
1440
1441 d3_selection.html(function(d){
1442 var s=labelFunc.call(d.data);
1443 if(s===null || s===undefined) return "";
1444 this.setAttribute("title",s);
1445 if(typeof s!=="string") s = sortColformat(s);
1446 if(unitName) s+="<span class='unitName'>"+unitName+"</span>";
1447 return s;
1448 });
1449 },
1450 /** -- */
1451 refreshSortingOptions: function(){
1452 this.DOM.listSortOptionSelect.selectAll("option").remove();
1453 this.DOM.listSortOptionSelect.selectAll("option").data(this.sortingOpts)
1454 .enter().append("option").html(function(summary){ return summary.summaryTitle; });
1455 this.DOM.listSortOptionSelect[0][0].value = this.sortingOpt_Active.summaryTitle;
1456 },
1457 /** -- */
1458 prepSortingOpts: function(){
1459 this.sortingOpts.forEach(function(sortOpt,i){
1460 if(sortOpt.summaryTitle) return; // It already points to a summary
1461 if(typeof(sortOpt)==="string"){
1462 sortOpt = { title: sortOpt };
1463 }
1464
1465 var summary = this.browser.summaries_by_name[sortOpt.title];
1466 if(summary===undefined){
1467 if(typeof(sortOpt.value)==="string"){
1468 summary = this.browser.changeSummaryName(sortOpt.value,sortOpt.title);
1469 } else{
1470 summary = this.browser.createSummary(sortOpt.title,sortOpt.value, "interval");
1471 if(sortOpt.unitName){
1472 summary.setUnitName(sortOpt.unitName);
1473 }
1474 }
1475 }
1476
1477 summary.sortLabel = sortOpt.label || summary.summaryFunc;
1478 summary.sortInverse = sortOpt.inverse || false;
1479 summary.sortFunc = sortOpt.sortFunc || this.getSortFunc(summary.summaryFunc);
1480
1481 this.sortingOpts[i] = summary;
1482 },this);
1483 if(this.DOM.removeSortOption)
1484 this.DOM.removeSortOption.style("display",(this.sortingOpts.length<2)?"none":"inline-block");
1485 },
1486 /** -- */
1487 setSortingOpt_Active: function(index){
1488 if(index<0 || index>=this.sortingOpts.length) return;
1489 this.sortingOpt_Active = this.sortingOpts[index];
1490
1491 this.sortRecords();
1492 this.DOM.listItems = this.DOM.listItemGroup.selectAll(".listItem")
1493 .data(this.browser.items, function(d){ return d.id(); })
1494 .order();
1495
1496 this.updateVisibleIndex();
1497 this.updateItemVisibility();
1498 this.refreshRecordSortLabels(this.DOM.recordsSortCol);
1499 kshf.Util.scrollToPos_do(this.DOM.listItemGroup[0][0],0);
1500 },
1501 /** -- */
1502 setSortColumnWidth: function(v){
1503 if(this.displayType!=='list') return;
1504 this.sortColWidth = Math.max(Math.min(v,110),30);
1505 this.DOM.recordsSortCol.style("width",this.sortColWidth+"px")
1506 this.refreshAdjustSortColumnWidth();
1507 },
1508 /** -- */
1509 refreshAdjustSortColumnWidth: function(){
1510 this.DOM.adjustSortColumnWidth.style("left",
1511 (this.sortColWidth-2)+(this.showRank?15:0)+"px")
1512 },
1513 /** -- */
1514 setShowRank: function(v){
1515 this.showRank=v;
1516 this.DOM.root.attr('showRank',this.showRank);
1517 this.refreshRecordRanks(this.DOM.recordRanks);
1518 this.refreshAdjustSortColumnWidth();
1519 },
1520 /** Insert items into the UI, called once on load */
1521 insertRecords: function(){
1522 var me = this, x;
1523
1524 var newRecords = this.DOM.listItemGroup.selectAll(".listItem")
1525 .data(this.browser.items, function(d){ return d.id(); })
1526 .enter()
1527 .append("div")
1528 .attr("class","listItem")
1529 .attr("details","false")
1530 .attr("highlight",false)
1531 .attr("animSt","visible")
1532 .attr("itemID",function(d){ return d.id(); }) // can be used to apply custom CSS
1533 // store the link to DOM in the data item
1534 .each(function(d){ d.DOM.record = this; })
1535 .on("mouseenter",function(d){
1536 d.highlightAll(true);
1537 d.items.forEach(function(item){ item.highlightAll(false); });
1538 })
1539 .on("mouseleave",function(d){
1540 this.setAttribute("highlight","false");
1541 d.nohighlightAll(true);
1542 d.items.forEach(function(item){ item.nohighlightAll(false); });
1543 });
1544
1545 x = newRecords.append("span").attr("class","recordRank")
1546 .each(function(d){
1547 this.tipsy = new Tipsy(this, {
1548 gravity: 'e',
1549 title: function(){ return kshf.Util.ordinal_suffix_of((d.visibleOrder+1)); }
1550 });
1551 })
1552 .on("mouseenter",function(){ this.tipsy.show(); })
1553 .on("mouseout" ,function(){ this.tipsy.hide(); });
1554 this.refreshRecordRanks(x);
1555
1556 if(this.displayType==='list'){
1557 x = newRecords.append("div").attr("class","recordSortCol");
1558 this.refreshRecordSortLabels(x);
1559 }
1560
1561 newRecords.append("div").attr("class","recordToggleDetail")
1562 .each(function(d){
1563 this.tipsy = new Tipsy(this, {
1564 gravity:'s',
1565 title: function(){
1566 if(me.detailsToggle==="one" && this.displayType==='list')
1567 return d.showDetails===true?"Show less":"Show more";
1568 return kshf.lang.cur.GetMoreInfo;
1569 }
1570 });
1571 })
1572 .on("mouseover",function(){ this.tipsy.show(); })
1573 .on("mouseout" ,function(){ this.tipsy.hide(); })
1574 .append("span").attr("class","item_details_toggle fa")
1575 .on("click", function(d){
1576 this.parentNode.tipsy.hide();
1577 if(me.detailsToggle==="one" && me.displayType==='list'){
1578 me.setRecordDetails(d,!d.showDetails);
1579 }
1580 if(me.detailsToggle==="zoom"){
1581 me.browser.updateItemZoomText(d);
1582 me.browser.panel_infobox.attr("show","itemZoom");
1583 }
1584 });
1585
1586 x = newRecords.append("div").attr("class","content");
1587
1588 this.DOM.listItems = this.DOM.listItemGroup.selectAll(".listItem");
1589 this.DOM.recordsSortCol = this.DOM.listItemGroup.selectAll(".recordSortCol");
1590 this.DOM.recordsContent = this.DOM.listItemGroup.selectAll(".content");
1591 this.DOM.recordRanks = this.DOM.listItemGroup.selectAll(".recordRank");
1592 },
1593 /** -- */
1594 setRecordDetails: function(item, value){
1595 item.showDetails = value;
1596 item.DOM.record.setAttribute('details', item.showDetails);
1597 if(item.showDetails){
1598 if(this.detailCb) this.detailCb.call(item.data, item);
1599 }
1600 if(sendLog) sendLog(kshf.LOG.ITEM_DETAIL_OFF, {info:item.id(), value:value});
1601 },
1602 /** -- */
1603 showMore: function(){
1604 this.maxVisibleItems *= 2;
1605 this.updateItemVisibility(true);
1606 this.DOM.showMore.attr("showMoreVisible",false);
1607 if(sendLog) sendLog(kshf.LOG.LIST_SHOWMORE,{info: this.maxVisibleItems});
1608 },
1609 /** Sort all records given the active sort option
1610 * Records are only sorted on init & when active sorting option changes.
1611 * They are not resorted on filtering. ** Filtering does not affect record sorting.
1612 */
1613 sortRecords: function(){
1614 var sortValueFunc = this.sortingOpt_Active.summaryFunc;
1615 var sortFunc = this.sortingOpt_Active.sortFunc;
1616 var inverse = this.sortingOpt_Active.sortInverse;
1617 this.browser.items.sort(
1618 function(a,b){
1619 // Put filtered/remove data to later position
1620 // !! Don't do above!! Then, when you filter set, you'd need to re-order
1621 // Now, you don't need to re-order after filtering, which is a nice property to have.
1622 var v_a = sortValueFunc.call(a.data,a);
1623 var v_b = sortValueFunc.call(b.data,b);
1624
1625 if(isNaN(v_a)) v_a = undefined;
1626 if(isNaN(v_b)) v_b = undefined;
1627 if(v_a===null) v_a = undefined;
1628 if(v_b===null) v_b = undefined;
1629
1630 if(v_a===undefined && v_b!==undefined) return 1;
1631 if(v_b===undefined && v_a!==undefined) return -1;
1632 if(v_b===undefined && v_a===undefined) return 0;
1633
1634 var dif=sortFunc(v_a,v_b);
1635 if(dif===0) dif=b.id()-a.id();
1636 if(inverse) return -dif;
1637 return dif; // use unique IDs to add sorting order as the last option
1638 }
1639 );
1640 },
1641 /** Returns the sort value type for given sort Value function */
1642 getSortFunc: function(sortValueFunc){
1643 // 0: string, 1: date, 2: others
1644 var sortValueFunction, same;
1645
1646 // find appropriate sortvalue type
1647 for(var k=0, same=0; true ; k++){
1648 if(same===3 || k===this.browser.items.length){
1649 break;
1650 }
1651 var item = this.browser.items[k];
1652 var f = sortValueFunc.call(item.data,item);
1653 var sortValueType_temp2;
1654 switch(typeof f){
1655 case 'string': sortValueType_temp2 = kshf.Util.sortFunc_List_String; break;
1656 case 'number': sortValueType_temp2 = kshf.Util.sortFunc_List_Number; break;
1657 case 'object':
1658 if(f instanceof Date)
1659 sortValueType_temp2 = kshf.Util.sortFunc_List_Date;
1660 else
1661 sortValueType_temp2 = kshf.Util.sortFunc_List_Number;
1662 break;
1663 default: sortValueType_temp2 = kshf.Util.sortFunc_List_Number; break;
1664 }
1665
1666 if(sortValueType_temp2===sortValueFunction){
1667 same++;
1668 } else {
1669 sortValueFunction = sortValueType_temp2;
1670 same=0;
1671 }
1672 }
1673 return sortValueFunction;
1674 },
1675 /** Updates visibility of list items */
1676 updateItemVisibility: function(showMoreOnly, noAnimation){
1677 var me = this;
1678 var visibleItemCount=0;
1679
1680 this.DOM.listItems.each(function(item){
1681 var domItem = this;
1682
1683 var isVisible = (item.visibleOrder>=0) && (item.visibleOrder<me.maxVisibleItems);
1684 var isVisible_pre = (item.visibleOrder_pre>=0) && (item.visibleOrder_pre<me.maxVisibleItems);
1685 if(isVisible) {
1686 visibleItemCount++;
1687 if(me.visibleCb) me.visibleCb.call(item.data,item);
1688 }
1689
1690 if(showMoreOnly){
1691 domItem.style.display = isVisible?'':'none';
1692 domItem.setAttribute("animSt","visible");
1693 return;
1694 }
1695
1696 if(noAnimation){
1697 if(isVisible && !isVisible_pre){
1698 domItem.style.display = '';
1699 domItem.setAttribute("animSt","visible");
1700 }
1701 if(!isVisible && isVisible_pre){
1702 domItem.setAttribute("animSt","closed");
1703 domItem.style.display = 'none';
1704 }
1705 return;
1706 }
1707
1708 // NOTE: Max 100 items can be under animation (visibility change), so don't worry about performance!
1709
1710 if(isVisible && !isVisible_pre){
1711 domItem.setAttribute("animSt","closed"); // start from closed state
1712 setTimeout(function(){
1713 domItem.style.display = '';
1714 domItem.setAttribute("animSt","open");
1715 },500);
1716 setTimeout(function(){
1717 domItem.setAttribute("animSt","visible");
1718 },1100+item.visibleOrder*20);
1719 }
1720 if(!isVisible && isVisible_pre){
1721 // not in view now, but in view before
1722 setTimeout(function(){
1723 domItem.setAttribute("animSt","open");
1724 },-item.visibleOrder*20);
1725 setTimeout(function(){
1726 domItem.setAttribute("animSt","closed");
1727 },500);
1728 setTimeout(function(){
1729 domItem.style.display = 'none';
1730 },1000);
1731 }
1732 if(!isVisible && !isVisible_pre){
1733 domItem.style.display = 'none';
1734 }
1735 });
1736
1737 var hiddenItemCount = this.browser.itemsWantedCount-visibleItemCount;
1738 this.DOM.showMore.select(".CountAbove").html("&#x25B2;"+visibleItemCount+" shown");
1739 this.DOM.showMore.select(".CountBelow").html(hiddenItemCount+" below&#x25BC;");
1740 },
1741 /** -- */
1742 updateAfterFilter: function(){
1743 if(this.recordViewSummary===null) return;
1744 var me=this;
1745 var startTime = null;
1746 var scrollDom = this.DOM.listItemGroup[0][0];
1747 var scrollInit = scrollDom.scrollTop;
1748 var easeFunc = d3.ease('cubic-in-out');
1749 var scrollTime = 1000;
1750 var animateToTop = function(timestamp){
1751 var progress;
1752 if(startTime===null) startTime = timestamp;
1753 // complete animation in 500 ms
1754 progress = (timestamp - startTime)/scrollTime;
1755 scrollDom.scrollTop = (1-easeFunc(progress))*scrollInit;
1756 if(scrollDom.scrollTop===0){
1757 me.updateVisibleIndex();
1758 me.updateItemVisibility(false);
1759 } else {
1760 window.requestAnimationFrame(animateToTop);
1761 }
1762 };
1763 window.requestAnimationFrame(animateToTop);
1764 },
1765 /** -- */
1766 updateVisibleIndex: function(){
1767 var wantedCount = 0;
1768 var unwantedCount = 1;
1769 this.browser.items.forEach(function(item){
1770 item.visibleOrder_pre = item.visibleOrder;
1771 if(item.isWanted){
1772 item.visibleOrder = wantedCount;
1773 wantedCount++;
1774 } else {
1775 item.visibleOrder = -unwantedCount;
1776 unwantedCount++;
1777 }
1778 });
1779 this.refreshRecordRanks(this.DOM.recordRanks);
1780 this.maxVisibleItems = this.maxVisibleItems_Default;
1781 }
1782 };
1783
1784
1785 kshf.Panel = function(options){
1786 this.browser = options.browser;
1787 this.name = options.name;
1788 this.width_catLabel = options.width_catLabel;
1789 this.width_catBars = 0; // placeholder
1790 this.width_catMeasureLabel = 1; // placeholder
1791 this.summaries = [];
1792
1793 this.DOM = {};
1794 this.DOM.root = options.parentDOM.append("div")
1795 .attr("hasSummaries",false)
1796 .attr("class", "panel panel_"+options.name+
1797 ((options.name==="left"||options.name==="right")?" panel_side":""))
1798 ;
1799 this.initDOM_AdjustWidth();
1800 this.initDOM_DropZone();
1801 };
1802
1803 kshf.Panel.prototype = {
1804 /** -- */
1805 getWidth_Total: function(){
1806 if(this.name==="bottom") return this.browser.getWidth_Total();
1807 return this.width_catLabel + this.width_catMeasureLabel + this.width_catBars + kshf.scrollWidth;
1808 },
1809 /** -- */
1810 addSummary: function(summary,index){
1811 var curIndex=-1;
1812 this.summaries.forEach(function(s,i){ if(s===summary) curIndex=i; });
1813 if(curIndex===-1){ // summary is new to this panel
1814 if(index===this.summaries.length)
1815 this.summaries.push(summary);
1816 else
1817 this.summaries.splice(index,0,summary);
1818 this.DOM.root.attr("hasSummaries",true);
1819 this.updateWidth_QueryPreview();
1820 this.refreshAdjustWidth();
1821 } else { // summary was in the panel. Change position
1822 this.summaries.splice(curIndex,1);
1823 this.summaries.splice(index,0,summary);
1824 }
1825 this.summaries.forEach(function(s,i){ s.panelOrder = i; });
1826 this.addDOM_DropZone(summary.DOM.root[0][0]);
1827 this.refreshAdjustWidth();
1828 },
1829 /** -- */
1830 removeSummary: function(summary){
1831 var indexFrom = -1;
1832 this.summaries.forEach(function(s,i){ if(s===summary) indexFrom = i; });
1833 if(indexFrom===-1) return; // given summary is not within this panel
1834
1835 var toRemove=this.DOM.root.selectAll(".dropZone_between_wrapper")[0][indexFrom];
1836 toRemove.parentNode.removeChild(toRemove);
1837
1838 this.summaries.splice(indexFrom,1);
1839 this.summaries.forEach(function(s,i){ s.panelOrder = i; });
1840 this.refreshDropZoneIndex();
1841
1842 if(this.summaries.length===0) {
1843 this.DOM.root//.attr("hasSummaries",false);
1844 .attr("hasSummaries",false);
1845 } else {
1846 this.updateWidth_QueryPreview();
1847 }
1848 summary.panel = undefined;
1849 this.refreshAdjustWidth();
1850 },
1851 /** -- */
1852 addDOM_DropZone: function(beforeDOM){
1853 var me=this;
1854 var zone;
1855 if(beforeDOM){
1856 zone = this.DOM.root.insert("div",function(){return beforeDOM;});
1857 } else {
1858 zone = this.DOM.root.append("div");
1859 }
1860 zone.attr("class","dropZone_between_wrapper")
1861 .on("mouseenter",function(){
1862 this.setAttribute("hovered",true);
1863 this.children[0].setAttribute("readyToDrop",true);
1864 })
1865 .on("mouseleave",function(){
1866 this.setAttribute("hovered",false);
1867 this.children[0].setAttribute("readyToDrop",false);
1868 })
1869 .on("mouseup",function(){
1870 var movedSummary = me.browser.movedSummary;
1871 if(movedSummary.panel){ // if the summary was in the panels already
1872 movedSummary.DOM.root[0][0].nextSibling.style.display = "";
1873 movedSummary.DOM.root[0][0].previousSibling.style.display = "";
1874 }
1875
1876 movedSummary.addToPanel(me,this.__data__);
1877
1878 if(movedSummary.type=="categorical"){
1879 movedSummary.refreshLabelWidth();
1880 movedSummary.updateBarPreviewScale2Active();
1881 }
1882 movedSummary.refreshWidth();
1883
1884 me.browser.updateLayout();
1885 })
1886 ;
1887
1888 var zone2 = zone.append("div").attr("class","dropZone dropZone_summary dropZone_between");
1889 zone2.append("div").attr("class","dropIcon fa fa-angle-double-down");
1890 zone2.append("div").attr("class","dropText").text("Drop summary");
1891
1892 this.refreshDropZoneIndex();
1893 },
1894 /** -- */
1895 initDOM_DropZone: function(dom){
1896 var me=this;
1897 this.DOM.dropZone_Panel = this.DOM.root.append("div").attr("class","dropZone dropZone_summary dropZone_panel")
1898 .attr("readyToDrop",false)
1899 .on("mouseenter",function(event){
1900 this.setAttribute("readyToDrop",true);
1901 this.style.width = me.getWidth_Total()+"px";
1902 })
1903 .on("mouseleave",function(event){
1904 this.setAttribute("readyToDrop",false);
1905 this.style.width = null;
1906 })
1907 .on("mouseup",function(event){
1908 // If this panel has summaries within, dropping makes no difference.
1909 if(me.summaries.length!==0) return;
1910 var movedSummary = me.browser.movedSummary;
1911 if(movedSummary===undefined) return;
1912 if(movedSummary.panel){ // if the summary was in the panels already
1913 movedSummary.DOM.root[0][0].nextSibling.style.display = "";
1914 movedSummary.DOM.root[0][0].previousSibling.style.display = "";
1915 }
1916 movedSummary.addToPanel(me);
1917 if(movedSummary.type=="categorical"){
1918 movedSummary.refreshLabelWidth();
1919 movedSummary.updateBarPreviewScale2Active();
1920 }
1921 movedSummary.refreshWidth();
1922 me.browser.updateLayout();
1923 })
1924 ;
1925 this.DOM.dropZone_Panel.append("span").attr("class","dropIcon fa fa-angle-double-down");
1926 this.DOM.dropZone_Panel.append("div").attr("class","dropText").text("Drop summary");
1927
1928 this.addDOM_DropZone();
1929 },
1930 /** -- */
1931 initDOM_AdjustWidth: function(){
1932 if(this.name==='middle' || this.name==='bottom') return; // cannot have adjust handles for now
1933 var me=this;
1934 var root = this.browser.DOM.root;
1935 this.DOM.panelAdjustWidth = this.DOM.root.append("span")
1936 .attr("class","panelAdjustWidth")
1937 .on("mousedown", function (d, i) {
1938 if(d3.event.which !== 1) return; // only respond to left-click
1939 var adjustDOM = this;
1940 adjustDOM.setAttribute("dragging","");
1941 root.style('cursor','ew-resize');
1942 me.browser.DOM.pointerBlock.attr("active","");
1943 me.browser.setNoAnim(true);
1944 var mouseDown_x = d3.mouse(document.body)[0];
1945 var mouseDown_width = me.width_catBars;
1946 d3.select("body").on("mousemove", function() {
1947 var mouseMove_x = d3.mouse(document.body)[0];
1948 var mouseDif = mouseMove_x-mouseDown_x;
1949 if(me.name==='right') mouseDif *= -1;
1950 var oldhideBarAxis = me.hideBarAxis;
1951 me.setWidthCatBars(mouseDown_width+mouseDif);
1952 if(me.hideBarAxis!==oldhideBarAxis){
1953 me.browser.updateLayout_Height();
1954 }
1955 // TODO: Adjust other panel widths
1956 }).on("mouseup", function(){
1957 adjustDOM.removeAttribute("dragging");
1958 root.style('cursor','default');
1959 me.browser.DOM.pointerBlock.attr("active",null);
1960 me.browser.setNoAnim(false);
1961 // unregister mouse-move callbacks
1962 d3.select("body").on("mousemove", null).on("mouseup", null);
1963 });
1964 d3.event.preventDefault();
1965 })
1966 .on("click",function(){
1967 d3.event.stopPropagation();
1968 d3.event.preventDefault();
1969 });
1970 },
1971 /** -- */
1972 refreshDropZoneIndex: function(){
1973 var me = this;
1974 this.DOM.root.selectAll(".dropZone_between_wrapper")
1975 .attr("panel_index",function(d,i){
1976 this.__data__ = i;
1977 if(i===0) return "first";
1978 if(i===me.summaries.length) return "last";
1979 return "middle";
1980 })
1981 ;
1982 },
1983 /** -- */
1984 refreshAdjustWidth: function(){
1985 if(this.name==='middle' || this.name==='bottom') return; // cannot have adjust handles for now
1986 this.DOM.panelAdjustWidth.style("opacity",(this.summaries.length>0)?1:0);
1987 },
1988 /** -- */
1989 setTotalWidth: function(_w_){
1990 this.width_catBars = _w_-this.width_catLabel-this.width_catMeasureLabel-kshf.scrollWidth;
1991 },
1992 /** -- */
1993 getNumOfOpenSummaries: function(){
1994 return this.summaries.reduce(function(prev,cur){return prev+!cur.collapsed;},0);
1995 },
1996 /** -- */
1997 collapseAllSummaries: function(){
1998 this.summaries.forEach(function(summary){ summary.setCollapsed(true); });
1999 },
2000 /** -- */
2001 setWidthCatLabel: function(_w_){
2002 console.log(_w_);
2003 _w_ = Math.max(90,_w_); // use at least 90 pixels for the category label.
2004 if(_w_===this.width_catLabel) return;
2005 var widthDif = this.width_catLabel-_w_;
2006 this.width_catLabel = _w_;
2007 this.summaries.forEach(function(summary){
2008 if(summary.refreshLabelWidth!==undefined){
2009 summary.refreshLabelWidth();
2010 }
2011 });
2012 this.setWidthCatBars(this.width_catBars+widthDif);
2013 },
2014 /** -- */
2015 setWidthCatBars: function(_w_){
2016 _w_ = Math.max(_w_,0);
2017 this.hideBars = _w_<=5;
2018 this.hideBarAxis = _w_<=20;
2019
2020 if(this.forceHideBarAxis===true){
2021 this.hideBarAxis = true;
2022 }
2023 if(this.hideBars===false){
2024 this.DOM.root.attr("hidebars",false);
2025 } else {
2026 this.DOM.root.attr("hidebars",true);
2027 }
2028 if(this.hideBarAxis===false){
2029 this.DOM.root.attr("hideBarAxis",false);
2030 } else {
2031 this.DOM.root.attr("hideBarAxis",true);
2032 }
2033
2034 this.width_catBars = _w_;
2035
2036 this.updateSummariesWidth();
2037 if(this.name!=="middle")
2038 this.browser.updateMiddlePanelWidth();
2039 },
2040 /** --- */
2041 updateSummariesWidth: function(){
2042 this.summaries.forEach(function(summary){
2043 if(summary.hasCategories && summary.hasCategories()){
2044 summary.updateBarPreviewScale2Active();
2045 }
2046 summary.refreshWidth();
2047 });
2048 },
2049 /** --- */
2050 updateWidth_QueryPreview: function(){
2051 var maxTotalCount = d3.max(this.summaries, function(summary){
2052 if(summary.getMaxAggr_Total===undefined) return 0;
2053 return summary.getMaxAggr_Total();
2054 });
2055
2056 var oldPreviewWidth = this.width_catMeasureLabel;
2057
2058 this.width_catMeasureLabel = 13;
2059 var digits = 1;
2060 while(maxTotalCount>9){
2061 digits++;
2062 maxTotalCount = Math.floor(maxTotalCount/10);
2063 }
2064 if(digits>3) {
2065 digits = 2;
2066 this.width_catMeasureLabel+=4; // "." character is used to split. It takes some space
2067 }
2068 this.width_catMeasureLabel += digits*6;
2069
2070 if(oldPreviewWidth!==this.width_catMeasureLabel){
2071 this.summaries.forEach(function(summary){
2072 if(summary.refreshLabelWidth) summary.refreshLabelWidth();
2073 });
2074 }
2075 }
2076 };
2077
2078 /**
2079 * @constructor
2080 */
2081 kshf.Browser = function(options){
2082 this.options = options;
2083
2084 if(kshf.lang.cur===null){
2085 kshf.lang.cur = kshf.lang.en;
2086 }
2087
2088 // BASIC OPTIONS
2089 this.summaries = [];
2090 this.summaries_by_name = {};
2091 this.panels = {};
2092
2093 this.selfRefSummaries = [];
2094 this.maxFilterID = 0;
2095
2096 this.filters = [];
2097
2098 this.attribsShown = false;
2099
2100 this.pauseResultPreview = false;
2101 this.vizPreviewActive = false;
2102 this.vizCompareActive = false;
2103 this.ratioModeActive = false;
2104 this.percentModeActive = false;
2105 this.isFullscreen = false;
2106
2107 this.previewedSelectionSummary = null;
2108
2109 this.noAnim=false;
2110
2111 this.listDef = options.itemDisplay || {};
2112 if(options.list) this.listDef = options.list;
2113
2114 this.domID = options.domID;
2115
2116 // Callbacks
2117 this.loadedCb = options.loadedCb;
2118 this.newSummaryCb = options.newSummaryCb;
2119 this.readyCb = options.readyCb;
2120 this.updateCb = options.updateCb;
2121 this.previewCb = options.previewCb;
2122 this.previewCompareCb = options.previewCompareCb;
2123 this.preview_not = false;
2124 this.ratioModeCb = options.ratioModeCb;
2125
2126 this.showDropZones = false;
2127
2128 this.itemName = options.itemName || "";
2129
2130 this.showDataSource = true;
2131 if(options.showDataSource===false) this.showDataSource = false;
2132
2133 this.forceHideBarAxis = false;
2134 if(options.forceHideBarAxis!==undefined) this.forceHideBarAxis = options.forceHideBarAxis;
2135 this.DOM = {};
2136 this.DOM.root = d3.select(this.domID)
2137 .classed("kshf",true)
2138 .attr("percentview",false)
2139 .attr("noanim",true)
2140 .attr("ratiomode",false)
2141 .attr("attribsShown",false)
2142 .attr("showdropzone",false)
2143 .attr("previewcompare",false)
2144 .attr("resultpreview",false)
2145 .style("position","relative")
2146 //.style("overflow-y","hidden")
2147 .on("mousemove",function(d){
2148 if(typeof logIf === "object"){
2149 logIf.setSessionID();
2150 }
2151 })
2152 ;
2153
2154 // remove any DOM elements under this domID, kshf takes complete control over what's inside
2155 var rootDomNode = this.DOM.root[0][0];
2156 while (rootDomNode.hasChildNodes()) rootDomNode.removeChild(rootDomNode.lastChild);
2157
2158 this.DOM.pointerBlock = this.DOM.root.append("div").attr("class","pointerBlock");
2159 this.DOM.attribDragBox = this.DOM.root.append("div").attr("class","attribDragBox");
2160
2161 this.insertDOM_ResizeBrowser();
2162 this.insertDOM_Infobox();
2163 this.insertDOM_WarningBox();
2164
2165 this.insertDOM_PanelBasic();
2166
2167 this.DOM.panelsTop = this.DOM.root.append("div").attr("class","panels_Above");
2168
2169 this.panels.left = new kshf.Panel({
2170 width_catLabel : options.leftPanelLabelWidth || options.categoryTextWidth || 115,
2171 browser: this,
2172 name: 'left',
2173 parentDOM: this.DOM.panelsTop
2174 });
2175
2176 this.DOM.middleColumn = this.DOM.panelsTop.append("div").attr("class","middleColumn");
2177
2178 this.DOM.middleColumn.append("div").attr("class", "recordDisplay")
2179
2180 this.panels.middle = new kshf.Panel({
2181 width_catLabel : options.middlePanelLabelWidth || options.categoryTextWidth || 115,
2182 browser: this,
2183 name: 'middle',
2184 parentDOM: this.DOM.middleColumn
2185 });
2186 this.panels.right = new kshf.Panel({
2187 width_catLabel : options.rightPanelLabelWidth || options.categoryTextWidth || 115,
2188 browser: this,
2189 name: 'right',
2190 parentDOM: this.DOM.panelsTop
2191 });
2192 this.panels.bottom = new kshf.Panel({
2193 width_catLabel : options.categoryTextWidth || 115,
2194 browser: this,
2195 name: 'bottom',
2196 parentDOM: this.DOM.root
2197 });
2198
2199 this.DOM.attributePanel = this.DOM.root.append("div").attr("class","panel attributePanel");
2200 var xx= this.DOM.attributePanel.append("div").attr("class","attributePanelHeader");
2201 xx.append("span").text("Available Attributes");
2202 xx.append("span").attr("class","addAttrib fa fa-plus")
2203 .each(function(){
2204 this.tipsy = new Tipsy(this, {
2205 gravity: "e",
2206 title: function(){ return "Add new"; }
2207 })
2208 })
2209 .on("mouseover",function(){ this.tipsy.show(); })
2210 .on("mouseout" ,function(){ this.tipsy.hide(); })
2211 .on("click",function(){
2212 me.createSummary("[New]",function(){ return this.Name;}, 'categorical');
2213 me.insertAttributeList();
2214 });
2215 xx.append("span").attr("class","hidePanel fa fa-times")
2216 .each(function(){
2217 this.tipsy = new Tipsy(this, {
2218 gravity: "e",
2219 title: function(){ return "Close panel"; }
2220 })
2221 })
2222 .on("mouseover",function(){ this.tipsy.show(); })
2223 .on("mouseout" ,function(){ this.tipsy.hide(); })
2224 .on("click",function(){
2225 me.showAttributes();
2226 });
2227
2228 this.DOM.attributeList = this.DOM.attributePanel.append("div").attr("class","attributeList");
2229
2230 this.DOM.dropZone_AttribList = this.DOM.attributeList.append("div").attr("class","dropZone dropZone_AttribList")
2231 .attr("readyToDrop",false)
2232 .on("mouseenter",function(event){
2233 this.setAttribute("readyToDrop",true);
2234 })
2235 .on("mouseleave",function(event){
2236 this.setAttribute("readyToDrop",false);
2237 })
2238 .on("mouseup",function(event){
2239 var movedSummary = me.movedSummary;
2240 movedSummary.removeFromPanel();
2241 movedSummary.clearDOM();
2242 movedSummary.browser.updateLayout();
2243 me.movedSummary = null;
2244 })
2245 ;
2246 this.DOM.dropZone_AttribList.append("span").attr("class","dropIcon fa fa-angle-double-down");
2247 this.DOM.dropZone_AttribList.append("div").attr("class","dropText").text("Remove summary");
2248
2249 var me = this;
2250
2251 this.DOM.root.selectAll(".panel").on("mouseleave",function(){
2252 setTimeout( function(){ me.updateLayout_Height(); }, 1500); // update layout after 1.5 seconds
2253 });
2254
2255 if(options.source){
2256 window.setTimeout(function() { me.loadSource(options.source); }, 10);
2257 } else {
2258 this.panel_infobox.attr("show","source");
2259 }
2260
2261 kshf.loadFont();
2262 };
2263
2264 kshf.Browser.prototype = {
2265 /** -- */
2266 setNoAnim: function(v){
2267 if(v===this.noAnim) return;
2268 if(this.finalized===undefined) return;
2269 this.noAnim=v;
2270 this.DOM.root.attr("noanim",this.noAnim);
2271 },
2272 /** -- */
2273 removeSummary: function(summary){
2274 var indexFrom = -1;
2275 this.summaries.forEach(function(s,i){
2276 if(s===summary) indexFrom = i;
2277 });
2278 if(indexFrom===-1) return; // given summary is not within this panel
2279 this.summaries.splice(indexFrom,1);
2280
2281 summary.removeFromPanel();
2282 },
2283 /** -- */
2284 getAttribTypeFromFunc: function(attribFunc){
2285 var type = null;
2286 this.items.some(function(item,i){
2287 var item=attribFunc.call(item.data,item);
2288 if(item===null) return false;
2289 if(item===undefined) return false;
2290 if(typeof(item)==="number" || item instanceof Date) {
2291 type="interval";
2292 return true;
2293 }
2294 // TODO": Think about boolean summaries
2295 if(typeof(item)==="string" || typeof(item)==="boolean") {
2296 type = "categorical";
2297 return true;
2298 }
2299 if(Array.isArray(item)){
2300 type = "categorical";
2301 return true;
2302 }
2303 return false;
2304 },this);
2305 return type;
2306 },
2307 /** -- */
2308 createSummary: function(name,func,type){
2309 if(this.summaries_by_name[name]!==undefined){
2310 console.log("createSummary: The summary name["+name+"] is already used. It must be unique. Try again");
2311 return;
2312 }
2313 if(typeof(func)==="string"){
2314 var x=func;
2315 func = function(){ return this[x]; }
2316 }
2317
2318 var attribFunc=func || function(d){ return d.data[name]; }
2319 if(type===undefined){
2320 type = this.getAttribTypeFromFunc(attribFunc);
2321 }
2322 if(type===null){
2323 console.log("Summary data type could not be detected for summary name:"+name);
2324 return;
2325 }
2326
2327 var summary;
2328 if(type==='categorical'){
2329 summary = new kshf.Summary_Categorical();
2330 }
2331 if(type==='interval'){
2332 summary = new kshf.Summary_Interval();
2333 }
2334
2335 summary.initialize(this,name,func);
2336
2337 this.summaries.push(summary);
2338 this.summaries_by_name[name] = summary;
2339
2340 if(this.newSummaryCb) this.newSummaryCb.call(this,summary);
2341 return summary;
2342 },
2343 /** -- */
2344 changeSummaryName: function(curName,newName){
2345 if(curName===newName) return;
2346 var summary = this.summaries_by_name[curName];
2347 if(summary===undefined){
2348 console.log("The given summary name is not there. Try again");
2349 return;
2350 }
2351 if(this.summaries_by_name[newName]!==undefined){
2352 if(newName!==this.summaries_by_name[newName].summaryColumn){
2353 console.log("The new summary name is already used. It must be unique. Try again");
2354 return;
2355 }
2356 }
2357 // remove the indexing using oldName IFF the old name was not original column name
2358 if(curName!==summary.summaryColumn){
2359 delete this.summaries_by_name[curName];
2360 }
2361 this.summaries_by_name[newName] = summary;
2362 summary.setSummaryName(newName);
2363 return summary;
2364 },
2365 /** -- */
2366 getWidth_Total: function(){
2367 return this.divWidth;
2368 },
2369 /** -- */
2370 domHeight: function(){
2371 return parseInt(this.DOM.root.style("height"));
2372 },
2373 /** -- */
2374 domWidth: function(){
2375 return parseInt(this.DOM.root.style("width"));
2376 },
2377 // TODO: If names are the same and config options are different, what do you do?
2378 createFilter: function(opts){
2379 opts.browser = this;
2380 // see if it has been created before TODO
2381 var newFilter = new kshf.Filter(this.maxFilterID,opts);
2382 ++this.maxFilterID;
2383 this.filters.push(newFilter);
2384 return newFilter;
2385 },
2386 /** -- */
2387 insertDOM_ResizeBrowser: function(){
2388 var me=this;
2389 this.DOM.resizeBrowser_corner = this.DOM.root.append("div").attr("class", "resizeBrowser_corner")
2390 .each(function(summary){
2391 this.tipsy = new Tipsy(this, {
2392 gravity: 'e', title: function(){ return kshf.lang.cur.ResizeBrowser; }
2393 });
2394 })
2395 .on("mouseover",function(){
2396 if(this.getAttribute("dragging")==="true") return;
2397 this.tipsy.show();
2398 })
2399 .on("mouseout",function(){
2400 this.tipsy.hide();
2401 })
2402 .on("mousedown", function (d, i) {
2403 var resizeDOM = this;
2404 this.tipsy.hide();
2405 resizeDOM.setAttribute("dragging",true);
2406 me.DOM.root.style('cursor','nwse-resize');
2407 me.setNoAnim(true);
2408 var mouseDown_x = d3.mouse(d3.select("body")[0][0])[0];
2409 var mouseDown_y = d3.mouse(d3.select("body")[0][0])[1];
2410 var mouseDown_width = parseInt(d3.select(this.parentNode).style("width"));
2411 var mouseDown_height = parseInt(d3.select(this.parentNode).style("height"));
2412 d3.select("body").on("mousemove", function() {
2413 var mouseDown_x_diff = d3.mouse(d3.select("body")[0][0])[0]-mouseDown_x;
2414 var mouseDown_y_diff = d3.mouse(d3.select("body")[0][0])[1]-mouseDown_y;
2415 d3.select(me.domID).style("height",(mouseDown_height+mouseDown_y_diff)+"px");
2416 d3.select(me.domID).style("width" ,(mouseDown_width +mouseDown_x_diff)+"px");
2417 me.updateLayout();
2418 }).on("mouseup", function(){
2419 if(sendLog) sendLog(kshf.LOG.RESIZE);
2420 resizeDOM.removeAttribute("dragging");
2421 me.DOM.root.style('cursor','default');
2422 me.setNoAnim(false);
2423 // unregister mouse-move callbacks
2424 d3.select("body").on("mousemove", null).on("mouseup", null);
2425 });
2426 d3.event.preventDefault();
2427 })
2428 .style("display",this.options.showResizeCorner?true:false);
2429 },
2430 /* -- */
2431 insertDOM_WarningBox: function(){
2432 this.panel_warningBox = this.DOM.root.append("div").attr("class", "warningBox_wrapper").attr("shown",false)
2433 var x = this.panel_warningBox.append("span").attr("class","warningBox");
2434 this.DOM.warningText = x.append("span").attr("class","warningText");
2435 x.append("span").attr("class","dismiss").text("Dismiss")
2436 .on("click",function(){
2437 this.parentNode.parentNode.setAttribute("shown",false);
2438 });
2439 },
2440 /** -- */
2441 showWarning: function(v){
2442 this.panel_warningBox.attr("shown",true);
2443 this.DOM.warningText.text(v);
2444 },
2445 /** -- */
2446 hideWarning: function(){
2447 this.panel_warningBox.attr("shown",false);
2448 },
2449 /** -- */
2450 insertDOM_PanelBasic: function(){
2451 var me=this;
2452
2453 this.DOM.panel_Basic = this.DOM.root.append("div").attr("class","panel_Basic");
2454
2455 var recordInfo = this.DOM.panel_Basic.append("span")
2456 .attr("class","recordInfo editableTextContainer")
2457 .attr("edittitle",false);
2458
2459 this.DOM.activeRecordCount = recordInfo.append("span").attr("class","activeRecordCount");
2460
2461 this.DOM.recordName = recordInfo.append("span").attr("class","recordName editableText")
2462 .attr("contenteditable",false)
2463 .on("mousedown", function(){ d3.event.stopPropagation(); })
2464 .on("blur",function(){
2465 this.parentNode.setAttribute("edittitle",false);
2466 this.setAttribute("contenteditable", false);
2467 me.itemName = this.textContent;
2468 })
2469 .on("keydown",function(){
2470 if(event.keyCode===13){ // ENTER
2471 this.parentNode.setAttribute("edittitle",false);
2472 this.setAttribute("contenteditable", false);
2473 me.itemName = this.textContent;
2474 }
2475 });
2476
2477 recordInfo.append("span")
2478 .attr("class","editTextButton fa")
2479 .each(function(){
2480 this.tipsy = new Tipsy(this, {
2481 gravity: 'w', title: function(){
2482 var curState=this.parentNode.getAttribute("edittitle");
2483 if(curState===null || curState==="false"){
2484 return kshf.lang.cur.EditTitle;
2485 } else {
2486 return "OK";
2487 }
2488 }
2489 })
2490 })
2491 .on("mouseenter",function(){ this.tipsy.show(); })
2492 .on("mouseleave",function(){ this.tipsy.hide(); })
2493 .on("mousedown", function(){
2494 d3.event.stopPropagation();
2495 d3.event.preventDefault();
2496 })
2497 .on("click",function(){
2498 var curState=this.parentNode.getAttribute("edittitle");
2499 if(curState===null || curState==="false"){
2500 this.parentNode.setAttribute("edittitle",true);
2501 var parentDOM = d3.select(this.parentNode);
2502 var v=parentDOM.select(".recordName")[0][0];
2503 v.setAttribute("contenteditable",true);
2504 v.focus();
2505 } else {
2506 this.parentNode.setAttribute("edittitle",false);
2507 var parentDOM = d3.select(this.parentNode);
2508 var v=parentDOM.select(".recordName")[0][0];
2509 v.setAttribute("contenteditable",false);
2510 me.itemName = this.textContent;
2511 }
2512 });
2513
2514 this.DOM.filtercrumbs = this.DOM.panel_Basic.append("span").attr("class","filtercrumbs");
2515
2516 this.initDOM_ClearAllFilters();
2517
2518 var rightBoxes = this.DOM.panel_Basic.append("span").attr("class","rightBoxes");
2519 // Attribute panel
2520 rightBoxes.append("i").attr("class","showConfigButton fa fa-cog")
2521 .each(function(d){
2522 this.tipsy = new Tipsy(this, { gravity: 'ne', title: function(){ return kshf.lang.cur.ModifyBrowser; } });
2523 })
2524 .on("mouseover",function(){ this.tipsy.show(); })
2525 .on("mouseout", function(){ this.tipsy.hide(); })
2526 .on("click",function(){ me.showAttributes(); })
2527 ;
2528 // Datasource
2529 this.DOM.datasource = rightBoxes.append("a").attr("class","fa fa-table datasource")
2530 .attr("target","_blank")
2531 .each(function(d){
2532 this.tipsy = new Tipsy(this, { gravity: 'ne', title: function(){ return kshf.lang.cur.OpenDataSource; } });
2533 })
2534 .on("mouseover",function(){ this.tipsy.show(); })
2535 .on("mouseout",function(d,i){ this.tipsy.hide(); })
2536 .on("click",function(){
2537 if(sendLog) sendLog(kshf.LOG.DATASOURCE);
2538 })
2539 ;
2540 // Info & Credits
2541 rightBoxes.append("i").attr("class","fa fa-info-circle credits")
2542 .each(function(d){
2543 this.tipsy = new Tipsy(this, { gravity: 'ne', title: function(){ return kshf.lang.cur.ShowInfoCredits; } });
2544 })
2545 .on("mouseover",function(){ this.tipsy.show(); })
2546 .on("mouseout",function(d,i){ this.tipsy.hide(); })
2547 .on("click",function(){ me.showInfoBox();})
2548 ;
2549 // Info & Credits
2550 rightBoxes.append("i").attr("class","fa fa-arrows-alt fullscreen")
2551 .each(function(d){
2552 this.tipsy = new Tipsy(this, { gravity: 'ne', title: function(){ return kshf.lang.cur.ShowFullscreen; } });
2553 })
2554 .on("mouseover",function(){ this.tipsy.show(); })
2555 .on("mouseout",function(d,i){ this.tipsy.hide(); })
2556 .on("click",function(){ me.showFullscreen();})
2557 ;
2558
2559 var adsdasda = this.DOM.panel_Basic.append("div").attr("class","totalViz");
2560 this.DOM.totalViz_total = adsdasda.append("span").attr("class","aggr total");
2561 this.DOM.totalViz_active = adsdasda.append("span").attr("class","aggr active");
2562 this.DOM.totalViz_preview = adsdasda.append("span").attr("class","aggr preview");
2563 },
2564 /** -- */
2565 refreshTotalViz: function(){
2566 this.DOM.totalViz_active .style("width",
2567 (100*this.itemsWanted_Aggregrate_Total/this.itemsTotal_Aggregrate_Total)+"%");
2568 this.DOM.totalViz_preview.style("width",
2569 (100*this.itemCount_Previewed/this.itemsTotal_Aggregrate_Total)+"%");
2570 },
2571 /** --- */
2572 initDOM_ClearAllFilters: function(){
2573 var me=this;
2574 this.DOM.filterClearAll = this.DOM.panel_Basic.append("span").attr("class","filterClearAll")
2575 .each(function(d){
2576 this.tipsy = new Tipsy(this, {
2577 gravity: 'n', title: function(){ return kshf.lang.cur.RemoveAllFilters; }
2578 });
2579 })
2580 .on("mouseenter",function(){ this.tipsy.show(); })
2581 .on("mouseleave",function(){ this.tipsy.hide(); })
2582 .on("click",function(){
2583 this.tipsy.hide();
2584 me.clearFilters_All();
2585 })
2586 ;
2587 this.DOM.filterClearAll.append("span").attr("class","title").text(kshf.lang.cur.ShowAll);
2588 this.DOM.filterClearAll.append("div").attr("class","chartClearFilterButton allFilter")
2589 .append("span").attr("class","fa fa-times")
2590 ;
2591 },
2592 /* -Modified to show the i3visio credits- */
2593 insertDOM_Infobox: function(){
2594 var me=this;
2595 /* TO-DO: update the language depending on the language */
2596 var creditString="";
2597 creditString += "<div align='center'>";
2598 creditString += "<div class='header'>Explorify is part of <span class='libName'>OSRFramework</span>.</div>";
2599 creditString += "<div align='center' class='boxinbox project_credits'>";
2600 creditString += "<div>Developed by</div>";
2601 //creditString += " <a href='http://www.cs.umd.edu/hcil/' target='_blank'><img src='https://wiki.umiacs.umd.edu/hcil/images/1/10/HCIL_logo_small_no_border.gif' style='height:50px'></a>";
2602 creditString += " Yaiza Rubio and Félix Brezo</br><a class='myName' href='http://i3visio.com' target='_blank'>i3visio</a>";
2603 //creditString += " <a href='http://www.umd.edu' target='_blank'><img src='http://www.trademarks.umd.edu/marks/gr/informal.gif' style='height:50px'></a>";
2604 creditString += "</div>";
2605 creditString += "";
2606 creditString += "<div align='center' class='boxinbox project_credits'>";
2607 creditString += "<div style='float:right; text-align: right'>"
2608 creditString += "<iframe src='http://ghbtns.com/github-btn.html?user=i3visio&repo=osrframework&type=watch&count=true' allowtransparency='true' frameborder='0' scrolling='0' width='90px' height='20px'></iframe><br/>";
2609 creditString += "</div>";
2610 creditString += "<div style='float:left; padding-left: 10px'>"
2611 creditString += "<iframe src='http://ghbtns.com/github-btn.html?user=i3visio&repo=osrframework&type=fork&count=true' allowtransparency='true' frameborder='0' scrolling='0' width='90px' height='20px'></iframe>";
2612 creditString += "</div>";
2613 creditString += "Libraries and third-party used:<br/>";
2614 creditString += " <a href='http://d3js.org/' target='_blank'>D3</a> -";
2615 creditString += " <a href='http://jquery.com' target='_blank'>JQuery</a> -";
2616 creditString += " <a href='https://github.com/adilyalcin/keshif' target='_blank'>Keshif</a>";
2617 creditString += "</div><br/>";
2618 //creditString += "";
2619 creditString += "<div align='center' class='project_fund'>";
2620 creditString += "If you have questions or if you just want to know what things we do, <br/>";
2621 creditString += "you can contact us in <a href='mailto:[email protected]'>[email protected]</a>.</div>";
2622 //creditString += "";
2623
2624 this.panel_infobox = this.DOM.root.append("div").attr("class", "panel panel_infobox");
2625 this.panel_infobox.append("div").attr("class","background")
2626 .on("click",function(){
2627 var activePanel = this.parentNode.getAttribute("show");
2628 if(activePanel==="credit" || activePanel==="itemZoom"){
2629 me.panel_infobox.attr("show","none");
2630 }
2631 })
2632 ;
2633 this.DOM.loadingBox = this.panel_infobox.append("div").attr("class","infobox_content infobox_loading");
2634 // this.DOM.loadingBox.append("span").attr("class","fa fa-spinner fa-spin");
2635 var ssdsd = this.DOM.loadingBox.append("span").attr("class","spinner");
2636 ssdsd.append("span").attr("class","spinner_x spinner_1");
2637 ssdsd.append("span").attr("class","spinner_x spinner_2");
2638 ssdsd.append("span").attr("class","spinner_x spinner_3");
2639 ssdsd.append("span").attr("class","spinner_x spinner_4");
2640 ssdsd.append("span").attr("class","spinner_x spinner_5");
2641
2642 var hmmm=this.DOM.loadingBox.append("div").attr("class","status_text");
2643 hmmm.append("span").attr("class","status_text_sub info").text(kshf.lang.cur.LoadingData);
2644 this.DOM.status_text_sub_dynamic = hmmm.append("span").attr("class","status_text_sub dynamic");
2645
2646 var infobox_credit = this.panel_infobox.append("div").attr("class","infobox_content infobox_credit");
2647 infobox_credit.append("div").attr("class","infobox_close_button")
2648 .on("click",function(){
2649 me.panel_infobox.attr("show","none");
2650 })
2651 .append("span").attr("class","fa fa-times");
2652 infobox_credit.append("div").attr("class","all-the-credits").html(creditString);
2653
2654 this.insertSourceBox();
2655
2656
2657 this.DOM.infobox_itemZoom = this.panel_infobox.append("span").attr("class","infobox_content infobox_itemZoom");
2658
2659 this.DOM.infobox_itemZoom.append("div").attr("class","infobox_close_button")
2660 .on("click",function(){
2661 me.panel_infobox.attr("show","none");
2662 })
2663 .append("span").attr("class","fa fa-times");
2664
2665 this.DOM.infobox_itemZoom_content = this.DOM.infobox_itemZoom.append("span").attr("class","content");
2666 },
2667 /** -- */
2668 insertSourceBox: function(){
2669 var me=this;
2670 var x,y,z;
2671 var source_type="GoogleSheet";
2672 var sourceURL=null, sourceSheet="";
2673
2674 var readyToLoad=function(){
2675 return sourceURL!==null && sourceSheet!=="";
2676 };
2677
2678 this.DOM.infobox_source = this.panel_infobox.append("div").attr("class","infobox_content infobox_source")
2679 .attr("selected_source_type",source_type);
2680
2681 this.DOM.infobox_source.append("div").attr("class","sourceHeader").text("Where's your data?");
2682
2683 var source_wrapper = this.DOM.infobox_source.append("div").attr("class","source_wrapper");
2684
2685 x = source_wrapper.append("div").attr("class","offpoofff");
2686
2687 x.append("span").attr("class","source_from").text("Google Sheet").attr("source_type","GoogleSheet");
2688 x.append("span").attr("class","source_from").text("Google Drive Folder").attr("source_type","GoogleDrive");
2689 x.append("span").attr("class","source_from").text("Dropbox Folder").attr("source_type","Dropbox");
2690 x.append("span").attr("class","source_from").text("Local File").attr("source_type","LocalFile");
2691
2692 x.selectAll(".source_from").on("click",function(){
2693 source_type=this.getAttribute("source_type");
2694 me.DOM.infobox_source.attr("selected_source_type",source_type);
2695 var placeholder;
2696 switch(source_type){
2697 case "GoogleSheet": placeholder = 'https://docs.google.com/spreadsheets/d/**************'; break;
2698 case "GoogleDrive": placeholder = 'https://******.googledrive.com/host/**************/'; break;
2699 case "Dropbox": placeholder = "https://dl.dropboxusercontent.com/u/**************/";
2700 }
2701
2702 gdocLink.attr("placeholder",placeholder);
2703 });
2704
2705 x = source_wrapper.append("div");
2706 var gdocLink = x.append("input")
2707 .attr("type","text")
2708 .attr("class","gdocLink")
2709 .attr("placeholder",'https://docs.google.com/spreadsheets/d/**************')
2710 .on("keyup",function(){
2711 gdocLink_ready.style("opacity",this.value===""?"0":"1");
2712 var input = this.value;
2713 if(source_type==="GoogleSheet"){
2714 var firstIndex = input.indexOf("docs.google.com/spreadsheets/d/");
2715 if(firstIndex!==-1){
2716 var input = input.substr(firstIndex+31); // focus after the base url
2717 if(input.indexOf("/")!==-1){
2718 input = input.substr(0,input.indexOf("/"));
2719 }
2720 }
2721 if(input.length===44){
2722 sourceURL = input;
2723 gdocLink_ready.attr("ready",true);
2724 } else {
2725 sourceURL = null;
2726 gdocLink_ready.attr("ready",false);
2727 }
2728 }
2729 if(source_type==="GoogleDrive"){
2730 var firstIndex = input.indexOf(".googledrive.com/host/");
2731 if(firstIndex!==-1){
2732 // Make sure last character is "/"
2733 if(input[input.length-1]!=="/") input+="/";
2734 sourceURL = input;
2735 gdocLink_ready.attr("ready",true);
2736 } else{
2737 sourceURL = null;
2738 gdocLink_ready.attr("ready",false);
2739 }
2740 }
2741 if(source_type==="Dropbox"){
2742 var firstIndex = input.indexOf("dl.dropboxusercontent.com/");
2743 if(firstIndex!==-1){
2744 // Make sure last character is "/"
2745 if(input[input.length-1]!=="/") input+="/";
2746 sourceURL = input;
2747 gdocLink_ready.attr("ready",true);
2748 } else{
2749 sourceURL = null;
2750 gdocLink_ready.attr("ready",false);
2751 }
2752 }
2753 if(source_type==="LocalFile"){
2754 // TODO
2755 }
2756 actionButton.attr("disabled",!readyToLoad());
2757 });
2758
2759 x.append("span").attr("class","fa fa-info-circle")
2760 .each(function(summary){
2761 this.tipsy = new Tipsy(this, {
2762 gravity: 's', title: function(){
2763 if(source_type==="GoogleSheet")
2764 return "The link to your Google Sheet";
2765 if(source_type==="GoogleDrive")
2766 return "The link to *hosted* Google Drive folder";
2767 if(source_type==="Dropbox")
2768 return "The link to your *Public* Dropbox folder";
2769 if(source_type==="LocalFile")
2770 return "Select your file or drag & drop into the field";
2771 }
2772 });
2773 })
2774 .on("mouseenter",function(){ this.tipsy.show(); })
2775 .on("mouseleave",function(){ this.tipsy.hide(); });
2776
2777 var gdocLink_ready = x.append("span").attr("class","gdocLink_ready fa").attr("ready",false);
2778
2779 var sheetInfo = this.DOM.infobox_source.append("div").attr("class","sheetInfo");
2780
2781 x = sheetInfo.append("div").attr("class","sheet_wrapper")
2782 x.append("div").attr("class","subheading tableHeader")
2783 ;
2784
2785 x = sheetInfo.append("div").attr("class","sheet_wrapper sheetName_wrapper")
2786 x.append("span").attr("class","subheading").text("Name");
2787 x.append("span").attr("class","fa fa-info-circle")
2788 .each(function(summary){
2789 this.tipsy = new Tipsy(this, {
2790 //gravity: 's', title: function(){ return "Your document may have multiple sheets.<br>Provide the name of the main sheet"; }
2791 gravity: 's', title: function(){
2792 var v;
2793 if(source_type==="GoogleSheet")
2794 v="The name of the data sheet in your Google Sheet.";
2795 if(source_type==="GoogleDrive")
2796 v="The file name in the folder.";
2797 if(source_type==="Dropbox")
2798 v="The file name in the folder.";
2799 v+="<br>Also describes what each data row represents"
2800 return v;
2801 }
2802 });
2803 })
2804 .on("mouseenter",function(){ this.tipsy.show(); })
2805 .on("mouseleave",function(){ this.tipsy.hide(); });
2806
2807 x.append("input").attr("type","text").attr("class","sheetName")
2808 .on("keyup",function(){
2809 sourceSheet = this.value;
2810 actionButton.attr("disabled",!readyToLoad());
2811 });
2812 z=x.append("span").attr("class","fileType_wrapper");
2813 z.append("span").text(".");
2814 var DOMfileType = z.append("select").attr("class","fileType");
2815 DOMfileType.append("option").attr("value","csv").text("csv");
2816 DOMfileType.append("option").attr("value","tsv").text("tsv");
2817 DOMfileType.append("option").attr("value","json").text("json");
2818
2819 x = sheetInfo.append("div").attr("class","sheet_wrapper sheetColumn_ID_wrapper")
2820 x.append("span").attr("class","subheading").text("ID column");
2821 x.append("span").attr("class","fa fa-info-circle")
2822 .each(function(summary){
2823 this.tipsy = new Tipsy(this, {
2824 //gravity: 's', title: function(){ return "Your document may have multiple sheets.<br>Provide the name of the main sheet"; }
2825 gravity: 's', title: function(){ return "The column that uniquely identifies each item.<br><br>If no such column, skip."; }
2826 });
2827 })
2828 .on("mouseenter",function(){ this.tipsy.show(); })
2829 .on("mouseleave",function(){ this.tipsy.hide(); });
2830 x.append("input").attr("class","sheetColumn_ID").attr("type","text").attr("placeholder","id");
2831
2832 x = sheetInfo.append("div").attr("class","sheet_wrapper sheetColumn_Split_wrapper")
2833 x.append("span").attr("class","subheading").text("Split column");
2834 x.append("span").attr("class","fa fa-info-circle")
2835 .each(function(summary){
2836 this.tipsy = new Tipsy(this, {
2837 //gravity: 's', title: function(){ return "Your document may have multiple sheets.<br>Provide the name of the main sheet"; }
2838 gravity: 's', title: function(){
2839 return "If column has multi-values<br>(ex: action+drama),<br>split values using separator";
2840 }
2841 });
2842 })
2843 .on("mouseenter",function(){ this.tipsy.show(); })
2844 .on("mouseleave",function(){ this.tipsy.hide(); });
2845 x.append("input").attr("type","text").attr("class","sheetColumn_Splitter")
2846 .on("keyup",function(){
2847 sheetColumn_sep_wrapper.style("display",this.value!==""?"inline-block":"none");
2848 });
2849 var sheetColumn_sep_wrapper = x.append("span").attr("class","sheetColumn_sep_wrapper");
2850 sheetColumn_sep_wrapper.append("span").text(" with")
2851 sheetColumn_sep_wrapper.append("span").attr("class","fa fa-info-circle")
2852 .each(function(summary){
2853 this.tipsy = new Tipsy(this, {
2854 //gravity: 's', title: function(){ return "Your document may have multiple sheets.<br>Provide the name of the main sheet"; }
2855 gravity: 's', title: function(){
2856 return "Separator";
2857 }
2858 });
2859 })
2860 .on("mouseenter",function(){ this.tipsy.show(); })
2861 .on("mouseleave",function(){ this.tipsy.hide(); });;
2862 sheetColumn_sep_wrapper.append("input").attr("class","sheetColumn_Separator").attr("type","text").attr("placeholder","+");
2863
2864
2865 var actionButton = this.DOM.infobox_source.append("div").attr("class","actionButton")
2866 .html("Explore it with Keshif")
2867 .attr("disabled",true)
2868 .on("click",function(){
2869 if(!readyToLoad()){
2870 alert("Please input your data source link and sheet name.");
2871 return;
2872 }
2873 var sheetID = me.DOM.infobox_source.select(".sheetColumn_ID")[0][0].value;
2874 if(sheetID==="") sheetID = "id";
2875 var loadedCb_pre = me.loadedCb;
2876 me.loadedCb = function(){
2877 var splitColumnName = me.DOM.infobox_source.select(".sheetColumn_Splitter")[0][0].value;
2878 var splitSepName = me.DOM.infobox_source.select(".sheetColumn_Separator")[0][0].value;
2879 if(splitColumnName){
2880 kshf.Util.cellToArray(this.items, [splitColumnName], splitSepName, false);
2881 }
2882 if(loadedCb_pre) loadedCb_pre.call(this,this);
2883 };
2884 var readyCb_pre = me.readyCb;
2885 me.readyCb = function(){
2886 me.showAttributes();
2887 if(readyCb_pre) readyCb_pre.call(this,this);
2888 }
2889 if(source_type==="GoogleSheet"){
2890 me.loadSource({
2891 gdocId: sourceURL,
2892 sheets: [ {name:sourceSheet, id:sheetID} ]
2893 });
2894 }
2895 if(source_type==="GoogleDrive"){
2896 me.loadSource({
2897 dirPath: sourceURL,
2898 fileType: DOMfileType[0][0].value,
2899 sheets: [ {name:sourceSheet, id:sheetID} ]
2900 });
2901 }
2902 if(source_type==="Dropbox"){
2903 me.loadSource({
2904 dirPath: sourceURL,
2905 fileType: DOMfileType[0][0].value,
2906 sheets: [ {name:sourceSheet, id:sheetID} ]
2907 });
2908 }
2909 if(source_type==="LocalFile"){
2910 me.loadSource({
2911 dirPath: sourceURL,
2912 fileType: DOMfileType[0][0].value,
2913 sheets: [ {name:sourceSheet, id:sheetID} ]
2914 });
2915 }
2916 });
2917 },
2918 /** -- */
2919 updateItemZoomText: function(item){
2920 var str="";
2921 for(var column in item.data){
2922 var v=item.data[column];
2923 if(v===undefined || v===null) continue;
2924 str+="<b>"+column+":</b> "+ v.toString()+"<br>";
2925 }
2926 this.DOM.infobox_itemZoom_content.html(str);
2927 // this.DOM.infobox_itemZoom_content.html(item.data.toString());
2928 },
2929 /** -- */
2930 showAttributes: function(v){
2931 if(v===undefined) v = !this.attribsShown; // if undefined, invert
2932 this.attribsShown = v;
2933 this.DOM.root.attr("attribsShown",this.attribsShown);
2934
2935 var lastIndex = 0, me=this;
2936 var initAttib = function(){
2937 var start = Date.now();
2938 me.summaries[lastIndex++].initializeAggregates();
2939 var end = Date.now();
2940 if(lastIndex!==me.summaries.length)
2941 setTimeout(initAttib,end-start);
2942 };
2943 setTimeout(initAttib,150);
2944 },
2945 /** -- */
2946 showFullscreen: function(){
2947 this.isFullscreen = this.isFullscreen?false:true;
2948 var elem = browser.DOM.root[0][0];
2949 if(this.isFullscreen){
2950 if (elem.requestFullscreen) {
2951 elem.requestFullscreen();
2952 } else if (elem.msRequestFullscreen) {
2953 elem.msRequestFullscreen();
2954 } else if (elem.mozRequestFullScreen) {
2955 elem.mozRequestFullScreen();
2956 } else if (elem.webkitRequestFullscreen) {
2957 elem.webkitRequestFullscreen();
2958 }
2959 } else {
2960 if (document.exitFullscreen) {
2961 document.exitFullscreen();
2962 } else if (document.msExitFullscreen) {
2963 document.msExitFullscreen();
2964 } else if (document.mozCancelFullScreen) {
2965 document.mozCancelFullScreen();
2966 } else if (document.webkitExitFullscreen) {
2967 document.webkitExitFullscreen();
2968 }
2969 }
2970 },
2971 /** -- */
2972 showInfoBox: function(){
2973 this.panel_infobox.attr("show","credit");
2974 if(sendLog) sendLog(kshf.LOG.INFOBOX);
2975 },
2976 /** -- */
2977 loadSource: function(v){
2978 this.source = v;
2979 this.panel_infobox.attr("show","loading");
2980 if(this.source.sheets){
2981 if(!Array.isArray(this.source.sheets)){
2982 this.source.sheets = [this.source.sheets];
2983 }
2984 this.source.sheets.forEach(function(sheet, i){
2985 if(typeof sheet === "string"){
2986 this.source.sheets[i] = {name: sheet};
2987 }
2988 }, this);
2989 this.source.loadedTableCount=0;
2990
2991 this.DOM.status_text_sub_dynamic
2992 .text("("+this.source.loadedTableCount+"/"+this.source.sheets.length+")");
2993
2994 this.source.sheets[0].primary = true;
2995 this.primaryTableName = this.source.sheets[0].name;
2996 if(this.source.gdocId){
2997 if(this.source.url===undefined)
2998 this.source.url = "https://docs.google.com/spreadsheet/ccc?key="+this.source.gdocId;
2999 }
3000 this.source.sheets.forEach(function(sheet){
3001 if(sheet.id===undefined) sheet.id="id"; // set id column
3002 if(sheet.tableName===undefined) sheet.tableName = sheet.name; // set table name
3003 // if this table name has been loaded, skip this one
3004 if(kshf.dt[sheet.tableName]!==undefined){
3005 this.incrementLoadedSheetCount();
3006 return;
3007 }
3008 if(this.source.gdocId){
3009 this.loadSheet_Google(sheet);
3010 } else if(this.source.dirPath){
3011 if(this.source.fileType==="json"){
3012 this.loadSheet_JSON(sheet);
3013 } else if(this.source.fileType==="csv" || this.source.fileType==="tsv"){
3014 this.loadSheet_CSV(sheet);
3015 }
3016 }
3017 },this);
3018 } else {
3019 if(this.source.callback){
3020 this.source.callback(this);
3021 }
3022 }
3023 },
3024 loadSheet_Google: function(sheet){
3025 var me=this;
3026 var headers=1;
3027 if(sheet.headers){
3028 headers = sheet.headers;
3029 }
3030 var qString='https://docs.google.com/spreadsheet/tq?key='+this.source.gdocId+'&headers='+headers;
3031 if(sheet.sheetID){
3032 qString+='&gid='+sheet.sheetID;
3033 } else {
3034 qString+='&sheet='+sheet.name;
3035 }
3036 if(sheet.range){
3037 qString+="&range="+sheet.range;
3038 }
3039
3040 var googleQuery = new google.visualization.Query(qString);
3041 if(sheet.query) googleQuery.setQuery(sheet.query);
3042
3043 googleQuery.send( function(response){
3044 if(kshf.dt[sheet.tableName]!==undefined){
3045 me.incrementLoadedSheetCount();
3046 return;
3047 }
3048 if(response.isError()) {
3049 me.panel_infobox.select("div.status_text .info")
3050 .text("Cannot load data");
3051 me.panel_infobox.select("span.spinner").selectAll("span").remove();
3052 me.panel_infobox.select("span.spinner").append('i').attr("class","fa fa-warning");
3053 me.panel_infobox.select("div.status_text .dynamic")
3054 .text("("+response.getMessage()+")");
3055 return;
3056 }
3057
3058 var j,r,i,arr=[],idIndex=-1,itemId=0;
3059 var dataTable = response.getDataTable();
3060 var numCols = dataTable.getNumberOfColumns();
3061
3062 // find the index with sheet.id (idIndex)
3063 for(i=0; true ; i++){
3064 if(i===numCols || dataTable.getColumnLabel(i).trim()===sheet.id) {
3065 idIndex = i;
3066 break;
3067 }
3068 }
3069
3070 var tmpTable=[];
3071
3072 // create the column name tables
3073 for(j=0; j<dataTable.getNumberOfColumns(); j++){
3074 tmpTable.push(dataTable.getColumnLabel(j).trim());
3075 }
3076
3077 // create the item array
3078 arr.length = dataTable.getNumberOfRows(); // pre-allocate for speed
3079 for(r=0; r<dataTable.getNumberOfRows() ; r++){
3080 var c={};
3081 for(i=0; i<numCols ; i++) {
3082 c[tmpTable[i]] = dataTable.getValue(r,i);
3083 }
3084 // push unique id as the last column if necessary
3085 if(c[sheet.id]===undefined) c[sheet.id] = itemId++;
3086 arr[r] = new kshf.Item(c,sheet.id);
3087 }
3088
3089 me.finishDataLoad(sheet,arr);
3090 });
3091 },
3092 /** -- */
3093 loadSheet_CSV: function(sheet){
3094 var me=this;
3095 var fileName=this.source.dirPath+sheet.name+"."+this.source.fileType;
3096 $.ajax({
3097 url: fileName,
3098 type: "GET",
3099 async: (this.source.callback===undefined)?true:false,
3100 contentType: "text/csv",
3101 success: function(data) {
3102 // if data is already loaded, nothing else to do...
3103 if(kshf.dt[sheet.tableName]!==undefined){
3104 me.incrementLoadedSheetCount();
3105 return;
3106 }
3107 var arr = [];
3108 var idColumn = sheet.id;
3109
3110 var config = {};
3111 config.dynamicTyping = true;
3112 config.header = true; // header setting can be turned off
3113 if(sheet.header===false) config.header = false;
3114 if(sheet.preview!==undefined) config.preview = sheet.preview;
3115 if(sheet.fastMode!==undefined) config.fastMode = sheet.fastMode;
3116 if(sheet.dynamicTyping!==undefined) config.dynamicTyping = sheet.dynamicTyping;
3117
3118 var parsedData = Papa.parse(data, config);
3119
3120 parsedData.data.forEach(function(row,i){
3121 if(row[idColumn]===undefined) row[idColumn] = i;
3122 arr.push(new kshf.Item(row,idColumn));
3123 })
3124
3125 me.finishDataLoad(sheet, arr);
3126 }
3127 });
3128 },
3129 /** Note: Requires json root to be an array, and each object will be passed to keshif item. */
3130 loadSheet_JSON: function(sheet){
3131 var me=this;
3132 var fileName=this.source.dirPath+sheet.name+".json";
3133 $.ajax({
3134 url: fileName+"?dl=0",
3135 type: "GET",
3136 async: (this.source.callback===undefined)?true:false,
3137 dataType: "json",
3138 success: function(data) {
3139 // if data is already loaded, nothing else to do...
3140 if(kshf.dt[sheet.tableName]!==undefined){
3141 me.incrementLoadedSheetCount();
3142 return;
3143 }
3144 var arr = [];
3145 var idColumn = sheet.id;
3146
3147 data.forEach(function(dataItem,i){
3148 if(dataItem[idColumn]===undefined) dataItem[idColumn] = i;
3149 arr.push(new kshf.Item(dataItem, idColumn));
3150 });
3151
3152 me.finishDataLoad(sheet, arr);
3153 }
3154 });
3155 },
3156 /** -- */
3157 createTableFromTable: function(srcItems, dstTableName, summaryFunc){
3158 var i;
3159 var me=this;
3160 kshf.dt_id[dstTableName] = {};
3161 kshf.dt[dstTableName] = [];
3162 var dstTable_Id = kshf.dt_id[dstTableName];
3163 var dstTable = kshf.dt[dstTableName];
3164
3165 var hasString = false;
3166
3167 srcItems.forEach(function(srcData_i){
3168 var mapping = summaryFunc.call(srcData_i.data,srcData_i);
3169 if(mapping==="" || mapping===undefined || mapping===null) return;
3170 if(mapping instanceof Array) {
3171 mapping.forEach(function(v2){
3172 if(v2==="" || v2===undefined || v2===null) return;
3173 if(!dstTable_Id[v2]){
3174 if(typeof(v2)==="string") hasString=true;
3175 var itemData = {id: v2};
3176 var item = new kshf.Item(itemData,'id');
3177 dstTable_Id[v2] = item;
3178 dstTable.push(item);
3179 }
3180 });
3181 } else {
3182 if(!dstTable_Id[mapping]){
3183 if(typeof(mapping)==="string") hasString=true;
3184 var itemData = {id: mapping};
3185 var item = new kshf.Item(itemData,'id');
3186 dstTable_Id[mapping] = item;
3187 dstTable.push(item);
3188 }
3189 }
3190 });
3191
3192 // If any of the table values are string, convert all to string
3193 if(hasString){
3194 dstTable.forEach(function(item){
3195 item.data.id = ""+item.data.id;
3196 })
3197 }
3198 },
3199 /** -- */
3200 finishDataLoad: function(sheet,arr) {
3201 kshf.dt[sheet.name] = arr;
3202 var id_table = {};
3203 arr.forEach(function(r){id_table[r.id()] = r;});
3204 kshf.dt_id[sheet.tableName] = id_table;
3205 this.incrementLoadedSheetCount();
3206 },
3207 /** -- */
3208 incrementLoadedSheetCount: function(){
3209 var me=this;
3210 this.source.loadedTableCount++;
3211 this.panel_infobox.select("div.status_text .dynamic")
3212 .text("("+this.source.loadedTableCount+"/"+this.source.sheets.length+")");
3213 // finish loading
3214 if(this.source.loadedTableCount===this.source.sheets.length) {
3215 if(this.source.callback===undefined){
3216 this.loadCharts();
3217 } else {
3218 this.source.callback(this);
3219 }
3220 }
3221 },
3222 /** -- */
3223 loadCharts: function(){
3224 if(this.primaryTableName===undefined){
3225 alert("Cannot load keshif. Please define browser.primaryTableName.");
3226 return;
3227 }
3228 this.items = kshf.dt[this.primaryTableName];
3229 if(this.itemName==="") {
3230 this.itemName=this.primaryTableName;
3231 }
3232
3233 var me=this;
3234 this.panel_infobox.select("div.status_text .info").text(kshf.lang.cur.CreatingBrowser);
3235 this.panel_infobox.select("div.status_text .dynamic").text("");
3236 window.setTimeout(function(){ me._loadCharts(); }, 50);
3237 },
3238 /** -- */
3239 _loadCharts: function(){
3240 var me=this;
3241
3242 if(this.loadedCb!==undefined) this.loadedCb.call(this);
3243
3244 // Total
3245 this.itemsTotal_Aggregrate_Total = 0;
3246 this.items.forEach(function(item){
3247 this.itemsTotal_Aggregrate_Total+=item.aggregate_Self;
3248 },this);
3249
3250 // Create a summary for each existing column in the data
3251 for(var column in this.items[0].data){
3252 if(typeof(column)==="string") this.createSummary(column);
3253 }
3254
3255 // Should do this here, because bottom panel width calls for browser width, and this reads the browser width...
3256 this.divWidth = this.domWidth();
3257
3258 if(this.options.summaries) this.options.facets = this.options.summaries;
3259 this.options.facets = this.options.facets || [];
3260
3261 this.options.facets.forEach(function(facetDescr){
3262 if(typeof facetDescr==="string"){
3263 facetDescr = {title: facetDescr};
3264 }
3265 if(facetDescr.sortingOpts){
3266 facetDescr.catSortBy = facetDescr.sortingOpts
3267 }
3268 if(facetDescr.catLabel||facetDescr.catTooltip||facetDescr.catTableName||facetDescr.catSortBy){
3269 facetDescr.type="categorical";
3270 } else if(facetDescr.intervalScale || facetDescr.showPercentile || facetDescr.unitName ){
3271 facetDescr.type="interval";
3272 }
3273
3274 if(facetDescr.attribMap){
3275 facetDescr.value = facetDescr.attribMap;
3276 }
3277
3278 var summary = this.summaries_by_name[facetDescr.title];
3279 if(summary===undefined){
3280 if(typeof(facetDescr.value)==="string"){
3281 var summary = this.summaries_by_name[facetDescr.value];
3282 if(summary===undefined){
3283 summary = this.createSummary(facetDescr.value);
3284 }
3285 summary = this.changeSummaryName(facetDescr.value,facetDescr.title);
3286 } else if(typeof(facetDescr.value)==="function"){
3287 summary = this.createSummary(facetDescr.title,facetDescr.value,facetDescr.type);
3288 } else{
3289 return;
3290 }
3291 } else {
3292 if(facetDescr.value){
3293 // Requesting a new summarywith the same name.
3294 summary.destroy();
3295 summary = this.createSummary(facetDescr.title,facetDescr.value,facetDescr.type);
3296 }
3297 }
3298
3299 if(facetDescr.type){
3300 facetDescr.type = facetDescr.type.toLowerCase();
3301 if(facetDescr.type!==summary.type){
3302 summary.destroy();
3303 if(facetDescr.value===undefined){
3304 facetDescr.value = facetDescr.title;
3305 }
3306 if(typeof(facetDescr.value)==="string"){
3307 summary = this.createSummary(facetDescr.value,null,facetDescr.type);
3308 if(facetDescr.value!==facetDescr.title)
3309 this.changeSummaryName(facetDescr.value,facetDescr.title);
3310 } else if(typeof(facetDescr.value)==="function"){
3311 summary = this.createSummary(facetDescr.title,facetDescr.value,facetDescr.type);
3312 }
3313 // TODO!
3314 // summary.updateSummaryDataType();
3315 }
3316 }
3317 if(summary===undefined){
3318 return;
3319 }
3320
3321 summary.initializeAggregates();
3322
3323 // Common settings
3324 if(facetDescr.collapsed){
3325 summary.setCollapsed(true);
3326 }
3327 if(facetDescr.items){
3328 summary.items = facetDescr.items;
3329 }
3330 if(facetDescr.description) summary.summaryDescription = facetDescr.description;
3331
3332 // THESE AFFECT HOW CATEGORICAL VALUES ARE MAPPED
3333 if(summary.type==='categorical'){
3334 if(facetDescr.catTableName){
3335 summary.setCatTable(facetDescr.catTableName);
3336 }
3337 if(facetDescr.catLabel){
3338 summary.setCatLabel(facetDescr.catLabel);
3339 }
3340 if(facetDescr.catTooltip){
3341 summary.setCatTooltip(facetDescr.catTooltip);
3342 }
3343 summary.catBarScale = facetDescr.catBarScale || summary.catBarScale;
3344 if(facetDescr.minAggrValue) summary.setMinAggrValue(facetDescr.minAggrValue);
3345 if(facetDescr.catSortBy!==undefined) summary.setSortingOpts(facetDescr.catSortBy);
3346
3347 if(facetDescr.layout!=="none"){
3348 facetDescr.layout = facetDescr.layout || 'left';
3349 summary.addToPanel(this.panels[facetDescr.layout]);
3350 }
3351 }
3352
3353 if(summary.type==='interval'){
3354 summary.unitName = facetDescr.unitName || summary.unitName;
3355 if(facetDescr.showPercentile){
3356 summary.showPercentile = true;
3357 summary.initDOM_Percentile();
3358 }
3359 summary.optimumTickWidth = facetDescr.optimumTickWidth || summary.optimumTickWidth;
3360
3361 // add to panel before you set scale type and other options: TODO: Fix
3362 if(facetDescr.layout!=="none"){
3363 facetDescr.layout = facetDescr.layout || 'left';
3364 summary.addToPanel(this.panels[facetDescr.layout]);
3365 }
3366
3367 if(facetDescr.intervalScale) {
3368 summary.setScaleType(facetDescr.intervalScale);
3369 }
3370 }
3371
3372 if(summary.isLinked) this.selfRefSummaries.push(summary);
3373 },this);
3374
3375 this.panels.left.updateWidth_QueryPreview();
3376 this.panels.right.updateWidth_QueryPreview();
3377 this.panels.middle.updateWidth_QueryPreview();
3378
3379 this.listDisplay = new kshf.RecordDisplay(this,this.listDef, this.DOM.root);
3380
3381 this.setItemName();
3382
3383 if(this.showDataSource !== false && this.source.url){
3384 this.DOM.datasource
3385 .style("display","inline-block")
3386 .attr("href",this.source.url);
3387 }
3388
3389 this.checkZoomLevel();
3390
3391 this.loaded = true;
3392
3393 var x = function(){
3394 var totalWidth = this.divWidth;
3395 var colCount = 0;
3396 if(this.panels.left.summaries.length>0){
3397 totalWidth-=this.panels.left.width_catLabel+kshf.scrollWidth+this.panels.left.width_catMeasureLabel;
3398 colCount++;
3399 }
3400 if(this.panels.right.summaries.length>0){
3401 totalWidth-=this.panels.right.width_catLabel+kshf.scrollWidth+this.panels.right.width_catMeasureLabel;
3402 colCount++;
3403 }
3404 if(this.panels.middle.summaries.length>0){
3405 totalWidth-=this.panels.middle.width_catLabel+kshf.scrollWidth+this.panels.middle.width_catMeasureLabel;
3406 colCount++;
3407 }
3408 return Math.floor((totalWidth)/8);
3409 };
3410 var defaultBarChartWidth = x.call(this);
3411
3412 this.panels.left.setWidthCatBars(this.options.barChartWidth || defaultBarChartWidth);
3413 this.panels.right.setWidthCatBars(this.options.barChartWidth || defaultBarChartWidth);
3414 this.panels.middle.setWidthCatBars(this.options.barChartWidth || defaultBarChartWidth);
3415 this.panels.bottom.updateSummariesWidth(this.options.barChartWidth || defaultBarChartWidth);
3416
3417 this.updateMiddlePanelWidth();
3418
3419 this.refresh_filterClearAll();
3420
3421 this.items.forEach(function(item){item.updateWanted();});
3422 this.update_itemsWantedCount();
3423
3424 this.updateAfterFilter();
3425
3426 this.updateLayout_Height();
3427
3428 // hide infobox
3429 this.panel_infobox.attr("show","none");
3430
3431 this.insertAttributeList();
3432
3433 if(this.readyCb!==undefined) this.readyCb(this);
3434 this.finalized = true;
3435
3436 setTimeout(function(){
3437 me.setNoAnim(false);
3438 },10000);
3439 },
3440 /** -- */
3441 unregisterBodyCallbacks: function(){
3442 // TODO: Revert to previous handlers...
3443 d3.select("body").style('cursor','auto')
3444 .on("mousemove",null)
3445 .on("mouseup",null)
3446 .on("keydown",null);
3447 },
3448 /** -- */
3449 prepareDropZones: function(summary,source){
3450 this.movedSummary = summary;
3451 this.showDropZones = true;
3452 this.DOM.root
3453 .attr("showdropzone",true)
3454 .attr("dropattrtype",summary.getDataType())
3455 .attr("dropSource",source)
3456 ;
3457 this.DOM.attribDragBox.style("display","block").text(summary.summaryTitle);
3458 if(!summary.uniqueCategories()){
3459 }
3460 },
3461 /** -- */
3462 clearDropZones: function(){
3463 this.showDropZones = false;
3464 this.unregisterBodyCallbacks();
3465 this.DOM.root.attr("showdropzone",false);
3466 this.DOM.attribDragBox.style("display","none");
3467 if(this.movedSummary && !this.movedSummary.uniqueCategories()){
3468 // ?
3469 }
3470 this.movedSummary = undefined;
3471 },
3472 /** -- */
3473 setItemName: function(){
3474 this.DOM.recordName.html(this.itemName);
3475 },
3476 /** -- */
3477 insertAttributeList: function(){
3478 var me=this;
3479 var x=this.DOM.attributeList;
3480
3481 var newAttributes = x.selectAll(".nugget")
3482 .data(this.summaries).enter();
3483
3484 this.attribMoved = false;
3485
3486 var newSummaries = newAttributes
3487 .append("div").attr("class","nugget editableTextContainer")
3488 .each(function(summary){
3489 summary.DOM.nugget = d3.select(this);
3490 summary.refreshNuggetDisplay();
3491 })
3492 .attr("title",function(summary){
3493 if(summary.summaryColumn!==undefined) return summary.summaryColumn;
3494 })
3495 .attr("state",function(summary){
3496 if(summary.summaryColumn===null) return "custom"; // calculated
3497 if(summary.summaryTitle===summary.summaryColumn) return "exact";
3498 return "edited";
3499 })
3500 .attr("datatype",function(summary){
3501 return summary.getDataType();
3502 })
3503 .attr("aggr_initialized",function(summary){
3504 return summary.aggr_initialized;
3505 })
3506 .on("dblclick",function(summary){
3507 if(summary.uniqueCategories()){
3508 me.listDisplay.setRecordViewSummary(summary);
3509 me.listDisplay.updateVisibleIndex();
3510 me.listDisplay.updateItemVisibility(false,true);
3511
3512 if(me.listDisplay.textSearchSummary===null)
3513 me.listDisplay.setTextSearchSummary(summary);
3514 return;
3515 }
3516
3517 if(summary.hasTime!==undefined && summary.hasTime===true) {
3518 summary.addToPanel(me.panels.bottom);
3519 } else if(summary.type==='categorical') {
3520 summary.addToPanel(me.panels.left);
3521 summary.refreshLabelWidth();
3522 summary.updateBarPreviewScale2Active();
3523 } else if(summary.type==='interval') {
3524 summary.addToPanel(me.panels.right);
3525 me.listDisplay.addSortingOption(summary);
3526 }
3527 summary.refreshWidth();
3528 me.updateLayout();
3529 })
3530 .on("mousedown",function(summary){
3531 if(d3.event.which !== 1) return; // only respond to left-click
3532
3533 var _this = this;
3534 me.attribMoved = false;
3535 d3.select("body")
3536 .on("keydown", function(){
3537 if(event.keyCode===27){ // Escape key
3538 _this.removeAttribute("moved");
3539 me.clearDropZones();
3540 }
3541 })
3542 .on("mousemove", function(){
3543 if(!me.attribMoved){
3544 _this.setAttribute("moved","");
3545 me.prepareDropZones(summary,"attributePanel");
3546 me.attribMoved = true;
3547 }
3548 var mousePos = d3.mouse(me.DOM.root[0][0]);
3549 kshf.Util.setTransform(me.DOM.attribDragBox[0][0],
3550 "translate("+(mousePos[0]-20)+"px,"+(mousePos[1]+5)+"px)");
3551 d3.event.stopPropagation();
3552 d3.event.preventDefault();
3553 })
3554 .on("mouseup", function(){
3555 if(!me.attribMoved) return;
3556 _this.removeAttribute("moved");
3557 me.DOM.root.attr("drag_cursor",null);
3558 me.clearDropZones();
3559 d3.event.preventDefault();
3560 });
3561 d3.event.preventDefault();
3562 })
3563 .on("mouseup",function(summary){
3564 if(me.attribMoved===false) me.unregisterBodyCallbacks();
3565 })
3566 ;
3567
3568 var nuggetViz = newSummaries.append("span").attr("class","nuggetViz")
3569 .each(function(summary){
3570 this.tipsy = new Tipsy(this, {
3571 gravity: 'e', title: function(){
3572 if(!summary.aggr_initialized){
3573 return "Click to initialize";
3574 }
3575 return summary.getDataType();
3576 }
3577 })
3578 })
3579 .on("mousedown",function(summary){
3580 if(!summary.aggr_initialized){
3581 // stop dragging event start
3582 d3.event.stopPropagation();
3583 d3.event.preventDefault();
3584 }
3585 })
3586 .on("click",function(summary){
3587 if(!summary.aggr_initialized){
3588 summary.initializeAggregates();
3589 }
3590 });
3591
3592 nuggetViz.append("span").attr("class","nuggetInfo fa");
3593 var nuggetChart = nuggetViz.append("span").attr("class","nuggetChart");
3594 newSummaries.append("span").attr("class","summaryTitle editableText")
3595 .attr("contenteditable",false)
3596 .text(function(summary){ return summary.summaryTitle; })
3597 .on("blur",function(summary){
3598 this.parentNode.setAttribute("edittitle",false);
3599 this.setAttribute("contenteditable",false);
3600 me.changeSummaryName(summary.summaryTitle,this.textContent);
3601 d3.event.preventDefault();
3602 d3.event.stopPropagation();
3603 })
3604 .on("keydown",function(summary){
3605 if(d3.event.keyCode===13){ // ENTER
3606 this.parentNode.setAttribute("edittitle",false);
3607 this.setAttribute("contenteditable",false);
3608 me.changeSummaryName(summary.summaryTitle,this.textContent);
3609 d3.event.preventDefault();
3610 d3.event.stopPropagation();
3611 }
3612 })
3613 ;
3614 newSummaries.append("div").attr("class","fa editTextButton")
3615 .each(function(summary){
3616 this.tipsy = new Tipsy(this, {
3617 gravity: 'w', title: function(){
3618 var curState=this.parentNode.getAttribute("edittitle");
3619 if(curState===null || curState==="false"){
3620 return kshf.lang.cur.EditTitle;
3621 } else {
3622 return "OK";
3623 }
3624 }
3625 })
3626 })
3627 .on("mouseenter",function(){ this.tipsy.show(); })
3628 .on("mouseleave",function(){ this.tipsy.hide(); })
3629 .on("mousedown",function(summary){
3630 d3.event.stopPropagation();
3631 d3.event.preventDefault();
3632 })
3633 .on("click",function(summary){
3634 this.tipsy.hide();
3635 var parentDOM = d3.select(this.parentNode);
3636 var summaryTitle = parentDOM.select(".summaryTitle");
3637 var summaryTitle_DOM = parentDOM.select(".summaryTitle")[0][0];
3638
3639 var curState=this.parentNode.getAttribute("edittitle");
3640 if(curState===null || curState==="false"){
3641 this.parentNode.setAttribute("edittitle",true);
3642 summaryTitle_DOM.setAttribute("contenteditable",true);
3643 summaryTitle_DOM.focus();
3644 } else {
3645 this.parentNode.setAttribute("edittitle",false);
3646 summaryTitle_DOM.setAttribute("contenteditable",false);
3647 me.changeSummaryName(summary.summaryTitle,summaryTitle_DOM.textContent);
3648 }
3649 // stop dragging event start
3650 d3.event.stopPropagation();
3651 d3.event.preventDefault();
3652 });
3653
3654 newSummaries.append("div").attr("class","fa fa-code editCodeButton")
3655 .each(function(summary){
3656 this.tipsy = new Tipsy(this, {
3657 gravity: 'w', title: function(){ return "Edit Function"; }
3658 });
3659 })
3660 .on("mouseenter",function(){ this.tipsy.show(); })
3661 .on("mouseleave",function(){ this.tipsy.hide(); })
3662 .on("mousedown",function(summary){
3663 d3.event.stopPropagation();
3664 d3.event.preventDefault();
3665 })
3666 .on("click",function(summary){
3667 alert("TODO: Edit this:\n"+summary.getFuncString());
3668 // stop dragging event start
3669 d3.event.stopPropagation();
3670 d3.event.preventDefault();
3671 })
3672 ;
3673
3674 this.summaries.forEach(function(summary){
3675 if(summary.aggr_initialized) summary.refreshViz_Nugget();
3676 });
3677 },
3678 /** External method - used by demos to auto-select certain features on load -- */
3679 filterFacetAttribute: function(facetID, itemId){
3680 this.summaries[facetID].filterAttrib(this.summaries[facetID]._cats[itemId],"OR");
3681 },
3682 /** -- */
3683 clearFilters_All: function(force){
3684 var me=this;
3685 if(this.skipSortingFacet){
3686 // you can now sort the last filtered summary, attention is no longer there.
3687 this.skipSortingFacet.dirtySort = false;
3688 this.skipSortingFacet.DOM.root.attr("refreshSorting",false);
3689 }
3690 // clear all registered filters
3691 this.filters.forEach(function(filter){
3692 filter.clearFilter(false,false,false);
3693 })
3694 if(force!==false){
3695 this.items.forEach(function(item){ item.updateWanted_More(true); });
3696 this.update_itemsWantedCount();
3697 this.refresh_filterClearAll();
3698 this.updateAfterFilter(1); // more results
3699 if(sendLog){
3700 sendLog(kshf.LOG.FILTER_CLEAR_ALL);
3701 }
3702 }
3703 setTimeout( function(){ me.updateLayout_Height(); }, 1000); // update layout after 1.75 seconds
3704 },
3705 /** -- */
3706 refreshActiveItemCount: function(){
3707 var noneSelected = (this.itemsWanted_Aggregrate_Total===0);
3708 this.DOM.activeRecordCount
3709 .text(!noneSelected?this.itemsWanted_Aggregrate_Total:"No")
3710 .style("width",(noneSelected?"30":(this.itemsTotal_Aggregrate_Total.toString().length*11+5))+"px")
3711 ;
3712 },
3713 /** -- */
3714 update_itemsWantedCount: function(){
3715 this.itemsWantedCount = 0;
3716 this.itemsWanted_Aggregrate_Total = 0;
3717 this.items.forEach(function(item){
3718 if(item.isWanted){
3719 this.itemsWantedCount++;
3720 this.itemsWanted_Aggregrate_Total+=item.aggregate_Self;
3721 }
3722 },this);
3723
3724 this.refreshTotalViz();
3725 this.refreshActiveItemCount();
3726 },
3727 /** @arg resultChange:
3728 * - If positive, more results are shown
3729 * - If negative, fewer results are shown
3730 * - Else, no info is available. */
3731 updateAfterFilter: function (resultChange) {
3732 this.clearPreviewCompare();
3733 // basically, propogate call under every facet and listDisplay
3734 this.summaries.forEach(function(summary){
3735 if(summary.inBrowser()) summary.updateAfterFilter(resultChange);
3736 });
3737 this.listDisplay.updateAfterFilter();
3738
3739 if(this.updateCb) this.updateCb(this);
3740 },
3741 /** -- */
3742 refresh_filterClearAll: function(){
3743 var filteredCount=0;
3744 this.filters.forEach(function(filter){ filteredCount+=filter.isFiltered?1:0; })
3745 this.DOM.root.attr("isfiltered",filteredCount>0);
3746 },
3747 /** Ratio mode is when glyphs scale to their max */
3748 setRatioMode: function(how){
3749 this.ratioModeActive = how;
3750 this.DOM.root.attr("ratiomode",how);
3751 this.setPercentMode(how);
3752 this.summaries.forEach(function(summary){
3753 if(summary.inBrowser()) summary.refreshViz_All();
3754 });
3755 if(this.ratioModeCb) this.ratioModeCb.call(this,!how);
3756 },
3757 /** -- */
3758 setPercentMode: function(how){
3759 this.percentModeActive = how;
3760 this.DOM.root.attr("percentview",how);
3761 this.summaries.forEach(function(summary){
3762 if(summary.inBrowser()) summary.refreshMeasureLabel();
3763 });
3764 this.summaries.forEach(function(summary){
3765 if(summary.inBrowser()) summary.refreshViz_Axis();
3766 });
3767 },
3768 /** -- */
3769 clearPreviewCompare: function(){
3770 this.vizCompareActive = false;
3771 this.DOM.root.attr("previewcompare",false);
3772 this.summaries.forEach(function(summary){
3773 if(summary.inBrowser()) summary.refreshViz_Compare();
3774 });
3775 if(this.comparedAggregate){
3776 this.comparedAggregate.DOM.facet.setAttribute("compare",false);
3777 this.comparedAggregate = null;
3778 }
3779 if(this.previewCompareCb) this.previewCompareCb.call(this,true);
3780 },
3781 /** -- */
3782 setPreviewCompare: function(aggregate){
3783 if(this.comparedAggregate){
3784 var a=aggregate===this.comparedAggregate;
3785 this.clearPreviewCompare();
3786 if(a) return;
3787 }
3788 aggregate.DOM.facet.setAttribute("compare",true);
3789 this.comparedAggregate = aggregate;
3790 this.vizCompareActive = true;
3791 this.DOM.root.attr("previewcompare",true);
3792 this.summaries.forEach(function(summary){
3793 if(summary.inBrowser()) {
3794 summary.cachePreviewValue();
3795 summary.refreshViz_Compare();
3796 }
3797 });
3798 if(this.previewCompareCb) this.previewCompareCb.call(this,false);
3799 },
3800 /** -- */
3801 clearResultPreviews: function(){
3802 this.vizPreviewActive = false;
3803 this.DOM.root.attr("resultpreview",false);
3804 this.items.forEach(function(item){
3805 item.updatePreview_Cache = false;
3806 });
3807 this.itemCount_Previewed = 0;
3808 this.summaries.forEach(function(summary){
3809 if(summary.inBrowser()) summary.clearViz_Preview();
3810 });
3811 this.refreshTotalViz();
3812 if(this.previewCb) this.previewCb.call(this,true);
3813 },
3814 /** -- */
3815 refreshResultPreviews: function(){
3816 this.vizPreviewActive = true;
3817 this.DOM.root.attr("resultpreview",true);
3818 this.summaries.forEach(function(summary){
3819 if(summary.inBrowser()) summary.refreshViz_Preview();
3820 });
3821 this.refreshTotalViz();
3822 if(this.previewCb) this.previewCb.call(this,false);
3823 },
3824 /** -- */
3825 checkZoomLevel: function(){
3826 // Using devicePixelRatio works in Chrome and Firefox, but not in Safari
3827 // I have not tested IE yet.
3828 if(window.devicePixelRatio!==undefined){
3829 if(window.devicePixelRatio!==1 && window.devicePixelRatio!==2){
3830 var me=this;
3831 setTimeout(function(){
3832 me.showWarning("Please reset your browser zoom level for the best experience.")
3833 },1000);
3834 } else {
3835 this.hideWarning();
3836 }
3837 } else {
3838 this.hideWarning();
3839 }
3840 },
3841 /** -- */
3842 updateLayout: function(){
3843 if(this.loaded!==true) return;
3844 this.checkZoomLevel();
3845 this.divWidth = this.domWidth();
3846 this.updateLayout_Height();
3847 this.updateMiddlePanelWidth();
3848 },
3849 /** -- */
3850 updateLayout_Height: function(){
3851 var me=this;
3852 var divHeight_Total = this.domHeight();
3853
3854 var panel_Basic_height = Math.max(parseInt(this.DOM.panel_Basic.style("height")),24)+6;
3855
3856 divHeight_Total-=panel_Basic_height;
3857
3858 // initialize all summaries as not yet processed.
3859 this.summaries.forEach(function(summary){
3860 if(summary.inBrowser()) summary.heightProcessed = false;
3861 })
3862
3863 var bottomFacetsHeight=0;
3864 // process bottom summary too
3865 if(this.panels.bottom.summaries.length>0){
3866 var targetHeight=divHeight_Total/3;
3867 var maxHeight=0;
3868 // they all share the same target height
3869 this.panels.bottom.summaries.forEach(function(summary){
3870 targetHeight = Math.min(summary.getHeight_RangeMax(),targetHeight);
3871 summary.setHeight(targetHeight);
3872 summary.heightProcessed = true;
3873 bottomFacetsHeight += summary.getHeight();
3874 });
3875 }
3876
3877 var doLayout = function(sectionHeight,summaries){
3878 var finalPass = false;
3879 var processedFacets=0;
3880 var lastRound = false;
3881
3882 summaries.forEach(function(summary){
3883 // if it's already processed, log it
3884 if(summary.heightProcessed) processedFacets++;
3885 });
3886
3887 while(true){
3888 var remainingFacetCount = summaries.length-processedFacets;
3889 if(remainingFacetCount===0) {
3890 break;
3891 }
3892 var processedFacets_pre = processedFacets;
3893 summaries.forEach(function(summary){
3894 // in last round, if you have more attribs than visible, you may increase your height!
3895 if(lastRound===true && sectionHeight>5/*px*/ && !summary.collapsed && summary.catCount_Total!==undefined){
3896 if(summary.catCount_InDisplay<summary.catCount_Total){
3897 sectionHeight+=summary.getHeight();
3898 summary.setHeight(sectionHeight);
3899 sectionHeight-=summary.getHeight();
3900 return;
3901 }
3902 }
3903 if(summary.heightProcessed) return;
3904 if(remainingFacetCount===0) return;
3905 // auto-collapse summary if you do not have enough space
3906 var targetHeight = Math.floor(sectionHeight/remainingFacetCount);
3907 if(finalPass && targetHeight<summary.getHeight_RangeMin()){
3908 summary.setCollapsed(true);
3909 }
3910 if(!summary.collapsed){
3911 if(summary.getHeight_RangeMax()<=targetHeight){
3912 // You have 10 rows available, but I need max 5. Thanks,
3913 summary.setHeight(summary.getHeight_RangeMax());
3914 } else if(finalPass){
3915 summary.setHeight(targetHeight);
3916 } else if(lastRound){
3917 } else {
3918 return;
3919 }
3920 }
3921 sectionHeight-=summary.getHeight();
3922 summary.heightProcessed = true;
3923 processedFacets++;
3924 remainingFacetCount--;
3925 },this);
3926 finalPass = processedFacets_pre===processedFacets;
3927 if(lastRound===true) break;
3928 if(remainingFacetCount===0) lastRound = true;
3929 }
3930 return sectionHeight;
3931 };
3932
3933 var topPanelsHeight = divHeight_Total;
3934 if(this.panels.bottom.summaries.length>0) {
3935 /* if(this.showDropZones) {
3936 bottomFacetsHeight+=(1+this.panels.bottom.summaries.length)*36;
3937 }*/
3938 }
3939 this.panels.bottom.DOM.root.style("height",bottomFacetsHeight+"px");
3940
3941 topPanelsHeight-=bottomFacetsHeight;
3942 this.DOM.panelsTop.style("height",topPanelsHeight+"px");
3943
3944 // Left Panel
3945 if(this.panels.left.summaries.length>0){
3946 doLayout.call(this,topPanelsHeight,this.panels.left.summaries);
3947 }
3948 // Right Panel
3949 if(this.panels.right.summaries.length>0){
3950 doLayout.call(this,topPanelsHeight,this.panels.right.summaries);
3951 }
3952 // Middle Panel
3953 var midPanelHeight = 0;
3954 if(this.panels.middle.summaries.length>0){
3955 var panelHeight = topPanelsHeight;
3956 if(this.listDisplay.recordViewSummary){
3957 panelHeight -= 200; // give 200px fo the list display
3958 } else {
3959 panelHeight -= this.listDisplay.DOM.root[0][0].offsetHeight;
3960 }
3961 midPanelHeight = panelHeight - doLayout.call(this,panelHeight, this.panels.middle.summaries);
3962 }
3963
3964 // The part where summary DOM is updated
3965 this.summaries.forEach(function(summary){
3966 if(summary.inBrowser()) summary.refreshHeight();
3967 });
3968
3969 if(this.listDisplay){
3970 var listDivTop = 0;
3971 // get height of header
3972 var listHeaderHeight=this.listDisplay.DOM.recordViewHeader[0][0].offsetHeight;
3973 var listDisplayHeight = divHeight_Total-listDivTop-listHeaderHeight;
3974 if(this.panels.bottom.summaries.length>0){
3975 listDisplayHeight-=bottomFacetsHeight;
3976 }
3977 listDisplayHeight-=midPanelHeight;
3978 if(this.showDropZones && this.panels.middle.summaries.length===0)
3979 listDisplayHeight*=0.5;
3980 if(this.listDisplay.recordViewSummary!==null)
3981 this.listDisplay.DOM.listItemGroup.style("height",listDisplayHeight+"px");
3982 }
3983 },
3984 /** -- */
3985 updateMiddlePanelWidth: function(){
3986 // for some reason, on page load, this variable may be null. urgh.
3987 var widthMiddlePanel = this.divWidth;
3988 var marginLeft = 0;
3989 var marginRight = 0;
3990 if(this.panels.left.summaries.length>0){
3991 marginLeft=2;
3992 widthMiddlePanel-=this.panels.left.getWidth_Total()+2;
3993 }
3994 if(this.panels.right.summaries.length>0){
3995 marginRight=2;
3996 widthMiddlePanel-=this.panels.right.getWidth_Total()+2;
3997 }
3998 this.panels.left.DOM.root.style("margin-right",marginLeft+"px")
3999 this.panels.right.DOM.root.style("margin-left",marginRight+"px")
4000 this.panels.middle.setTotalWidth(widthMiddlePanel);
4001 this.panels.middle.updateSummariesWidth();
4002 this.panels.bottom.setTotalWidth(this.divWidth);
4003 this.panels.bottom.updateSummariesWidth();
4004 },
4005 /** -- */
4006 getFilterState: function() {
4007 var r={
4008 resultCt : this.itemsWantedCount,
4009 };
4010
4011 r.filtered="";
4012 r.selected="";
4013 this.filters.forEach(function(filter){
4014 if(filter.isFiltered){
4015 // set filtered to true for this summary ID
4016 if(r.filtered!=="") r.filtered+="x";
4017 r.filtered+=filter.id;
4018 // include filteing state of summary
4019 if(r.selected!=="") r.selected+="x";
4020 }
4021 },this);
4022 if(r.filtered==="") r.filtered=undefined;
4023 if(r.selected==="") r.selected=undefined;
4024
4025 return r;
4026 },
4027 /** -- */
4028 getFilterSummary: function(){
4029 var str="";
4030 this.filters.forEach(function(filter,i){
4031 if(!filter.isFiltered) return;
4032 if(filter.filterView_Detail){
4033 if(i!=0) str+=" & ";
4034 // if(filter.summary_header) str+= filter.summary_header+": ";
4035 str+=filter.filterView_Detail();
4036 }
4037 },this);
4038 return str;
4039 }
4040 };
4041
4042
4043
4044 // ***********************************************************************************************************
4045 // ***********************************************************************************************************
4046
4047 kshf.Summary_Base = function(){}
4048 kshf.Summary_Base.prototype = {
4049 initialize: function(browser,name,attribFunc){
4050 this.id = ++kshf.summaryCount;
4051 this.browser = browser;
4052 // this.parentFacet = options.parentFacet;
4053
4054 this.summaryTitle = name;
4055 this.summaryColumn = attribFunc?null:name;
4056 this.summaryFunc = attribFunc || function(){ return this[name]; };
4057
4058 this.chartScale_Measure = d3.scale.linear().clamp(true);
4059
4060 this.DOM = {};
4061 this.DOM.inited = false;
4062
4063 this.items = this.browser.items;
4064 if(this.items===undefined||this.items===null||this.items.length===0){
4065 alert("Error: Browser.items is not defined...");
4066 return;
4067 }
4068
4069 this.subFacets = [];
4070
4071 this.isRecordView = false;
4072
4073 // Only used when summary is inserted into browser
4074 this.collapsed_pre = false;
4075 this.collapsed = false;
4076
4077 this.aggr_initialized = false;
4078
4079 this.createSummaryFilter();
4080 },
4081 /** -- */
4082 setSummaryName: function(name){
4083 this.summaryTitle = name;
4084 if(this.DOM.summaryTitle_text){
4085 this.DOM.summaryTitle_text.text(this.summaryTitle);
4086 }
4087 this.summaryFilter._refreshFilterSummary();
4088 // This summary may be used for sorting options. Refresh the list
4089 if(this.browser.listDisplay){
4090 this.browser.listDisplay.refreshSortingOptions();
4091 }
4092 if(this.isTextSearch){
4093 this.browser.listDisplay.DOM.recordTextSearch.select("input")
4094 .attr("placeholder",kshf.lang.cur.Search+": "+this.summaryTitle);
4095 }
4096 if(this.sortFunc){
4097 this.browser.listDisplay.refreshSortingOptions();
4098 }
4099 if(this.DOM.nugget){
4100 this.DOM.nugget.select(".summaryTitle").text(this.summaryTitle);
4101 this.DOM.nugget.attr("state",function(summary){
4102 if(summary.summaryColumn===null) return "custom"; // calculated
4103 if(summary.summaryTitle===summary.summaryColumn) return "exact";
4104 return "edited";
4105 });
4106 }
4107 },
4108 /** -- */
4109 getDataType: function(){
4110 if(this.type==='categorical') {
4111 var str="categorical";
4112 if(!this.aggr_initialized) return str+=" uninitialized";
4113 if(this.uniqueCategories()) str+=" unique";
4114 str+=this.hasMultiValueItem?" multivalue":" singlevalue";
4115 return str;
4116 }
4117 if(this.type==='interval') {
4118 if(!this.aggr_initialized) return str+=" uninitialized";
4119 if(this.hasTime) return "interval time";
4120 return "interval numeric";
4121 //
4122 if(this.hasFloat) return "floating";
4123 return "integer";
4124 }
4125 return "?";
4126 },
4127 /** -- */
4128 destroy: function(){
4129 delete this.browser.summaries_by_name[this.summaryTitle];
4130 if(this.summaryColumn)
4131 delete this.browser.summaries_by_name[this.summaryColumn];
4132 this.browser.removeSummary(this);
4133 if(this.DOM.root){
4134 this.DOM.root[0][0].parentNode.removeChild(this.DOM.root[0][0]);
4135 }
4136 },
4137 /** -- */
4138 inBrowser: function(){
4139 return this.panel!==undefined;
4140 },
4141 /** -- */
4142 hasEntityParent: function(){
4143 if(this.parentFacet===undefined) return false;
4144 return this.parentFacet.hasCategories();
4145 },
4146 /** -- */
4147 hasSubFacets: function(){
4148 return this.subFacets.length>0;
4149 },
4150 /** -- */
4151 clearDOM: function(){
4152 var dom = this.DOM.root[0][0];
4153 dom.parentNode.removeChild(dom);
4154 },
4155 /** -- */
4156 getWidth: function(){
4157 return this.panel.getWidth_Total()-this.getWidth_LeftOffset();
4158 },
4159 /** -- */
4160 getWidth_LeftOffset: function(){
4161 return (this.parentFacet)?17:0;
4162 },
4163 /** -- */
4164 uniqueCategories: function(){
4165 if(this.browser && this.browser.items[0].idIndex===this.summaryTitle){
4166 return true;
4167 }
4168 return false;
4169 },
4170 /** -- */
4171 isFiltered: function(){
4172 return this.summaryFilter.isFiltered;
4173 },
4174 getFuncString: function(){
4175 var str=this.summaryFunc.toString();
4176 // replace the beginning, and the end
4177 return str.replace(/function\s*\(\w*\)\s*{\s*/,"").replace(/}$/,"");
4178 },
4179 /** -- */
4180 addToPanel: function(panel, index){
4181 if(index===undefined) index = panel.summaries.length;
4182 if(this.panel===undefined){
4183 this.panel = panel;
4184 } else if(this.panel && this.panel!==panel){
4185 this.panel.removeSummary(this);
4186 this.panel = panel;
4187 } else{ // this.panel === panel
4188 var curIndex;
4189 // this.panel is the same as panel...
4190 this.panel.summaries.forEach(function(s,i){
4191 if(s===this) curIndex = i;
4192 },this);
4193 // inserting the summary to the same index as current one
4194 if(curIndex===index) return;
4195 var toRemove=this.panel.DOM.root.selectAll(".dropZone_between_wrapper")[0][curIndex];
4196 toRemove.parentNode.removeChild(toRemove);
4197 }
4198 var beforeDOM = this.panel.DOM.root.selectAll(".dropZone_between_wrapper")[0][index];
4199 if(this.DOM.root){
4200 this.DOM.root.style("display","");
4201 panel.DOM.root[0][0].insertBefore(this.DOM.root[0][0],beforeDOM);
4202 } else {
4203 this.initDOM(beforeDOM);
4204 }
4205 panel.addSummary(this,index);
4206 this.panel.refreshDropZoneIndex();
4207 this.refreshNuggetDisplay();
4208 },
4209 /** -- */
4210 refreshNuggetDisplay: function(){
4211 if(this.DOM.nugget===undefined) return;
4212 var me=this;
4213 var nuggetHidden = (this.panel||this.isRecordView);
4214 if(nuggetHidden){
4215 this.DOM.nugget.attr('anim','disappear');
4216 setTimeout(function(){
4217 me.DOM.nugget.style("display","none");
4218 },800);
4219 } else {
4220 this.DOM.nugget.style("display","block");
4221 setTimeout(function(){
4222 me.DOM.nugget.attr('anim','appear');
4223 },300);
4224 }
4225 },
4226 /** -- */
4227 removeFromPanel: function(){
4228 if(this.panel===undefined) return;
4229 this.panel.removeSummary(this);
4230 this.refreshNuggetDisplay();
4231 },
4232 /** -- */
4233 insertRoot: function(beforeDOM){
4234 this.DOM.root = this.panel.DOM.root.insert("div", function(){ return beforeDOM; });
4235 this.DOM.root
4236 .attr("class","kshfChart")
4237 .attr("chart_id",this.id)
4238 .attr("collapsed",this.collapsed)
4239 .attr("filtered",false);
4240 },
4241 /** -- */
4242 insertHeader: function(){
4243 var me = this;
4244
4245 this.DOM.headerGroup = this.DOM.root.append("div").attr("class","headerGroup")
4246 .on("mousedown", function(){
4247 if(d3.event.which !== 1) return; // only respond to left-click
4248 if(!me.browser.attribsShown) {
4249 d3.event.preventDefault();
4250 return;
4251 }
4252 var _this = this;
4253 var _this_nextSibling = _this.parentNode.nextSibling;
4254 var _this_previousSibling = _this.parentNode.previousSibling;
4255 var moved = false;
4256 d3.select("body")
4257 .style('cursor','move')
4258 .on("keydown", function(){
4259 if(event.keyCode===27){ // ESP key
4260 _this.style.opacity = null;
4261 me.browser.clearDropZones();
4262 }
4263 })
4264 .on("mousemove", function(){
4265 if(!moved){
4266 _this_nextSibling.style.display = "none";
4267 _this_previousSibling.style.display = "none";
4268 _this.parentNode.style.opacity = 0.5;
4269 me.browser.prepareDropZones(me,"browser");
4270 moved = true;
4271 }
4272 var mousePos = d3.mouse(me.browser.DOM.root[0][0]);
4273 kshf.Util.setTransform(me.browser.DOM.attribDragBox[0][0],
4274 "translate("+(mousePos[0]-20)+"px,"+(mousePos[1]+5)+"px)");
4275 d3.event.stopPropagation();
4276 d3.event.preventDefault();
4277 })
4278 .on("mouseup", function(){
4279 // Mouse up on the body
4280 me.browser.clearDropZones();
4281 if(me.panel!==undefined || true) {
4282 _this.parentNode.style.opacity = null;
4283 _this_nextSibling.style.display = "";
4284 _this_previousSibling.style.display = "";
4285 }
4286 d3.event.preventDefault();
4287 });
4288 d3.event.preventDefault();
4289 })
4290 ;
4291
4292 // this.DOM.headerGroup.append("div").attr("class","border_line");
4293
4294 var header_display_control = this.DOM.headerGroup.append("span").attr("class","header_display_control");
4295
4296 header_display_control.append("span").attr("class","buttonSummaryCollapse fa fa-collapse")
4297 .each(function(){
4298 this.tipsy = new Tipsy(this, {
4299 gravity: function(){ return me.panelOrder!==0?'sw':'nw'; },
4300 title: function(){ return me.collapsed?kshf.lang.cur.OpenSummary:kshf.lang.cur.MinimizeSummary; }
4301 })
4302 })
4303 .on("mouseover",function(){ this.tipsy.show(); })
4304 .on("mouseout" ,function(){ this.tipsy.hide(); })
4305 .on("mousedown", function(){
4306 d3.event.preventDefault();
4307 d3.event.stopPropagation();
4308 })
4309 .on("click",function(){
4310 this.tipsy.hide();
4311 me.setCollapsedAndLayout(!me.collapsed); // flip
4312 })
4313 ;
4314 header_display_control.append("span").attr("class","buttonSummaryExpand fa fa-arrows-alt")
4315 .each(function(){
4316 this.tipsy = new Tipsy(this, {
4317 gravity: function(){ return me.panelOrder!==0?'sw':'nw'; },
4318 title: function(){ return kshf.lang.cur.MaximizeSummary; }
4319 })
4320 })
4321 .on("mouseover",function(){ this.tipsy.show(); })
4322 .on("mouseout" ,function(){ this.tipsy.hide(); })
4323 .on("mousedown", function(){
4324 d3.event.preventDefault();
4325 d3.event.stopPropagation();
4326 })
4327 .on("click",function(){
4328 me.panel.collapseAllSummaries();
4329 me.setCollapsedAndLayout(false); // uncollapse this one
4330 })
4331 ;
4332 header_display_control.append("span").attr("class","buttonSummaryRemove fa fa-remove")
4333 .each(function(){
4334 this.tipsy = new Tipsy(this, {
4335 gravity: function(){ return me.panelOrder!==0?'sw':'nw'; },
4336 title: function(){ return kshf.lang.cur.RemoveSummary; }
4337 })
4338 })
4339 .on("mouseover",function(){ this.tipsy.show(); })
4340 .on("mouseout" ,function(){ this.tipsy.hide(); })
4341 .on("mousedown", function(){
4342 d3.event.preventDefault();
4343 d3.event.stopPropagation();
4344 })
4345 .on("click",function(){
4346 // Clique control
4347 if(false){
4348 me.parentFacet.show_cliques = !me.parentFacet.show_cliques;
4349 me.parentFacet.DOM.root.attr("show_cliques",me.parentFacet.show_cliques);
4350 } else {
4351 me.removeFromPanel();
4352 me.clearDOM();
4353 me.browser.updateLayout();
4354 }
4355 })
4356 ;
4357
4358 this.DOM.summaryTitle = this.DOM.headerGroup.append("span")
4359 .attr("class","summaryTitle editableTextContainer")
4360 .attr("edittitle",false)
4361 .on("click",function(){ if(me.collapsed) me.setCollapsedAndLayout(false); })
4362 ;
4363
4364 this.DOM.summaryTitle.append("span").attr("class","chartFilterButtonParent").append("div")
4365 .attr("class","chartClearFilterButton rowFilter alone")
4366 .each(function(d){
4367 this.tipsy = new Tipsy(this, {
4368 gravity: function(){ return me.panelOrder!==0?'s':'n'; },
4369 title: function(){ return kshf.lang.cur.RemoveFilter; }
4370 })
4371 })
4372 .on("mouseover",function(){ this.tipsy.show(); })
4373 .on("mouseout" ,function(){ this.tipsy.hide(); })
4374 .on("mousedown", function(){
4375 d3.event.preventDefault();
4376 d3.event.stopPropagation();
4377 })
4378 .on("click", function(d,i){
4379 this.tipsy.hide();
4380 me.summaryFilter.clearFilter();
4381 if(sendLog) sendLog(kshf.LOG.FILTER_CLEAR_X, {id:me.summaryFilter.id});
4382 })
4383 .append("span").attr("class","fa fa-times")
4384 ;
4385
4386 this.DOM.summaryTitle_text = this.DOM.summaryTitle.append("span").attr("class","summaryTitle_text editableText")
4387 .attr("contenteditable",false)
4388 .on("mousedown", function(){
4389 // stop dragging event start
4390 d3.event.stopPropagation();
4391 })
4392 .on("blur",function(){
4393 this.parentNode.setAttribute("edittitle",false);
4394 this.setAttribute("contenteditable", false);
4395 me.browser.changeSummaryName(me.summaryTitle,this.textContent);
4396 })
4397 .on("keydown",function(){
4398 if(event.keyCode===13){ // ENTER
4399 this.parentNode.setAttribute("edittitle",false);
4400 this.setAttribute("contenteditable", false);
4401 me.browser.changeSummaryName(me.summaryTitle,this.textContent);
4402 }
4403 })
4404 .html((this.parentFacet && this.parentFacet.hasCategories())?
4405 ("<i class='fa fa-hand-o-up'></i> <span style='font-weight:500'>"+
4406 this.parentFacet.summaryTitle+":</span> "+" "+this.summaryTitle):
4407 this.summaryTitle
4408 );
4409
4410 this.DOM.summaryTitle.append("span")
4411 .attr("class","editTextButton fa")
4412 .each(function(summary){
4413 this.tipsy = new Tipsy(this, {
4414 gravity: 'w', title: function(){
4415 var curState=this.parentNode.getAttribute("edittitle");
4416 if(curState===null || curState==="false"){
4417 return kshf.lang.cur.EditTitle;
4418 } else {
4419 return "OK";
4420 }
4421 }
4422 })
4423 })
4424 .on("mouseenter",function(){ this.tipsy.show(); })
4425 .on("mouseleave",function(){ this.tipsy.hide(); })
4426 .on("mousedown", function(){
4427 // stop dragging event start
4428 d3.event.stopPropagation();
4429 d3.event.preventDefault();
4430 })
4431 .on("click",function(){
4432 var curState=this.parentNode.getAttribute("edittitle");
4433 if(curState===null || curState==="false"){
4434 this.parentNode.setAttribute("edittitle",true);
4435 var parentDOM = d3.select(this.parentNode);
4436 var v=parentDOM.select(".summaryTitle_text")[0][0];
4437 v.setAttribute("contenteditable",true);
4438 v.focus();
4439 } else {
4440 this.parentNode.setAttribute("edittitle",false);
4441 var parentDOM = d3.select(this.parentNode);
4442 var v=parentDOM.select(".summaryTitle_text")[0][0];
4443 v.setAttribute("contenteditable",false);
4444 me.browser.changeSummaryName(me.summaryTitle,v.textContent);
4445 }
4446 });
4447
4448 this.DOM.facetIcons = this.DOM.headerGroup.append("span").attr("class","facetIcons");
4449 this.DOM.facetIcons.append("span").attr("class", "hasMultiMappings fa fa-tags")
4450 .each(function(d){
4451 this.tipsy = new Tipsy(this, {
4452 gravity: 'ne', title: function(){
4453 return "Multiple "+me.summaryTitle+" possible.<br>Click to show relations.";
4454 }
4455 });
4456 })
4457 .on("mouseover",function(d){
4458 this.tipsy.show();
4459 })
4460 .on("mouseout" ,function(d){
4461 this.tipsy.hide();
4462 })
4463 .on("click",function(d){
4464 me.show_cliques = !me.show_cliques;
4465 me.DOM.root.attr("show_cliques",me.show_cliques);
4466 })
4467 ;
4468 // this.DOM.headerGroup.append("div").attr("class","border_line border_line_bottom");
4469
4470 this.setSummaryDescription(this.summaryDescription);
4471 },
4472 /** -- */
4473 setSummaryDescription: function(description){
4474 if(this.DOM.facetIcons===undefined) return;
4475 if(description===undefined) return;
4476 if(description===null) return;
4477 this.DOM.facetIcons.append("span").attr("class","summaryDescription fa fa-info-circle")
4478 .each(function(d){
4479 this.tipsy = new Tipsy(this, { gravity: 'ne', title: function(){ return description;} });
4480 })
4481 .on("mouseover",function(d){ this.tipsy.show(); })
4482 .on("mouseout" ,function(d){ this.tipsy.hide(); });
4483 },
4484 /** -- */
4485 insertChartAxis_Measure: function(dom, pos1, pos2){
4486 var me=this;
4487 this.DOM.chartAxis_Measure = dom.append("div").attr("class","chartAxis_Measure");
4488 this.DOM.chartAxis_Measure.append("span").attr("class","percentSign")
4489 .each(function(){
4490 this.tipsy = new Tipsy(this, {
4491 gravity: pos1, title: function(){
4492 return (me.browser.percentModeActive?"# "+kshf.lang.cur.Absolute:"% "+kshf.lang.cur.Percent)+
4493 " <span class='fa fa-eye'></span>";
4494 },
4495 })
4496 })
4497 .on("click",function(){
4498 me.browser.setPercentMode(!me.browser.percentModeActive);
4499 this.tipsy.hide();
4500 })
4501 .on("mouseover",function(){
4502 me.browser.DOM.root.selectAll(".percentSign").attr("highlight",true);
4503 this.tipsy.show();
4504 })
4505 .on("mouseout",function(){
4506 me.browser.DOM.root.selectAll(".percentSign").attr("highlight",false);
4507 this.tipsy.hide();
4508 });
4509 this.DOM.chartAxis_Measure.append("span").attr("class","chartAxis_Measure_background")
4510 .each(function(){
4511 this.tipsy = new Tipsy(this, {
4512 gravity: pos2, title: function(){
4513 return (me.browser.ratioModeActive?kshf.lang.cur.Absolute:kshf.lang.cur.Relative)+" "+
4514 kshf.lang.cur.Width+
4515 " <span class='fa fa-arrows-h'></span>";
4516 },
4517 })
4518 })
4519 .on("click",function(){ me.browser.setRatioMode(!me.browser.ratioModeActive); })
4520 .on("mouseover",function(){
4521 me.browser.DOM.root.selectAll(".chartAxis_Measure_background").attr("highlight",true);
4522 this.tipsy.show();
4523 })
4524 .on("mouseout",function(){
4525 me.browser.DOM.root.selectAll(".chartAxis_Measure_background").attr("highlight",false);
4526 this.tipsy.hide();
4527 });
4528 },
4529 /** -- */
4530 setCollapsedAndLayout: function(hide){
4531 this.setCollapsed(hide);
4532 this.browser.updateLayout_Height();
4533 if(sendLog) sendLog( (hide===true?kshf.LOG.FACET_COLLAPSE:kshf.LOG.FACET_SHOW), {id:this.id} );
4534 },
4535 /** -- */
4536 unrollCollapsed: function(){
4537 this.setCollapsed(this.collapsed_pre);
4538 },
4539 /** -- */
4540 setCollapsed: function(v){
4541 this.collapsed_pre = this.collapsed;
4542 this.collapsed = v;
4543 if(this.DOM.root){
4544 this.DOM.root.attr("collapsed",this.collapsed);
4545 if(!this.collapsed) {
4546 this.clearViz_Preview();
4547 this.refreshViz_All();
4548 } else {
4549 this.DOM.headerGroup.select(".buttonSummaryExpand").style("display","none");
4550 }
4551 }
4552 return this; // allow chaining
4553 },
4554 };
4555
4556 kshf.Summary_Categorical = function(){};
4557 kshf.Summary_Categorical.prototype = new kshf.Summary_Base();
4558 var Summary_Categorical_functions = {
4559 /** -- */
4560 initialize: function(browser,name,attribFunc){
4561 kshf.Summary_Base.prototype.initialize.call(this,browser,name,attribFunc);
4562 this.type='categorical';
4563
4564 this.heightRow_category = 18;
4565
4566 this.show_cliques = false;
4567
4568 this.scrollTop_cache=0;
4569 this.cat_InDisplay_First = 0;
4570 this.configRowCount=0;
4571
4572 // These settings affect the categories
4573 this.minAggrValue=1;
4574 this.removeInactiveCats = true;
4575
4576 this.catSortBy = [];
4577
4578 this.isLinked = false; // TODO: document / update
4579
4580 this.setCatLabel("id");
4581
4582 if(this.items.length<=1000) this.initializeAggregates();
4583 },
4584 /** -- */
4585 initializeAggregates: function(){
4586 if(this.aggr_initialized) return;
4587 if(this.catTableName===undefined){
4588 this.catTableName = this.summaryTitle+"_h_"+this.id;
4589 this.browser.createTableFromTable(this.items, this.catTableName, this.summaryFunc);
4590 }
4591 if(kshf.dt[this.catTableName]===undefined){
4592 return false; // Cannot initialize, table not defined.
4593 }
4594 this.mapToAggregates();
4595 if(this.catSortBy.length===0) this.setSortingOpts();
4596 if(this.getMaxAggr_Total()!=1 && this._cats.length>1) this.sortCategories();
4597
4598 this.aggr_initialized = true;
4599 this.refreshViz_Nugget();
4600 },
4601 /** -- */
4602 refreshViz_Nugget: function(){
4603 if(this.DOM.nugget===undefined) return;
4604 var nuggetChart = this.DOM.nugget.select(".nuggetChart");
4605
4606 this.DOM.nugget
4607 .attr("aggr_initialized",this.aggr_initialized)
4608 .attr("datatype",this.getDataType());
4609
4610 if(!this.aggr_initialized) return;
4611
4612 if(this.uniqueCategories()){
4613 this.DOM.nugget.select(".nuggetInfo").html("<span class='fa fa-tag'></span><br>Unique");
4614 nuggetChart.style("display",'none');
4615 return;
4616 }
4617
4618 var totalWidth= 25;
4619 var maxAggregate_Total = this.getMaxAggr_Total();
4620 nuggetChart.selectAll(".nuggetBar").data(this._cats).enter()
4621 .append("span").attr("class","nuggetBar")
4622 .style("width",function(cat){ return totalWidth*(cat.items.length/maxAggregate_Total)+"px"; });
4623
4624 this.DOM.nugget.select(".nuggetInfo").html(
4625 "<span class='fa fa-tag"+(this.hasMultiValueItem?"s":"")+"'></span><br>"+
4626 this._cats.length+"<br>rows<br>");
4627 },
4628 /** -- */
4629 getHeight: function(){
4630 if(!this.hasCategories() || this.collapsed) return this.getHeight_Header();
4631 return this.getHeight_Header() + this.getHeight_Content();
4632 },
4633 /** -- */
4634 getHeight_Header: function(){
4635 if(this._height_header==undefined) {
4636 this._height_header = this.DOM.headerGroup[0][0].offsetHeight;
4637 if(this.hasSubFacets()){
4638 this._height_header+=2;
4639 }
4640 }
4641 return this._height_header;
4642 },
4643 /** -- */
4644 getHeight_RangeMax: function(){
4645 if(!this.hasCategories()) return this.heightRow_category;
4646 return this.getHeight_Header()+(this.configRowCount+this.catCount_Visible+1)*this.heightRow_category-1;
4647 },
4648 /** -- */
4649 getHeight_RangeMin: function(){
4650 if(!this.hasCategories()) return this.getHeight_Header();
4651 return this.getHeight_Header()+this.getHeight_Config()+(Math.min(this.catCount_Visible,2)+1)*this.heightRow_category;
4652 },
4653 /** -- */
4654 getHeight_Config: function(){
4655 var r=0;
4656 if(this.configRowCount!=0) r+=1; // bottom border : 1 px
4657 if(this.showTextSearch) r+=18;
4658 if(this.catSortBy.length>1) r+=17;
4659 return r;
4660 },
4661 /** -- */
4662 getHeight_Bottom: function(){
4663 if(!this.areAllCatsInDisplay() || !this.panel.hideBarAxis || this.catCount_Total>4) return 18;
4664 return 0;
4665 },
4666 /** -- */
4667 getHeight_Content: function(){
4668 return this.attribHeight + this.getHeight_Config() + this.getHeight_Bottom();
4669 },
4670 /** -- */
4671 getWidth_Label: function(){
4672 return this.panel.width_catLabel-this.getWidth_LeftOffset();
4673 },
4674 /** -- */
4675 areAllCatsInDisplay: function(){
4676 return this.catCount_Visible===this.catCount_InDisplay;
4677 },
4678 /** -- */
4679 hasCategories: function(){
4680 if(this._cats && this._cats.length===0) return false;
4681 return this.summaryFunc!==undefined;
4682 },
4683 /** -- */
4684 uniqueCategories: function(){
4685 return this.getMaxAggr_Total()===1;
4686 },
4687 /** -- */
4688 insertSortingOption: function(opt){
4689 this.catSortBy.push( this.prepareSortingOption(opt) );
4690 },
4691 /** -- */
4692 prepareSortingOption: function(opt){
4693 opt.inverse = opt.inverse || false; // Default is false
4694 if(opt.value){
4695 if(typeof(opt.value)==="string"){
4696 opt.name = x;
4697 var x = opt.value;
4698 opt.value = function(){ return this[x]; }
4699 } else if(typeof(opt.value)==="function"){
4700 if(opt.name===undefined) opt.name = "custom"
4701 }
4702 if(opt.no_resort===undefined) opt.no_resort = true;
4703 } else {
4704 opt.name = opt.name || "# of Active";
4705 }
4706 if(opt.no_resort===undefined) opt.no_resort = (this.catCount_Total<=4);
4707 return opt;
4708 },
4709 /** -- */
4710 setSortingOpts: function(opts){
4711 this.catSortBy = opts || {};
4712 if(!Array.isArray(this.catSortBy)){
4713 this.catSortBy = [this.catSortBy];
4714 }
4715
4716 this.catSortBy.forEach(function(opt,i){
4717 if(typeof opt==="string" || typeof opt==="function"){
4718 this.catSortBy[i] = {value: opt};
4719 }
4720 },this);
4721
4722 this.catSortBy.forEach(function(opt){
4723 this.prepareSortingOption(opt);
4724 },this);
4725
4726 this.catSortBy_Active = this.catSortBy[0];
4727
4728 this.updateCatSorting(0,true,true);
4729 this.refreshSortOptions();
4730 this.refreshSortButton();
4731 },
4732 /** -- */
4733 setCatLabel: function( catLabel ){
4734 if(typeof(catLabel)==="function"){
4735 this.catLabel = catLabel;
4736 } else if(typeof(catLabel)==="string" || typeof(catLabel)=="number"){
4737 var x = catLabel;
4738 this.catLabel = function(){ return this[x]; };
4739 } else {
4740 return;
4741 }
4742 var me=this;
4743 if(this.DOM.theLabel)
4744 this.DOM.theLabel.html(function(cat){ return me.catLabel.call(cat.data); });
4745 },
4746 /** -- */
4747 setCatTooltip: function( catTooltip ){
4748 if(typeof(catTooltip)==="function"){
4749 this.catTooltip = catTooltip;
4750 } else if(typeof(catTooltip)==="string"){
4751 var x = catTooltip;
4752 this.catTooltip = function(){ return this[x]; };
4753 } else {
4754 return;
4755 }
4756 if(this.DOM.cats)
4757 this.DOM.cats.attr("title",function(cat){ return me.catTooltip.call(cat.data); });
4758 },
4759 /** -- */
4760 setCatTable: function(tableName){
4761 this.catTableName = tableName;
4762 if(tableName===""){
4763 this.catTableName = this.summaryTitle+"_h_"+this.id;
4764 } else {
4765 if(this.catTableName===this.browser.primaryTableName){
4766 this.isLinked=true;
4767 //this.browser.listDef.hasLinkedItems = true;
4768 this.catTableName = this.summaryTitle+"_h_"+this.id;
4769 kshf.dt_id[this.catTableName] = kshf.dt_id[this.browser.primaryTableName];
4770 kshf.dt[this.catTableName] = this.items.slice();
4771 }
4772 }
4773 if(this.aggr_initialized){
4774 this.mapToAggregates();
4775 this.updateCats();
4776 }
4777 },
4778 /** -- */
4779 createSummaryFilter: function(){
4780 var me=this;
4781 this.summaryFilter = this.browser.createFilter({
4782 parentSummary: this,
4783 onClear: function(summary){
4784 summary.clearCatTextSearch();
4785 summary.unselectAllAttribs();
4786 summary._update_Selected();
4787 },
4788 onFilter: function(summary){
4789 // at least one category is selected in some modality (and/ or/ not)
4790 summary._update_Selected();
4791
4792 var filterId = this.id;
4793
4794 summary.items.forEach(function(item){
4795 var recordVal_s=item.mappedDataCache[filterId];
4796
4797 if(recordVal_s===null){
4798 // survives if AND and OR is not selected
4799 item.setFilterCache(filterId, this.selected_AND.length===0 && this.selected_OR.length===0 );
4800 return;
4801 }
4802
4803 // Check NOT selections - If any mapped item is NOT, return false
4804 // Note: no other filtering depends on NOT state.
4805 // This is for ,multi-level filtering using not query
4806 /* if(this.selected_NOT.length>0){
4807 if(!recordVal_s.every(function(item){
4808 return !item.is_NOT() && item.isWanted;
4809 })){
4810 item.setFilterCache(filterId,false); return;
4811 }
4812 }*/
4813
4814 // If any of the record values are selected with NOT, the item will be removed
4815 if(this.selected_NOT.length>0){
4816 if(!recordVal_s.every(function(val){ return !val.is_NOT(); })){
4817 item.setFilterCache(filterId,false); return;
4818 }
4819 }
4820 // All AND selections must be among the record values
4821 if(this.selected_AND.length>0){
4822 // Compute the number of record values selected with AND.
4823 var t=0;
4824 recordVal_s.forEach(function(m){ if(m.is_AND()) t++; })
4825 if(t!==this.selected_AND.length){
4826 item.setFilterCache(filterId,false); return;
4827 }
4828 }
4829 // One of the OR selections must be among the item values
4830 // Check OR selections - If any mapped item is OR, return true
4831 if(this.selected_OR.length>0){
4832 item.setFilterCache(filterId, recordVal_s.some(function(d){return (d.is_OR());}) );
4833 return;
4834 }
4835 // only NOT selection
4836 item.setFilterCache(filterId,true);
4837 }, this);
4838 },
4839 filterView_Detail: function(){
4840 // 'this' is the Filter
4841 // go over all items and prepare the list
4842 var selectedItemsText="";
4843 var catTooltip = me.catTooltip;
4844
4845 var totalSelectionCount = this.selectedCount_Total();
4846
4847 if(me.subFacets.some(function(summary){ return summary.isFiltered();})){
4848 return " <i class='fa fa-hand-o-right'></i>";;
4849 }
4850
4851 var query_and = " <span class='AndOrNot AndOrNot_And'>"+kshf.lang.cur.And+"</span> ";
4852 var query_or = " <span class='AndOrNot AndOrNot_Or'>"+kshf.lang.cur.Or+"</span> ";
4853 var query_not = " <span class='AndOrNot AndOrNot_Not'>"+kshf.lang.cur.Not+"</span> ";
4854
4855 if(totalSelectionCount>4 || this.linkFilterSummary){
4856 selectedItemsText = "<b>"+totalSelectionCount+"</b> selected";
4857 // Note: Using selected because selections can include not, or,and etc (a variety of things)
4858 } else {
4859 var selectedItemsCount=0;
4860
4861 // OR selections
4862 if(this.selected_OR.length>0){
4863 var useBracket_or = this.selected_AND.length>0 || this.selected_NOT.length>0;
4864 if(useBracket_or) selectedItemsText+="[";
4865 // X or Y or ....
4866 this.selected_OR.forEach(function(attrib,i){
4867 selectedItemsText+=((i!==0 || selectedItemsCount>0)?query_or:"")+"<span class='attribName'>"
4868 +me.catLabel.call(attrib.data)+"</span>";
4869 selectedItemsCount++;
4870 });
4871 if(useBracket_or) selectedItemsText+="]";
4872 }
4873 // AND selections
4874 this.selected_AND.forEach(function(attrib,i){
4875 selectedItemsText+=((selectedItemsText!=="")?query_and:"")
4876 +"<span class='attribName'>"+me.catLabel.call(attrib.data)+"</span>";
4877 selectedItemsCount++;
4878 });
4879 // NOT selections
4880 this.selected_NOT.forEach(function(attrib,i){
4881 selectedItemsText+=query_not+"<span class='attribName'>"+me.catLabel.call(attrib.data)+"</span>";
4882 selectedItemsCount++;
4883 });
4884 }
4885 if(this.linkFilterSummary){
4886 selectedItemsText+= "<i class='fa fa-hand-o-left'></i><br> ["+this.linkFilterSummary+"]";
4887 }
4888
4889 return selectedItemsText;
4890 }
4891 });
4892
4893 this.summaryFilter.selected_AND = [];
4894 this.summaryFilter.selected_OR = [];
4895 this.summaryFilter.selected_NOT = [];
4896 this.summaryFilter.selectedCount_Total = function(){
4897 return this.selected_AND.length + this.selected_OR.length + this.selected_NOT.length;
4898 };
4899 this.summaryFilter.selected_Any = function(){
4900 return this.selected_AND.length>0 || this.selected_OR.length>0 || this.selected_NOT.length>0;
4901 };
4902 this.summaryFilter.selected_All_clear = function(){
4903 kshf.Util.clearArray(this.selected_AND);
4904 kshf.Util.clearArray(this.selected_OR);
4905 kshf.Util.clearArray(this.selected_NOT);
4906 };
4907 },
4908 /** -- */
4909 insertSubFacets: function(){
4910 this.DOM.subFacets=this.DOM.root.append("div").attr("class","subFacets");
4911
4912 this.DOM.subFacets.append("span").attr("class","facetGroupBar").append("span").attr("class","facetGroupBarSub");
4913
4914 if(!this.hasCategories()){
4915 this.options.facets.forEach(function(facetDescr){
4916 facetDescr.parentFacet = this;
4917 facetDescr.panel = this.panel;
4918 var fct=this.browser.addFacet(facetDescr,this.browser.primaryTableName);
4919 this.subFacets.push(fct);
4920 },this);
4921 } else {
4922 this.options.facets.forEach(function(facetDescr){
4923 facetDescr.parentFacet = this;
4924 facetDescr.panel = this.panel;
4925 facetDescr.items = this._cats;
4926 var fct=this.browser.addFacet(facetDescr,this.catTableName);
4927 this.subFacets.push(fct);
4928 },this);
4929 }
4930
4931 // Init facet DOMs after all facets are added / data mappings are completed
4932 this.subFacets.forEach(function(summary){ summary.initDOM(); });
4933 },
4934 /** --
4935 * Note: accesses summaryFilter, summaryFunc
4936 */
4937 mapToAggregates: function(){
4938 var filterId = this.summaryFilter.id, me=this;
4939
4940 var targetTable_id = {};
4941 var targetTable = [];
4942 kshf.dt[this.catTableName].forEach(function(srcI){
4943 var i = new kshf.Item(srcI.data,srcI.idIndex);
4944 targetTable_id[i.id()] = i;
4945 targetTable.push(i);
4946 });
4947 this.catTable = targetTable;
4948 var maxDegree = 0;
4949 this.items.forEach(function(item){
4950 item.mappedDataCache[filterId] = null; // default mapping to null
4951
4952 var mapping = this.summaryFunc.call(item.data,item);
4953 if(mapping===undefined || mapping==="" || mapping===null)
4954 return;
4955 if(mapping instanceof Array){
4956 var found = {};
4957 mapping = mapping.filter(function(e){
4958 if(e===undefined || e==="" || e===null) return false; // remove invalid values
4959 if(found[e]===undefined){ found[e] = true; return true; } // remove duplicate values
4960 return false;
4961 });
4962 if(mapping.length===0) return; // empty array - checked after removing invalid/duplicates
4963 } else {
4964 mapping = [mapping];
4965 }
4966 maxDegree = Math.max(maxDegree, mapping.length);
4967
4968 item.mappedDataCache[filterId] = [];
4969 mapping.forEach(function(a){
4970 var m=targetTable_id[a];
4971 if(m==undefined) return;
4972 item.mappedDataCache[filterId].push(m);
4973 m.addItem(item);
4974 });
4975 }, this);
4976
4977 this.hasMultiValueItem = maxDegree>1;
4978
4979 // TODO: Fix!!!!
4980 // add degree filter if attrib has multi-value items and set-vis is enabled
4981 if(this.hasMultiValueItem && this.enableSetVis){
4982 var fscale;
4983 if(maxDegree>100) fscale = 'log';
4984 else if(maxDegree>10) fscale = 'linear';
4985 else fscale = 'step';
4986 // TODO: FIX!!!
4987 var facetDescr = {
4988 title:"<i class='fa fa-hand-o-up'></i> # of "+this.summaryTitle,
4989 value: function(d){
4990 var arr=d.mappedDataCache[filterId];
4991 if(arr==null) return 0;
4992 return arr.length;
4993 },
4994 parentFacet: this.parentFacet,
4995 collapsed: true,
4996 type: 'interval',
4997 intervalScale: fscale,
4998 layout: this.panel
4999 };
5000 this.browser.addFacet(facetDescr,this.browser.primaryTableName);
5001 }
5002
5003 this.updateCats();
5004
5005 this.unselectAllAttribs();
5006 },
5007 // TODO: Check how isLinked and dataMap (old variable) affected this calculations...
5008 // Modified internal dataMap function - Skip rows with 0 active item count
5009 setMinAggrValue: function(v){
5010 this.minAggrValue = Math.max(1,v);
5011 this.updateCats();
5012 },
5013 /** -- */
5014 updateCats: function(){
5015 this._cats = this.catTable.filter(function(cat){
5016 return cat.items.length>=this.minAggrValue;
5017 },this);
5018 this.updateCatCount_Total();
5019 this.updateCatCount_Visible();
5020 },
5021 /** -- */
5022 updateCatCount_Total: function(){
5023 this.catCount_Total = this._cats.length;
5024 this.catCount_Wanted = this.catCount_Total;
5025 if(this.catCount_Total===1){
5026 this.catBarScale = "scale_frequency";
5027 }
5028 if(this.catCount_Total<=4) {
5029 this.catSortBy.forEach(function(opt){ opt.no_resort=true; });
5030 }
5031 this.showTextSearch = this.catCount_Total>=20;
5032 },
5033 /** -- */
5034 updateCatCount_Wanted: function(){
5035 this.catCount_Wanted = 0;
5036 this._cats.forEach(function(cat){ if(cat.isWanted) this.catCount_Wanted++; },this);
5037 },
5038 /** -- */
5039 updateCatCount_Visible: function(){
5040 this.catCount_Visible = 0;
5041 this.catCount_NowVisible = 0;
5042 this.catCount_NowInvisible = 0;
5043 this._cats.forEach(function(cat){
5044 v = this.isAttribVisible(cat);
5045 cat.isVisible_before = cat.isVisible;
5046 cat.isVisible = v;
5047 if(!cat.isVisible && cat.isVisible_before) this.catCount_NowInvisible++;
5048 if(cat.isVisible && !cat.isVisible_before) this.catCount_NowVisible++;
5049 if(cat.isVisible) this.catCount_Visible++;
5050 },this);
5051 },
5052 /** -- */
5053 initDOM: function(beforeDOM){
5054 this.initializeAggregates();
5055
5056 if(this.DOM.inited===true) return;
5057 var me = this;
5058
5059 this.insertRoot(beforeDOM);
5060
5061 this.DOM.root
5062 .attr("filtered_or",0)
5063 .attr("filtered_and",0)
5064 .attr("filtered_not",0)
5065 .attr("filtered_total",0)
5066 .attr("hasMultiValueItem",this.hasMultiValueItem)
5067 .attr("refreshSorting",false)
5068 ;
5069
5070 this.insertHeader();
5071
5072 if(this.hasCategories()) this.init_DOM_Cat();
5073
5074 // TODO: Insert subfacets here
5075 if(this.facets){
5076 this.DOM.root.attr("hasFacets",true);
5077 this.insertSubFacets();
5078 // no-attrib facets (hierarchy parents) still need to adjust their header position
5079 this.refreshLabelWidth();
5080 }
5081
5082 this.setCollapsed(this.collapsed);
5083
5084 this.DOM.inited = true;
5085 },
5086 /** -- */
5087 refreshConfigRowCount: function(){
5088 this.configRowCount = 0;
5089 if(this.showTextSearch){
5090 this.configRowCount++;
5091 }
5092 if(this.catSortBy.length>1) {
5093 this.configRowCount++;
5094 }
5095 if(this.configRowCount>0){
5096 this.DOM.facetControls.style("display","block");
5097 }
5098 },
5099 /** -- */
5100 init_DOM_Cat: function(){
5101 var me=this;
5102 this.DOM.wrapper = this.DOM.root.append("div").attr("class","wrapper");
5103
5104 this.DOM.facetCategorical = this.DOM.wrapper.append("div").attr("class","facetCategorical")
5105 ;
5106
5107 // create config row(s) if needed
5108 this.DOM.facetControls = this.DOM.facetCategorical.append("div").attr("class","facetControls");
5109 this.initDOM_CatTextSearch();
5110 this.initDOM_CatSortButton();
5111 this.initDOM_CatSortOpts();
5112
5113 if(this.showTextSearch){
5114 this.DOM.attribTextSearch.style("display","block");
5115 }
5116 this.refreshConfigRowCount();
5117
5118 this.DOM.scrollToTop = this.DOM.facetCategorical.append("div").attr("class","scrollToTop fa fa-arrow-up")
5119 .each(function(){
5120 this.tipsy = new Tipsy(this, {gravity: 'e', title: function(){ return kshf.lang.cur.ScrollToTop; }});
5121 })
5122 .on("mouseover",function(){ this.tipsy.show(); })
5123 .on("mouseout" ,function(){ this.tipsy.hide(); })
5124 .on("click",function(d){
5125 this.tipsy.hide();
5126 kshf.Util.scrollToPos_do(me.DOM.attribGroup[0][0],0);
5127 if(sendLog) sendLog(kshf.LOG.FACET_SCROLL_TOP, {id:me.id} );
5128 })
5129 ;
5130
5131 this.DOM.attribGroup = this.DOM.facetCategorical.append("div").attr("class","attribGroup")
5132 .on("mousedown",function(){
5133 d3.event.stopPropagation();
5134 d3.event.preventDefault();
5135 })
5136 .on("scroll",function(d){
5137 if(kshf.Util.ignoreScrollEvents===true) return;
5138 me.scrollTop_cache = me.DOM.attribGroup[0][0].scrollTop;
5139
5140 me.DOM.scrollToTop.style("visibility", me.scrollTop_cache>0?"visible":"hidden");
5141
5142 me.cat_InDisplay_First = Math.floor(me.scrollTop_cache/me.heightRow_category);
5143 me.refreshScrollDisplayMore(me.cat_InDisplay_First+me.catCount_InDisplay);
5144 me.updateAttribCull();
5145 me.cullAttribs();
5146 me.refreshMeasureLabel();
5147
5148 me.browser.pauseResultPreview = true;
5149 if(this.pauseTimer) clearTimeout(this.pauseTimer);
5150 this.pauseTimer = setTimeout(function(){me.browser.pauseResultPreview=false;}, 200);
5151 });
5152 // with this, I make sure that the (scrollable) div height is correctly set to visible number of categories
5153 this.DOM.chartBackground = this.DOM.attribGroup.append("span").attr("class","chartBackground");
5154
5155 this.DOM.chartCatLabelResize = this.DOM.attribGroup.append("span").attr("class","chartCatLabelResize dragWidthHandle")
5156 .on("mousedown", function (d, i) {
5157 var resizeDOM = this;
5158 me.panel.DOM.root.attr("catLabelDragging",true);
5159
5160 me.browser.DOM.pointerBlock.attr("active","");
5161 me.browser.DOM.root.style('cursor','col-resize');
5162 me.browser.setNoAnim(true);
5163 var mouseDown_x = d3.mouse(d3.select("body")[0][0])[0];
5164 var initWidth = me.panel.width_catLabel;
5165
5166 d3.select("body").on("mousemove", function() {
5167 var mouseDown_x_diff = d3.mouse(d3.select("body")[0][0])[0]-mouseDown_x;
5168 me.panel.setWidthCatLabel(initWidth+mouseDown_x_diff);
5169 }).on("mouseup", function(){
5170 me.panel.DOM.root.attr("catLabelDragging",false);
5171 me.browser.DOM.pointerBlock.attr("active",null);
5172 me.browser.DOM.root.style('cursor','default');
5173 me.browser.setNoAnim(false);
5174 d3.select("body").on("mousemove", null).on("mouseup", null);
5175 });
5176 d3.event.preventDefault();
5177 });
5178
5179 this.DOM.belowAttribs = this.DOM.facetCategorical.append("div").attr("class","belowAttribs");
5180 this.DOM.belowAttribs.append("div").attr("class", "border_line");
5181
5182 this.insertChartAxis_Measure(this.DOM.belowAttribs,'e','e');
5183
5184 this.DOM.scroll_display_more = this.DOM.belowAttribs.append("div").attr("class","hasLabelWidth")
5185 .append("span").attr("class","scroll_display_more")
5186 .on("click",function(){
5187 kshf.Util.scrollToPos_do(
5188 me.DOM.attribGroup[0][0],me.DOM.attribGroup[0][0].scrollTop+me.heightRow_category);
5189 if(sendLog) sendLog(kshf.LOG.FACET_SCROLL_MORE, {id:me.id});
5190 });
5191
5192 this.insertCategories();
5193
5194 this.refreshLabelWidth();
5195
5196 this.updateCatSorting(0,true,true);
5197 },
5198 /** -- */
5199 initDOM_CatSortButton: function(){
5200 var me=this;
5201 this.DOM.catSortButton = this.DOM.facetControls.append("span").attr("class","catSortButton sortButton fa")
5202 .on("click",function(d){
5203 if(me.dirtySort){
5204 me.dirtySort = false;
5205 me.DOM.root.attr("refreshSorting",false);
5206 } else{
5207 me.catSortBy_Active.inverse = me.catSortBy_Active.inverse?false:true;
5208 me.refreshSortButton();
5209 }
5210 me.updateCatSorting(0,true);
5211 })
5212 .each(function(){
5213 this.tipsy = new Tipsy(this, {
5214 gravity: 'w', title: function(){
5215 return me.dirtySort?kshf.lang.cur.Reorder:kshf.lang.cur.ReverseOrder;
5216 }
5217 })
5218 })
5219 .on("mouseover",function(){ this.tipsy.show(); })
5220 .on("mouseout" ,function(){ this.tipsy.hide(); });
5221 this.refreshSortButton();
5222 },
5223 /** -- */
5224 initDOM_CatSortOpts: function(){
5225 var me=this;
5226 var x = this.DOM.facetControls.append("span").attr("class","sortOptionSelectGroup hasLabelWidth");
5227
5228 this.DOM.optionSelect = x.append("select").attr("class","optionSelect")
5229 .on("change", function(){
5230 me.catSortBy_Active = me.catSortBy[this.selectedIndex];
5231 me.refreshSortButton();
5232 me.updateCatSorting(0,true);
5233 if(sendLog) sendLog(kshf.LOG.FACET_SORT, {id:me.id, info:this.selectedIndex});
5234 })
5235
5236 this.refreshSortOptions();
5237 },
5238 /** -- */
5239 refreshSortButton: function(){
5240 if(this.DOM.catSortButton===undefined) return;
5241 this.DOM.catSortButton
5242 //.style("display",(this.catSortBy_Active.no_resort?"none":"inline-block"))
5243 .style("display","inline-block")
5244 .attr("inverse",this.catSortBy_Active.inverse);
5245 },
5246 /** -- */
5247 refreshSortOptions: function(){
5248 if(this.DOM.optionSelect===undefined) return;
5249
5250 this.refreshConfigRowCount();
5251
5252 this.DOM.optionSelect.style("display", (this.catSortBy.length>1)?"block":"none" );
5253
5254 this.DOM.optionSelect.selectAll(".sort_label").data([]).exit().remove(); // remove all existing options
5255
5256 var x= this.DOM.optionSelect.selectAll(".sort_label")
5257 .data(this.catSortBy)
5258 .enter().append("option").attr("class", "sort_label").text(function(d){ return d.name; });
5259 },
5260 /** -- */
5261 initDOM_CatTextSearch: function(){
5262 var me=this;
5263 this.DOM.attribTextSearch = this.DOM.facetControls.append("div").attr("class","attribTextSearch hasLabelWidth");
5264 this.DOM.attribTextSearchControl = this.DOM.attribTextSearch.append("span")
5265 .attr("class","attribTextSearchControl fa")
5266 .on("click",function() { me.summaryFilter.clearFilter(); });
5267 this.DOM.attribTextSearchInput = this.DOM.attribTextSearch.append("input")
5268 .attr("class","attribTextSearchInput")
5269 .attr("type","text")
5270 .attr("placeholder",kshf.lang.cur.Search)
5271 // .on("mousedown",function(){alert('sdsdd');})
5272 .on("input",function(){
5273 if(this.timer){
5274 clearTimeout(this.timer);
5275 }
5276 var x = this;
5277 this.timer = setTimeout( function(){
5278 var v=x.value.toLowerCase();
5279 if(v===""){
5280 me.summaryFilter.clearFilter();
5281 } else {
5282 me.DOM.attribTextSearchControl.attr("showClear",true);
5283 me.summaryFilter.selected_All_clear();
5284 me._cats.forEach(function(attrib){
5285 if(me.catLabel.call(attrib.data).toString().toLowerCase().indexOf(v)!==-1){
5286 attrib.set_OR(me.summaryFilter.selected_OR);
5287 } else {
5288 // search in tooltiptext
5289 if(me.catTooltip){
5290 var tooltipText = me.catTooltip.call(attrib.data);
5291 if(tooltipText && tooltipText.toLowerCase().indexOf(v)!==-1) {
5292 attrib.set_OR(me.summaryFilter.selected_OR);
5293 }
5294 } else{
5295 attrib.set_NONE();
5296 }
5297 }
5298 });
5299 if(me.summaryFilter.selectedCount_Total()===0){
5300 me.summaryFilter.clearFilter();
5301 } else {
5302 me.summaryFilter.how = "All";
5303 me.summaryFilter.addFilter(true);
5304 me.summaryFilter.linkFilterSummary = "";
5305 if(sendLog) sendLog(kshf.LOG.FILTER_TEXTSEARCH, {id:me.summaryFilter.id, info:v});
5306 }
5307 }
5308 }, 750);
5309 })
5310 ;
5311 },
5312 /** returns the maximum active aggregate value per row in chart data */
5313 getMaxAggr_Active: function(){
5314 return d3.max(this._cats, function(cat){ return cat.aggregate_Active; });
5315 },
5316 /** returns the maximum total aggregate value stored per row in chart data */
5317 getMaxAggr_Total: function(){
5318 if(this._cats===undefined) return 0;
5319 var subMax=0;
5320 // recurse
5321 if(this.subFacets.length>0){
5322 subMax = d3.max(this.subFacets, function(f){ return f.getMaxAggr_Total(v); });
5323 }
5324 if(!this.hasCategories()) return subMax;
5325 if(this._maxBarValueMaxPerAttrib) return this._maxBarValueMaxPerAttrib;
5326 this._maxBarValueMaxPerAttrib = d3.max(this._cats, function(d){ return d.aggregate_Total;});
5327 return this._maxBarValueMaxPerAttrib;
5328 },
5329 /** -- */
5330 _update_Selected: function(){
5331 if(this.DOM.root) {
5332 this.DOM.root
5333 .attr("filtered",this.isFiltered())
5334 .attr("filtered_or",this.summaryFilter.selected_OR.length)
5335 .attr("filtered_and",this.summaryFilter.selected_AND.length)
5336 .attr("filtered_not",this.summaryFilter.selected_NOT.length)
5337 .attr("filtered_total",this.summaryFilter.selectedCount_Total())
5338 ;
5339 }
5340 var show_box = (this.summaryFilter.selected_OR.length+this.summaryFilter.selected_AND.length)>1;
5341 this.summaryFilter.selected_OR.forEach(function(attrib){
5342 attrib.DOM.facet.setAttribute("show-box",show_box);
5343 },this);
5344 this.summaryFilter.selected_AND.forEach(function(attrib){
5345 attrib.DOM.facet.setAttribute("show-box",show_box);
5346 },this);
5347 this.summaryFilter.selected_NOT.forEach(function(attrib){
5348 attrib.DOM.facet.setAttribute("show-box","true");
5349 },this);
5350 },
5351 /** -- */
5352 unselectAllAttribs: function(){
5353 this._cats.forEach(function(cat){
5354 if(cat.f_selected() && cat.DOM.facet) cat.DOM.facet.setAttribute("highlight",false);
5355 cat.set_NONE();
5356 });
5357 this.summaryFilter.selected_All_clear();
5358 },
5359 /** -- */
5360 selectAllAttribsButton: function(){
5361 this._cats.forEach(function(attrib){
5362 if(!attrib.selectedForLink) return;
5363 attrib.set_OR(this.summaryFilter.selected_OR);
5364 },this);
5365 this._update_Selected();
5366 this.summaryFilter.how="All";
5367 this.summaryFilter.addFilter(true);
5368 if(sendLog) sendLog(kshf.LOG.FILTER_ATTR_ADD_OR_ALL, {id: this.summaryFilter.id} );
5369 },
5370 /** -- */
5371 setCollapsed: function(v){
5372 kshf.Summary_Base.prototype.setCollapsed.call(this,v);
5373 // collapse children only if this is a hierarchy, not sub-filtering
5374 if(this.hasSubFacets() && !this.hasCategories()){
5375 this.subFacets.forEach(function(f){ f.setCollapsed(v); });
5376 }
5377 return this; // allow chaining
5378 },
5379 /** -- */
5380 clearCatTextSearch: function(){
5381 if(!this.showTextSearch) return;
5382 this.DOM.attribTextSearchControl.attr("showClear",false);
5383 this.DOM.attribTextSearchInput[0][0].value = '';
5384 },
5385 /** -- */
5386 scrollBarShown: function(){
5387 return this.attribHeight<this.catCount_Total*this.heightRow_category;
5388 },
5389 /** -- */
5390 getWidth_CatChart: function(){
5391 // This will make the bar width extend over to the scroll area.
5392 // Doesn't look better, the amount of space saved makes chart harder to read and breaks the regularly spaced flow.
5393 /*if(!this.scrollBarShown()){
5394 return this.panel.width_catBars+kshf.scrollWidth-5;
5395 }*/
5396 return this.panel.width_catBars;
5397 },
5398 /** -- */
5399 updateBarPreviewScale2Active: function(){
5400 if(!this.hasCategories()) return; // nothing to do
5401 var me=this;
5402
5403 this.chartScale_Measure
5404 .rangeRound([0, this.getWidth_CatChart()])
5405 .nice(this.chartAxis_Measure_TickSkip())
5406 .domain([
5407 0,
5408 (this.catBarScale==="scale_frequency")?
5409 this.browser.itemsWantedCount:
5410 this.getMaxAggr_Active()
5411 ])
5412 ;
5413
5414 this.refreshViz_Active();
5415 this.refreshViz_Total();
5416 this.refreshViz_Compare();
5417 this.refreshViz_Axis();
5418
5419 this.DOM.aggr_Preview.attr("fast",null); // take it slow for result preview animations
5420 this.refreshViz_Preview();
5421 setTimeout(function(){ me.DOM.aggr_Preview.attr("fast",true); },800);
5422 },
5423 /** -- */
5424 setHeight: function(newHeight){
5425 if(!this.hasCategories()) return;
5426 var attribHeight_old = this.attribHeight;
5427 var attribHeight_new = Math.min(
5428 newHeight-this.getHeight_Header()-this.getHeight_Config()-this.getHeight_Bottom()+2,
5429 this.heightRow_category*this.catCount_Visible);
5430
5431 // if(this.attribHeight===attribHeight_new) return;
5432 this.attribHeight = attribHeight_new;
5433
5434 // update catCount_InDisplay
5435 var c = Math.floor(this.attribHeight / this.heightRow_category);
5436 var c = Math.floor(this.attribHeight / this.heightRow_category);
5437 if(c<0) c=1;
5438 if(c>this.catCount_Visible) c=this.catCount_Visible;
5439 if(this.catCount_Visible<=2){
5440 c = this.catCount_Visible;
5441 } else {
5442 c = Math.max(c,2);
5443 }
5444 this.catCount_InDisplay = c+1;
5445 this.catCount_InDisplay = Math.min(this.catCount_InDisplay,this.catCount_Visible);
5446
5447 this.refreshScrollDisplayMore(this.cat_InDisplay_First+this.catCount_InDisplay);
5448
5449 this.updateAttribCull();
5450 this.cullAttribs();
5451
5452 this.DOM.headerGroup.select(".buttonSummaryExpand").style("display",
5453 (this.panel.getNumOfOpenSummaries()<=1||this.areAllCatsInDisplay())?
5454 "none":
5455 "inline-block"
5456 );
5457
5458 this.updateBarPreviewScale2Active();
5459
5460 if(this.cbSetHeight && attribHeight_old!==attribHeight_new) this.cbSetHeight(this);
5461 },
5462 /** -- */
5463 updateAfterFilter: function(resultChange){
5464 if(!this.hasCategories()) return;
5465 this.refreshMeasureLabel();
5466 this.updateBarPreviewScale2Active();
5467
5468 if(this.show_cliques) {
5469 this.dirtySort = true;
5470 this.DOM.root.attr("refreshSorting",true);
5471 }
5472
5473 if(!this.dirtySort) {
5474 this.updateCatSorting();
5475 } else {
5476 this.refreshViz_All();
5477 this.refreshViz_Active();
5478 }
5479 },
5480 /** -- */
5481 refreshWidth: function(){
5482 if(this.DOM.facetCategorical){
5483 this.DOM.facetCategorical.style("width",this.getWidth()+"px");
5484 this.DOM.summaryTitle.style("max-width",(this.getWidth()-40)+"px");
5485 this.DOM.chartAxis_Measure.select(".chartAxis_Measure_background")
5486 .style("width",(this.getWidth()-this.panel.width_catMeasureLabel-this.getWidth_Label())+"px");
5487 this.refreshViz_Axis();
5488 }
5489 },
5490 /** -- */
5491 refreshMeasureLabel: function(){
5492 if(!this.hasCategories()) return;
5493 if(this.browser.previewedSelectionSummary===this && !this.hasMultiValueItem) return;
5494
5495 var me=this;
5496
5497 this.DOM.cats.attr("noitems",function(aggr){ return !me.isAttribSelectable(aggr); });
5498
5499 this.DOM.measureLabel.each(function(attrib){
5500 if(attrib.isCulled) return;
5501 var p=attrib.aggregate_Preview;
5502 if(me.browser.vizPreviewActive){
5503 if(me.browser.preview_not)
5504 p = attrib.aggregate_Active-attrib.aggregate_Preview;
5505 else
5506 p = attrib.aggregate_Preview;
5507 } else {
5508 p = attrib.aggregate_Active;
5509 }
5510 if(me.browser.percentModeActive){
5511 if(attrib.aggregate_Active===0){
5512 this.textContent = "";
5513 } else {
5514 if(me.browser.ratioModeActive){
5515 if(!me.browser.vizPreviewActive){
5516 this.textContent = "";
5517 return;
5518 }
5519 p = 100*p/attrib.aggregate_Active;
5520 } else {
5521 p = 100*p/me.browser.itemsWanted_Aggregrate_Total;
5522 }
5523 if(p<0) p=0;
5524 this.textContent = p.toFixed(0)+"%";
5525 }
5526 } else {
5527 if(p<0) p=0;
5528 this.textContent = kshf.Util.formatForItemCount(p);
5529 }
5530 });
5531 },
5532 /** -- */
5533 refreshViz_All: function(){
5534 if(!this.hasCategories() || this.collapsed) return;
5535 var me=this;
5536 this.refreshViz_Total();
5537 this.refreshViz_Active();
5538
5539 this.DOM.aggr_Preview.attr("fast",null); // take it slow for result preview animations
5540 this.refreshViz_Preview();
5541 setTimeout(function(){ me.DOM.aggr_Preview.attr("fast",true); },800);
5542
5543 this.refreshViz_Compare();
5544 this.refreshMeasureLabel();
5545 this.refreshViz_Axis();
5546 },
5547 /** -- */
5548 refreshViz_Total: function(){
5549 if(!this.hasCategories() || this.collapsed) return;
5550 var me = this;
5551 // Do not need to update total. Total value is invisible. Percent view is based on active count.
5552 if(!this.browser.ratioModeActive){
5553 this.DOM.aggr_Total.each(function(attrib){
5554 kshf.Util.setTransform(this,
5555 "scaleX("+me.chartScale_Measure(attrib.aggregate_Total)+")");
5556 });
5557 this.DOM.aggr_TotalTip.each(function(attrib){
5558 kshf.Util.setTransform(this,
5559 "translateX("+me.chartScale_Measure(attrib.aggregate_Total)+"px)");
5560 }).style("opacity",function(attrib){
5561 return (attrib.aggregate_Total>me.chartScale_Measure.domain()[1])?1:0;
5562 });
5563 } else {
5564 this.DOM.aggr_TotalTip.style("opacity",0);
5565 }
5566 },
5567 /** -- */
5568 refreshViz_Active: function(){
5569 if(!this.hasCategories() || this.collapsed) return;
5570 var me=this, ratioMode=this.browser.ratioModeActive, maxWidth = this.chartScale_Measure.range()[1];
5571 var width_Text = this.getWidth_Label()+this.panel.width_catMeasureLabel;
5572 this.DOM.aggr_Active.each(function(category){
5573 kshf.Util.setTransform(this,"scaleX("+(ratioMode?
5574 ((category.aggregate_Active===0)?0:maxWidth):
5575 me.chartScale_Measure(category.aggregate_Active)
5576 )+")");
5577 });
5578 var func_clickAreaScale=function(category){
5579 return width_Text+(ratioMode?
5580 ((category.aggregate_Active===0)?0:maxWidth):
5581 me.chartScale_Measure(category.aggregate_Active)
5582 )+"px";
5583 };
5584 this.DOM.attribClickArea.style("width",func_clickAreaScale);
5585 this.DOM.compareButton
5586 .style("left",func_clickAreaScale)
5587 .attr("inside",function(category){
5588 if(ratioMode) return "";
5589 if(maxWidth-me.chartScale_Measure(category.aggregate_Active)<10) return "";
5590 });
5591 },
5592 /** -- */
5593 refreshViz_Preview: function(){
5594 if(!this.hasCategories() || this.collapsed) return;
5595 var me=this, ratioMode=this.browser.ratioModeActive, maxWidth = this.chartScale_Measure.range()[1];
5596 this.DOM.aggr_Preview.each(function(aggr){
5597 var p=aggr.aggregate_Preview;
5598 if(me.browser.preview_not) p = aggr.aggregate_Active-p;
5599 kshf.Util.setTransform(this,"scaleX("+(
5600 ratioMode ? ((p/aggr.aggregate_Active)*maxWidth ) : me.chartScale_Measure(p)
5601 )+")");
5602 });
5603 this.refreshMeasureLabel();
5604 },
5605 /** Gets the active previewed value, and stores it in the cache */
5606 cachePreviewValue: function(){
5607 if(!this.hasCategories() || this.collapsed) return;
5608 var preview_not=this.browser.preview_not;
5609 this.DOM.aggr_Preview.each(function(aggr){
5610 aggr.aggregate_Compare = aggr.aggregate_Preview;
5611 if(preview_not) {
5612 aggr.aggregate_Compare = aggr.aggregate_Active-aggr.aggregate_Compare;
5613 }
5614 });
5615 },
5616 /** -- */
5617 refreshViz_Compare: function(){
5618 if(!this.hasCategories() || this.collapsed) return;
5619 if(!this.browser.vizCompareActive) return;
5620 var me=this, ratioMode=this.browser.ratioModeActive, maxWidth = this.chartScale_Measure.range()[1];
5621 if(this.browser.vizCompareActive){
5622 this.DOM.aggr_Compare.each(function(cat){
5623 kshf.Util.setTransform(this,"scaleX("+(
5624 ratioMode ? ((cat.aggregate_Compare/cat.aggregate_Active)*maxWidth) : me.chartScale_Measure(cat.aggregate_Compare)
5625 )+")");
5626 });
5627 }
5628 },
5629 /** -- */
5630 clearViz_Preview: function(){
5631 if(!this.hasCategories()) return;
5632 this._cats.forEach(function(cat){
5633 cat.updatePreview_Cache = false;
5634 });
5635 if(this.collapsed) return;
5636 this.DOM.aggr_Preview.each(function(cat){
5637 cat.aggregate_Preview=0;
5638 if(cat.aggregate_Compare===0) return;
5639 kshf.Util.setTransform(this,"scaleX(0)");
5640 });
5641 this.refreshMeasureLabel();
5642 },
5643 /** -- */
5644 refreshViz_Axis: function(){
5645 if(!this.hasCategories()) return;
5646 var me=this;
5647
5648 var tickValues;
5649 var transformFunc;
5650
5651 var maxValue;
5652
5653 var chartWidth = this.getWidth_CatChart();
5654
5655 if(this.browser.ratioModeActive) {
5656 maxValue = 100;
5657 tickValues = d3.scale.linear()
5658 .rangeRound([0, chartWidth])
5659 .nice(this.chartAxis_Measure_TickSkip())
5660 .clamp(true)
5661 .domain([0,100])
5662 .ticks(this.chartAxis_Measure_TickSkip());
5663 } else {
5664 if(this.browser.percentModeActive) {
5665 maxValue = Math.round(100*me.getMaxAggr_Active()/me.browser.itemsWantedCount);
5666 tickValues = d3.scale.linear()
5667 .rangeRound([0, chartWidth])
5668 .nice(this.chartAxis_Measure_TickSkip())
5669 .clamp(true)
5670 .domain([0,maxValue])
5671 .ticks(this.chartAxis_Measure_TickSkip());
5672 } else {
5673 tickValues = this.chartScale_Measure.ticks(this.chartAxis_Measure_TickSkip())
5674 }
5675 }
5676
5677 // remove non-integer values & 0...
5678 tickValues = tickValues.filter(function(d){return d%1===0&&d!==0;});
5679
5680 var tickDoms = this.DOM.chartAxis_Measure.selectAll("span.tick").data(tickValues,function(i){return i;});
5681
5682 if(this.browser.ratioModeActive){
5683 transformFunc=function(d){
5684 kshf.Util.setTransform(this,"translateX("+(d*chartWidth/100-0.5)+"px)");
5685 };
5686 } else {
5687 if(this.browser.percentModeActive) {
5688 transformFunc=function(d){
5689 kshf.Util.setTransform(this,"translateX("+((d/maxValue)*chartWidth-0.5)+"px)");
5690 };
5691 } else {
5692 transformFunc=function(d){
5693 kshf.Util.setTransform(this,"translateX("+(me.chartScale_Measure(d)-0.5)+"px)");
5694 };
5695 }
5696 }
5697
5698 var x=this.browser.noAnim;
5699
5700 if(x===false) this.browser.setNoAnim(true);
5701 var tickData_new=tickDoms.enter().append("span").attr("class","tick").each(transformFunc);
5702 if(x===false) this.browser.setNoAnim(false);
5703
5704 // translate the ticks horizontally on scale
5705 tickData_new.append("span").attr("class","line")
5706 .style("top","-"+(this.attribHeight+3)+"px")
5707 .style("height",(this.attribHeight-1)+"px");
5708
5709 if(this.browser.ratioModeActive){
5710 tickData_new.append("span").attr("class","text").text(function(d){return d;});
5711 } else {
5712 tickData_new.append("span").attr("class","text").text(function(d){return d3.format("s")(d);});
5713 }
5714 if(this.configRowCount>0){
5715 var h=this.attribHeight;
5716 var hm=tickData_new.append("span").attr("class","text text_upper").style("top",(-h-19)+"px");
5717 if(this.browser.ratioModeActive){
5718 hm.text(function(d){return d;});
5719 } else {
5720 hm.text(function(d){return d3.format("s")(d);});
5721 }
5722 }
5723
5724 setTimeout(function(){
5725 me.DOM.chartAxis_Measure.selectAll("span.tick").style("opacity",1).each(transformFunc);
5726 });
5727
5728 tickDoms.exit().remove();
5729 },
5730 /** -- */
5731 refreshLabelWidth: function(){
5732 if(!this.hasCategories()) return;
5733 if(this.DOM.facetCategorical===undefined) return;
5734 var labelWidth = this.getWidth_Label();
5735 var barChartMinX = labelWidth + this.panel.width_catMeasureLabel;
5736
5737 this.DOM.chartCatLabelResize.style("left",(labelWidth+1)+"px");
5738 this.DOM.facetCategorical.selectAll(".hasLabelWidth").style("width",labelWidth+"px");
5739 this.DOM.item_count_wrapper
5740 .style("left",labelWidth+"px")
5741 .style("width",this.panel.width_catMeasureLabel+"px")
5742 ;
5743 this.DOM.chartAxis_Measure.each(function(d){
5744 kshf.Util.setTransform(this,"translateX("+barChartMinX+"px)");
5745 });
5746 this.DOM.catSortButton.style("left",labelWidth+"px");
5747 this.DOM.aggr_Group.style("left",barChartMinX+"px");
5748 if(this.DOM.catSortButton)
5749 this.DOM.catSortButton.style("width",this.panel.width_catMeasureLabel+"px");
5750 },
5751 /** -- */
5752 refreshScrollDisplayMore: function(bottomItem){
5753 if(this.catCount_Total<=4) {
5754 this.DOM.scroll_display_more.style("display","none");
5755 return;
5756 }
5757 var moreTxt = ""+this.catCount_Visible+" "+kshf.lang.cur.Rows;
5758 var below = this.catCount_Visible-bottomItem;
5759 if(below>0) moreTxt+=", <span class='fa fa-angle-down'></span> "+below+" "+kshf.lang.cur.More;
5760 this.DOM.scroll_display_more.html(moreTxt);
5761 },
5762 /** -- */
5763 refreshHeight: function(){
5764 // Note: if this has attributes, the total height is computed from height of the children by html layout engine.
5765 // So far, should be pretty nice.
5766 if(!this.hasCategories()) return;
5767
5768 this.DOM.wrapper.style("height",(this.collapsed?"0":this.getHeight_Content())+"px");
5769 this.DOM.attribGroup.style("height",this.attribHeight+"px"); // 1 is for borders...
5770 this.DOM.root.style("max-height",(this.getHeight()+1)+"px");
5771
5772 var h=this.attribHeight;
5773 this.DOM.chartAxis_Measure.selectAll(".line").style("top",(-h+1)+"px").style("height",(h-2)+"px");
5774 this.DOM.chartAxis_Measure.selectAll(".text_upper").style("top",(-h-19)+"px");
5775 },
5776 /** -- */
5777 setHeightRow_attrib: function(h){
5778 var me=this;
5779 if(this.heightRow_category===h) return;
5780 this.heightRow_category = h;
5781
5782 this.browser.setNoAnim(true);
5783
5784 this.browser.updateLayout();
5785
5786 this.DOM.cats.each(function(attrib){
5787 kshf.Util.setTransform(this,
5788 "translate("+attrib.posX+"px,"+(me.heightRow_category*attrib.orderIndex)+"px)");
5789 this.style.marginTop = ((me.heightRow_category-18)/2)+"px";
5790 });
5791 this.DOM.chartBackground.style("height",this.getTotalAttribHeight()+"px");
5792 this.DOM.chartCatLabelResize.style("height",this.getTotalAttribHeight()+"px");
5793
5794 setTimeout(function(){ me.browser.setNoAnim(false); },100);
5795 },
5796 /** -- */
5797 isAttribVisible: function(attrib){
5798 if(this.isLinked){
5799 if(attrib.selectedForLink===false) return false;
5800 return true;
5801 }
5802
5803 // Show selected attribute always
5804 if(attrib.f_selected()) return true;
5805 // Show if number of active items is not zero
5806 if(attrib.aggregate_Active!==0) return true;
5807 // Show if item has been "isWanted" by some active sub-filtering
5808 if(this.catCount_Wanted < this.catCount_Total && attrib.isWanted) return true;
5809 // if inactive attributes are not removed, well, don't remove them...
5810 if(this.removeInactiveCats===false) return true;
5811 // summary is not filtered yet, cannot click on 0 items
5812 if(!this.isFiltered()) return attrib.aggregate_Active!==0;
5813 // Hide if multiple options are selected and selection is and
5814 // if(this.summaryFilter.selecttype==="SelectAnd") return false;
5815 // TODO: Figuring out non-selected, zero-active-item attribs under "SelectOr" is tricky!
5816
5817 // if(attrib.orderIndex===this.catCount_Total) return true;
5818
5819 if(attrib.isWanted===false) return false;
5820 return true;
5821 },
5822 /** -- */
5823 isAttribSelectable: function(attrib){
5824 // Show selected attribute always
5825 if(attrib.f_selected()) return true;
5826 // Show if number of active items is not zero
5827 if(attrib.aggregate_Active!==0) return true;
5828 // Show if multiple attributes are selected and the summary does not include multi value items
5829 if(this.isFiltered() && !this.hasMultiValueItem) return true;
5830 // Hide
5831 return false;
5832 },
5833 /** When clicked on an attribute ... */
5834 /* what: AND / OR / NOT */
5835 filterAttrib: function(attrib, what, how){
5836 if(this.browser.skipSortingFacet){
5837 // you can now sort the last filtered summary, attention is no longer there.
5838 this.browser.skipSortingFacet.dirtySort = false;
5839 this.browser.skipSortingFacet.DOM.root.attr("refreshSorting",false);
5840 }
5841 this.browser.skipSortingFacet=this;
5842 this.browser.skipSortingFacet.dirtySort = true;
5843 this.browser.skipSortingFacet.DOM.root.attr("refreshSorting",true);
5844
5845 var i=0;
5846
5847 var preTest = (this.summaryFilter.selected_OR.length>0 && (this.summaryFilter.selected_AND.length>0 ||
5848 this.summaryFilter.selected_NOT.length>0));
5849
5850 // if selection is in same mode, "undo" to NONE.
5851 if(what==="NOT" && attrib.is_NOT()) what = "NONE";
5852 if(what==="AND" && attrib.is_AND()) what = "NONE";
5853 if(what==="OR" && attrib.is_OR() ) what = "NONE";
5854
5855 if(what==="NONE"){
5856 if(attrib.is_AND() || attrib.is_NOT()){
5857 this.summaryFilter.how = "MoreResults";
5858 }
5859 if(attrib.is_OR()){
5860 this.summaryFilter.how = this.summaryFilter.selected_OR.length===0?"MoreResults":"LessResults";
5861 }
5862 attrib.set_NONE();
5863 if(this.summaryFilter.selected_OR.length===1 && this.summaryFilter.selected_AND.length===0){
5864 this.summaryFilter.selected_OR.forEach(function(a){
5865 a.set_NONE();
5866 a.set_AND(this.summaryFilter.selected_AND);
5867 },this);
5868 }
5869 if(!this.summaryFilter.selected_Any()){
5870 this.dirtySort = false;
5871 this.DOM.root.attr("refreshSorting",false);
5872 }
5873 if(sendLog) sendLog(kshf.LOG.FILTER_ATTR_UNSELECT, {id:this.summaryFilter.id, info:attrib.id()});
5874 }
5875 if(what==="NOT"){
5876 if(attrib.is_NONE()){
5877 if(attrib.aggregate_Active===this.browser.itemsWantedCount){
5878 alert("Removing this category will create an empty result list, so it is not allowed.");
5879 return;
5880 }
5881 this.summaryFilter.how = "LessResults";
5882 } else {
5883 this.summaryFilter.how = "All";
5884 }
5885 attrib.set_NOT(this.summaryFilter.selected_NOT);
5886 if(sendLog) sendLog(kshf.LOG.FILTER_ATTR_ADD_NOT, {id:this.summaryFilter.id, info:attrib.id()});
5887 }
5888 if(what==="AND"){
5889 attrib.set_AND(this.summaryFilter.selected_AND);
5890 this.summaryFilter.how = "LessResults";
5891 if(sendLog) sendLog(kshf.LOG.FILTER_ATTR_ADD_AND, {id:this.summaryFilter.id, info:attrib.id()});
5892 }
5893 if(what==="OR"){
5894 if(!this.hasMultiValueItem && this.summaryFilter.selected_NOT.length>0){
5895 var temp = [];
5896 this.summaryFilter.selected_NOT.forEach(function(a){ temp.push(a); });
5897 temp.forEach(function(a){ a.set_NONE(); });
5898 }
5899 if(this.summaryFilter.selected_OR.length===0 && this.summaryFilter.selected_AND.length===1){
5900 this.summaryFilter.selected_AND.forEach(function(a){
5901 a.set_NONE();
5902 a.set_OR(this.summaryFilter.selected_OR);
5903 },this);
5904 }
5905 attrib.set_OR(this.summaryFilter.selected_OR);
5906 this.summaryFilter.how = "MoreResults";
5907 if(sendLog) sendLog(kshf.LOG.FILTER_ATTR_ADD_OR, {id:this.summaryFilter.id, info:attrib.id()});
5908 }
5909 if(how) this.summaryFilter.how = how;
5910
5911 if(preTest){
5912 this.summaryFilter.how = "All";
5913 }
5914 if(this.summaryFilter.selected_OR.length>0 && (this.summaryFilter.selected_AND.length>0 ||
5915 this.summaryFilter.selected_NOT.length>0)){
5916 this.summaryFilter.how = "All";
5917 }
5918
5919 if(this.summaryFilter.selectedCount_Total()===0){
5920 this.summaryFilter.clearFilter();
5921 return;
5922 }
5923 this.clearCatTextSearch();
5924 this.summaryFilter.linkFilterSummary = "";
5925 this.summaryFilter.addFilter(true);
5926 },
5927 /** -- */
5928 cbAttribEnter: function(attrib){
5929 this.browser.previewedSelectionSummary = this;
5930
5931 var me=this;
5932
5933 if(attrib.cliqueRow)
5934 attrib.cliqueRow.setAttribute("highlight","selected");
5935
5936 if(this.isAttribSelectable(attrib)) {
5937 attrib.DOM.facet.setAttribute("selecttype","and");
5938 attrib.DOM.facet.setAttribute("highlight","selected");
5939 if(!this.hasMultiValueItem && this.summaryFilter.selected_AND.length!==0) {
5940 return;
5941 }
5942 attrib.highlightAll(true);
5943 var timeoutTime = kshf.previewTimeoutMS;
5944 if(this.browser.vizCompareActive) timeoutTime = 0;
5945 // this.resultPreviewShowTimeout = setTimeout(function(){
5946 if(!me.browser.pauseResultPreview &&
5947 (me.hasMultiValueItem || me.summaryFilter.selected_AND.length===0) &&
5948 (!attrib.is_NOT()) ){
5949 // calculate the preview
5950 attrib.items.forEach(function(item){item.updatePreview(me.parentFacet);},me);
5951 me.browser.itemCount_Previewed = attrib.aggregate_Preview;
5952 attrib.DOM.facet.setAttribute("showlock",true);
5953 me.browser.refreshResultPreviews(attrib);
5954 if(sendLog) {
5955 if(me.resultPreviewLogTimeout) clearTimeout(me.resultPreviewLogTimeout);
5956 me.resultPreviewLogTimeout = setTimeout(function(){
5957 sendLog(kshf.LOG.FILTER_PREVIEW, {id:me.summaryFilter.id, info: attrib.id()});
5958 }, 1000); // wait 1 second to see the update fully
5959 }
5960 }
5961 // },timeoutTime);
5962 } else {
5963 if(this.tipsy_title===undefined) return;
5964 }
5965 },
5966 /** -- */
5967 cbAttribLeave: function(attrib){
5968 this.browser.previewedSelectionSummary = null;
5969
5970 if(attrib.skipMouseOut !==undefined && attrib.skipMouseOut===true){
5971 attrib.skipMouseOut = false;
5972 return;
5973 }
5974
5975 if(attrib.cliqueRow)
5976 attrib.cliqueRow.setAttribute("highlight",false);
5977
5978 if(!this.isAttribSelectable(attrib)) return;
5979 attrib.nohighlightAll(true);
5980
5981 if(this.resultPreviewLogTimeout){
5982 clearTimeout(this.resultPreviewLogTimeout);
5983 }
5984 this.browser.items.forEach(function(item){
5985 if(item.DOM.record) item.DOM.record.setAttribute("highlight",false);
5986 },this);
5987
5988 if(!this.browser.pauseResultPreview){
5989 attrib.DOM.facet.setAttribute("showlock",false);
5990 this.browser.clearResultPreviews();
5991 }
5992
5993 if(this.resultPreviewShowTimeout){
5994 clearTimeout(this.resultPreviewShowTimeout);
5995 this.resultPreviewShowTimeout = null;
5996 }
5997 },
5998 /** - */
5999 insertCategories: function(){
6000 var me = this;
6001 this.resultPreviewLogTimeout = null;
6002
6003 var DOM_cats_new = this.DOM.attribGroup.selectAll(".attrib")
6004 .data(this._cats, function(category){ return category.id(); })
6005 .enter().append("span").attr("class","attrib")
6006 .attr("highlight",false)
6007 .attr("showlock" ,false)
6008 .attr("selected",0)
6009 .each(function(category){
6010 category.facet = me;
6011 category.DOM.facet = this;
6012 category.isVisible = true;
6013 this.isLinked = me.isLinked;
6014
6015 category.pos_y = 0;
6016 kshf.Util.setTransform(this,"translateY(0px)");
6017 })
6018 .on("mouseover",function(category){ me.cbAttribEnter(category);})
6019 .on("mouseleave",function(category){ me.cbAttribLeave(category);})
6020 .attr("title",me.catTooltip?function(cat){ return me.catTooltip.call(cat.data); }:null);
6021 ;
6022 this.updateAttribCull();
6023
6024 var cbAttribClick = function(attrib){
6025 if(!me.isAttribSelectable(attrib)) return;
6026
6027 if(this.timer){ // double click
6028 if(!me.hasMultiValueItem) return;
6029 me.unselectAllAttribs();
6030 me.filterAttrib("AND","All");
6031 if(sendLog) sendLog(kshf.LOG.FILTER_ATTR_EXACT,{id: me.summaryFilter.id, info: attrib.id()});
6032 return;
6033 } else {
6034 if(attrib.is_NOT()){
6035 me.filterAttrib(attrib,"NOT");
6036 } else if(attrib.is_AND()){
6037 me.filterAttrib(attrib,"AND");
6038 } else if(attrib.is_OR()){
6039 me.filterAttrib(attrib,"OR");
6040 } else {
6041 // remove the single selection if it is defined with OR
6042 if(!me.hasMultiValueItem && me.summaryFilter.selected_Any()){
6043 if(me.summaryFilter.selected_OR.indexOf(attrib)<0){
6044 var temp = [];
6045 me.summaryFilter.selected_OR.forEach(function(a){ temp.push(a); });
6046 temp.forEach(function(a){ a.set_NONE(); });
6047 }
6048 if(me.summaryFilter.selected_AND.indexOf(attrib)<0){
6049 var temp = [];
6050 me.summaryFilter.selected_AND.forEach(function(a){ temp.push(a); });
6051 temp.forEach(function(a){ a.set_NONE(); });
6052 }
6053 if(me.summaryFilter.selected_NOT.indexOf(attrib)<0){
6054 var temp = [];
6055 me.summaryFilter.selected_NOT.forEach(function(a){ temp.push(a); });
6056 temp.forEach(function(a){ a.set_NONE(); });
6057 }
6058 me.filterAttrib(attrib,"AND","All");
6059 } else {
6060 me.filterAttrib(attrib,"AND");
6061 }
6062 }
6063 }
6064 if(me.hasMultiValueItem){
6065 var x = this;
6066 this.timer = setTimeout(function() { x.timer = null; }, 500);
6067 }
6068 };
6069
6070 var dragged;
6071 var draggedAttrib = null;
6072 var attribDrag = function(d){
6073 this.addEventListener("dragstart", function( event ) {
6074 // store a ref. on the dragged elem
6075 dragged = event.target;
6076 draggedAttrib = d;
6077 // make it half transparent
6078 event.target.style.opacity = .5;
6079 }, false);
6080 this.addEventListener("dragend", function( event ) {
6081 // reset the transparency
6082 event.target.style.opacity = "";
6083 draggedAttrib = null;
6084 }, false);
6085 this.addEventListener("dragover", function( event ) {
6086 // prevent default to allow drop
6087 event.preventDefault();
6088 }, false);
6089 this.addEventListener("dragenter", function( event ) {
6090 // highlight potential drop target when the draggable element enters it
6091 if(draggedAttrib) {
6092 event.target.style.background = "rgba(0,0,150,0.5)";
6093 }
6094 }, false);
6095 this.addEventListener("dragleave", function( event ) {
6096 // reset background of potential drop target when the draggable element leaves it
6097 if(draggedAttrib) {
6098 event.target.style.background = "";
6099 }
6100 }, false);
6101 this.addEventListener("drop", function( event ) {
6102 // prevent default action (open as link for some elements)
6103 event.preventDefault();
6104 // move dragged elem to the selected drop target
6105 if ( event.target.className == "clickArea" ) {
6106 event.target.style.background = "";
6107 var item1 = dragged.__data__;
6108 var item2 = event.target.__data__;
6109 me._cats[item2.orderIndex] = item1;
6110 me._cats[item1.orderIndex] = item2;
6111 var tmp = item2.orderIndex
6112 item2.orderIndex = item1.orderIndex;
6113 item1.orderIndex = tmp;
6114
6115 item1.DOM.facet.tipsy.hide();
6116 item2.DOM.facet.tipsy.hide();
6117 item2.DOM.facet.setAttribute("highlight",false);
6118 item2.DOM.facet.setAttribute("highlight",false);
6119
6120 me.DOM.cats.each(function(attrib){
6121 if(attrib.isVisible){
6122 attrib.posX = 0;
6123 attrib.posY = me.heightRow_category*attrib.orderIndex;
6124 attrib.posY = me.heightRow_category*attrib.orderIndex;
6125 kshf.Util.setTransform(this,"translate("+attrib.posX+"px,"+attrib.posY+"px)");
6126 }
6127 });
6128
6129 if(me.cbFacetSort) me.cbFacetSort.call(me);
6130 }
6131 }, false);
6132 };
6133
6134 var cbOrEnter = function(attrib){
6135 me.browser.clearResultPreviews();
6136 attrib.DOM.facet.setAttribute("selecttype","or");
6137 if(me.summaryFilter.selected_OR.length>0)
6138 me.browser.clearResultPreviews();
6139 d3.event.stopPropagation();
6140 };
6141 var cbOrLeave = function(attrib){
6142 attrib.DOM.facet.setAttribute("selecttype","and");
6143 };
6144 var cbOrClick = function(attrib){
6145 me.filterAttrib(attrib,"OR");
6146 d3.event.stopPropagation();
6147 d3.event.preventDefault();
6148 };
6149
6150 var cbNotEnter = function(attrib){
6151 attrib.DOM.facet.setAttribute("selecttype","not");
6152 me.browser.preview_not = true;
6153 me.browser.refreshResultPreviews(attrib);
6154 d3.event.stopPropagation();
6155 };
6156 var cbNotLeave = function(attrib){
6157 attrib.DOM.facet.setAttribute("selecttype","and");
6158 me.browser.preview_not = false;
6159 me.browser.clearResultPreviews();
6160 };
6161 var cbNotClick = function(attrib){
6162 me.browser.preview_not = true;
6163 me.filterAttrib(attrib,"NOT");
6164 setTimeout(function(){ me.browser.preview_not = false; }, 1000);
6165 d3.event.stopPropagation();
6166 d3.event.preventDefault();
6167 };
6168
6169 var domAttrLabel = DOM_cats_new.append("span").attr("class", "attribLabel hasLabelWidth");
6170
6171 var filterButtons = domAttrLabel.append("span").attr("class", "filterButtons");
6172 filterButtons.append("span").attr("class","filterButton notButton")
6173 .text(kshf.lang.cur.Not)
6174 .on("mouseover",cbNotEnter)
6175 .on("mouseout",cbNotLeave)
6176 .on("click",cbNotClick);
6177 filterButtons.append("span").attr("class","filterButton orButton")
6178 .text(kshf.lang.cur.Or)
6179 .on("mouseover",cbOrEnter)
6180 .on("mouseout",cbOrLeave)
6181 .on("click",cbOrClick)
6182 ;
6183
6184 this.DOM.theLabel = domAttrLabel.append("span").attr("class","theLabel").html(function(category){
6185 return me.catLabel.call(category.data);
6186 });
6187
6188 DOM_cats_new.append("span").attr("class", "item_count_wrapper")
6189 .append("span").attr("class","measureLabel");
6190
6191 var domBarGroup = DOM_cats_new.append("span").attr("class","aggr_Group");
6192 domBarGroup.append("span").attr("class", "aggr total");
6193 domBarGroup.append("span").attr("class", "aggr total_tip");
6194 domBarGroup.append("span").attr("class", "aggr active");
6195 domBarGroup.append("span").attr("class", "aggr preview").attr("fast",true);
6196 domBarGroup.append("span").attr("class", "aggr compare").attr("hidden",true);
6197
6198 DOM_cats_new.append("span").attr("class", "clickArea")
6199 .attr("draggable",true)
6200 .on("click", cbAttribClick)
6201 .each(attribDrag)
6202 ;
6203
6204 DOM_cats_new.append("span").attr("class","compareButton fa")
6205 .each(function(category){
6206 this.tipsy = new Tipsy(this, {
6207 gravity: 'w',
6208 title: function(){
6209 return (me.browser.comparedAggregate!==category)?
6210 kshf.lang.cur.LockToCompare:kshf.lang.cur.Unlock;
6211 }
6212 });
6213 })
6214 .on("mouseenter",function(){ this.tipsy.show(); })
6215 .on("mouseleave",function(){ this.tipsy.hide(); })
6216 .on("click",function(attrib){
6217 this.tipsy.hide();
6218 me.browser.setPreviewCompare(attrib);
6219 d3.event.stopPropagation();
6220 })
6221 ;
6222
6223 this.DOM.cats = this.DOM.attribGroup.selectAll(".attrib")
6224 this.DOM.attribClickArea = this.DOM.cats.selectAll(".clickArea");
6225 this.DOM.compareButton = this.DOM.cats.selectAll(".compareButton");
6226 this.DOM.item_count_wrapper = this.DOM.cats.selectAll(".item_count_wrapper");
6227 this.DOM.measureLabel = this.DOM.cats.selectAll(".item_count_wrapper > .measureLabel");
6228
6229 this.DOM.aggr_Group = this.DOM.cats.selectAll(".aggr_Group");
6230 this.DOM.aggr_Total = this.DOM.aggr_Group.selectAll(".total");
6231 this.DOM.aggr_TotalTip = this.DOM.aggr_Group.selectAll(".total_tip");
6232 this.DOM.aggr_Active = this.DOM.aggr_Group.selectAll(".active");
6233 this.DOM.aggr_Preview = this.DOM.aggr_Group.selectAll(".preview");
6234 this.DOM.aggr_Compare = this.DOM.aggr_Group.selectAll(".compare");
6235 },
6236 /** -- */
6237 sortCategories: function(){
6238 var me = this;
6239 var inverse = this.catSortBy_Active.inverse;
6240 // Prepare sorting callback
6241 if(this.catSortBy_Active.prep) this.catSortBy_Active.prep.call(this);
6242
6243 // idCompareFunc can be based on integer or string comparison
6244 var idCompareFunc = function(a,b){return b.id()-a.id();};
6245 if(typeof(this._cats[0].id())==="string")
6246 idCompareFunc = function(a,b){return b.id().localeCompare(a.id());};
6247
6248 var theSortFunc;
6249 var sortV = this.catSortBy_Active.value;
6250 // sortV can only be function. Just having the check for sanity
6251 if(sortV && typeof sortV==="function"){
6252 // valueCompareFunc can be based on integer or string comparison
6253 var valueCompareFunc = function(a,b){return a-b;};
6254 if(typeof(sortV.call(this._cats[0].data, this._cats[0]))==="string")
6255 valueCompareFunc = function(a,b){return a.localeCompare(b);};
6256
6257 // Of the value is a 2-parameter function, we'll expect that it defines a sorting order
6258 if(sortV.length===2){
6259 theSortFunc = sortV;
6260 } else {
6261 // The value is a custom value that returns an integer
6262 theSortFunc = function(a,b){
6263 var x = valueCompareFunc(sortV.call(a.data,a),sortV.call(b.data,b));
6264 if(x===0) x=idCompareFunc(a,b);
6265 if(inverse) x=-x;
6266 return x;
6267 };
6268 }
6269 } else {
6270 var sortFunc = function(a,b){
6271 var dif=b.aggregate_Active - a.aggregate_Active;
6272 if(dif===0) { return b.aggregate_Total-a.aggregate_Total; }
6273 return dif;
6274 };
6275
6276 theSortFunc = function(a,b){
6277 // linked items...
6278 if(a.selectedForLink && !b.selectedForLink) return -1;
6279 if(b.selectedForLink && !a.selectedForLink) return 1;
6280
6281 // selected on top of the list
6282 if(!a.f_selected() && b.f_selected()) return 1;
6283 if( a.f_selected() && !b.f_selected()) return -1;
6284
6285 // put the items with zero active items to the end of list (may not be displayed)
6286 if(a.aggregate_Active===0 && b.aggregate_Active!==0) return 1;
6287 if(b.aggregate_Active===0 && a.aggregate_Active!==0) return -1;
6288
6289 var x=sortFunc(a,b);
6290 if(x===0) x=idCompareFunc(a,b); // stable sorting. ID's would be string most probably.
6291 if(inverse) x=-x;
6292 return x;
6293 };
6294 }
6295 this._cats.sort(theSortFunc);
6296 this._cats.forEach(function(cat,i){ cat.orderIndex=i; });
6297 },
6298 /** -- */
6299 updateAttribCull: function(){
6300 var me=this;
6301 this._cats.forEach(function(attrib,i){
6302 attrib.isCulled_before = attrib.isCulled;
6303 // not visible if it is not within visible range...
6304 if(attrib.orderIndex<me.cat_InDisplay_First) {
6305 attrib.isCulled=true;
6306 }
6307 else if(attrib.orderIndex>me.cat_InDisplay_First+me.catCount_InDisplay) {
6308 attrib.isCulled=true;
6309 } else {
6310 attrib.isCulled=false;
6311 }
6312 });
6313 },
6314 /** -- */
6315 updateCatSorting: function(sortDelay,force,noAnim){
6316 if(this._cats===undefined) return;
6317 if(this._cats.length===0) return;
6318 if(this.uniqueCategories()) return; // Nothing to sort...
6319 if(this.catSortBy_Active.no_resort===true && force!==true) return;
6320 if(this.removeInactiveCats){
6321 this.updateCatCount_Visible();
6322 }
6323
6324 var me = this;
6325 if(sortDelay===undefined) sortDelay = 1000;
6326 this.sortCategories();
6327
6328 if(this.panel===undefined) return; // The rest deals with updating UI
6329 if(this.DOM.cats===undefined) return;
6330
6331 this.updateAttribCull();
6332
6333 var xRemoveOffset = -100;
6334 if(this.panel.name==='right') xRemoveOffset *= -1; // disappear to the other edge
6335 if(this.cbFacetSort) this.cbFacetSort.call(this);
6336
6337 // filler is used to insert the scroll bar.
6338 // Items outside the view are not visible, something needs to expand the box
6339 this.DOM.chartBackground.style("height",this.getTotalAttribHeight()+"px");
6340 this.DOM.chartCatLabelResize.style("height",this.getTotalAttribHeight()+"px");
6341
6342 var attribGroupScroll = me.DOM.attribGroup[0][0];
6343 // always scrolls to top row automatically when re-sorted
6344 if(this.scrollTop_cache!==0) kshf.Util.scrollToPos_do(attribGroupScroll,0);
6345 this.refreshScrollDisplayMore(this.cat_InDisplay_First+this.catCount_InDisplay);
6346
6347 if(noAnim){
6348 this.DOM.cats.each(function(attrib){
6349 var x = 0;
6350 var y = me.heightRow_category*attrib.orderIndex;
6351 attrib.posX = x;
6352 attrib.posY = y;
6353 kshf.Util.setTransform(this,"translate("+x+"px,"+y+"px)");
6354 });
6355 return;
6356 }
6357
6358 setTimeout(function(){
6359 // 1. Make items disappear
6360 // Note: do not cull with number of items made visible.
6361 // We are applying visible and block to ALL attributes as we animate the change
6362 me.DOM.cats.each(function(ctgry){
6363 if(ctgry.isVisible_before && !ctgry.isVisible){
6364 // disappear into left panel...
6365 this.style.opacity = 0;
6366 ctgry.posX = xRemoveOffset;
6367 ctgry.posY = ctgry.posY;
6368 kshf.Util.setTransform(this,"translate("+ctgry.posX+"px,"+ctgry.posY+"px)");
6369 }
6370 if(!ctgry.isVisible_before && ctgry.isVisible){
6371 // will be made visible...
6372 ctgry.posY = me.heightRow_category*ctgry.orderIndex;
6373 kshf.Util.setTransform(this,"translate("+xRemoveOffset+"px,"+ctgry.posY+"px)");
6374 }
6375 if(ctgry.isVisible || ctgry.isVisible_before){
6376 this.style.visibility = "visible";
6377 this.style.display = "block";
6378 }
6379 });
6380
6381 // 2. Re-sort
6382 setTimeout(function(){
6383 me.DOM.cats.each(function(ctgry){
6384 if(ctgry.isVisible && ctgry.isVisible_before){
6385 ctgry.posX = 0;
6386 ctgry.posY = me.heightRow_category*ctgry.orderIndex;
6387 kshf.Util.setTransform(this,"translate("+ctgry.posX+"px,"+ctgry.posY+"px)");
6388 }
6389 });
6390
6391 // 3. Make items appear
6392 setTimeout(function(){
6393 me.DOM.cats.each(function(ctgry){
6394 if(!ctgry.isVisible_before && ctgry.isVisible){
6395 this.style.opacity = 1;
6396 ctgry.posX = 0;
6397 ctgry.posY = me.heightRow_category*ctgry.orderIndex;
6398 kshf.Util.setTransform(this,
6399 "translate("+ctgry.posX+"px,"+ctgry.posY+"px)");
6400 }
6401 });
6402 // 4. Apply culling
6403 setTimeout(function(){ me.cullAttribs();} , 700);
6404 },(me.catCount_NowVisible>0)?300:0);
6405
6406 },(me.catCount_NowInvisible>0)?300:0);
6407
6408 },sortDelay);
6409 },
6410 /** -- */
6411 getTotalAttribHeight: function(){
6412 return this.catCount_Visible*this.heightRow_category;
6413 },
6414 /** -- */
6415 cullAttribs: function(){
6416 this.DOM.cats
6417 .style("visibility",function(attrib){
6418 return (attrib.isCulled || !attrib.isVisible)?"hidden":"visible";
6419 }).style("display",function(attrib){
6420 return (attrib.isCulled || !attrib.isVisible)?"none":"block";
6421 });
6422
6423 if(this.cbCatCulled) this.cbCatCulled.call(this);
6424 },
6425 /** -- */
6426 chartAxis_Measure_TickSkip: function(){
6427 var width = this.chartScale_Measure.range()[1];
6428 var ticksSkip = width/25;
6429 if(this.getMaxAggr_Active()>100000){
6430 ticksSkip = width/30;
6431 }
6432 if(this.browser.percentModeActive){
6433 ticksSkip /= 1.1;
6434 }
6435 return ticksSkip;
6436 }
6437 };
6438
6439 for(var index in Summary_Categorical_functions){
6440 kshf.Summary_Categorical.prototype[index] = Summary_Categorical_functions[index];
6441 }
6442
6443
6444
6445 /**
6446 * KESHIF FACET - Categorical
6447 * @constructor
6448 */
6449 kshf.Summary_Interval = function(){};
6450 kshf.Summary_Interval.prototype = new kshf.Summary_Base();
6451 var Summary_Interval_functions = {
6452 initialize: function(browser,name,attribFunc){
6453 kshf.Summary_Base.prototype.initialize.call(this,browser,name,attribFunc);
6454 this.type='interval';
6455
6456 // Call the parent's constructor
6457 var me = this;
6458
6459 // pixel width settings...
6460 this.height_hist = 1; // Initial width (will be updated later...)
6461 this.height_hist_min = 20; // Minimum possible histogram height
6462 this.height_hist_max = 100; // Maximim possible histogram height
6463 this.height_slider = 12; // Slider height
6464 this.height_labels = 13; // Height for labels
6465 this.height_percentile = 16; // Height for percentile chart
6466 this.height_hist_topGap = 12; // Height for histogram gap on top.
6467
6468 this.width_barGap = 2; // The width between neighboring histgoram bars
6469 this.width_histMargin = 17; // ..
6470 this.width_vertAxisLabel = 23; // ..
6471
6472 this.optimumTickWidth = 50;
6473
6474 this.scaleType = 'linear'; // 'time', 'step', 'log'
6475 this.hasFloat = false;
6476 this.hasTime = false;
6477
6478 this.unitName = undefined; // the text appended to the numeric value (TODO: should not apply to time)
6479 this.showPercentile = false; // Percentile chart is a 1-line chart which shows %10-%20-%30-%40-%50 percentiles
6480 this.zoomed = false;
6481
6482 this.histBins = [];
6483 this.intervalTicks = [];
6484 this.intervalRange = {};
6485 this.intervalTickFormat = function(v){
6486 if(!me.hasFloat) return d3.format("s")(v);
6487 return d3.format(".2f")(v);
6488 };
6489
6490 if(this.items.length<=1000) this.initializeAggregates();
6491 },
6492 /** -- */
6493 initializeAggregates: function(){
6494 if(this.aggr_initialized) return;
6495 var me=this;
6496 var filterId = this.summaryFilter.id;
6497 this.itemV = function(item){ return item.mappedDataCache[filterId].v; };
6498
6499 this.items.forEach(function(item){
6500 var v=this.summaryFunc.call(item.data,item);
6501 if(isNaN(v)) v=null;
6502 if(v===undefined) v=null;
6503 if(v!==null){
6504 if(v instanceof Date){
6505 this.hasTime = true;
6506 } else {
6507 if(typeof v!=='number'){
6508 v = null;
6509 } else{
6510 this.hasFloat = this.hasFloat || v%1!==0;
6511 }
6512 }
6513 }
6514 item.mappedDataCache[filterId] = {
6515 v: v,
6516 h: this,
6517 };
6518 },this);
6519 if(this.hasTime) this.setScaleType('time');
6520
6521 // remove items that map to null / undefined
6522 this.filteredItems = this.items.filter(function(item){
6523 var v = me.itemV(item);
6524 return (v!==undefined && v!==null);
6525 });
6526
6527 // Sort the items by their attribute value
6528 var sortValue = this.hasTime?
6529 function(a){ return me.itemV(a).getTime(); }:
6530 function(a){ return me.itemV(a); };
6531 this.filteredItems.sort(function(a,b){ return sortValue(a)-sortValue(b);});
6532
6533 this.updateIntervalRangeMinMax();
6534
6535 this.detectLogScale();
6536
6537 // The default is for nugget viz...
6538 this.updateScaleAndBins(30,10);
6539
6540 this.aggr_initialized = true;
6541
6542 this.refreshViz_Nugget();
6543 },
6544 /** -- */
6545 detectLogScale: function(){
6546 if(this.scaleType==='time') return;
6547 var me = this;
6548 var filterId = this.summaryFilter.id;
6549 var activeItemV = function(item){
6550 // decide based on whether the items are in the visible range
6551 var v = item.mappedDataCache[filterId].v;
6552 if(v>=me.intervalRange.active.min && v <= me.intervalRange.active.max) return v;
6553 };
6554 var deviation = d3.deviation(this.filteredItems, activeItemV);
6555 var activeRange = this.intervalRange.active.max-this.intervalRange.active.min;
6556 if(deviation/activeRange<0.12 && this.intervalRange.active.min>=0){
6557 this.setScaleType('log');
6558 } else{
6559 if(this.scaleType==='log'){
6560 this.setScaleType("linear");
6561 }
6562 }
6563 },
6564 /** -- */
6565 createSummaryFilter: function(){
6566 var me=this;
6567 this.summaryFilter = this.browser.createFilter({
6568 parentSummary: this,
6569 onClear: function(summary){
6570 if(this.filteredBin){
6571 this.filteredBin.setAttribute("filtered",false);
6572 this.filteredBin = undefined;
6573 }
6574 summary.DOM.root.attr("filtered",false);
6575 if(summary.zoomed){
6576 summary.setZoomed(false);
6577 }
6578 summary.resetIntervalFilterActive();
6579 summary.refreshIntervalSlider();
6580 },
6581 onFilter: function(summary){
6582 summary.DOM.root.attr("filtered",true);
6583
6584 var i_min = this.active.min;
6585 var i_max = this.active.max;
6586
6587 var isFilteredCb;
6588 if(summary.isFiltered_min() && summary.isFiltered_max()){
6589 if(this.max_inclusive)
6590 isFilteredCb = function(v){ return v>=i_min && v<=i_max; };
6591 else
6592 isFilteredCb = function(v){ return v>=i_min && v<i_max; };
6593 } else if(summary.isFiltered_min()){
6594 isFilteredCb = function(v){ return v>=i_min; };
6595 } else {
6596 if(this.max_inclusive)
6597 isFilteredCb = function(v){ return v<=i_max; };
6598 else
6599 isFilteredCb = function(v){ return v<i_max; };
6600 }
6601 if(summary.scaleType==='step'){
6602 if(i_min===i_max){
6603 isFilteredCb = function(v){ return v===i_max; };
6604 }
6605 }
6606
6607 // TODO: Optimize: Check if the interval scale is extending/shrinking or completely updated...
6608 summary.items.forEach(function(item){
6609 var v = item.mappedDataCache[this.id].v;
6610 item.setFilterCache(this.id, (v!==null)?isFilteredCb(v):false);
6611 },this);
6612
6613 if(summary.scaleType==="step"){
6614 if(summary.zoomed) summary.DOM.zoomControl.attr("sign", "minus");
6615 } else {
6616 summary.DOM.zoomControl.attr("sign", "plus");
6617 }
6618
6619 summary.refreshIntervalSlider();
6620 },
6621 filterView_Detail: function(summary){
6622 var minValue = this.active.min;
6623 var maxValue = this.active.max;
6624 if(summary.scaleType==='step'){
6625 if(minValue===maxValue) return "<b>"+minValue+"</b>";
6626 }
6627 if(summary.scaleType==='time'){
6628 return "<b>"+summary.intervalTickFormat(minValue)+
6629 "</b> to <b>"+summary.intervalTickFormat(maxValue)+"</b>";
6630 }
6631 if(summary.hasFloat){
6632 minValue = minValue.toFixed(2);
6633 maxValue = maxValue.toFixed(2);
6634 }
6635 if(summary.isFiltered_min() && summary.isFiltered_max()){
6636 return "<b>"+minValue+"</b> to <b>"+maxValue+"</b>";
6637 } else if(summary.isFiltered_min()){
6638 return "<b>at least "+minValue+"</b>";
6639 } else {
6640 return "<b>at most "+maxValue+"</b>";
6641 }
6642 },
6643 });
6644 },
6645 /** -- */
6646 refreshViz_Nugget: function(){
6647 if(this.DOM.nugget===undefined) return;
6648
6649 var nuggetChart = this.DOM.nugget.select(".nuggetChart");
6650
6651 this.DOM.nugget
6652 .attr("aggr_initialized",this.aggr_initialized)
6653 .attr("datatype",this.getDataType());
6654
6655 if(!this.aggr_initialized) return;
6656
6657 if(this.uniqueCategories()){
6658 this.DOM.nugget.select(".nuggetInfo").html("<span class='fa fa-tag'></span><br>Unique");
6659 nuggetChart.style("display",'none');
6660 return;
6661 }
6662
6663 var maxAggregate_Total = this.getMaxAggr_Total();
6664
6665 if(this.intervalRange.min===this.intervalRange.max){
6666 this.DOM.nugget.select(".nuggetInfo").html("only<br>"+this.intervalRange.min);
6667 nuggetChart.style("display",'none');
6668 return;
6669 }
6670
6671 var totalHeight = 17;
6672 nuggetChart.selectAll(".nuggetBar").data(this.histBins).enter()
6673 .append("span").attr("class","nuggetBar")
6674 .style("height",function(aggr){
6675 return totalHeight*(aggr.length/maxAggregate_Total)+"px";
6676 })
6677 ;
6678
6679 this.DOM.nugget.select(".nuggetInfo").html(
6680 "<span class='num_left'>"+this.intervalTickFormat(this.intervalRange.min)+"</span>"+
6681 "<span class='num_right'>"+this.intervalTickFormat(this.intervalRange.max)+"</span>");
6682 },
6683 /** -- */
6684 updateIntervalRangeMinMax: function(){
6685 this.intervalRange.min = d3.min(this.filteredItems,this.itemV);
6686 this.intervalRange.max = d3.max(this.filteredItems,this.itemV);
6687 this.intervalRange.active = {
6688 min: this.intervalRange.min,
6689 max: this.intervalRange.max
6690 };
6691 this.isEmpty = this.intervalRange.min===undefined;
6692 if(this.isEmpty) this.setCollapsed(true);
6693 this.resetIntervalFilterActive();
6694 },
6695 /** -- */
6696 resetIntervalFilterActive: function(){
6697 this.summaryFilter.active = {
6698 min: this.intervalRange.min,
6699 max: this.intervalRange.max
6700 };
6701 },
6702 /** -- */
6703 setScaleType: function(t){
6704 if(this.scaleType===t) return;
6705 var me=this;
6706 this.scaleType=t;
6707
6708 if(this.DOM.facetInterval) this.DOM.facetInterval.attr("scaleType",this.scaleType);
6709
6710 // remove items with value:0 (because log(0) is invalid)
6711 if(this.scaleType==='log' && (this.intervalRange.min===0 || this.intervalRange.max===0)) {
6712 this.filteredItems = this.filteredItems.filter(function(item){ return me.itemV(item)!==0; });
6713 this.updateIntervalRangeMinMax();
6714 if(this.panel===undefined){
6715 this.updateScaleAndBins(30,10);
6716 } else {
6717 var _width_ = this.getWidth()-this.width_histMargin-this.width_vertAxisLabel;
6718 this.updateScaleAndBins( _width_, Math.ceil(_width_/this.optimumTickWidth));
6719 }
6720 }
6721 },
6722 /** -- */
6723 getHeight: function(){
6724 if(this.collapsed) return this.getHeight_Header();
6725 // Note: I don't know why I need -2 to match real dom height.
6726 return this.getHeight_Header()+this.getHeight_Wrapper();
6727 },
6728 /** -- */
6729 getHeight_Wrapper: function(){
6730 return this.height_hist+this.getHeight_Extra();
6731 },
6732 /** -- */
6733 getHeight_Header: function(){
6734 return this.DOM.headerGroup[0][0].offsetHeight;
6735 },
6736 /** -- */
6737 getHeight_Extra: function(){
6738 return 7+this.height_hist_topGap+this.height_labels+this.height_slider+
6739 (this.showPercentile?this.height_percentile:0);
6740 },
6741 /** -- */
6742 getHeight_RangeMax: function(){
6743 return this.getHeight_Header()+this.height_hist_max+this.getHeight_Extra();
6744 },
6745 /** -- */
6746 getHeight_RangeMin: function(){
6747 return this.getHeight_Header()+this.height_hist_min+this.getHeight_Extra();
6748 },
6749 /** -- */
6750 isFiltered_min: function(){
6751 // the active min is different from intervalRange min.
6752 if(this.summaryFilter.active.min!==this.intervalRange.min) return true;
6753 // if using log scale, assume min is also filtered when max is filtered.
6754 if(this.scaleType==='log') return this.isFiltered_max();
6755 return false;
6756 },
6757 /** -- */
6758 isFiltered_max: function(){
6759 return this.summaryFilter.active.max!==this.intervalRange.max;
6760 },
6761 /** -- */
6762 getMaxAggr_Total: function(){
6763 return d3.max(this.histBins,function(aggr){ return aggr.length; });
6764 },
6765 /** -- */
6766 getMaxAggr_Active: function(){
6767 return d3.max(this.histBins,function(aggr){ return aggr.aggregate_Active; });
6768 },
6769 /** -- */
6770 initDOM: function(beforeDOM){
6771 this.initializeAggregates();
6772 if(this.isEmpty) return;
6773 if(this.DOM.inited===true) return;
6774 var me = this;
6775
6776 this.insertRoot(beforeDOM);
6777
6778 this.DOM.root
6779 .attr("hasMultiValueItem",false);
6780
6781 this.insertHeader();
6782
6783 this.DOM.wrapper = this.DOM.root.append("div").attr("class","wrapper");
6784 this.DOM.facetInterval = this.DOM.wrapper.append("div")
6785 .attr("class","facetInterval")
6786 .attr("scaleType",this.scaleType)
6787 .attr("zoomed",this.zoomed)
6788 .on("mousedown",function(){
6789 d3.event.stopPropagation();
6790 d3.event.preventDefault();
6791 });
6792
6793 this.DOM.histogram = this.DOM.facetInterval.append("div").attr("class","histogram");
6794 this.DOM.histogram_bins = this.DOM.histogram.append("div").attr("class","bins")
6795 .style("margin-left",(this.width_vertAxisLabel)+"px");
6796
6797 if(this.scaleType==='time'){
6798 this.DOM.timeSVG = this.DOM.histogram.append("svg").attr("class","timeSVG")
6799 .attr("xmlns","http://www.w3.org/2000/svg")
6800 .style("margin-left",(this.width_vertAxisLabel+this.width_barGap)+"px");
6801 }
6802
6803 this.insertChartAxis_Measure(this.DOM.histogram, 'w', 'nw');
6804 this.DOM.chartAxis_Measure.style("padding-left",(this.width_vertAxisLabel-2)+"px")
6805
6806 this.initDOM_Slider();
6807
6808 if(this.showPercentile===true){
6809 this.initDOM_Percentile();
6810 }
6811
6812 var _width_ = this.getWidth()-this.width_histMargin-this.width_vertAxisLabel;
6813 this.updateScaleAndBins( _width_, Math.ceil(_width_/this.optimumTickWidth));
6814
6815 this.setCollapsed(this.collapsed);
6816 this.setUnitName(this.unitName);
6817
6818 this.DOM.inited=true;
6819 },
6820 /** -- */
6821 setZoomed: function(v){
6822 this.zoomed = v;
6823 this.DOM.facetInterval.attr("zoomed",this.zoomed);
6824 if(this.zoomed){
6825 this.intervalRange.active.min = this.summaryFilter.active.min;
6826 this.intervalRange.active.max = this.summaryFilter.active.max;
6827 this.DOM.zoomControl.attr("sign","minus");
6828 } else {
6829 this.intervalRange.active.min = this.intervalRange.min;
6830 this.intervalRange.active.max = this.intervalRange.max;
6831 this.DOM.zoomControl.attr("sign","plus");
6832 }
6833 // TODO: enable this once all else is working...
6834 this.detectLogScale();
6835 var _width_ = this.getWidth()-this.width_histMargin-this.width_vertAxisLabel;
6836 this.updateScaleAndBins( _width_, Math.ceil(_width_/this.optimumTickWidth));
6837 },
6838 /** -- */
6839 setUnitName: function(v){
6840 this.unitName = v;
6841 this.refreshTickLabels();
6842 },
6843 /** -- */
6844 initDOM_Percentile: function(){
6845 var me=this;
6846 if(this.DOM.facetInterval===undefined) return;
6847 this.DOM.percentileGroup = this.DOM.facetInterval.append("div").attr("class","percentileGroup")
6848 .style('margin-left',this.width_vertAxisLabel+"px");;
6849 this.DOM.percentileGroup.append("span").attr("class","percentileTitle").html(kshf.lang.cur.Percentiles);
6850
6851 this.DOM.quantile = {};
6852
6853 [[10,90],[20,80],[30,70],[40,60]].forEach(function(qb){
6854 this.DOM.quantile[""+qb[0]+"_"+qb[1]] = this.DOM.percentileGroup.append("span")
6855 .attr("class","quantile q_range q_"+qb[0]+"_"+qb[1])
6856 .each(function(){
6857 this.tipsy = new Tipsy(this, {
6858 gravity: 's',
6859 title: function(){
6860 return "<span style='font-weight:300'>%"+qb[0]+" - %"+qb[1]+" Percentile: <span style='font-weight:500'>"+
6861 me.quantile_val[qb[0]]+" - "+me.quantile_val[qb[1]]+"</span></span>"
6862 ;
6863 }
6864 })
6865 })
6866 .on("mouseover",function(){ this.tipsy.show(); })
6867 .on("mouseout" ,function(){ this.tipsy.hide(); })
6868 ;
6869 },this);
6870
6871 [10,20,30,40,50,60,70,80,90].forEach(function(q){
6872 this.DOM.quantile[q] = this.DOM.percentileGroup.append("span")
6873 .attr("class","quantile q_pos q_"+q)
6874 .each(function(){
6875 this.tipsy = new Tipsy(this, {
6876 gravity: 's',
6877 title: function(){
6878 return "Median: "+ me.quantile_val[q];
6879 }
6880 })
6881 })
6882 .on("mouseover",function(){ this.tipsy.show(); })
6883 .on("mouseout" ,function(){ this.tipsy.hide(); })
6884 ;
6885 },this);
6886 },
6887 /** -- */
6888 updateDOMwidth: function(){
6889 if(this.DOM.inited===false) return;
6890 var chartWidth = this.getWidth()-this.width_histMargin-this.width_vertAxisLabel;
6891 this.DOM.facetInterval.style("width",this.getWidth()+"px");
6892 this.DOM.summaryTitle.style("max-width",(this.getWidth()-40)+"px");
6893 if(this.DOM.timeSVG)
6894 this.DOM.timeSVG.style("width",(chartWidth+2)+"px")
6895 },
6896 /** --
6897 Uses
6898 - this.scaleType
6899 - this.intervalRange min & max
6900 Updates
6901 - this.intervalTickFormat
6902 - this.valueScale.nice()
6903 Return
6904 - the tick values in an array
6905 */
6906 getValueTicks: function(optimalTickCount){
6907 var me=this;
6908 var ticks;
6909
6910 // HANDLE TIME CAREFULLY
6911 if(this.scaleType==='time') {
6912 // 1. Find the appropriate aggregation interval (day, month, etc)
6913 var timeRange_ms = this.intervalRange.active.max-this.intervalRange.active.min; // in milliseconds
6914 var timeInterval;
6915 var timeIntervalStep = 1;
6916 if((timeRange_ms/1000) < optimalTickCount){
6917 timeInterval = d3.time.second.utc;
6918 this.intervalTickFormat = d3.time.format.utc("%S");
6919 } else if((timeRange_ms/(1000*5)) < optimalTickCount){
6920 timeInterval = d3.time.second.utc;
6921 timeIntervalStep = 5;
6922 this.intervalTickFormat = d3.time.format.utc("%-S");
6923 } else if((timeRange_ms/(1000*15)) < optimalTickCount){
6924 timeInterval = d3.time.second.utc;
6925 timeIntervalStep = 15;
6926 this.intervalTickFormat = d3.time.format.utc("%-S");
6927 } else if((timeRange_ms/(1000*60)) < optimalTickCount){
6928 timeInterval = d3.time.minute.utc;
6929 timeIntervalStep = 1;
6930 this.intervalTickFormat = d3.time.format.utc("%-M");
6931 } else if((timeRange_ms/(1000*60*5)) < optimalTickCount){
6932 timeInterval = d3.time.minute.utc;
6933 timeIntervalStep = 5;
6934 this.intervalTickFormat = d3.time.format.utc("%-M");
6935 } else if((timeRange_ms/(1000*60*15)) < optimalTickCount){
6936 timeInterval = d3.time.minute.utc;
6937 timeIntervalStep = 15;
6938 this.intervalTickFormat = d3.time.format.utc("%-M");
6939 } else if((timeRange_ms/(1000*60*60)) < optimalTickCount){
6940 timeInterval = d3.time.hour.utc;
6941 timeIntervalStep = 1;
6942 this.intervalTickFormat = d3.time.format.utc("%-H");
6943 } else if((timeRange_ms/(1000*60*60*6)) < optimalTickCount){
6944 timeInterval = d3.time.hour.utc;
6945 timeIntervalStep = 6;
6946 this.intervalTickFormat = d3.time.format.utc("%-H");
6947 } else if((timeRange_ms/(1000*60*60*24)) < optimalTickCount){
6948 timeInterval = d3.time.day.utc;
6949 timeIntervalStep = 1;
6950 this.intervalTickFormat = d3.time.format.utc("%-e");
6951 // TODO: kshf.Util.ordinal_suffix_of();
6952 } else if((timeRange_ms/(1000*60*60*24*7)) < optimalTickCount){
6953 timeInterval = d3.time.week.utc;
6954 timeIntervalStep = 1;
6955 this.intervalTickFormat = function(v){
6956 var suffix = kshf.Util.ordinal_suffix_of(v.getUTCDate());
6957 var first=d3.time.format.utc("%-b")(v);
6958 return suffix+"<br>"+first;
6959 };
6960 this.height_labels = 28;
6961 } else if((timeRange_ms/(1000*60*60*24*30)) < optimalTickCount){
6962 timeInterval = d3.time.month.utc;
6963 timeIntervalStep = 1;
6964 this.intervalTickFormat = function(v){
6965 var threeMonthsLater = timeInterval.offset(v, 3);
6966 var first=d3.time.format.utc("%-b")(v);
6967 var s=first;
6968 if(first==="Jan") s+="<br>"+(d3.time.format("%Y")(threeMonthsLater));
6969 return s;
6970 };
6971 this.height_labels = 28;
6972 } else if((timeRange_ms/(1000*60*60*24*30*3)) < optimalTickCount){
6973 timeInterval = d3.time.month.utc;
6974 timeIntervalStep = 3;
6975 this.intervalTickFormat = function(v){
6976 var threeMonthsLater = timeInterval.offset(v, 3);
6977 var first=d3.time.format.utc("%-b")(v);
6978 var s=first;
6979 if(first==="Jan") s+="<br>"+(d3.time.format("%Y")(threeMonthsLater));
6980 return s;
6981 };
6982 this.height_labels = 28;
6983 } else if((timeRange_ms/(1000*60*60*24*30*6)) < optimalTickCount){
6984 timeInterval = d3.time.month.utc;
6985 timeIntervalStep = 6;
6986 this.intervalTickFormat = function(v){
6987 var threeMonthsLater = timeInterval.offset(v, 6);
6988 var first=d3.time.format.utc("%-b")(v);
6989 var s=first;
6990 if(first==="Jan") s+="<br>"+(d3.time.format("%Y")(threeMonthsLater));
6991 return s;
6992 };
6993 this.height_labels = 28;
6994 } else if((timeRange_ms/(1000*60*60*24*365)) < optimalTickCount){
6995 timeInterval = d3.time.year.utc;
6996 timeIntervalStep = 1;
6997 this.intervalTickFormat = d3.time.format.utc("%Y");
6998 } else if((timeRange_ms/(1000*60*60*24*365*2)) < optimalTickCount){
6999 timeInterval = d3.time.year.utc;
7000 timeIntervalStep = 2;
7001 this.intervalTickFormat = d3.time.format.utc("%Y");
7002 } else if((timeRange_ms/(1000*60*60*24*365*3)) < optimalTickCount){
7003 timeInterval = d3.time.year.utc;
7004 timeIntervalStep = 3;
7005 this.intervalTickFormat = d3.time.format.utc("%Y");
7006 } else if((timeRange_ms/(1000*60*60*24*365*4)) < optimalTickCount){
7007 timeInterval = d3.time.year.utc;
7008 timeIntervalStep = 4;
7009 this.intervalTickFormat = d3.time.format.utc("%Y");
7010 } else if((timeRange_ms/(1000*60*60*24*365*5)) < optimalTickCount){
7011 timeInterval = d3.time.year.utc;
7012 timeIntervalStep = 5;
7013 this.intervalTickFormat = function(v){
7014 var later = timeInterval.offset(v, 4);
7015 return d3.time.format.utc("%Y")(v);
7016 };
7017 this.height_labels = 28;
7018 } else if((timeRange_ms/(1000*60*60*24*365*25)) < optimalTickCount){
7019 timeInterval = d3.time.year.utc;
7020 timeIntervalStep = 25;
7021 this.intervalTickFormat = d3.time.format.utc("%Y");
7022 } else if((timeRange_ms/(1000*60*60*24*365*100)) < optimalTickCount){
7023 timeInterval = d3.time.year.utc;
7024 timeIntervalStep = 100;
7025 this.intervalTickFormat = d3.time.format.utc("%Y");
7026 } else {
7027 timeInterval = d3.time.year.utc;
7028 timeIntervalStep = 500;
7029 this.intervalTickFormat = d3.time.format.utc("%Y");
7030 }
7031
7032 this.valueScale.nice(timeInterval, timeIntervalStep);
7033 ticks = this.valueScale.ticks(timeInterval, timeIntervalStep);
7034 } else if(this.scaleType==='step'){
7035 ticks = [];
7036 for(var i=this.intervalRange.active.min ; i<=this.intervalRange.active.max; i++){
7037 ticks.push(i);
7038 }
7039 this.intervalTickFormat = d3.format("d");
7040 } else if(this.scaleType==='log'){
7041 this.valueScale.nice(optimalTickCount);
7042 // Generate ticks
7043 ticks = this.valueScale.ticks(optimalTickCount);
7044 while(ticks.length > optimalTickCount*1.6){
7045 ticks = ticks.filter(function(d,i){return i%2===0;});
7046 }
7047 if(!this.hasFloat)
7048 ticks = ticks.filter(function(d){return d%1===0;});
7049 this.intervalTickFormat = d3.format(".1s");
7050 } else {
7051 this.valueScale.nice(optimalTickCount);
7052 this.valueScale.nice(optimalTickCount);
7053 ticks = this.valueScale.ticks(optimalTickCount);
7054 this.valueScale.nice(optimalTickCount);
7055 ticks = this.valueScale.ticks(optimalTickCount);
7056
7057 if(!this.hasFloat) ticks = ticks.filter(function(d){return d===0||d%1===0;});
7058
7059 var d3Formating = d3.format(this.hasFloat?".2f":".2s");
7060 this.intervalTickFormat = function(d){
7061 if(!me.hasFloat && d<10) return d;
7062 if(!me.hasFloat && Math.abs(ticks[1]-ticks[0])<1000) return d;
7063 var x= d3Formating(d);
7064 if(x.indexOf(".00")!==-1) x = x.replace(".00","");
7065 if(x.indexOf(".0")!==-1) x = x.replace(".0","");
7066 return x;
7067 }
7068 }
7069
7070 return ticks;
7071 },
7072 /**
7073 Uses
7074 - optimumTickWidth
7075 - this.intervalRang
7076 Updates:
7077 - scaleType (if steps is more appropriate)
7078 - valueScale
7079 - intervalTickFormat
7080 */
7081 updateScaleAndBins: function(_width_,optimalTickCount){
7082 if(this.isEmpty) return;
7083 var me=this;
7084
7085 // Check if you can use a ste-scale instead
7086 var stepRange=(this.intervalRange.active.max-this.intervalRange.active.min)+1;
7087 var stepWidth=_width_/stepRange;
7088 if(!this.hasFloat && (this.scaleType==='step' || this.scaleType==='linear')) {
7089 if(optimalTickCount>=stepRange){
7090 this.setScaleType('step');
7091 } else {
7092 this.setScaleType('linear');
7093 }
7094 }
7095
7096 // UPDATE intervalScale
7097 switch(this.scaleType){
7098 case 'linear': case 'step':
7099 this.valueScale = d3.scale.linear(); break;
7100 case 'log':
7101 this.valueScale = d3.scale.log().base(2); break;
7102 case 'time':
7103 this.valueScale = d3.time.scale.utc(); break;
7104 }
7105
7106 this.valueScale
7107 .domain([this.intervalRange.active.min, this.intervalRange.active.max])
7108 .range([0, _width_]);
7109
7110 if(this.scaleType==='step'){
7111 this.valueScale.range([stepWidth/2, _width_-stepWidth/2]);
7112 }
7113
7114 var ticks = this.getValueTicks(optimalTickCount);
7115
7116 // Sometimes, the number of bins generated is larger than the optimal
7117 // In some cases, the ticks become suitable for step-scale. Detect it here.
7118 if(!this.hasFloat && (this.scaleType==='step' || this.scaleType==='linear')){
7119 if(ticks.length===stepRange){
7120 this.setScaleType('step');
7121 this.valueScale.range([stepWidth/2, _width_-stepWidth/2]);
7122 }
7123 }
7124
7125 if(this.scaleType!=='step'){
7126 this.aggrWidth = this.valueScale(ticks[1])-this.valueScale(ticks[0]);
7127 } else {
7128 this.aggrWidth = _width_/stepRange;
7129 }
7130
7131 var ticksChanged = (this.intervalTicks.length!==ticks.length) ||
7132 this.intervalTicks[0]!==ticks[0] ||
7133 this.intervalTicks[this.intervalTicks.length-1] !== ticks[ticks.length-1]
7134 ;
7135
7136 if(ticksChanged){
7137 this.intervalTicks = ticks;
7138 var filterId = this.summaryFilter.id;
7139
7140 var itemV = function(item){
7141 // if(item.isWanted) // Include all items - Aggregate also shows the "total" viz
7142 return item.mappedDataCache[filterId].v;
7143 };
7144 if(this.zoomed===false){
7145 itemV = this.itemV;
7146 }
7147 if(this.scaleType!=='step'){
7148 this.histBins = d3.layout.histogram().bins(this.intervalTicks).value(itemV)(this.filteredItems);
7149 } else {
7150 // I'll do the bins myself, d3 just messes it up when I need a simple step scale
7151 this.histBins = [];
7152 for(var bin=this.intervalRange.active.min; bin<=this.intervalRange.active.max; bin++){
7153 var d = [];
7154 d.x = bin;
7155 d.y = 0;
7156 d.dx = 0;
7157 this.histBins.push(d);
7158 }
7159 this.filteredItems.forEach(function(item){
7160 var v = itemV(item);
7161 if(v===null || v===undefined) return;
7162 if(v<this.intervalRange.active.min) return;
7163 if(v>this.intervalRange.active.max) return;
7164 var bin = this.histBins[v-this.intervalRange.active.min];
7165 bin.push(item);
7166 bin.y++;
7167 },this);
7168 }
7169
7170 this.updateAggregate_Active();
7171 this.updateBarScale2Active();
7172
7173 if(this.DOM.root){
7174 this.insertVizDOM();
7175 }
7176
7177 if(this.showPercentile) this.updatePercentiles();
7178 }
7179 if(this.DOM.root){
7180 if(this.DOM.aggr_Group===undefined){
7181 this.insertVizDOM();
7182 }
7183 this.refreshBins_Translate();
7184 this.refreshViz_Scale();
7185
7186 this.DOM.labelGroup.selectAll(".tick").style("left",function(d){
7187 return (me.valueScale(d))+"px";
7188 });
7189 this.refreshIntervalSlider();
7190 }
7191 },
7192 /** -- */
7193 insertVizDOM: function(){
7194 if(this.scaleType==='time' && this.DOM.root) {
7195 // delete existing DOM:
7196 // TODO: Find a way to avoid this?
7197 this.DOM.timeSVG.select(".lineTrend.total").remove();
7198 this.DOM.timeSVG.select(".lineTrend.active").remove();
7199 this.DOM.timeSVG.select(".lineTrend.preview").remove();
7200 this.DOM.timeSVG.select(".lineTrend.compare").remove();
7201 this.DOM.timeSVG.selectAll("line.activeLine").remove();
7202 this.DOM.timeSVG.selectAll("line.previewLine").remove();
7203 this.DOM.timeSVG.selectAll("line.compareLine").remove();
7204
7205 this.DOM.lineTrend_Total = this.DOM.timeSVG.append("path").attr("class","lineTrend total")
7206 .datum(this.histBins);
7207 this.DOM.lineTrend_Active = this.DOM.timeSVG.append("path").attr("class","lineTrend active")
7208 .datum(this.histBins);
7209 this.DOM.lineTrend_ActiveLine = this.DOM.timeSVG.selectAll("line.activeLine")
7210 .data(this.histBins, function(d,i){ return i; })
7211 .enter().append("line").attr("class","lineTrend activeLine");
7212 this.DOM.lineTrend_Preview = this.DOM.timeSVG.append("path").attr("class","lineTrend preview")
7213 .datum(this.histBins);
7214 this.DOM.lineTrend_PreviewLine = this.DOM.timeSVG.selectAll("line.previewLine")
7215 .data(this.histBins, function(d,i){ return i; })
7216 .enter().append("line").attr("class","lineTrend previewLine");
7217 this.DOM.lineTrend_Compare = this.DOM.timeSVG.append("path").attr("class","lineTrend compare")
7218 .datum(this.histBins);
7219 this.DOM.lineTrend_CompareLine = this.DOM.timeSVG.selectAll("line.compareLine")
7220 .data(this.histBins, function(d,i){ return i; })
7221 .enter().append("line").attr("class","lineTrend compareLine");
7222 }
7223
7224 this.insertBins();
7225 this.refreshViz_Axis();
7226 //this.refreshViz_Preview();
7227 this.refreshMeasureLabel();
7228 this.updateTicks();
7229 },
7230 /** -- */
7231 updateTicks: function(){
7232 this.DOM.labelGroup.selectAll(".tick").data([]).exit().remove(); // remove all existing ticks
7233 var ddd = this.DOM.labelGroup.selectAll(".tick").data(this.intervalTicks);
7234 var ddd_enter = ddd.enter().append("span").attr("class","tick");
7235 ddd_enter.append("span").attr("class","line");
7236 ddd_enter.append("span").attr("class","text");
7237 this.refreshTickLabels();
7238 },
7239 /** -- */
7240 getBarWidth: function(){
7241 return this.aggrWidth - this.width_barGap*2;
7242 },
7243 /** -- */
7244 refreshTickLabels: function(){
7245 var me=this;
7246 if(this.DOM.labelGroup===undefined) return;
7247 this.DOM.labelGroup.selectAll(".tick .text").html(function(d){
7248 if(me.scaleType==='time'){
7249 return me.intervalTickFormat(d);
7250 } else {
7251 var v;
7252 if(d<1 && d!==0) v=d.toFixed(1);
7253 else v=me.intervalTickFormat(d);
7254
7255 if(me.unitName) v+="<span class='unitName'>"+me.unitName+"</span>";
7256 return v;
7257 }
7258 });
7259 },
7260 /** -- */
7261 insertBins: function(){
7262 var me=this;
7263 var resultPreviewLogTimeout = null;
7264
7265 var filterId = this.summaryFilter.id;
7266
7267 // just remove everything that was in the histogram_bins befoe
7268 this.DOM.histogram_bins
7269 .selectAll(".aggr_Group").data([]).exit().remove();
7270
7271 var activeBins = this.DOM.histogram_bins
7272 .selectAll(".aggr_Group").data(this.histBins, function(d,i){ return i; });
7273
7274 var newBins=activeBins.enter().append("span").attr("class","aggr_Group")
7275 .each(function(aggr){
7276 aggr.aggregate_Preview=0;
7277 aggr.forEach(function(item){
7278 item.mappedDataCache[filterId].b = aggr;
7279 },this);
7280 aggr.DOM = {}
7281 aggr.DOM.facet = this;
7282 })
7283 .on("mouseenter",function(aggr){
7284 var thiss=this;
7285
7286 me.browser.previewedSelectionSummary = me;
7287
7288 if(!me.browser.pauseResultPreview){
7289 var timeoutTime = kshf.previewTimeoutMS;
7290 if(me.browser.vizCompareActive) timeoutTime = 0;
7291 // this.resultPreviewShowTimeout = setTimeout(function(){
7292 aggr.forEach(function(item){item.updatePreview(me.parentFacet);});
7293 me.browser.itemCount_Previewed = aggr.aggregate_Preview;
7294 // Histograms cannot have sub-facets, so don't iterate over mappedDOMs...
7295 thiss.setAttribute("highlight","selected");
7296 thiss.setAttribute("showlock",true);
7297 me.browser.refreshResultPreviews();
7298 if(sendLog) {
7299 if(resultPreviewLogTimeout){
7300 clearTimeout(resultPreviewLogTimeout);
7301 }
7302 resultPreviewLogTimeout = setTimeout(function(){
7303 sendLog(kshf.LOG.FILTER_PREVIEW, {id:me.summaryFilter.id, info: aggr.x+"x"+aggr.dx});
7304 }, 1000); // wait 1 second to see the update fully
7305 }
7306 // },timeoutTime);
7307 }
7308 })
7309 .on("mouseleave",function(aggr){
7310 me.browser.previewedSelectionSummary = null;
7311
7312 if(resultPreviewLogTimeout){
7313 clearTimeout(resultPreviewLogTimeout);
7314 }
7315 if(this.resultPreviewShowTimeout){
7316 clearTimeout(this.resultPreviewShowTimeout);
7317 this.resultPreviewShowTimeout = null;
7318 }
7319 if(!me.browser.pauseResultPreview){
7320 this.setAttribute("highlight",false);
7321 this.setAttribute("showlock",false);
7322
7323 me.browser.items.forEach(function(item){
7324 if(item.DOM.record) item.DOM.record.setAttribute("highlight",false);
7325 })
7326 me.browser.clearResultPreviews();
7327 }
7328 })
7329 .on("click",function(aggr){
7330 if(me.summaryFilter.filteredBin===this){
7331 me.summaryFilter.clearFilter();
7332 return;
7333 }
7334 this.setAttribute("filtered","true");
7335
7336 // store histogram state
7337 me.summaryFilter.dom_HistogramBar = this;
7338 if(me.scaleType!=='time'){
7339 me.summaryFilter.active = {
7340 min: aggr.x,
7341 max: aggr.x+aggr.dx
7342 };
7343 } else {
7344 me.summaryFilter.active = {
7345 min: aggr.x,
7346 max: new Date(aggr.x.getTime()+aggr.dx)
7347 };
7348 }
7349 // if we are filtering the last aggr, make max_score inclusive
7350 me.summaryFilter.max_inclusive = (aggr.x+aggr.dx)===me.intervalRange.active.max;
7351 if(me.scaleType==='step'){
7352 me.summaryFilter.max_inclusive = true;
7353 }
7354
7355 me.summaryFilter.filteredBin=this;
7356 me.summaryFilter.addFilter(true);
7357 if(sendLog) sendLog(kshf.LOG.FILTER_INTRVL_BIN,
7358 {id:me.summaryFilter.id, info:me.summaryFilter.active.min+"x"+me.summaryFilter.active.max} );
7359 });
7360
7361 newBins.append("span").attr("class","aggr total");
7362 newBins.append("span").attr("class","aggr total_tip");
7363 newBins.append("span").attr("class","aggr active");
7364 newBins.append("span").attr("class","aggr preview").attr("fast",true);
7365 newBins.append("span").attr("class","aggr compare").attr("hidden",true);
7366
7367 newBins.append("span").attr("class","compareButton fa")
7368 .each(function(aggr){
7369 this.tipsy = new Tipsy(this, {
7370 gravity: 's',
7371 title: function(){
7372 return (me.browser.comparedAggregate!==aggr)?
7373 kshf.lang.cur.LockToCompare:kshf.lang.cur.Unlock;
7374 }
7375 });
7376 })
7377 .on("click",function(aggr){
7378 this.tipsy.hide();
7379 me.browser.setPreviewCompare(aggr);
7380 d3.event.stopPropagation();
7381 })
7382 .on("mouseenter",function(aggr){
7383 this.tipsy.options.className = "tipsyFilterLock";
7384 this.tipsy.hide();
7385 this.tipsy.show();
7386 d3.event.stopPropagation();
7387 })
7388 .on("mouseleave",function(aggr){
7389 this.tipsy_title = undefined;
7390 this.tipsy.hide();
7391 d3.event.stopPropagation();
7392 })
7393 ;
7394
7395 newBins.append("span").attr("class","measureLabel").each(function(bar){
7396 kshf.Util.setTransform(this,"translateY("+me.height_hist+"px)");
7397 });
7398
7399 this.DOM.aggr_Group = this.DOM.histogram_bins.selectAll(".aggr_Group");
7400 this.DOM.aggr_Total = this.DOM.aggr_Group.selectAll(".total");
7401 this.DOM.aggr_TotalTip = this.DOM.aggr_Group.selectAll(".total_tip");
7402 this.DOM.aggr_Active = this.DOM.aggr_Group.selectAll(".active");
7403 this.DOM.aggr_Preview = this.DOM.aggr_Group.selectAll(".preview");
7404 this.DOM.aggr_Compare = this.DOM.aggr_Group.selectAll(".compare");
7405
7406 this.DOM.compareButton = this.DOM.aggr_Group.selectAll(".compareButton");
7407 this.DOM.measureLabel = this.DOM.aggr_Group.selectAll(".measureLabel");
7408 },
7409 /** --- */
7410 roundFilterRange: function(){
7411 // Make sure the range is within the visible limits:
7412 this.summaryFilter.active.min = Math.max(
7413 this.intervalTicks[0], this.summaryFilter.active.min);
7414 this.summaryFilter.active.max = Math.min(
7415 this.intervalTicks[this.intervalTicks.length-1], this.summaryFilter.active.max);
7416
7417 if(this.scaleType==='time'){
7418 // TODO: Round to meaningful dates
7419 return;
7420 }
7421 if(this.scaleType==='log' || this.scaleType==='step' || (!this.hasFloat) ){
7422 this.summaryFilter.active.min=Math.round(this.summaryFilter.active.min);
7423 this.summaryFilter.active.max=Math.round(this.summaryFilter.active.max);
7424 }
7425 },
7426 /** -- */
7427 initDOM_Slider: function(){
7428 var me=this;
7429
7430 this.DOM.intervalSlider = this.DOM.facetInterval.append("div").attr("class","intervalSlider")
7431 .style('margin-left',(this.width_vertAxisLabel)+"px");
7432
7433 this.DOM.zoomControl = this.DOM.intervalSlider.append("span").attr("class","zoomControl fa")
7434 .attr("sign","plus")
7435 .each(function(d){
7436 this.tipsy = new Tipsy(this, {
7437 gravity: 'w', title: function(){
7438 return (this.getAttribute("sign")==="plus")?"Zoom into range":"Zoom out";
7439 }
7440 });
7441 })
7442 .on("mouseenter",function(){ this.tipsy.show(); })
7443 .on("mouseleave",function(){ this.tipsy.hide(); })
7444 .on("click",function(){
7445 this.tipsy.hide();
7446 me.setZoomed(this.getAttribute("sign")==="plus");
7447 })
7448 ;
7449
7450 var controlLine = this.DOM.intervalSlider.append("div").attr("class","controlLine")
7451 .on("mousedown", function(){
7452 if(d3.event.which !== 1) return; // only respond to left-click
7453 me.browser.setNoAnim(true);
7454 var e=this.parentNode;
7455 var initPos = me.valueScale.invert(d3.mouse(e)[0]);
7456 d3.select("body").style('cursor','ew-resize')
7457 .on("mousemove", function() {
7458 var targetPos = me.valueScale.invert(d3.mouse(e)[0]);
7459 me.summaryFilter.active.min=d3.min([initPos,targetPos]);
7460 me.summaryFilter.active.max=d3.max([initPos,targetPos]);
7461 me.roundFilterRange();
7462 me.refreshIntervalSlider();
7463 // wait half second to update
7464 if(this.timer){
7465 clearTimeout(this.timer);
7466 this.timer = null;
7467 }
7468 me.summaryFilter.filteredBin=this;
7469 this.timer = setTimeout(function(){
7470 if(me.isFiltered_min() || me.isFiltered_max()){
7471 me.summaryFilter.addFilter(true);
7472 if(sendLog) sendLog(kshf.LOG.FILTER_INTRVL_HANDLE,
7473 { id: me.summaryFilter.id,
7474 info: me.summaryFilter.active.min+"x"+me.summaryFilter.active.m});
7475 } else {
7476 me.summaryFilter.clearFilter();
7477 }
7478 },250);
7479 }).on("mouseup", function(){
7480 me.browser.setNoAnim(false);
7481 d3.select("body").style('cursor','auto').on("mousemove",null).on("mouseup",null);
7482 });
7483 d3.event.preventDefault();
7484 });
7485
7486 controlLine.append("span").attr("class","base total");
7487 controlLine.append("span").attr("class","base active")
7488 .each(function(){
7489 this.tipsy = new Tipsy(this, {
7490 gravity: "s",
7491 title: function(){ return kshf.lang.cur.DragToFilter; }
7492 })
7493 })
7494 // TODO: The problem is, the x-position (left-right) of the tooltip is not correctly calculated
7495 // because the size of the bar is set by scaling, not through width....
7496 //.on("mouseover",function(){ this.tipsy.show(); })
7497 .on("mouseout" ,function(){ this.tipsy.hide(); })
7498 .on("mousedown", function(){
7499 this.tipsy.hide();
7500 if(d3.event.which !== 1) return; // only respond to left-click
7501 if(me.scaleType==='time') return; // time is not supported for now.
7502 me.browser.setNoAnim(true);
7503 var e=this.parentNode;
7504 var initMin = me.summaryFilter.active.min;
7505 var initMax = me.summaryFilter.active.max;
7506 var initRange= initMax - initMin;
7507 var initPos = d3.mouse(e)[0];
7508
7509 d3.select("body").style('cursor','ew-resize')
7510 .on("mousemove", function() {
7511 if(me.scaleType==='log'){
7512 var targetDif = d3.mouse(e)[0]-initPos;
7513 me.summaryFilter.active.min =
7514 me.valueScale.invert(me.valueScale(initMin)+targetDif);
7515 me.summaryFilter.active.max =
7516 me.valueScale.invert(me.valueScale(initMax)+targetDif);
7517
7518 } else {
7519 var targetPos = me.valueScale.invert(d3.mouse(e)[0]);
7520 var targetDif = targetPos-me.valueScale.invert(initPos);
7521
7522 me.summaryFilter.active.min = initMin+targetDif;
7523 me.summaryFilter.active.max = initMax+targetDif;
7524 if(me.summaryFilter.active.min<me.intervalRange.active.min){
7525 me.summaryFilter.active.min=me.intervalRange.active.min;
7526 me.summaryFilter.active.max=me.intervalRange.active.min+initRange;
7527 }
7528 if(me.summaryFilter.active.max>me.intervalRange.active.max){
7529 me.summaryFilter.active.max=me.intervalRange.active.max;
7530 me.summaryFilter.active.min=me.intervalRange.active.max-initRange;
7531 }
7532 }
7533
7534 me.roundFilterRange();
7535 me.refreshIntervalSlider();
7536
7537 // wait half second to update
7538 if(this.timer){
7539 clearTimeout(this.timer);
7540 this.timer = null;
7541 }
7542 me.summaryFilter.filteredBin = this;
7543 this.timer = setTimeout(function(){
7544 if(me.isFiltered_min() || me.isFiltered_max()){
7545 me.summaryFilter.addFilter(true);
7546 if(sendLog) sendLog(kshf.LOG.FILTER_INTRVL_HANDLE,
7547 { id: me.summaryFilter.id,
7548 info: me.summaryFilter.active.min+"x"+me.summaryFilter.active.max});
7549 } else{
7550 me.summaryFilter.clearFilter();
7551 }
7552 },200);
7553 }).on("mouseup", function(){
7554 me.browser.setNoAnim(false);
7555 d3.select("body").style('cursor','auto').on("mousemove",null).on("mouseup",null);
7556 });
7557 d3.event.preventDefault();
7558 d3.event.stopPropagation();
7559 });
7560
7561 var handle_cb = function (d, i) {
7562 var mee = this;
7563 if(d3.event.which !== 1) return; // only respond to left-click
7564 me.browser.setNoAnim(true);
7565 var e=this.parentNode;
7566 d3.select("body").style('cursor','ew-resize')
7567 .on("mousemove", function() {
7568 mee.dragging = true;
7569 me.browser.pauseResultPreview = true;
7570 var targetPos = me.valueScale.invert(d3.mouse(e)[0]);
7571 me.summaryFilter.active[d] = targetPos;
7572 // Swap is min > max
7573 if(me.summaryFilter.active.min>me.summaryFilter.active.max){
7574 var t=me.summaryFilter.active.min;
7575 me.summaryFilter.active.min = me.summaryFilter.active.max;
7576 me.summaryFilter.active.max = t;
7577 if(d==='min') d='max'; else d='min';
7578 }
7579 me.roundFilterRange();
7580 me.refreshIntervalSlider();
7581 // wait half second to update
7582 if(this.timer){
7583 clearTimeout(this.timer);
7584 this.timer = null;
7585 }
7586 me.summaryFilter.filteredBin=this;
7587 this.timer = setTimeout( function(){
7588 if(me.isFiltered_min() || me.isFiltered_max()){
7589 if(sendLog) sendLog(kshf.LOG.FILTER_INTRVL_HANDLE,
7590 { id: me.summaryFilter.id,
7591 info: me.summaryFilter.active.min+"x"+me.summaryFilter.active.max });
7592 me.summaryFilter.addFilter(true);
7593 } else {
7594 me.summaryFilter.clearFilter();
7595 }
7596 },200);
7597 }).on("mouseup", function(){
7598 mee.dragging = false;
7599 me.browser.pauseResultPreview = false;
7600 me.browser.setNoAnim(false);
7601 d3.select("body").style('cursor','auto').on("mousemove",null).on("mouseup",null);
7602 });
7603 d3.event.preventDefault();
7604 d3.event.stopPropagation();
7605 };
7606
7607 controlLine.selectAll(".handle").data(['min','max']).enter()
7608 .append("span").attr("class",function(d){ return "handle "+d; })
7609 .each(function(d,i){
7610 this.tipsy = new Tipsy(this, {
7611 gravity: i==0?"e":"w", title: function(){ return kshf.lang.cur.DragToFilter }
7612 })
7613 })
7614 .on("mouseover",function(){ if(this.dragging!==true) this.tipsy.show(); })
7615 .on("mouseout" ,function(){ this.tipsy.hide(); })
7616 .on("mousedown", function(d,i){
7617 this.tipsy.hide();
7618 handle_cb.call(this,d,i);
7619 })
7620 .append("span").attr("class","rangeLimitOnChart");
7621
7622 this.DOM.selectedItemValue = controlLine.append("div").attr("class","selectedItemValue");
7623 this.DOM.selectedItemValue.append("span").attr("class","circlee");
7624 this.DOM.selectedItemValueText = this.DOM.selectedItemValue
7625 .append("span").attr("class","selected-item-value-text")
7626 .append("span").attr("class","selected-item-value-text-v");
7627
7628 this.DOM.labelGroup = this.DOM.intervalSlider.append("div").attr("class","labelGroup");
7629 },
7630 /** -- */
7631 updateBarScale2Total: function(){
7632 this.chartScale_Measure
7633 .domain([0, this.getMaxAggr_Total()])
7634 .range ([0, this.height_hist]);
7635 },
7636 /** -- */
7637 updateBarScale2Active: function(){
7638 this.chartScale_Measure
7639 .domain([0, this.getMaxAggr_Active()])
7640 .range ([0, this.height_hist]);
7641 },
7642 /** -- */
7643 updateAggregate_Active: function(){
7644 this.histBins.forEach(function(aggr){ aggr.aggregate_Active = 0; });
7645
7646 if(this.parentFacet && this.parentFacet.hasCategories()){
7647 this.histBins.forEach(function(aggr){
7648 aggr.forEach(function(item){
7649 if(item.aggregate_Active>0) aggr.aggregate_Active+=item.aggregate_Self;
7650 });
7651 });
7652 } else {
7653 this.histBins.forEach(function(aggr){
7654 aggr.forEach(function(item){ if(item.isWanted) aggr.aggregate_Active+=item.aggregate_Self; });
7655 });
7656 }
7657 },
7658 /** -- */
7659 refreshBins_Translate: function(){
7660 var me=this;
7661 var offset = 0;
7662 if(this.scaleType==='step') offset = this.width_barGap-this.aggrWidth/2;
7663 if(this.scaleType==='time') offset = this.width_barGap;
7664 this.DOM.aggr_Group
7665 .style("width",this.getBarWidth()+"px")
7666 .each(function(aggr){
7667 kshf.Util.setTransform(this,"translateX("+(me.valueScale(aggr.x)+offset)+"px)");
7668 });
7669 },
7670 /** -- Note: Same as the function used for categorical facet */
7671 refreshViz_All: function(){
7672 if(this.isEmpty || this.collapsed) return;
7673 var me=this;
7674 this.refreshViz_Total();
7675 this.refreshViz_Active();
7676
7677 this.DOM.aggr_Preview.attr("fast",null); // take it slow for result preview animations
7678 this.refreshViz_Preview();
7679 setTimeout(function(){ me.DOM.aggr_Preview.attr("fast",true); },800);
7680
7681 this.refreshViz_Compare();
7682 this.refreshMeasureLabel();
7683 this.refreshViz_Axis();
7684 },
7685 /** -- */
7686 refreshViz_Scale: function(){
7687 this.refreshViz_Total();
7688 this.refreshViz_Active();
7689 },
7690 /** -- */
7691 refreshViz_Total: function(){
7692 if(this.isEmpty || this.collapsed) return;
7693 var me=this;
7694 var width=this.getBarWidth();
7695
7696 var heightTotal = function(aggr){
7697 if(aggr.length===0) return 0;
7698 if(me.browser.ratioModeActive) return me.height_hist;
7699 return me.chartScale_Measure(aggr.length);
7700 };
7701
7702 if(this.scaleType==='time'){
7703 var durationTime=this.browser.noAnim?0:700;
7704 this.timeSVGLine = d3.svg.area()
7705 .x(function(aggr){
7706 return me.valueScale(aggr.x)+width/2;
7707 })
7708 .y0(me.height_hist)
7709 .y1(function(aggr){
7710 if(aggr.aggregate_Total===0) return me.height_hist+3;
7711 return me.height_hist-heightTotal(aggr);
7712 });
7713 this.DOM.lineTrend_Total
7714 .transition().duration(durationTime)
7715 .attr("d", this.timeSVGLine);
7716 } else {
7717 this.DOM.aggr_Total.each(function(aggr){
7718 kshf.Util.setTransform(this,
7719 "translateY("+me.height_hist+"px) scale("+width+","+heightTotal(aggr)+")");
7720 });
7721 if(!this.browser.ratioModeActive){
7722 this.DOM.aggr_TotalTip
7723 .style("opacity",function(aggr){
7724 return (aggr.length>me.chartScale_Measure.domain()[1])?1:0;
7725 })
7726 .style("width",width+"px");
7727 } else {
7728 this.DOM.aggr_TotalTip.style("opacity",0);
7729 }
7730 }
7731 },
7732 /** -- */
7733 refreshViz_Active: function(){
7734 if(this.isEmpty || this.collapsed) return;
7735 var me=this;
7736 var width = this.getBarWidth();
7737
7738 var heightActive = function(aggr){
7739 if(aggr.aggregate_Active===0) return 0;
7740 if(me.browser.ratioModeActive) return me.height_hist;
7741 return me.chartScale_Measure(aggr.aggregate_Active);
7742 };
7743
7744 if(!this.isFiltered() || this.scaleType==='step'){
7745 this.DOM.aggr_Active.each(function(aggr){
7746 kshf.Util.setTransform(this,
7747 "translateY("+me.height_hist+"px) scale("+width+","+heightActive(aggr)+")");
7748 });
7749 } else {
7750 // is filtered & not step scale
7751 var filter_min = this.summaryFilter.active.min;
7752 var filter_max = this.summaryFilter.active.max;
7753 var minPos = this.valueScale(filter_min);
7754 var maxPos = this.valueScale(filter_max);
7755 this.DOM.aggr_Active.each(function(aggr){
7756 var translateX = "";
7757 var width_self=width;
7758 var aggr_min = aggr.x;
7759 var aggr_max = aggr.x + aggr.dx;
7760 if(aggr.aggregate_Active>0){
7761 // it is within the filtered range
7762 if(aggr_min<filter_min){
7763 var lostWidth = minPos-me.valueScale(aggr_min);
7764 translateX = "translateX("+lostWidth+"px) ";
7765 width_self -= lostWidth;
7766 }
7767 if(aggr_max>filter_max){
7768 var lostWidth = me.valueScale(aggr_max)-maxPos-me.width_barGap*2;
7769 //translateX = " translateX("+lostWidth+"px)";
7770 width_self -= lostWidth;
7771 }
7772 }
7773 kshf.Util.setTransform(this,
7774 "translateY("+me.height_hist+"px) "+translateX+"scale("+width_self+","+heightActive(aggr)+")");
7775 });
7776 }
7777
7778 this.DOM.compareButton
7779 .each(function(aggr){
7780 kshf.Util.setTransform(this,"translateY("+(me.height_hist-heightActive(aggr)-9)+"px)");
7781 })
7782 .attr("inside",function(aggr){
7783 if(me.browser.ratioModeActive) return "";
7784 if(me.height_hist-heightActive(aggr)<6) return "";
7785 });
7786
7787 if(this.scaleType==='time'){
7788 var durationTime=this.browser.noAnim?0:700;
7789 this.timeSVGLine = d3.svg.area()
7790 .x(function(aggr){
7791 return me.valueScale(aggr.x)+width/2;
7792 })
7793 .y0(me.height_hist+2)
7794 .y1(function(aggr){
7795 if(aggr.aggregate_Active===0) return me.height_hist+3;
7796 return me.height_hist-heightActive(aggr);
7797 });
7798
7799 this.DOM.lineTrend_Active
7800 .transition().duration(durationTime)
7801 .attr("d", this.timeSVGLine);
7802
7803 this.DOM.lineTrend_ActiveLine.transition().duration(durationTime)
7804 .attr("y1",function(aggr){ return me.height_hist+3; })
7805 .attr("y2",function(aggr){
7806 if(aggr.aggregate_Active===0) return me.height_hist+3;
7807 return me.height_hist-heightActive(aggr);
7808 })
7809 .attr("x1",function(aggr){
7810 return me.valueScale(aggr.x)+width/2;
7811 })
7812 .attr("x2",function(aggr){ return me.valueScale(aggr.x)+width/2; });
7813 }
7814 },
7815 /** Gets the active previewed value, and stores it in the cache */
7816 cachePreviewValue: function(){
7817 if(this.isEmpty || this.collapsed) return;
7818 var preview_not=this.browser.preview_not;
7819 this.histBins.forEach(function(aggr){
7820 aggr.aggregate_Compare = aggr.aggregate_Preview;
7821 if(preview_not) {
7822 aggr.aggregate_Compare = aggr.aggregate_Active-aggr.aggregate_Preview;
7823 }
7824 });
7825 },
7826 /** -- */
7827 refreshViz_Compare: function(){
7828 if(this.isEmpty || this.collapsed) return;
7829 if(!this.browser.vizCompareActive) return;
7830
7831 var me=this;
7832 var width = this.getBarWidth();
7833
7834 var heightCompare = function(aggr){
7835 if(aggr.aggregate_Compare===0) return 0;
7836 if(me.browser.ratioModeActive)
7837 return (aggr.aggregate_Compare/aggr.aggregate_Active)*me.height_hist;
7838 return me.chartScale_Measure(aggr.aggregate_Compare);
7839 };
7840
7841 if(!this.isFiltered() || this.scaleType==='step'){
7842 this.DOM.aggr_Compare.each(function(aggr){
7843 kshf.Util.setTransform(this,
7844 "translateY("+me.height_hist+"px) scale("+(width/2)+","+heightCompare(aggr)+")");
7845 });
7846 } else {
7847 // is filtered & not step scale
7848 var filter_min = this.summaryFilter.active.min;
7849 var filter_max = this.summaryFilter.active.max;
7850 var minPos = this.valueScale(filter_min);
7851 var maxPos = this.valueScale(filter_max);
7852 this.DOM.aggr_Compare.each(function(aggr){
7853 var translateX = "";
7854 var width_self=width;
7855 var aggr_min = aggr.x;
7856 var aggr_max = aggr.x + aggr.dx;
7857 if(aggr.aggregate_Active>0){
7858 // it is within the filtered range
7859 if(aggr_min<filter_min){
7860 var lostWidth = minPos-me.valueScale(aggr_min);
7861 translateX = "translateX("+lostWidth+"px) ";
7862 width_self -= lostWidth;
7863 }
7864 if(aggr_max>filter_max){
7865 var lostWidth = me.valueScale(aggr_max)-maxPos-me.width_barGap*2;
7866 //translateX = " translateX("+lostWidth+"px)";
7867 width_self -= lostWidth;
7868 }
7869 }
7870 kshf.Util.setTransform(this,
7871 "translateY("+me.height_hist+"px) "+translateX+"scale("+(width_self/2)+","+heightCompare(aggr)+")");
7872 });
7873 }
7874
7875 if(this.scaleType==='time'){
7876 this.timeSVGLine = d3.svg.line()
7877 .x(function(aggr){ return me.valueScale(aggr.x)+width/2; })
7878 .y(function(aggr){
7879 if(aggr.aggregate_Compare===0) return me.height_hist+3;
7880 return me.height_hist-heightCompare(aggr);
7881 });
7882
7883 var durationTime=0;
7884 if(this.browser.vizCompareActive){
7885 durationTime=200;
7886 }
7887
7888 this.DOM.lineTrend_Compare
7889 .transition()
7890 .duration(durationTime)
7891 .attr("d", this.timeSVGLine);
7892
7893 this.DOM.lineTrend_CompareLine.transition().duration(durationTime)
7894 .attr("y1",function(aggr){ return me.height_hist+3; })
7895 .attr("y2",function(aggr){
7896 if(aggr.aggregate_Compare===0) return me.height_hist+3;
7897 return me.height_hist-heightCompare(aggr);
7898 })
7899 .attr("x1",function(aggr){
7900 return me.valueScale(aggr.x)+width/2+1;
7901 })
7902 .attr("x2",function(aggr){ return me.valueScale(aggr.x)+width/2+1; });
7903 }
7904 },
7905 /** -- */
7906 refreshViz_Preview: function(){
7907 if(this.isEmpty || this.collapsed) return;
7908 var me=this;
7909 var width = this.getBarWidth();
7910
7911 var getAggrHeight_Preview = function(aggr){
7912 var p=aggr.aggregate_Preview;
7913 if(me.browser.preview_not) p = aggr.aggregate_Active-aggr.aggregate_Preview;
7914 if(me.browser.ratioModeActive){
7915 if(aggr.aggregate_Active===0) return 0;
7916 return (p / aggr.aggregate_Active)*me.height_hist;
7917 } else {
7918 return me.chartScale_Measure(p);
7919 }
7920 };
7921
7922 if(!this.isFiltered() || this.scaleType==='step'){
7923 this.DOM.aggr_Preview.each(function(aggr){
7924 kshf.Util.setTransform(this,
7925 "translateY("+me.height_hist+"px) scale("+width+","+getAggrHeight_Preview(aggr)+")");
7926 });
7927 } else {
7928 // is filtered & not step scale
7929 var filter_min = this.summaryFilter.active.min;
7930 var filter_max = this.summaryFilter.active.max;
7931 var minPos = this.valueScale(filter_min);
7932 var maxPos = this.valueScale(filter_max);
7933 this.DOM.aggr_Preview.each(function(aggr){
7934 var translateX = "";
7935 var width_self=width;
7936 var aggr_min = aggr.x;
7937 var aggr_max = aggr.x + aggr.dx;
7938 if(aggr.aggregate_Active>0){
7939 // it is within the filtered range
7940 if(aggr_min<filter_min){
7941 var lostWidth = minPos-me.valueScale(aggr_min);
7942 translateX = "translateX("+lostWidth+"px) ";
7943 width_self -= lostWidth;
7944 }
7945 if(aggr_max>filter_max){
7946 var lostWidth = me.valueScale(aggr_max)-maxPos-me.width_barGap*2;
7947 //translateX = " translateX("+lostWidth+"px)";
7948 width_self -= lostWidth;
7949 }
7950 }
7951 kshf.Util.setTransform(this,
7952 "translateY("+me.height_hist+"px) "+translateX+"scale("+width_self+","+getAggrHeight_Preview(aggr)+")");
7953 });
7954 }
7955
7956 this.refreshMeasureLabel();
7957
7958 if(this.scaleType==='time'){
7959 var durationTime=200;
7960 this.timeSVGLine = d3.svg.area()
7961 .x(function(aggr){
7962 return me.valueScale(aggr.x)+width/2;
7963 })
7964 .y0(me.height_hist+2)
7965 .y1(function(aggr){
7966 if(aggr.aggregate_Preview===0) return me.height_hist+3;
7967 return me.height_hist-getAggrHeight_Preview(aggr);
7968 });
7969
7970 this.DOM.lineTrend_Preview
7971 .transition().duration(durationTime)
7972 .attr("d", this.timeSVGLine);
7973
7974 this.DOM.lineTrend_PreviewLine.transition().duration(durationTime)
7975 .attr("y1",function(aggr){ return me.height_hist+3; })
7976 .attr("y2",function(aggr){
7977 if(aggr.aggregate_Preview===0) return me.height_hist+3;
7978 return me.height_hist-getAggrHeight_Preview(aggr);
7979 })
7980 .attr("x1",function(aggr){
7981 return me.valueScale(aggr.x)+width/2-1;
7982 })
7983 .attr("x2",function(aggr){ return me.valueScale(aggr.x)+width/2-1; });
7984 }
7985 },
7986 /** -- */
7987 clearViz_Preview: function(){
7988 if(this.isEmpty || this.collapsed) return;
7989 if(this.DOM.aggr_Preview===undefined) return;
7990 var me=this;
7991 var width = this.getBarWidth();
7992 var transform="translateY("+this.height_hist+"px) "+"scale("+this.getBarWidth()+",0)";
7993 this.DOM.aggr_Preview.each(function(bar){
7994 bar.aggregate_Preview=0;
7995 kshf.Util.setTransform(this,transform);
7996 });
7997 this.refreshMeasureLabel();
7998
7999 if(this.scaleType==='time'){
8000 var durationTime=200;
8001 this.timeSVGLine = d3.svg.line()
8002 .x(function(aggr){
8003 return me.valueScale(aggr.x)+width/2;
8004 })
8005 .y(function(aggr){
8006 return me.height_hist;
8007 });
8008
8009 this.DOM.lineTrend_Preview
8010 .transition().duration(durationTime)
8011 .attr("d", this.timeSVGLine);
8012 }
8013 },
8014 /** -- */
8015 refreshViz_Axis: function(){
8016 if(this.isEmpty || this.collapsed) return;
8017 var me = this, tickValues, maxValue;
8018
8019 var chartAxis_Measure_TickSkip = me.height_hist/17;
8020
8021 if(this.browser.ratioModeActive) {
8022 maxValue = 100;
8023 tickValues = d3.scale.linear()
8024 .rangeRound([0, this.height_hist])
8025 .domain([0,100])
8026 .ticks(chartAxis_Measure_TickSkip)
8027 .filter(function(d){return d!==0;});
8028 } else {
8029 if(this.browser.percentModeActive) {
8030 maxValue = Math.round(100*me.getMaxAggr_Active()/me.browser.itemsWantedCount);
8031 tickValues = d3.scale.linear()
8032 .rangeRound([0, this.height_hist])
8033 .nice(chartAxis_Measure_TickSkip)
8034 .clamp(true)
8035 .domain([0,maxValue])
8036 .ticks(chartAxis_Measure_TickSkip);
8037 } else {
8038 tickValues = this.chartScale_Measure.ticks(chartAxis_Measure_TickSkip);
8039 }
8040 }
8041
8042 // remove non-integer values & 0...
8043 tickValues = tickValues.filter(function(d){return d%1===0&&d!==0;});
8044
8045 var tickDoms = this.DOM.chartAxis_Measure.selectAll("span.tick")
8046 .data(tickValues,function(i){return i;});
8047 tickDoms.exit().remove();
8048 var tickData_new=tickDoms.enter().append("span").attr("class","tick");
8049
8050 // translate the ticks horizontally on scale
8051 tickData_new.append("span").attr("class","line");
8052
8053 // Place the doms at the bottom of the histogram, so their animation is in the right direction
8054 tickData_new.each(function(){
8055 kshf.Util.setTransform(this,"translateY("+me.height_hist+"px)");
8056 });
8057
8058 if(this.browser.ratioModeActive){
8059 tickData_new.append("span").attr("class","text").text(function(d){return d;});
8060 } else {
8061 tickData_new.append("span").attr("class","text").text(function(d){return d3.format("s")(d);});
8062 }
8063
8064 setTimeout(function(){
8065 var transformFunc;
8066 if(me.browser.ratioModeActive){
8067 transformFunc=function(d){
8068 kshf.Util.setTransform(this,"translateY("+
8069 (me.height_hist-d*me.height_hist/100)+"px)");
8070 };
8071 } else {
8072 if(me.browser.percentModeActive){
8073 transformFunc=function(d){
8074 kshf.Util.setTransform(this,"translateY("+
8075 (me.height_hist-(d/maxValue)*me.height_hist)+"px)");
8076 };
8077 } else {
8078 transformFunc=function(d){
8079 kshf.Util.setTransform(this,"translateY("+
8080 (me.height_hist-me.chartScale_Measure(d))+"px)");
8081 };
8082 }
8083 }
8084 var x = me.browser.noAnim;
8085 if(x===false) me.browser.setNoAnim(true);
8086 me.DOM.chartAxis_Measure.selectAll(".tick").style("opacity",1).each(transformFunc);
8087 if(x===false) me.browser.setNoAnim(false);
8088 });
8089 },
8090 /** -- */
8091 refreshMeasureLabel: function(){
8092 var me=this;
8093 if(this.browser.previewedSelectionSummary===this) return;
8094
8095 this.DOM.aggr_Group.attr("noitems",function(aggr){ return aggr.aggregate_Active===0; });
8096
8097 this.DOM.measureLabel.each(function(aggr){
8098 var p=aggr.aggregate_Preview;
8099 if(me.browser.vizPreviewActive){
8100 if(me.browser.preview_not)
8101 p = aggr.aggregate_Active-aggr.aggregate_Preview;
8102 else
8103 p = aggr.aggregate_Preview;
8104 } else {
8105 p = aggr.aggregate_Active;
8106 }
8107 if(me.browser.percentModeActive){
8108 if(me.browser.ratioModeActive){
8109 p = 100*p/aggr.aggregate_Active;
8110 if(!me.browser.vizPreviewActive){
8111 this.textContent = "";
8112 return;
8113 }
8114 } else {
8115 p = 100*p/me.browser.itemsWanted_Aggregrate_Total;
8116 }
8117 if(p<0) p=0;
8118 this.textContent = p.toFixed(0)+"%";
8119 } else {
8120 if(p<0) p=0;
8121 this.textContent = kshf.Util.formatForItemCount(p);
8122 }
8123 });
8124 },
8125 /** -- */
8126 refreshIntervalSlider: function(){
8127 var minPos = this.valueScale(this.summaryFilter.active.min);
8128 var maxPos = this.valueScale(this.summaryFilter.active.max);
8129 // Adjusting min/max position is important because if it is not adjusted, the
8130 // tips of the filtering range may not appear at the bar limits, which looks distracting.
8131 if(this.summaryFilter.active.min===this.intervalRange.min){
8132 minPos = this.valueScale.range()[0];
8133 }
8134 if(this.summaryFilter.active.max===this.intervalRange.max){
8135 maxPos = this.valueScale.range()[1];
8136 }
8137 if(this.scaleType==='step'){
8138 minPos-=this.aggrWidth/2;
8139 maxPos+=this.aggrWidth/2;
8140 }
8141
8142 this.DOM.intervalSlider.select(".base.active")
8143 .attr("filtered",this.isFiltered())
8144 .each(function(d){
8145 kshf.Util.setTransform(this,"translateX("+minPos+"px) scaleX("+(maxPos-minPos)+")");
8146 });
8147 this.DOM.intervalSlider.selectAll(".handle")
8148 .each(function(d){
8149 kshf.Util.setTransform(this,"translateX("+((d==="min")?minPos:maxPos)+"px)");
8150 });
8151 },
8152 /** -- */
8153 refreshHeight: function(){
8154 this.DOM.histogram.style("height",(this.height_hist+this.height_hist_topGap)+"px")
8155 this.DOM.wrapper.style("height",(this.collapsed?"0":this.getHeight_Wrapper())+"px");
8156 this.DOM.root.style("max-height",(this.getHeight()+1)+"px");
8157
8158 var labelTranslate ="translateY("+this.height_hist+"px)";
8159 if(this.DOM.measureLabel)
8160 this.DOM.measureLabel.each(function(bar){ kshf.Util.setTransform(this,labelTranslate); });
8161 if(this.DOM.timeSVG)
8162 this.DOM.timeSVG.style("height",(this.height_hist+2)+"px");
8163 },
8164 /** -- */
8165 refreshWidth: function(){
8166 var _width_ = this.getWidth()-this.width_histMargin-this.width_vertAxisLabel;
8167 this.updateScaleAndBins( _width_, Math.ceil(_width_/this.optimumTickWidth));
8168 this.updateDOMwidth();
8169 },
8170 /** -- */
8171 setHeight: function(targetHeight){
8172 if(this.histBins===undefined) return;
8173 var c = targetHeight-this.getHeight_Header()-this.getHeight_Extra();
8174 c = Math.min(c,100);
8175 if(this.height_hist===c) return;
8176 this.height_hist = c;
8177 this.updateBarScale2Active();
8178 this.refreshBins_Translate();
8179
8180 this.refreshViz_Scale();
8181 this.refreshViz_Preview();
8182 this.refreshViz_Compare();
8183 this.refreshViz_Axis();
8184 this.refreshHeight();
8185
8186 this.DOM.labelGroup.style("height",this.height_labels+"px");
8187 this.DOM.intervalSlider.selectAll(".rangeLimitOnChart")
8188 .style("height",this.height_hist+"px")
8189 .style("top",(-this.height_hist-13)+"px")
8190 },
8191 /** -- */
8192 updateAfterFilter: function(resultChange){
8193 if(this.isEmpty) return;
8194 this.updateAggregate_Active();
8195 this.refreshMeasureLabel();
8196 this.updateBarPreviewScale2Active();
8197 if(this.showPercentile) this.updatePercentiles();
8198 },
8199 /** -- */
8200 updateBarPreviewScale2Active: function(){
8201 var me=this;
8202 this.updateBarScale2Active();
8203 this.refreshBins_Translate();
8204 this.refreshViz_Scale();
8205 this.refreshViz_Compare();
8206
8207 this.DOM.aggr_Preview.attr("fast",null); // take it slow for result preview animations
8208 this.refreshViz_Preview();
8209 this.refreshViz_Axis();
8210
8211 setTimeout(function(){ me.DOM.aggr_Preview.attr("fast",true); },800);
8212 },
8213 /** -- */
8214 setSelectedPosition: function(v){
8215 if(!this.inBrowser()) return;
8216 if(this.DOM.inited===false) return;
8217 if(v===null) return;
8218 if(this.valueScale===undefined) return;
8219
8220 var t="translateX("+(this.valueScale(v))+"px)";
8221 this.DOM.selectedItemValue
8222 .each(function(){ kshf.Util.setTransform(this,t); })
8223 .style("display","block");
8224
8225 this.DOM.selectedItemValueText.html(
8226 this.intervalTickFormat(v)+(this.unitName?("<span class='unitName'>"+this.unitName+"</span>"):"")
8227 );
8228 },
8229 /** -- */
8230 hideSelectedPosition: function(){
8231 if(this.inBrowser()) this.DOM.selectedItemValue.style("display",null);
8232 },
8233 /** -- */
8234 updatePercentiles: function(){
8235 var me=this;
8236 // get active values into an array
8237 // the items are already sorted by their numeric value, it's just a linear pass.
8238 var values = [];
8239 if(!this.hasEntityParent()){
8240 this.filteredItems.forEach(function(item){
8241 if(item.isWanted) values.push(me.itemV(item));
8242 });
8243 } else {
8244 this.filteredItems.forEach(function(item){
8245 if(item.aggregate_Active>0) values.push(me.itemV(item));
8246 });
8247 }
8248
8249 this.quantile_val = {};
8250 this.quantile_pos = {};
8251 [10,20,30,40,50,60,70,80,90].forEach(function(q){
8252 this.quantile_val[q] = d3.quantile(values,q/100);
8253 this.quantile_pos[q] = this.valueScale(this.quantile_val[q]);
8254 kshf.Util.setTransform(this.DOM.quantile[q][0][0],"translateX("+this.quantile_pos[q]+"px)");
8255 },this);
8256
8257 [[10,90],[20,80],[30,70],[40,60]].forEach(function(qb){
8258 kshf.Util.setTransform(this.DOM.quantile[""+qb[0]+"_"+qb[1]][0][0],
8259 "translateX("+(this.quantile_pos[qb[0]])+"px) "+
8260 "scaleX("+(this.quantile_pos[qb[1]]-this.quantile_pos[qb[0]])+") ");
8261 },this);
8262 },
8263 };
8264
8265 for(var index in Summary_Interval_functions){
8266 kshf.Summary_Interval.prototype[index] = Summary_Interval_functions[index];
8267 }
0 /*
1 99Lime.com HTML KickStart by Joshua Gatcke
2 kickstart.js
3 */
4
5 jQuery(document).ready(function($){
6
7 /*---------------------------------
8 MENU Dropdowns
9 -----------------------------------*/
10 $('ul.menu').each(function(){
11 // add the menu toggle
12 $(this).prepend('<li class="menu-toggle"><a href="#"><span class="icon" data-icon="Y"></span> Menu</a></li>');
13
14 // find menu items with children.
15 $(this).find('li').has('ul').addClass('has-menu')
16 .find('a:first').append('<span class="arrow">&nbsp;</span>');
17 });
18
19 $('ul.menu li').hover(function(){
20 $(this).find('ul:first').stop(true, true).fadeIn('fast');
21 $(this).addClass('hover');
22 },
23 function(){
24 $(this).find('ul').stop(true, true).fadeOut('slow');
25 $(this).removeClass('hover');
26 });
27
28 /*---------------------------------
29 Slideshow
30 -----------------------------------*/
31 $('.slideshow').bxSlider({
32 mode: 'horizontal', // 'horizontal', 'vertical', 'fade'
33 video: true,
34 useCSS: true,
35 pager: true,
36 speed: 500, // transition time
37 startSlide: 0,
38 infiniteLoop: true,
39 captions: true,
40 adaptiveHeight: false,
41 touchEnabled: true,
42 pause: 4000,
43 autoControls: false,
44 controls: false,
45 autoStart: true,
46 auto: true
47 });
48
49 /*---------------------------------
50 Fancybox Lightbox
51 -----------------------------------*/
52 $('.gallery').each(function(i){
53 $(this).find('a').attr('rel', 'gallery'+i)
54 .fancybox({
55 overlayOpacity: 0.2,
56 overlayColor: '#000'
57 });
58 });
59
60 // lightbox links
61 $('a.lightbox').fancybox({
62 overlayOpacity: 0.2,
63 overlayColor: '#000'
64 });
65
66 /*---------------------------------
67 Tabs
68 -----------------------------------*/
69 // tab setup
70 $('.tab-content').addClass('clearfix').not(':first').hide();
71 $('ul.tabs').each(function(){
72 var current = $(this).find('li.current');
73 if(current.length < 1) { $(this).find('li:first').addClass('current'); }
74 current = $(this).find('li.current a').attr('href');
75 $(current).show();
76 });
77
78 // tab click
79 $(document).on('click', 'ul.tabs a[href^="#"]', function(e){
80 e.preventDefault();
81 var tabs = $(this).parents('ul.tabs').find('li');
82 var tab_next = $(this).attr('href');
83 var tab_current = tabs.filter('.current').find('a').attr('href');
84 $(tab_current).hide();
85 tabs.removeClass('current');
86 $(this).parent().addClass('current');
87 $(tab_next).show();
88 history.pushState( null, null, window.location.search + $(this).attr('href') );
89 return false;
90 });
91
92 // tab hashtag identification and auto-focus
93 var wantedTag = window.location.hash;
94 if (wantedTag != "")
95 {
96 // This code can and does fail, hard, killing the entire app.
97 // Esp. when used with the jQuery.Address project.
98 try {
99 var allTabs = $("ul.tabs a[href^=" + wantedTag + "]").parents('ul.tabs').find('li');
100 var defaultTab = allTabs.filter('.current').find('a').attr('href');
101 $(defaultTab).hide();
102 allTabs.removeClass('current');
103 $("ul.tabs a[href^=" + wantedTag + "]").parent().addClass('current');
104 $("#" + wantedTag.replace('#','')).show();
105 } catch(e) {
106 // I have no idea what to do here, so I'm leaving this for the maintainer.
107 }
108 }
109
110 /*---------------------------------
111 Image Caption
112 -----------------------------------*/
113 $('img.caption').each(function(){
114 $(this).wrap('<div class="caption">');
115 $(this).parents('div.caption')
116 .attr('class', 'img-wrap '+$(this).attr('class'));
117 if($(this).attr('title')){
118 $(this).parents('div.caption')
119 .append('<span>'+$(this).attr('title')+'</span>');
120 }
121 });
122
123 /*---------------------------------
124 Notice
125 -----------------------------------*/
126 $(document).on('click', '.notice a[class^="icon-remove"]', function(e){
127 e.preventDefault();
128 var notice = $(this).parents('.notice');
129 $(this).hide();
130 notice.fadeOut('slow');
131 });
132
133 /*---------------------------------
134 ToolTip - TipTip
135 -----------------------------------*/
136
137 // Standard tooltip
138 $('.tooltip, .tooltip-top, .tooltip-bottom, .tooltip-right, .tooltip-left').each(function(){
139 // variables
140 var tpos = 'top';
141 var content = $(this).attr('title');
142 var dataContent = $(this).attr('data-content');
143 var keepAlive = false;
144 var action = 'hover';
145 var delay = $(this).attr('data-delay');
146 if (delay === undefined) {delay = 1000;}
147
148 // position
149 if($(this).hasClass('tooltip-top')) { tpos = 'top'; }
150 if($(this).hasClass('tooltip-right')) { tpos = 'right'; }
151 if($(this).hasClass('tooltip-bottom')) { tpos = 'bottom'; }
152 if($(this).hasClass('tooltip-left')) { tpos = 'left'; }
153
154 // content
155 $('.tooltip-content').removeClass('hide').wrap('<div class="hide"></div>');
156 if(dataContent) { content = $(dataContent).html(); keepAlive = true; }
157
158 // action (hover or click) defaults to hover
159 if($(this).attr('data-action') == 'click') { action = 'click'; }
160
161 // tooltip
162 $(this).attr('title','')
163 .tipTip({defaultPosition: tpos, content: content, keepAlive: keepAlive, activation: action, delay: delay});
164 });
165
166 /*---------------------------------
167 Table Sort
168 -----------------------------------*/
169 // init
170 var aAsc = [];
171 $('table.sortable').each(function(){
172 $(this).find('thead th').each(function(index){$(this).attr('rel', index);});
173 $(this).find('th,td').each(function(){$(this).attr('value', $(this).text());});
174 });
175
176 // table click
177 $(document).on('click', 'table.sortable thead th', function(e){
178 // update arrow icon
179 $(this).parents('table.sortable').find('span.arrow').remove();
180 $(this).append('<span class="arrow"></span>');
181
182 // sort direction
183 var nr = $(this).attr('rel');
184 aAsc[nr] = aAsc[nr]=='asc'?'desc':'asc';
185 if(aAsc[nr] == 'desc'){ $(this).find('span.arrow').addClass('up'); }
186
187 // sort rows
188 var rows = $(this).parents('table.sortable').find('tbody tr');
189 rows.tsort('td:eq('+nr+')',{order:aAsc[nr],attr:'value'});
190
191 // fix row classes
192 rows.removeClass('alt first last');
193 var table = $(this).parents('table.sortable');
194 table.find('tr:even').addClass('alt');
195 table.find('tr:first').addClass('first');
196 table.find('tr:last').addClass('last');
197 });
198
199 /*---------------------------------
200 CSS Helpers
201 -----------------------------------*/
202 $('input[type=checkbox]').addClass('checkbox');
203 $('input[type=radio]').addClass('radio');
204 $('input[type=file]').addClass('file');
205 $('[disabled=disabled]').addClass('disabled');
206 $('table').find('tr:even').addClass('alt');
207 $('table').find('tr:first-child').addClass('first');
208 $('table').find('tr:last-child').addClass('last');
209 $('ul').find('li:first-child').addClass('first');
210 $('ul').find('li:last-child').addClass('last');
211 $('hr').before('<div class="clear">&nbsp;</div>');
212 $('[class*="col_"]').addClass('column');
213 $('pre').addClass('prettyprint');prettyPrint();
214
215 });
216
217 /*
218 * FancyBox - jQuery Plugin
219 * Simple and fancy lightbox alternative
220 *
221 * Examples and documentation at: http://fancybox.net
222 *
223 * Copyright (c) 2008 - 2010 Janis Skarnelis
224 * That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
225 *
226 * Version: 1.3.4 (11/11/2010)
227 * Requires: jQuery v1.3+
228 *
229 * Dual licensed under the MIT and GPL licenses:
230 * http://www.opensource.org/licenses/mit-license.php
231 * http://www.gnu.org/licenses/gpl.html
232 */
233 (function(a){var p,u,v,e,B,m,C,j,y,z,s=0,d={},q=[],r=0,c={},k=[],E=null,n=new Image,H=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,S=/[^\.]\.(swf)\s*$/i,I,J=1,x=0,w="",t,g,l=!1,A=a.extend(a("<div/>")[0],{prop:0}),K=navigator.userAgent.match(/msie [6]/i)&&!window.XMLHttpRequest,L=function(){u.hide();n.onerror=n.onload=null;E&&E.abort();p.empty()},M=function(){!1===d.onError(q,s,d)?(u.hide(),l=!1):(d.titleShow=!1,d.width="auto",d.height="auto",p.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>'),
234 D())},G=function(){var b=q[s],c,f,e,g,k,j;L();d=a.extend({},a.fn.fancybox.defaults,"undefined"==typeof a(b).data("fancybox")?d:a(b).data("fancybox"));j=d.onStart(q,s,d);if(!1===j)l=!1;else{"object"==typeof j&&(d=a.extend(d,j));e=d.title||(b.nodeName?a(b).attr("title"):b.title)||"";b.nodeName&&!d.orig&&(d.orig=a(b).children("img:first").length?a(b).children("img:first"):a(b));""===e&&(d.orig&&d.titleFromAlt)&&(e=d.orig.attr("alt"));c=d.href||(b.nodeName?a(b).attr("href"):b.href)||null;if(/^(?:javascript)/i.test(c)||
235 "#"==c)c=null;d.type?(f=d.type,c||(c=d.content)):d.content?f="html":c&&(f=c.match(H)?"image":c.match(S)?"swf":a(b).hasClass("iframe")?"iframe":0===c.indexOf("#")?"inline":"ajax");if(f)switch("inline"==f&&(b=c.substr(c.indexOf("#")),f=0<a(b).length?"inline":"ajax"),d.type=f,d.href=c,d.title=e,d.autoDimensions&&("html"==d.type||"inline"==d.type||"ajax"==d.type?(d.width="auto",d.height="auto"):d.autoDimensions=!1),d.modal&&(d.overlayShow=!0,d.hideOnOverlayClick=!1,d.hideOnContentClick=!1,d.enableEscapeButton=
236 !1,d.showCloseButton=!1),d.padding=parseInt(d.padding,10),d.margin=parseInt(d.margin,10),p.css("padding",d.padding+d.margin),a(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){a(this).replaceWith(m.children())}),f){case "html":p.html(d.content);D();break;case "inline":if(!0===a(b).parent().is("#fancybox-content")){l=!1;break}a('<div class="fancybox-inline-tmp" />').hide().insertBefore(a(b)).bind("fancybox-cleanup",function(){a(this).replaceWith(m.children())}).bind("fancybox-cancel",
237 function(){a(this).replaceWith(p.children())});a(b).appendTo(p);D();break;case "image":l=!1;a.fancybox.showActivity();n=new Image;n.onerror=function(){M()};n.onload=function(){l=!0;n.onerror=n.onload=null;d.width=n.width;d.height=n.height;a("<img />").attr({id:"fancybox-img",src:n.src,alt:d.title}).appendTo(p);N()};n.src=c;break;case "swf":d.scrolling="no";g='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+d.width+'" height="'+d.height+'"><param name="movie" value="'+c+'"></param>';
238 k="";a.each(d.swf,function(a,b){g+='<param name="'+a+'" value="'+b+'"></param>';k+=" "+a+'="'+b+'"'});g+='<embed src="'+c+'" type="application/x-shockwave-flash" width="'+d.width+'" height="'+d.height+'"'+k+"></embed></object>";p.html(g);D();break;case "ajax":l=!1;a.fancybox.showActivity();d.ajax.win=d.ajax.success;E=a.ajax(a.extend({},d.ajax,{url:c,data:d.ajax.data||{},error:function(a){0<a.status&&M()},success:function(a,b,f){if(200==("object"==typeof f?f:E).status){if("function"==typeof d.ajax.win){j=
239 d.ajax.win(c,a,b,f);if(!1===j){u.hide();return}if("string"==typeof j||"object"==typeof j)a=j}p.html(a);D()}}}));break;case "iframe":N()}else M()}},D=function(){var b=d.width,c=d.height,b=-1<b.toString().indexOf("%")?parseInt((a(window).width()-2*d.margin)*parseFloat(b)/100,10)+"px":"auto"==b?"auto":b+"px",c=-1<c.toString().indexOf("%")?parseInt((a(window).height()-2*d.margin)*parseFloat(c)/100,10)+"px":"auto"==c?"auto":c+"px";p.wrapInner('<div style="width:'+b+";height:"+c+";overflow: "+("auto"==
240 d.scrolling?"auto":"yes"==d.scrolling?"scroll":"hidden")+';position:relative;"></div>');d.width=p.width();d.height=p.height();N()},N=function(){var b,h;u.hide();if(e.is(":visible")&&!1===c.onCleanup(k,r,c))a.event.trigger("fancybox-cancel"),l=!1;else{l=!0;a(m.add(v)).unbind();a(window).unbind("resize.fb scroll.fb");a(document).unbind("keydown.fb");e.is(":visible")&&"outside"!==c.titlePosition&&e.css("height",e.height());k=q;r=s;c=d;if(c.overlayShow){if(v.css({"background-color":c.overlayColor,opacity:c.overlayOpacity,
241 cursor:c.hideOnOverlayClick?"pointer":"auto",height:a(document).height()}),!v.is(":visible")){if(K)a("select:not(#fancybox-tmp select)").filter(function(){return"hidden"!==this.style.visibility}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});v.show()}}else v.hide();b=O();var f={},F=c.autoScale,n=2*c.padding;f.width=-1<c.width.toString().indexOf("%")?parseInt(b[0]*parseFloat(c.width)/100,10):c.width+n;f.height=-1<c.height.toString().indexOf("%")?parseInt(b[1]*
242 parseFloat(c.height)/100,10):c.height+n;if(F&&(f.width>b[0]||f.height>b[1]))"image"==d.type||"swf"==d.type?(F=c.width/c.height,f.width>b[0]&&(f.width=b[0],f.height=parseInt((f.width-n)/F+n,10)),f.height>b[1]&&(f.height=b[1],f.width=parseInt((f.height-n)*F+n,10))):(f.width=Math.min(f.width,b[0]),f.height=Math.min(f.height,b[1]));f.top=parseInt(Math.max(b[3]-20,b[3]+0.5*(b[1]-f.height-40)),10);f.left=parseInt(Math.max(b[2]-20,b[2]+0.5*(b[0]-f.width-40)),10);g=f;w=c.title||"";x=0;j.empty().removeAttr("style").removeClass();
243 if(!1!==c.titleShow&&(w=a.isFunction(c.titleFormat)?c.titleFormat(w,k,r,c):w&&w.length?"float"==c.titlePosition?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+w+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+c.titlePosition+'">'+w+"</div>":!1)&&""!==w)switch(j.addClass("fancybox-title-"+c.titlePosition).html(w).appendTo("body").show(),c.titlePosition){case "inside":j.css({width:g.width-
244 2*c.padding,marginLeft:c.padding,marginRight:c.padding});x=j.outerHeight(!0);j.appendTo(B);g.height+=x;break;case "over":j.css({marginLeft:c.padding,width:g.width-2*c.padding,bottom:c.padding}).appendTo(B);break;case "float":j.css("left",-1*parseInt((j.width()-g.width-40)/2,10)).appendTo(e);break;default:j.css({width:g.width-2*c.padding,paddingLeft:c.padding,paddingRight:c.padding}).appendTo(e)}j.hide();e.is(":visible")?(a(C.add(y).add(z)).hide(),b=e.position(),t={top:b.top,left:b.left,width:e.width(),
245 height:e.height()},h=t.width==g.width&&t.height==g.height,m.fadeTo(c.changeFade,0.3,function(){var b=function(){m.html(p.contents()).fadeTo(c.changeFade,1,P)};a.event.trigger("fancybox-change");m.empty().removeAttr("filter").css({"border-width":c.padding,width:g.width-2*c.padding,height:d.autoDimensions?"auto":g.height-x-2*c.padding});h?b():(A.prop=0,a(A).animate({prop:1},{duration:c.changeSpeed,easing:c.easingChange,step:Q,complete:b}))})):(e.removeAttr("style"),m.css("border-width",c.padding),"elastic"==
246 c.transitionIn?(t=R(),m.html(p.contents()),e.show(),c.opacity&&(g.opacity=0),A.prop=0,a(A).animate({prop:1},{duration:c.speedIn,easing:c.easingIn,step:Q,complete:P})):("inside"==c.titlePosition&&0<x&&j.show(),m.css({width:g.width-2*c.padding,height:d.autoDimensions?"auto":g.height-x-2*c.padding}).html(p.contents()),e.css(g).fadeIn("none"==c.transitionIn?0:c.speedIn,P)))}},P=function(){a.support.opacity||(m.get(0).style.removeAttribute("filter"),e.get(0).style.removeAttribute("filter"));d.autoDimensions&&
247 m.css("height","auto");e.css("height","auto");w&&w.length&&j.show();c.showCloseButton&&C.show();(c.enableEscapeButton||c.enableKeyboardNav)&&a(document).bind("keydown.fb",function(b){if(27==b.keyCode&&c.enableEscapeButton)b.preventDefault(),a.fancybox.close();else if((37==b.keyCode||39==b.keyCode)&&c.enableKeyboardNav&&"INPUT"!==b.target.tagName&&"TEXTAREA"!==b.target.tagName&&"SELECT"!==b.target.tagName)b.preventDefault(),a.fancybox[37==b.keyCode?"prev":"next"]()});c.showNavArrows?((c.cyclic&&1<
248 k.length||0!==r)&&y.show(),(c.cyclic&&1<k.length||r!=k.length-1)&&z.show()):(y.hide(),z.hide());c.hideOnContentClick&&m.bind("click",a.fancybox.close);c.hideOnOverlayClick&&v.bind("click",a.fancybox.close);a(window).bind("resize.fb",a.fancybox.resize);c.centerOnScroll&&a(window).bind("scroll.fb",a.fancybox.center);"iframe"==c.type&&a('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(navigator.userAgent.match(/msie [6]/i)?'allowtransparency="true""':
249 "")+' scrolling="'+d.scrolling+'" src="'+c.href+'"></iframe>').appendTo(m);e.show();l=!1;a.fancybox.center();c.onComplete(k,r,c);var b,h;k.length-1>r&&(b=k[r+1].href,"undefined"!==typeof b&&b.match(H)&&(h=new Image,h.src=b));0<r&&(b=k[r-1].href,"undefined"!==typeof b&&b.match(H)&&(h=new Image,h.src=b))},Q=function(b){var a={width:parseInt(t.width+(g.width-t.width)*b,10),height:parseInt(t.height+(g.height-t.height)*b,10),top:parseInt(t.top+(g.top-t.top)*b,10),left:parseInt(t.left+(g.left-t.left)*b,
250 10)};"undefined"!==typeof g.opacity&&(a.opacity=0.5>b?0.5:b);e.css(a);m.css({width:a.width-2*c.padding,height:a.height-x*b-2*c.padding})},O=function(){return[a(window).width()-2*c.margin,a(window).height()-2*c.margin,a(document).scrollLeft()+c.margin,a(document).scrollTop()+c.margin]},R=function(){var b=d.orig?a(d.orig):!1,h={};b&&b.length?(h=b.offset(),h.top+=parseInt(b.css("paddingTop"),10)||0,h.left+=parseInt(b.css("paddingLeft"),10)||0,h.top+=parseInt(b.css("border-top-width"),10)||0,h.left+=
251 parseInt(b.css("border-left-width"),10)||0,h.width=b.width(),h.height=b.height(),h={width:h.width+2*c.padding,height:h.height+2*c.padding,top:h.top-c.padding-20,left:h.left-c.padding-20}):(b=O(),h={width:2*c.padding,height:2*c.padding,top:parseInt(b[3]+0.5*b[1],10),left:parseInt(b[2]+0.5*b[0],10)});return h},T=function(){u.is(":visible")?(a("div",u).css("top",-40*J+"px"),J=(J+1)%12):clearInterval(I)};a.fn.fancybox=function(b){if(!a(this).length)return this;a(this).data("fancybox",a.extend({},b,a.metadata?
252 a(this).metadata():{})).unbind("click.fb").bind("click.fb",function(b){b.preventDefault();l||(l=!0,a(this).blur(),q=[],s=0,b=a(this).attr("rel")||"",!b||""==b||"nofollow"===b?q.push(this):(q=a("a[rel="+b+"], area[rel="+b+"], img[rel="+b+"]"),s=q.index(this)),G())});return this};a.fancybox=function(b,c){var d;if(!l){l=!0;d="undefined"!==typeof c?c:{};q=[];s=parseInt(d.index,10)||0;if(a.isArray(b)){for(var e=0,g=b.length;e<g;e++)"object"==typeof b[e]?a(b[e]).data("fancybox",a.extend({},d,b[e])):b[e]=
253 a({}).data("fancybox",a.extend({content:b[e]},d));q=jQuery.merge(q,b)}else"object"==typeof b?a(b).data("fancybox",a.extend({},d,b)):b=a({}).data("fancybox",a.extend({content:b},d)),q.push(b);if(s>q.length||0>s)s=0;G()}};a.fancybox.showActivity=function(){clearInterval(I);u.show();I=setInterval(T,66)};a.fancybox.hideActivity=function(){u.hide()};a.fancybox.next=function(){return a.fancybox.pos(r+1)};a.fancybox.prev=function(){return a.fancybox.pos(r-1)};a.fancybox.pos=function(b){l||(b=parseInt(b),
254 q=k,-1<b&&b<k.length?(s=b,G()):c.cyclic&&1<k.length&&(s=b>=k.length?0:k.length-1,G()))};a.fancybox.cancel=function(){l||(l=!0,a.event.trigger("fancybox-cancel"),L(),d.onCancel(q,s,d),l=!1)};a.fancybox.close=function(){function b(){v.fadeOut("fast");j.empty().hide();e.hide();a.event.trigger("fancybox-cleanup");m.empty();c.onClosed(k,r,c);k=d=[];r=s=0;c=d={};l=!1}if(!l&&!e.is(":hidden"))if(l=!0,c&&!1===c.onCleanup(k,r,c))l=!1;else if(L(),a(C.add(y).add(z)).hide(),a(m.add(v)).unbind(),a(window).unbind("resize.fb scroll.fb"),
255 a(document).unbind("keydown.fb"),m.find("iframe").attr("src",K&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank"),"inside"!==c.titlePosition&&j.empty(),e.stop(),"elastic"==c.transitionOut){t=R();var h=e.position();g={top:h.top,left:h.left,width:e.width(),height:e.height()};c.opacity&&(g.opacity=1);j.empty().hide();A.prop=1;a(A).animate({prop:0},{duration:c.speedOut,easing:c.easingOut,step:Q,complete:b})}else e.fadeOut("none"==c.transitionOut?0:c.speedOut,b)};a.fancybox.resize=
256 function(){v.is(":visible")&&v.css("height",a(document).height());a.fancybox.center(!0)};a.fancybox.center=function(b){var a,d;if(!l&&(d=!0===b?1:0,a=O(),d||!(e.width()>a[0]||e.height()>a[1])))e.stop().animate({top:parseInt(Math.max(a[3]-20,a[3]+0.5*(a[1]-m.height()-40)-c.padding)),left:parseInt(Math.max(a[2]-20,a[2]+0.5*(a[0]-m.width()-40)-c.padding))},"number"==typeof b?b:200)};a.fancybox.init=function(){a("#fancybox-wrap").length||(a("body").append(p=a('<div id="fancybox-tmp"></div>'),u=a('<div id="fancybox-loading"><div></div></div>'),
257 v=a('<div id="fancybox-overlay"></div>'),e=a('<div id="fancybox-wrap"></div>')),B=a('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(e),
258 B.append(m=a('<div id="fancybox-content"></div>'),C=a('<a id="fancybox-close"></a>'),j=a('<div id="fancybox-title"></div>'),y=a('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),z=a('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>')),C.click(a.fancybox.close),u.click(a.fancybox.cancel),y.click(function(b){b.preventDefault();a.fancybox.prev()}),z.click(function(b){b.preventDefault();a.fancybox.next()}),
259 a.fn.mousewheel&&e.bind("mousewheel.fb",function(b,c){if(l)b.preventDefault();else if(0==a(b.target).get(0).clientHeight||a(b.target).get(0).scrollHeight===a(b.target).get(0).clientHeight)b.preventDefault(),a.fancybox[0<c?"prev":"next"]()}),a.support.opacity||e.addClass("fancybox-ie"),K&&(u.addClass("fancybox-ie6"),e.addClass("fancybox-ie6"),a('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(B)))};
260 a.fn.fancybox.defaults={padding:10,margin:40,opacity:!1,modal:!1,cyclic:!1,scrolling:"auto",width:560,height:340,autoScale:!0,autoDimensions:!0,centerOnScroll:!1,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:!0,hideOnContentClick:!1,overlayShow:!0,overlayOpacity:0.7,overlayColor:"#777",titleShow:!0,titlePosition:"float",titleFormat:null,titleFromAlt:!1,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",easingOut:"swing",showCloseButton:!0,
261 showNavArrows:!0,enableEscapeButton:!0,enableKeyboardNav:!0,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};a(document).ready(function(){a.fancybox.init()})})(jQuery);
262
263
264 /*
265 * TipTip
266 * Copyright 2010 Drew Wilson
267 * www.drewwilson.com
268 * code.drewwilson.com/entry/tiptip-jquery-plugin
269 *
270 * Version 1.3 - Updated: Mar. 23, 2010
271 *
272 * This Plug-In will create a custom tooltip to replace the default
273 * browser tooltip. It is extremely lightweight and very smart in
274 * that it detects the edges of the browser window and will make sure
275 * the tooltip stays within the current window size. As a result the
276 * tooltip will adjust itself to be displayed above, below, to the left
277 * or to the right depending on what is necessary to stay within the
278 * browser window. It is completely customizable as well via CSS.
279 *
280 * This TipTip jQuery plug-in is dual licensed under the MIT and GPL licenses:
281 * http://www.opensource.org/licenses/mit-license.php
282 * http://www.gnu.org/licenses/gpl.html
283 */
284 (function($){$.fn.tipTip=function(options){var defaults={activation:"hover",keepAlive:false,maxWidth:"200px",edgeOffset:3,defaultPosition:"bottom",delay:400,fadeIn:200,fadeOut:200,attribute:"title",content:false,enter:function(){},exit:function(){}};var opts=$.extend(defaults,options);if($("#tiptip_holder").length<=0){var tiptip_holder=$('<div id="tiptip_holder" style="max-width:'+opts.maxWidth+';"></div>');var tiptip_content=$('<div id="tiptip_content"></div>');var tiptip_arrow=$('<div id="tiptip_arrow"></div>');$("body").append(tiptip_holder.html(tiptip_content).prepend(tiptip_arrow.html('<div id="tiptip_arrow_inner"></div>')))}else{var tiptip_holder=$("#tiptip_holder");var tiptip_content=$("#tiptip_content");var tiptip_arrow=$("#tiptip_arrow")}return this.each(function(){var org_elem=$(this);if(opts.content){var org_title=opts.content}else{var org_title=org_elem.attr(opts.attribute)}if(org_title!=""){if(!opts.content){org_elem.removeAttr(opts.attribute)}var timeout=false;if(opts.activation=="hover"){org_elem.hover(function(){active_tiptip()},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}else if(opts.activation=="focus"){org_elem.focus(function(){active_tiptip()}).blur(function(){deactive_tiptip()})}else if(opts.activation=="click"){org_elem.click(function(){active_tiptip();return false}).hover(function(){},function(){if(!opts.keepAlive){deactive_tiptip()}});if(opts.keepAlive){tiptip_holder.hover(function(){},function(){deactive_tiptip()})}}function active_tiptip(){opts.enter.call(this);tiptip_content.html(org_title);tiptip_holder.hide().removeAttr("class").css("margin","0");tiptip_arrow.removeAttr("style");var top=parseInt(org_elem.offset()['top']);var left=parseInt(org_elem.offset()['left']);var org_width=parseInt(org_elem.outerWidth());var org_height=parseInt(org_elem.outerHeight());var tip_w=tiptip_holder.outerWidth();var tip_h=tiptip_holder.outerHeight();var w_compare=Math.round((org_width-tip_w)/2);var h_compare=Math.round((org_height-tip_h)/2);var marg_left=Math.round(left+w_compare);var marg_top=Math.round(top+org_height+opts.edgeOffset);var t_class="";var arrow_top="";var arrow_left=Math.round(tip_w-12)/2;if(opts.defaultPosition=="bottom"){t_class="_bottom"}else if(opts.defaultPosition=="top"){t_class="_top"}else if(opts.defaultPosition=="left"){t_class="_left"}else if(opts.defaultPosition=="right"){t_class="_right"}var right_compare=(w_compare+left)<parseInt($(window).scrollLeft());var left_compare=(tip_w+left)>parseInt($(window).width());if((right_compare&&w_compare<0)||(t_class=="_right"&&!left_compare)||(t_class=="_left"&&left<(tip_w+opts.edgeOffset+5))){t_class="_right";arrow_top=Math.round(tip_h-13)/2;arrow_left=-12;marg_left=Math.round(left+org_width+opts.edgeOffset);marg_top=Math.round(top+h_compare)}else if((left_compare&&w_compare<0)||(t_class=="_left"&&!right_compare)){t_class="_left";arrow_top=Math.round(tip_h-13)/2;arrow_left=Math.round(tip_w);marg_left=Math.round(left-(tip_w+opts.edgeOffset+5));marg_top=Math.round(top+h_compare)}var top_compare=(top+org_height+opts.edgeOffset+tip_h+8)>parseInt($(window).height()+$(window).scrollTop());var bottom_compare=((top+org_height)-(opts.edgeOffset+tip_h+8))<0;if(top_compare||(t_class=="_bottom"&&top_compare)||(t_class=="_top"&&!bottom_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_top"}else{t_class=t_class+"_top"}arrow_top=tip_h;marg_top=Math.round(top-(tip_h+5+opts.edgeOffset))}else if(bottom_compare|(t_class=="_top"&&bottom_compare)||(t_class=="_bottom"&&!top_compare)){if(t_class=="_top"||t_class=="_bottom"){t_class="_bottom"}else{t_class=t_class+"_bottom"}arrow_top=-12;marg_top=Math.round(top+org_height+opts.edgeOffset)}if(t_class=="_right_top"||t_class=="_left_top"){marg_top=marg_top+5}else if(t_class=="_right_bottom"||t_class=="_left_bottom"){marg_top=marg_top-5}if(t_class=="_left_top"||t_class=="_left_bottom"){marg_left=marg_left+5}tiptip_arrow.css({"margin-left":arrow_left+"px","margin-top":arrow_top+"px"});tiptip_holder.css({"margin-left":marg_left+"px","margin-top":marg_top+"px"}).attr("class","tip"+t_class);if(timeout){clearTimeout(timeout)}timeout=setTimeout(function(){tiptip_holder.stop(true,true).fadeIn(opts.fadeIn)},opts.delay)}function deactive_tiptip(){opts.exit.call(this);if(timeout){clearTimeout(timeout)}tiptip_holder.fadeOut(opts.fadeOut)}}})}})(jQuery);
285
286 /* TINY SORT */
287 (function(e){var a=false,g=null,f=parseFloat,b=/(\d+\.?\d*)$/g;e.tinysort={id:"TinySort",version:"1.2.18",copyright:"Copyright (c) 2008-2012 Ron Valstar",uri:"http://tinysort.sjeiti.com/",licenced:{MIT:"http://www.opensource.org/licenses/mit-license.php",GPL:"http://www.gnu.org/licenses/gpl.html"},defaults:{order:"asc",attr:g,data:g,useVal:a,place:"start",returns:a,cases:a,forceStrings:a,sortFunction:g}};e.fn.extend({tinysort:function(m,h){if(m&&typeof(m)!="string"){h=m;m=g}var n=e.extend({},e.tinysort.defaults,h),s,B=this,x=e(this).length,C={},p=!(!m||m==""),q=!(n.attr===g||n.attr==""),w=n.data!==g,j=p&&m[0]==":",k=j?B.filter(m):B,r=n.sortFunction,v=n.order=="asc"?1:-1,l=[];if(!r){r=n.order=="rand"?function(){return Math.random()<0.5?1:-1}:function(F,E){var i=!n.cases?d(F.s):F.s,K=!n.cases?d(E.s):E.s;if(!n.forceStrings){var H=i.match(b),G=K.match(b);if(H&&G){var J=i.substr(0,i.length-H[0].length),I=K.substr(0,K.length-G[0].length);if(J==I){i=f(H[0]);K=f(G[0])}}}return v*(i<K?-1:(i>K?1:0))}}B.each(function(G,H){var I=e(H),E=p?(j?k.filter(H):I.find(m)):I,J=w?E.data(n.data):(q?E.attr(n.attr):(n.useVal?E.val():E.text())),F=I.parent();if(!C[F]){C[F]={s:[],n:[]}}if(E.length>0){C[F].s.push({s:J,e:I,n:G})}else{C[F].n.push({e:I,n:G})}});for(s in C){C[s].s.sort(r)}for(s in C){var y=C[s],A=[],D=x,u=[0,0],z;switch(n.place){case"first":e.each(y.s,function(E,F){D=Math.min(D,F.n)});break;case"org":e.each(y.s,function(E,F){A.push(F.n)});break;case"end":D=y.n.length;break;default:D=0}for(z=0;z<x;z++){var o=c(A,z)?!a:z>=D&&z<D+y.s.length,t=(o?y.s:y.n)[u[o?0:1]].e;t.parent().append(t);if(o||!n.returns){l.push(t.get(0))}u[o?0:1]++}}return B.pushStack(l)}});function d(h){return h&&h.toLowerCase?h.toLowerCase():h}function c(j,m){for(var k=0,h=j.length;k<h;k++){if(j[k]==m){return !a}}return a}e.fn.TinySort=e.fn.Tinysort=e.fn.tsort=e.fn.tinysort})(jQuery);
288
289 /*global jQuery */
290 /*jshint multistr:true browser:true */
291 /*!
292 * FitVids 1.0
293 *
294 * Copyright 2011, Chris Coyier - http://css-tricks.com + Dave Rupert - http://daverupert.com
295 * Credit to Thierry Koblentz - http://www.alistapart.com/articles/creating-intrinsic-ratios-for-video/
296 * Released under the WTFPL license - http://sam.zoy.org/wtfpl/
297 *
298 * Date: Thu Sept 01 18:00:00 2011 -0500
299 */
300
301 (function( $ ){
302
303 "use strict";
304
305 $.fn.fitVids = function( options ) {
306 var settings = {
307 customSelector: null
308 };
309
310 var div = document.createElement('div'),
311 ref = document.getElementsByTagName('base')[0] || document.getElementsByTagName('script')[0];
312
313 div.className = 'fit-vids-style';
314 div.innerHTML = '&shy;<style> \
315 .fluid-width-video-wrapper { \
316 width: 100%; \
317 position: relative; \
318 padding: 0; \
319 } \
320 \
321 .fluid-width-video-wrapper iframe, \
322 .fluid-width-video-wrapper object, \
323 .fluid-width-video-wrapper embed { \
324 position: absolute; \
325 top: 0; \
326 left: 0; \
327 width: 100%; \
328 height: 100%; \
329 } \
330 </style>';
331
332 ref.parentNode.insertBefore(div,ref);
333
334 if ( options ) {
335 $.extend( settings, options );
336 }
337
338 return this.each(function(){
339 var selectors = [
340 "iframe[src*='player.vimeo.com']",
341 "iframe[src*='www.youtube.com']",
342 "iframe[src*='www.kickstarter.com']",
343 "object",
344 "embed"
345 ];
346
347 if (settings.customSelector) {
348 selectors.push(settings.customSelector);
349 }
350
351 var $allVideos = $(this).find(selectors.join(','));
352
353 $allVideos.each(function(){
354 var $this = $(this);
355 if (this.tagName.toLowerCase() === 'embed' && $this.parent('object').length || $this.parent('.fluid-width-video-wrapper').length) { return; }
356 var height = ( this.tagName.toLowerCase() === 'object' || ($this.attr('height') && !isNaN(parseInt($this.attr('height'), 10))) ) ? parseInt($this.attr('height'), 10) : $this.height(),
357 width = !isNaN(parseInt($this.attr('width'), 10)) ? parseInt($this.attr('width'), 10) : $this.width(),
358 aspectRatio = height / width;
359 if(!$this.attr('id')){
360 var videoID = 'fitvid' + Math.floor(Math.random()*999999);
361 $this.attr('id', videoID);
362 }
363 $this.wrap('<div class="fluid-width-video-wrapper"></div>').parent('.fluid-width-video-wrapper').css('padding-top', (aspectRatio * 100)+"%");
364 $this.removeAttr('height').removeAttr('width');
365 });
366 });
367 };
368 })( jQuery );
369
370
371 /**
372 * BxSlider v4.0 - Fully loaded, responsive content slider
373 * http://bxslider.com
374 *
375 * Copyright 2012, Steven Wanderski - http://stevenwanderski.com - http://bxcreative.com
376 * Written while drinking Belgian ales and listening to jazz
377 *
378 * Released under the WTFPL license - http://sam.zoy.org/wtfpl/
379 */
380 (function(t){var e={},n={mode:"horizontal",slideSelector:"",infiniteLoop:!0,hideControlOnEnd:!1,speed:500,easing:null,slideMargin:0,startSlide:0,randomStart:!1,captions:!1,ticker:!1,tickerHover:!1,adaptiveHeight:!1,adaptiveHeightSpeed:500,touchEnabled:!0,swipeThreshold:50,video:!1,useCSS:!0,pager:!0,pagerType:"full",pagerShortSeparator:" / ",pagerSelector:null,buildPager:null,pagerCustom:null,controls:!0,nextText:"Next",prevText:"Prev",nextSelector:null,prevSelector:null,autoControls:!1,startText:"Start",stopText:"Stop",autoControlsCombine:!1,autoControlsSelector:null,auto:!1,pause:4e3,autoStart:!0,autoDirection:"next",autoHover:!1,autoDelay:0,minSlides:1,maxSlides:1,moveSlides:0,slideWidth:0,onSliderLoad:function(){},onSlideBefore:function(){},onSlideAfter:function(){},onSlideNext:function(){},onSlidePrev:function(){}};t.fn.bxSlider=function(s){if(0!=this.length){if(this.length>1)return this.each(function(){t(this).bxSlider(s)}),this;var o={},r=this;e.el=this;var a=t(window).width(),l=t(window).height(),d=function(){o.settings=t.extend({},n,s),o.children=r.children(o.settings.slideSelector),o.children.length<o.settings.minSlides&&(o.settings.minSlides=o.children.length),o.children.length<o.settings.maxSlides&&(o.settings.maxSlides=o.children.length),o.settings.randomStart&&(o.settings.startSlide=Math.floor(Math.random()*o.children.length)),o.active={index:o.settings.startSlide},o.carousel=o.settings.minSlides>1||o.settings.maxSlides>1,o.minThreshold=o.settings.minSlides*o.settings.slideWidth+(o.settings.minSlides-1)*o.settings.slideMargin,o.maxThreshold=o.settings.maxSlides*o.settings.slideWidth+(o.settings.maxSlides-1)*o.settings.slideMargin,o.working=!1,o.controls={},o.interval=null,o.animProp="vertical"==o.settings.mode?"top":"left",o.usingCSS=o.settings.useCSS&&"fade"!=o.settings.mode&&function(){var t=document.createElement("div"),e=["WebkitPerspective","MozPerspective","OPerspective","msPerspective"];for(var i in e)if(void 0!==t.style[e[i]])return o.cssPrefix=e[i].replace("Perspective","").toLowerCase(),o.animProp="-"+o.cssPrefix+"-transform",!0;return!1}(),"vertical"==o.settings.mode&&(o.settings.maxSlides=o.settings.minSlides),c()},c=function(){if(r.wrap('<div class="bx-wrapper"><div class="bx-viewport"></div></div>'),o.viewport=r.parent(),o.loader=t('<div class="bx-loading" />'),o.viewport.prepend(o.loader),r.css({width:"horizontal"==o.settings.mode?215*o.children.length+"%":"auto",position:"relative"}),o.usingCSS&&o.settings.easing?r.css("-"+o.cssPrefix+"-transition-timing-function",o.settings.easing):o.settings.easing||(o.settings.easing="swing"),o.viewport.css({width:"100%",overflow:"hidden",position:"relative"}),o.children.css({"float":"horizontal"==o.settings.mode?"left":"none",listStyle:"none",position:"relative"}),o.children.width(h()),"horizontal"==o.settings.mode&&o.settings.slideMargin>0&&o.children.css("marginRight",o.settings.slideMargin),"vertical"==o.settings.mode&&o.settings.slideMargin>0&&o.children.css("marginBottom",o.settings.slideMargin),"fade"==o.settings.mode&&(o.children.css({position:"absolute",zIndex:0,display:"none"}),o.children.eq(o.settings.startSlide).css({zIndex:50,display:"block"})),o.controls.el=t('<div class="bx-controls" />'),o.settings.captions&&T(),o.settings.infiniteLoop&&"fade"!=o.settings.mode&&!o.settings.ticker){var e="vertical"==o.settings.mode?o.settings.minSlides:o.settings.maxSlides,i=o.children.slice(0,e).clone().addClass("bx-clone"),n=o.children.slice(-e).clone().addClass("bx-clone");r.append(i).prepend(n)}o.active.last=o.settings.startSlide==v()-1,o.settings.video&&r.fitVids(),o.settings.ticker||(o.settings.pager&&S(),o.settings.controls&&b(),o.settings.auto&&o.settings.autoControls&&w(),(o.settings.controls||o.settings.autoControls||o.settings.pager)&&o.viewport.after(o.controls.el)),r.children().imagesLoaded(function(){o.loader.remove(),f(),"vertical"==o.settings.mode&&(o.settings.adaptiveHeight=!0),o.viewport.height(g()),o.settings.onSliderLoad(o.active.index),o.initialized=!0,t(window).bind("resize",O),o.settings.auto&&o.settings.autoStart&&L(),o.settings.ticker&&D(),o.settings.pager&&y(o.settings.startSlide),o.settings.controls&&q(),o.settings.touchEnabled&&!o.settings.ticker&&H()})},g=function(){var e=0,n=t();if("vertical"==o.settings.mode||o.settings.adaptiveHeight)if(o.carousel){var s=1==o.settings.moveSlides?o.active.index:o.active.index*p();for(n=o.children.eq(s),i=1;o.settings.maxSlides-1>=i;i++)n=s+i>=o.children.length?n.add(o.children.eq(i-1)):n.add(o.children.eq(s+i))}else n=o.children.eq(o.active.index);else n=o.children;return"vertical"==o.settings.mode?(n.each(function(){e+=t(this).outerHeight()}),o.settings.slideMargin>0&&(e+=o.settings.slideMargin*(o.settings.minSlides-1))):e=Math.max.apply(Math,n.map(function(){return t(this).outerHeight(!1)}).get()),e},h=function(){var t=o.settings.slideWidth,e=o.viewport.width();return 0==o.settings.slideWidth?t=e:e>o.maxThreshold?t=(e-o.settings.slideMargin*(o.settings.maxSlides-1))/o.settings.maxSlides:o.minThreshold>e&&(t=(e-o.settings.slideMargin*(o.settings.minSlides-1))/o.settings.minSlides),t},u=function(){var t=1;if("horizontal"==o.settings.mode)if(o.viewport.width()<o.minThreshold)t=o.settings.minSlides;else if(o.viewport.width()>o.maxThreshold)t=o.settings.maxSlides;else{var e=o.children.first().width();t=Math.floor(o.viewport.width()/e)}else"vertical"==o.settings.mode&&(t=o.settings.minSlides);return t},v=function(){var t=0;if(o.settings.moveSlides>0)if(o.settings.infiniteLoop)t=o.children.length/p();else for(var e=0,i=0;o.children.length>e;)++t,e=i+u(),i+=o.settings.moveSlides<=u()?o.settings.moveSlides:u();else t=Math.ceil(o.children.length/u());return t},p=function(){return o.settings.moveSlides>0&&o.settings.moveSlides<=u()?o.settings.moveSlides:u()},f=function(){if(o.active.last&&!o.settings.infiniteLoop){if("horizontal"==o.settings.mode){var t=o.children.last(),e=t.position();x(-(e.left-(o.viewport.width()-t.width())),"reset",0)}else if("vertical"==o.settings.mode){var i=o.children.length-o.settings.minSlides,e=o.children.eq(i).position();x(-e.top,"reset",0)}}else{var e=o.children.eq(o.active.index*p()).position();o.active.index==v()-1&&(o.active.last=!0),void 0!=e&&("horizontal"==o.settings.mode?x(-e.left,"reset",0):"vertical"==o.settings.mode&&x(-e.top,"reset",0))}},x=function(t,e,i,n){if(o.usingCSS){var s="vertical"==o.settings.mode?"translate3d(0, "+t+"px, 0)":"translate3d("+t+"px, 0, 0)";r.css("-"+o.cssPrefix+"-transition-duration",i/1e3+"s"),"slide"==e?(r.css(o.animProp,s),r.bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(){r.unbind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd"),z()})):"reset"==e?r.css(o.animProp,s):"ticker"==e&&(r.css("-"+o.cssPrefix+"-transition-timing-function","linear"),r.css(o.animProp,s),r.bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(){r.unbind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd"),x(n.resetValue,"reset",0),I()}))}else{var a={};a[o.animProp]=t,"slide"==e?r.animate(a,i,o.settings.easing,function(){z()}):"reset"==e?r.css(o.animProp,t):"ticker"==e&&r.animate(a,speed,"linear",function(){x(n.resetValue,"reset",0),I()})}},m=function(){var e="";pagerQty=v();for(var i=0;pagerQty>i;i++){var n="";o.settings.buildPager&&t.isFunction(o.settings.buildPager)?(n=o.settings.buildPager(i),o.pagerEl.addClass("bx-custom-pager")):(n=i+1,o.pagerEl.addClass("bx-default-pager")),e+='<div class="bx-pager-item"><a href="" data-slide-index="'+i+'" class="bx-pager-link">'+n+"</a></div>"}o.pagerEl.html(e)},S=function(){o.settings.pagerCustom?o.pagerEl=t(o.settings.pagerCustom):(o.pagerEl=t('<div class="bx-pager" />'),o.settings.pagerSelector?t(o.settings.pagerSelector).html(o.pagerEl):o.controls.el.addClass("bx-has-pager").append(o.pagerEl),m()),o.pagerEl.delegate("a","click",k)},b=function(){o.controls.next=t('<a class="bx-next" href="">'+o.settings.nextText+"</a>"),o.controls.prev=t('<a class="bx-prev" href="">'+o.settings.prevText+"</a>"),o.controls.next.bind("click",C),o.controls.prev.bind("click",E),o.settings.nextSelector&&t(o.settings.nextSelector).append(o.controls.next),o.settings.prevSelector&&t(o.settings.prevSelector).append(o.controls.prev),o.settings.nextSelector||o.settings.prevSelector||(o.controls.directionEl=t('<div class="bx-controls-direction" />'),o.controls.directionEl.append(o.controls.prev).append(o.controls.next),o.controls.el.addClass("bx-has-controls-direction").append(o.controls.directionEl))},w=function(){o.controls.start=t('<div class="bx-controls-auto-item"><a class="bx-start" href="">'+o.settings.startText+"</a></div>"),o.controls.stop=t('<div class="bx-controls-auto-item"><a class="bx-stop" href="">'+o.settings.stopText+"</a></div>"),o.controls.autoEl=t('<div class="bx-controls-auto" />'),o.controls.autoEl.delegate(".bx-start","click",A),o.controls.autoEl.delegate(".bx-stop","click",P),o.settings.autoControlsCombine?o.controls.autoEl.append(o.controls.start):o.controls.autoEl.append(o.controls.start).append(o.controls.stop),o.settings.autoControlsSelector?t(o.settings.autoControlsSelector).html(o.controls.autoEl):o.controls.el.addClass("bx-has-controls-auto").append(o.controls.autoEl),M(o.settings.autoStart?"stop":"start")},T=function(){o.children.each(function(){var e=t(this).find("img:first").attr("title");void 0!=e&&t(this).append('<div class="bx-caption"><span>'+e+"</span></div>")})},C=function(t){o.settings.auto&&r.stopAuto(),r.goToNextSlide(),t.preventDefault()},E=function(t){o.settings.auto&&r.stopAuto(),r.goToPrevSlide(),t.preventDefault()},A=function(t){r.startAuto(),t.preventDefault()},P=function(t){r.stopAuto(),t.preventDefault()},k=function(e){o.settings.auto&&r.stopAuto();var i=t(e.currentTarget),n=parseInt(i.attr("data-slide-index"));n!=o.active.index&&r.goToSlide(n),e.preventDefault()},y=function(e){return"short"==o.settings.pagerType?(o.pagerEl.html(e+1+o.settings.pagerShortSeparator+o.children.length),void 0):(o.pagerEl.find("a").removeClass("active"),o.pagerEl.each(function(i,n){t(n).find("a").eq(e).addClass("active")}),void 0)},z=function(){if(o.settings.infiniteLoop){var t="";0==o.active.index?t=o.children.eq(0).position():o.active.index==v()-1&&o.carousel?t=o.children.eq((v()-1)*p()).position():o.active.index==o.children.length-1&&(t=o.children.eq(o.children.length-1).position()),"horizontal"==o.settings.mode?x(-t.left,"reset",0):"vertical"==o.settings.mode&&x(-t.top,"reset",0)}o.working=!1,o.settings.onSlideAfter(o.children.eq(o.active.index),o.oldIndex,o.active.index)},M=function(t){o.settings.autoControlsCombine?o.controls.autoEl.html(o.controls[t]):(o.controls.autoEl.find("a").removeClass("active"),o.controls.autoEl.find("a:not(.bx-"+t+")").addClass("active"))},q=function(){!o.settings.infiniteLoop&&o.settings.hideControlOnEnd&&(0==o.active.index?(o.controls.prev.addClass("disabled"),o.controls.next.removeClass("disabled")):o.active.index==v()-1?(o.controls.next.addClass("disabled"),o.controls.prev.removeClass("disabled")):(o.controls.prev.removeClass("disabled"),o.controls.next.removeClass("disabled")))},L=function(){o.settings.autoDelay>0?setTimeout(r.startAuto,o.settings.autoDelay):r.startAuto(),o.settings.autoHover&&r.hover(function(){o.interval&&(r.stopAuto(!0),o.autoPaused=!0)},function(){o.autoPaused&&(r.startAuto(!0),o.autoPaused=null)})},D=function(){var e=0;if("next"==o.settings.autoDirection)r.append(o.children.clone().addClass("bx-clone"));else{r.prepend(o.children.clone().addClass("bx-clone"));var i=o.children.first().position();e="horizontal"==o.settings.mode?-i.left:-i.top}x(e,"reset",0),o.settings.pager=!1,o.settings.controls=!1,o.settings.autoControls=!1,o.settings.tickerHover&&!o.usingCSS&&o.viewport.hover(function(){r.stop()},function(){var e=0;o.children.each(function(){e+="horizontal"==o.settings.mode?t(this).outerWidth(!0):t(this).outerHeight(!0)});var i=o.settings.speed/e,n="horizontal"==o.settings.mode?"left":"top",s=i*(e-Math.abs(parseInt(r.css(n))));I(s)}),I()},I=function(t){speed=t?t:o.settings.speed;var e={left:0,top:0},i={left:0,top:0};"next"==o.settings.autoDirection?e=r.find(".bx-clone").first().position():i=o.children.first().position();var n="horizontal"==o.settings.mode?-e.left:-e.top,s="horizontal"==o.settings.mode?-i.left:-i.top,a={resetValue:s};x(n,"ticker",speed,a)},H=function(){o.touch={start:{x:0,y:0},end:{x:0,y:0}},o.viewport.bind("touchstart",W)},W=function(t){if(o.working)t.preventDefault();else{o.touch.originalPos=r.position();var e=t.originalEvent;o.touch.start.x=e.changedTouches[0].pageX,o.touch.start.y=e.changedTouches[0].pageY,o.viewport.bind("touchmove",N),o.viewport.bind("touchend",B)}},N=function(t){if(t.preventDefault(),"fade"!=o.settings.mode){var e=t.originalEvent,i=0;if("horizontal"==o.settings.mode){var n=e.changedTouches[0].pageX-o.touch.start.x;i=o.touch.originalPos.left+n}else{var n=e.changedTouches[0].pageY-o.touch.start.y;i=o.touch.originalPos.top+n}x(i,"reset",0)}},B=function(t){o.viewport.unbind("touchmove",N);var e=t.originalEvent,i=0;if(o.touch.end.x=e.changedTouches[0].pageX,o.touch.end.y=e.changedTouches[0].pageY,"fade"==o.settings.mode){var n=Math.abs(o.touch.start.x-o.touch.end.x);n>=o.settings.swipeThreshold&&(o.touch.start.x>o.touch.end.x?r.goToNextSlide():r.goToPrevSlide(),r.stopAuto())}else{var n=0;"horizontal"==o.settings.mode?(n=o.touch.end.x-o.touch.start.x,i=o.touch.originalPos.left):(n=o.touch.end.y-o.touch.start.y,i=o.touch.originalPos.top),!o.settings.infiniteLoop&&(0==o.active.index&&n>0||o.active.last&&0>n)?x(i,"reset",200):Math.abs(n)>=o.settings.swipeThreshold?(0>n?r.goToNextSlide():r.goToPrevSlide(),r.stopAuto()):x(i,"reset",200)}o.viewport.unbind("touchend",B)},O=function(){var e=t(window).width(),i=t(window).height();(a!=e||l!=i)&&(a=e,l=i,o.children.add(r.find(".bx-clone")).width(h()),o.viewport.css("height",g()),o.active.last&&(o.active.index=v()-1),o.active.index>=v()&&(o.active.last=!0),o.settings.pager&&!o.settings.pagerCustom&&(m(),y(o.active.index)),o.settings.ticker||f())};return r.goToSlide=function(e,i){if(!o.working&&o.active.index!=e)if(o.working=!0,o.oldIndex=o.active.index,o.active.index=0>e?v()-1:e>=v()?0:e,o.settings.onSlideBefore(o.children.eq(o.active.index),o.oldIndex,o.active.index),"next"==i?o.settings.onSlideNext(o.children.eq(o.active.index),o.oldIndex,o.active.index):"prev"==i&&o.settings.onSlidePrev(o.children.eq(o.active.index),o.oldIndex,o.active.index),o.active.last=o.active.index>=v()-1,o.settings.pager&&y(o.active.index),o.settings.controls&&q(),"fade"==o.settings.mode)o.settings.adaptiveHeight&&o.viewport.height()!=g()&&o.viewport.animate({height:g()},o.settings.adaptiveHeightSpeed),o.children.filter(":visible").fadeOut(o.settings.speed).css({zIndex:0}),o.children.eq(o.active.index).css("zIndex",51).fadeIn(o.settings.speed,function(){t(this).css("zIndex",50),z()});else{o.settings.adaptiveHeight&&o.viewport.height()!=g()&&o.viewport.animate({height:g()},o.settings.adaptiveHeightSpeed);var n=0,s={left:0,top:0};if(!o.settings.infiniteLoop&&o.carousel&&o.active.last)if("horizontal"==o.settings.mode){var a=o.children.eq(o.children.length-1);s=a.position(),n=o.viewport.width()-a.width()}else{var l=o.children.length-o.settings.minSlides;s=o.children.eq(l).position()}else if(o.carousel&&o.active.last&&"prev"==i){var d=1==o.settings.moveSlides?o.settings.maxSlides-p():(v()-1)*p()-(o.children.length-o.settings.maxSlides),a=r.children(".bx-clone").eq(d);s=a.position()}else if("next"==i&&0==o.active.index)s=r.find(".bx-clone").eq(o.settings.maxSlides).position(),o.active.last=!1;else if(e>=0){var c=e*p();s=o.children.eq(c).position()}var h="horizontal"==o.settings.mode?-(s.left-n):-s.top;x(h,"slide",o.settings.speed)}},r.goToNextSlide=function(){if(o.settings.infiniteLoop||!o.active.last){var t=o.active.index+1;r.goToSlide(t,"next")}},r.goToPrevSlide=function(){if(o.settings.infiniteLoop||0!=o.active.index){var t=o.active.index-1;r.goToSlide(t,"prev")}},r.startAuto=function(t){o.interval||(o.interval=setInterval(function(){"next"==o.settings.autoDirection?r.goToNextSlide():r.goToPrevSlide()},o.settings.pause),o.settings.autoControls&&1!=t&&M("stop"))},r.stopAuto=function(t){o.interval&&(clearInterval(o.interval),o.interval=null,o.settings.autoControls&&1!=t&&M("start"))},r.getCurrentSlide=function(){return o.active.index},r.getSlideCount=function(){return o.children.length},r.destroySlider=function(){o.initialized&&(o.initialized=!1,t(".bx-clone",this).remove(),o.children.removeAttr("style"),this.removeAttr("style").unwrap().unwrap(),o.controls.el&&o.controls.el.remove(),o.controls.next&&o.controls.next.remove(),o.controls.prev&&o.controls.prev.remove(),o.pagerEl&&o.pagerEl.remove(),t(".bx-caption",this).remove(),o.controls.autoEl&&o.controls.autoEl.remove(),clearInterval(o.interval),t(window).unbind("resize",O))},r.reloadSlider=function(t){void 0!=t&&(s=t),r.destroySlider(),d()},d(),this}}})(jQuery),function(t,e){var i="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";t.fn.imagesLoaded=function(n){function s(){var e=t(g),i=t(h);a&&(h.length?a.reject(d,e,i):a.resolve(d)),t.isFunction(n)&&n.call(r,d,e,i)}function o(e,n){e.src===i||-1!==t.inArray(e,c)||(c.push(e),n?h.push(e):g.push(e),t.data(e,"imagesLoaded",{isBroken:n,src:e.src}),l&&a.notifyWith(t(e),[n,d,t(g),t(h)]),d.length===c.length&&(setTimeout(s),d.unbind(".imagesLoaded")))}var r=this,a=t.isFunction(t.Deferred)?t.Deferred():0,l=t.isFunction(a.notify),d=r.find("img").add(r.filter("img")),c=[],g=[],h=[];return t.isPlainObject(n)&&t.each(n,function(t,e){"callback"===t?n=e:a&&a[t](e)}),d.length?d.bind("load.imagesLoaded error.imagesLoaded",function(t){o(t.target,"error"===t.type)}).each(function(n,s){var r=s.src,a=t.data(s,"imagesLoaded");a&&a.src===r?o(s,a.isBroken):s.complete&&s.naturalWidth!==e?o(s,0===s.naturalWidth||0===s.naturalHeight):(s.readyState||s.complete)&&(s.src=i,s.src=r)}):s(),a?a.promise(r):r}}(jQuery);
381
382
383 /*
384 Prettify JS
385 */
386 var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
387 (function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
388 [],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
389 f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
390 (j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
391 {b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
392 t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
393 "string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
394 l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
395 q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
396 q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
397 "");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
398 a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
399 for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
400 m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
401 a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
402 j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
403 "catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
404 H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
405 J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
406 I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
407 ["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
408 /^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
409 ["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
410 hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
411 !k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
412 250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
413 PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();
414
415 /*
416 HTML5 Shiv v3.6.2pre | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed
417 Uncompressed source: https://github.com/aFarkas/html5shiv
418 */
419 (function(l,f){function m(){var a=e.elements;return"string"==typeof a?a.split(" "):a}function i(a){var b=n[a[o]];b||(b={},h++,a[o]=h,n[h]=b);return b}function p(a,b,c){b||(b=f);if(g)return b.createElement(a);c||(c=i(b));b=c.cache[a]?c.cache[a].cloneNode():r.test(a)?(c.cache[a]=c.createElem(a)).cloneNode():c.createElem(a);return b.canHaveChildren&&!s.test(a)?c.frag.appendChild(b):b}function t(a,b){if(!b.cache)b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag();
420 a.createElement=function(c){return!e.shivMethods?b.createElem(c):p(c,a,b)};a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+m().join().replace(/\w+/g,function(a){b.createElem(a);b.frag.createElement(a);return'c("'+a+'")'})+");return n}")(e,b.frag)}function q(a){a||(a=f);var b=i(a);if(e.shivCSS&&!j&&!b.hasCSS){var c,d=a;c=d.createElement("p");d=d.getElementsByTagName("head")[0]||d.documentElement;c.innerHTML="x<style>article,aside,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}</style>";
421 c=d.insertBefore(c.lastChild,d.firstChild);b.hasCSS=!!c}g||t(a,b);return a}var k=l.html5||{},s=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,r=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,j,o="_html5shiv",h=0,n={},g;(function(){try{var a=f.createElement("a");a.innerHTML="<xyz></xyz>";j="hidden"in a;var b;if(!(b=1==a.childNodes.length)){f.createElement("a");var c=f.createDocumentFragment();b="undefined"==typeof c.cloneNode||
422 "undefined"==typeof c.createDocumentFragment||"undefined"==typeof c.createElement}g=b}catch(d){g=j=!0}})();var e={elements:k.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup main mark meter nav output progress section summary time video",version:"3.6.2pre",shivCSS:!1!==k.shivCSS,supportsUnknownElements:g,shivMethods:!1!==k.shivMethods,type:"default",shivDocument:q,createElement:p,createDocumentFragment:function(a,b){a||(a=f);if(g)return a.createDocumentFragment();
423 for(var b=b||i(a),c=b.frag.cloneNode(),d=0,e=m(),h=e.length;d<h;d++)c.createElement(e[d]);return c}};l.html5=e;q(f)})(this,document);
0 /*!
1 Papa Parse
2 v4.1.0
3 https://github.com/mholt/PapaParse
4 */
5 !(function(e){"use strict";function u(t,n){n=n||{};if(n.worker&&Papa.WORKERS_SUPPORTED){var r=m();r.userStep=n.step;r.userChunk=n.chunk;r.userComplete=n.complete;r.userError=n.error;n.step=x(n.step);n.chunk=x(n.chunk);n.complete=x(n.complete);n.error=x(n.error);delete n.worker;r.postMessage({input:t,config:n,workerId:r.id});return}var i=null;if(typeof t==="string"){if(n.download)i=new l(n);else i=new h(n)}else if(e.File&&t instanceof File||t instanceof Object)i=new c(n);return i.stream(t)}function a(t,n){function a(){if(typeof n!=="object")return;if(typeof n.delimiter==="string"&&n.delimiter.length==1&&e.Papa.BAD_DELIMITERS.indexOf(n.delimiter)==-1){o=n.delimiter}if(typeof n.quotes==="boolean"||n.quotes instanceof Array)s=n.quotes;if(typeof n.newline==="string")u=n.newline}function f(e){if(typeof e!=="object")return[];var t=[];for(var n in e)t.push(n);return t}function l(e,t){var n="";if(typeof e==="string")e=JSON.parse(e);if(typeof t==="string")t=JSON.parse(t);var r=e instanceof Array&&e.length>0;var i=!(t[0]instanceof Array);if(r){for(var s=0;s<e.length;s++){if(s>0)n+=o;n+=c(e[s],s)}if(t.length>0)n+=u}for(var a=0;a<t.length;a++){var f=r?e.length:t[a].length;for(var l=0;l<f;l++){if(l>0)n+=o;var h=r&&i?e[l]:l;n+=c(t[a][h],l)}if(a<t.length-1)n+=u}return n}function c(t,n){if(typeof t==="undefined"||t===null)return"";t=t.toString().replace(/"/g,'""');var r=typeof s==="boolean"&&s||s instanceof Array&&s[n]||h(t,e.Papa.BAD_DELIMITERS)||t.indexOf(o)>-1||t.charAt(0)==" "||t.charAt(t.length-1)==" ";return r?'"'+t+'"':t}function h(e,t){for(var n=0;n<t.length;n++)if(e.indexOf(t[n])>-1)return true;return false}var r="";var i=[];var s=false;var o=",";var u="\r\n";a();if(typeof t==="string")t=JSON.parse(t);if(t instanceof Array){if(!t.length||t[0]instanceof Array)return l(null,t);else if(typeof t[0]==="object")return l(f(t[0]),t)}else if(typeof t==="object"){if(typeof t.data==="string")t.data=JSON.parse(t.data);if(t.data instanceof Array){if(!t.fields)t.fields=t.data[0]instanceof Array?t.fields:f(t.data[0]);if(!(t.data[0]instanceof Array)&&typeof t.data[0]!=="object")t.data=[t.data]}return l(t.fields||[],t.data||[])}throw"exception: Unable to serialize unrecognized input"}function f(n){function r(e){var t=E(e);t.chunkSize=parseInt(t.chunkSize);this._handle=new p(t);this._handle.streamer=this;this._config=t}this._handle=null;this._paused=false;this._finished=false;this._input=null;this._baseIndex=0;this._partialLine="";this._rowCount=0;this._start=0;this._nextChunk=null;r.call(this,n);this.parseChunk=function(n){var r=this._partialLine+n;this._partialLine="";var i=this._handle.parse(r,this._baseIndex,!this._finished);if(this._handle.paused())return;var s=i.meta.cursor;if(!this._finished){this._partialLine=r.substring(s-this._baseIndex);this._baseIndex=s}if(i&&i.data)this._rowCount+=i.data.length;var o=this._finished||this._config.preview&&this._rowCount>=this._config.preview;if(t){e.postMessage({results:i,workerId:Papa.WORKER_ID,finished:o})}else if(x(this._config.chunk)){this._config.chunk(i,this._handle);if(this._paused)return;i=undefined}if(o&&x(this._config.complete)&&(!i||!i.meta.aborted))this._config.complete(i);if(!o&&(!i||!i.meta.paused))this._nextChunk();return i};this._sendError=function(n){if(x(this._config.error))this._config.error(n);else if(t&&this._config.error){e.postMessage({workerId:Papa.WORKER_ID,error:n,finished:false})}}}function l(e){function r(e){var t=e.getResponseHeader("Content-Range");return parseInt(t.substr(t.lastIndexOf("/")+1))}e=e||{};if(!e.chunkSize)e.chunkSize=Papa.RemoteChunkSize;f.call(this,e);var n;if(t){this._nextChunk=function(){this._readChunk();this._chunkLoaded()}}else{this._nextChunk=function(){this._readChunk()}}this.stream=function(e){this._input=e;this._nextChunk()};this._readChunk=function(){if(this._finished){this._chunkLoaded();return}n=new XMLHttpRequest;if(!t){n.onload=S(this._chunkLoaded,this);n.onerror=S(this._chunkError,this)}n.open("GET",this._input,!t);if(this._config.step||this._config.chunk){var e=this._start+this._config.chunkSize-1;n.setRequestHeader("Range","bytes="+this._start+"-"+e);n.setRequestHeader("If-None-Match","webkit-no-cache")}try{n.send()}catch(r){this._chunkError(r.message)}if(t&&n.status==0)this._chunkError();else this._start+=this._config.chunkSize};this._chunkLoaded=function(){if(n.readyState!=4)return;if(n.status<200||n.status>=400){this._chunkError();return}this._finished=!this._config.step&&!this._config.chunk||this._start>r(n);this.parseChunk(n.responseText)};this._chunkError=function(e){var t=n.statusText||e;this._sendError(t)}}function c(e){e=e||{};if(!e.chunkSize)e.chunkSize=Papa.LocalChunkSize;f.call(this,e);var t,n;var r=typeof FileReader!=="undefined";this.stream=function(e){this._input=e;n=e.slice||e.webkitSlice||e.mozSlice;if(r){t=new FileReader;t.onload=S(this._chunkLoaded,this);t.onerror=S(this._chunkError,this)}else t=new FileReaderSync;this._nextChunk()};this._nextChunk=function(){if(!this._finished&&(!this._config.preview||this._rowCount<this._config.preview))this._readChunk()};this._readChunk=function(){var e=Math.min(this._start+this._config.chunkSize,this._input.size);var i=t.readAsText(n.call(this._input,this._start,e),this._config.encoding);if(!r)this._chunkLoaded({target:{result:i}})};this._chunkLoaded=function(e){this._start+=this._config.chunkSize;this._finished=this._start>=this._input.size;this.parseChunk(e.target.result)};this._chunkError=function(){this._sendError(t.error)}}function h(e){e=e||{};f.call(this,e);var t;var n;this.stream=function(e){t=e;n=e;return this._nextChunk()};this._nextChunk=function(){if(this._finished)return;var e=this._config.chunkSize;var t=e?n.substr(0,e):n;n=e?n.substr(e):"";this._finished=!n;return this.parseChunk(t)}}function p(e){function c(){if(f&&u){b("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+Papa.DefaultDelimiter+"'");u=false}if(e.skipEmptyLines){for(var t=0;t<f.data.length;t++)if(f.data[t].length==1&&f.data[t][0]=="")f.data.splice(t--,1)}if(h())p();return v()}function h(){return e.header&&a.length==0}function p(){if(!f)return;for(var e=0;h()&&e<f.data.length;e++)for(var t=0;t<f.data[e].length;t++)a.push(f.data[e][t]);f.data.splice(0,1)}function v(){if(!f||!e.header&&!e.dynamicTyping)return f;for(var t=0;t<f.data.length;t++){var n={};for(var r=0;r<f.data[t].length;r++){if(e.dynamicTyping){var i=f.data[t][r];if(i=="true")f.data[t][r]=true;else if(i=="false")f.data[t][r]=false;else f.data[t][r]=y(i)}if(e.header){if(r>=a.length){if(!n["__parsed_extra"])n["__parsed_extra"]=[];n["__parsed_extra"].push(f.data[t][r])}else n[a[r]]=f.data[t][r]}}if(e.header){f.data[t]=n;if(r>a.length)b("FieldMismatch","TooManyFields","Too many fields: expected "+a.length+" fields but parsed "+r,t);else if(r<a.length)b("FieldMismatch","TooFewFields","Too few fields: expected "+a.length+" fields but parsed "+r,t)}}if(e.header&&f.meta)f.meta.fields=a;return f}function m(t){var n=[","," ","|",";",Papa.RECORD_SEP,Papa.UNIT_SEP];var r,i,s;for(var o=0;o<n.length;o++){var u=n[o];var a=0,f=0;s=undefined;var l=(new d({delimiter:u,preview:10})).parse(t);for(var c=0;c<l.data.length;c++){var h=l.data[c].length;f+=h;if(typeof s==="undefined"){s=h;continue}else if(h>1){a+=Math.abs(h-s);s=h}}f/=l.data.length;if((typeof i==="undefined"||a<i)&&f>1.99){i=a;r=u}}e.delimiter=r;return{successful:!!r,bestDelimiter:r}}function g(e){e=e.substr(0,1024*1024);var t=e.split("\r");if(t.length==1)return"\n";var n=0;for(var r=0;r<t.length;r++){if(t[r][0]=="\n")n++}return n>=t.length/2?"\r\n":"\r"}function y(e){var n=t.test(e);return n?parseFloat(e):e}function b(e,t,n,r){f.errors.push({type:e,code:t,message:n,row:r})}var t=/^\s*-?(\d*\.?\d+|\d+\.?\d*)(e[-+]?\d+)?\s*$/i;var n=this;var r=0;var i;var s;var o=false;var u;var a=[];var f={data:[],errors:[],meta:{}};if(x(e.step)){var l=e.step;e.step=function(t){f=t;if(h())c();else{c();if(f.data.length==0)return;r+=t.data.length;if(e.preview&&r>e.preview)s.abort();else l(f,n)}}}this.parse=function(t,n,r){if(!e.newline)e.newline=g(t);u=false;if(!e.delimiter){var a=m(t);if(a.successful)e.delimiter=a.bestDelimiter;else{u=true;e.delimiter=Papa.DefaultDelimiter}f.meta.delimiter=e.delimiter}var l=E(e);if(e.preview&&e.header)l.preview++;i=t;s=new d(l);f=s.parse(i,n,r);c();return o?{meta:{paused:true}}:f||{meta:{paused:false}}};this.paused=function(){return o};this.pause=function(){o=true;s.abort();i=i.substr(s.getCharIndex())};this.resume=function(){o=false;n.streamer.parseChunk(i)};this.abort=function(){s.abort();if(x(e.complete))e.complete(f);i=""}}function d(e){e=e||{};var t=e.delimiter;var n=e.newline;var r=e.comments;var i=e.step;var s=e.preview;var o=e.fastMode;if(typeof t!=="string"||t.length!=1||Papa.BAD_DELIMITERS.indexOf(t)>-1)t=",";if(r===t)throw"Comment character same as delimiter";else if(r===true)r="#";else if(typeof r!=="string"||Papa.BAD_DELIMITERS.indexOf(r)>-1)r=false;if(n!="\n"&&n!="\r"&&n!="\r\n")n="\n";var u=0;var a=false;this.parse=function(e,f,l){function C(e){m.push(e);b=u}function k(t){if(l)return A();if(!t)t=e.substr(u);y.push(t);u=c;C(y);if(v)O();return A()}function L(t){u=t;C(y);y=[];x=e.indexOf(n,u)}function A(e){return{data:m,errors:g,meta:{delimiter:t,linebreak:n,aborted:a,truncated:!!e,cursor:b+(f||0)}}}function O(){i(A());m=[],g=[]}if(typeof e!=="string")throw"Input must be a string";var c=e.length,h=t.length,p=n.length,d=r.length;var v=typeof i==="function";u=0;var m=[],g=[],y=[],b=0;if(!e)return A();if(o||o!==false&&e.indexOf('"')===-1){var w=e.split(n);for(var E=0;E<w.length;E++){var y=w[E];u+=y.length;if(E!==w.length-1)u+=n.length;else if(l)return A();if(r&&y.substr(0,d)==r)continue;if(v){m=[];C(y.split(t));O();if(a)return A()}else C(y.split(t));if(s&&E>=s){m=m.slice(0,s);return A(true)}}return A()}var S=e.indexOf(t,u);var x=e.indexOf(n,u);for(;;){if(e[u]=='"'){var T=u;u++;for(;;){var T=e.indexOf('"',T+1);if(T===-1){if(!l){g.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:m.length,index:u})}return k()}if(T===c-1){var N=e.substring(u,T).replace(/""/g,'"');return k(N)}if(e[T+1]=='"'){T++;continue}if(e[T+1]==t){y.push(e.substring(u,T).replace(/""/g,'"'));u=T+1+h;S=e.indexOf(t,u);x=e.indexOf(n,u);break}if(e.substr(T+1,p)===n){y.push(e.substring(u,T).replace(/""/g,'"'));L(T+1+p);S=e.indexOf(t,u);if(v){O();if(a)return A()}if(s&&m.length>=s)return A(true);break}}continue}if(r&&y.length===0&&e.substr(u,d)===r){if(x==-1)return A();u=x+p;x=e.indexOf(n,u);S=e.indexOf(t,u);continue}if(S!==-1&&(S<x||x===-1)){y.push(e.substring(u,S));u=S+h;S=e.indexOf(t,u);continue}if(x!==-1){y.push(e.substring(u,x));L(x+p);if(v){O();if(a)return A()}if(s&&m.length>=s)return A(true);continue}break}return k()};this.abort=function(){a=true};this.getCharIndex=function(){return u}}function v(){var e=document.getElementsByTagName("script");return e.length?e[e.length-1].src:""}function m(){if(!Papa.WORKERS_SUPPORTED)return false;if(!n&&Papa.SCRIPT_PATH===null)throw new Error("Script path cannot be determined automatically when Papa Parse is loaded asynchronously. "+"You need to set Papa.SCRIPT_PATH manually.");var t=new e.Worker(Papa.SCRIPT_PATH||r);t.onmessage=g;t.id=s++;i[t.id]=t;return t}function g(e){var t=e.data;var n=i[t.workerId];var r=false;if(t.error)n.userError(t.error,t.file);else if(t.results&&t.results.data){var s=function(){r=true;y(t.workerId,{data:[],errors:[],meta:{aborted:true}})};var o={abort:s,pause:b,resume:b};if(x(n.userStep)){for(var u=0;u<t.results.data.length;u++){n.userStep({data:[t.results.data[u]],errors:t.results.errors,meta:t.results.meta},o);if(r)break}delete t.results}else if(x(n.userChunk)){n.userChunk(t.results,o,t.file);delete t.results}}if(t.finished&&!r)y(t.workerId,t.results)}function y(e,t){var n=i[e];if(x(n.userComplete))n.userComplete(t);n.terminate();delete i[e]}function b(){throw"Not implemented."}function w(t){var n=t.data;if(typeof Papa.WORKER_ID==="undefined"&&n)Papa.WORKER_ID=n.workerId;if(typeof n.input==="string"){e.postMessage({workerId:Papa.WORKER_ID,results:Papa.parse(n.input,n.config),finished:true})}else if(e.File&&n.input instanceof File||n.input instanceof Object){var r=Papa.parse(n.input,n.config);if(r)e.postMessage({workerId:Papa.WORKER_ID,results:r,finished:true})}}function E(e){if(typeof e!=="object")return e;var t=e instanceof Array?[]:{};for(var n in e)t[n]=E(e[n]);return t}function S(e,t){return function(){e.apply(t,arguments)}}function x(e){return typeof e==="function"}var t=!e.document,n=false,r;var i={},s=0;e.Papa={};e.Papa.parse=u;e.Papa.unparse=a;e.Papa.RECORD_SEP=String.fromCharCode(30);e.Papa.UNIT_SEP=String.fromCharCode(31);e.Papa.BYTE_ORDER_MARK="";e.Papa.BAD_DELIMITERS=["\r","\n",'"',e.Papa.BYTE_ORDER_MARK];e.Papa.WORKERS_SUPPORTED=!!e.Worker;e.Papa.SCRIPT_PATH=null;e.Papa.LocalChunkSize=1024*1024*10;e.Papa.RemoteChunkSize=1024*1024*5;e.Papa.DefaultDelimiter=",";e.Papa.Parser=d;e.Papa.ParserHandle=p;e.Papa.NetworkStreamer=l;e.Papa.FileStreamer=c;e.Papa.StringStreamer=h;if(e.jQuery){var o=e.jQuery;o.fn.parse=function(t){function i(){if(r.length==0){if(x(t.complete))t.complete();return}var e=r[0];if(x(t.before)){var n=t.before(e.file,e.inputElem);if(typeof n==="object"){if(n.action=="abort"){s("AbortError",e.file,e.inputElem,n.reason);return}else if(n.action=="skip"){u();return}else if(typeof n.config==="object")e.instanceConfig=o.extend(e.instanceConfig,n.config)}else if(n=="skip"){u();return}}var i=e.instanceConfig.complete;e.instanceConfig.complete=function(t){if(x(i))i(t,e.file,e.inputElem);u()};Papa.parse(e.file,e.instanceConfig)}function s(e,n,r,i){if(x(t.error))t.error({name:e},n,r,i)}function u(){r.splice(0,1);i()}var n=t.config||{};var r=[];this.each(function(t){var i=o(this).prop("tagName").toUpperCase()=="INPUT"&&o(this).attr("type").toLowerCase()=="file"&&e.FileReader;if(!i||!this.files||this.files.length==0)return true;for(var s=0;s<this.files.length;s++){r.push({file:this.files[s],inputElem:this,instanceConfig:o.extend({},n)})}});i();return this}}if(t){e.onmessage=w}else if(Papa.WORKERS_SUPPORTED){r=v();if(!document.body){n=true}else{document.addEventListener("DOMContentLoaded",function(){n=true},true)}}l.prototype=Object.create(f.prototype);l.prototype.constructor=l;c.prototype=Object.create(f.prototype);c.prototype.constructor=c;h.prototype=Object.create(h.prototype);h.prototype.constructor=h})(this);
0 Copyright © 2011-2012 Joshua Gatcke http://www.99lime.com | HTML KickStart
1
2 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3
4 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
5
6 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0 Copyright © 2011-2012 Joshua Gatcke http://www.99lime.com | HTML KickStart
1
2 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
3
4 The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
5
6 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0 Copyright (c) 2014-2015, University of Maryland
1 All rights reserved.
2
3 Redistribution and use in source and binary forms, with or without modification,
4 are permitted provided that the following conditions are met:
5
6 Redistributions of source code must retain the above copyright notice, this
7 list of conditions and the following disclaimer.
8
9 Redistributions in binary form must reproduce the above copyright notice, this
10 list of conditions and the following disclaimer in the documentation and/or
11 other materials provided with the distribution.
12
13 Neither the name of the University of Maryland nor the names of its
14 contributors may be used to endorse or promote products derived from
15 this software without specific prior written permission.
16
17 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
21 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24 ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
0 <!--
1 _ _____ _ _
2 (_)___ /_ _(_)___(_) ___ ___ ___ _ __ ___
3 | | |_ \ \ / / / __| |/ _ \ / __/ _ \| '_ ` _ \
4 | |___) \ V /| \__ \ | (_) | _ | (_| (_) | | | | | |
5 |_|____/ \_/ |_|___/_|\___/ (_) \___\___/|_| |_| |_|
6
7 Copyright (C) F. Brezo and Y. Rubio (i3visio) 2017
8
9 -->
0
1 <center>
2 <small>
3 <div>
4 <img src="/img/osrframework-tiny.png" height="32px;" width="24px;"></i> OSRFramework Server |
5 This program is licensed as <a href="https://www.gnu.org/licenses/agpl-3.0-standalone.html" target"_blank" rel="noopener noreferrer">GNU AGPLv3+</a>
6 </div>
7
8 <div class="project">
9 Copyright (C) <a href="https://i3visio.com">i3visio</a>, 2017:
10 <i class="fa fa-code-fork"></i> <a href="https://github.com/i3visio/web-surfer-assistant" target"_blank" rel="noopener noreferrer"Code</a> &middot;
11 <i class="fa fa-support"></i> <a href="https://github.com/i3visio/osrframework/issues" target"_blank" rel="noopener noreferrer">Issues and bugs</a>
12 </div>
13 </small>
14 </center>
0 <!-- Keshif Scripts -->
1 <!--<script type="text/javascript" src="https://www.google.com/jsapi"></script>-->
2 <script type="text/javascript" src="/js/jsapi.js"></script>
3 <script type="text/javascript" src="/js/jquery.min.js"></script>
4 <script type="text/javascript" src="/js/d3.3.5.5.min.js" charset="utf-8"></script>
5 <script type="text/javascript" src="/js/keshif.js" charset="utf-8"></script>
6 <script type="text/javascript" src="/js/papaparse.min.js" charset="utf-8"></script>
7 <script type="text/javascript" src="/js/demo.js" charset="utf-8"></script>
8 <!-- Keshif CSS -->
9 <link rel="stylesheet" href="/css/keshif.css" type="text/css">
10 <link rel="stylesheet" href="/css/font-awesome.min.css">
11 <link rel="stylesheet" href="/css/keshif-style.css" type="text/css">
12
13
14 <!-- The main javascript starts here -->
15 <!-- TODO:
16 - Save this javascript onto a different .js file
17 - Create a ./lib/lang.js to store the values of the interface in different languages
18 -->
19 <script type="text/javascript">
20 // Events when charging
21 $(document).ready( function(){
22 // Help in: <http://stackoverflow.com/questions/13261970/how-to-get-the-absolute-path-of-the-current-javascript-file-name>
23 // Grabbing the attributes
24 var attributes = document.location.search;
25 // Splitting the attributes using the '?' as a marker
26 var splittedAttributes = attributes.split("&");
27 // Initializing values
28 var lang = "en";
29 var folder = null;
30 var sheet = null;
31 var extension = null;
32
33 // Grabbing the new attributes
34 if (splittedAttributes.length > 1) {
35 // Iterating to grab the configuration
36 for (i = 1; i < splittedAttributes.length; i++) {
37 // splitting the attribute sin a pair type, value
38 var list = splittedAttributes[i].split("=");
39
40 var type = list[0];
41 var value = list[1];
42
43 if (type == "lang") {
44 lang=value;
45 } else if (type == "folder"){
46 folder=value;
47 } else if (type == "sheet"){
48 sheet=value;
49 } else if (type == "extension"){
50 extension=value;
51 }
52 }
53 }
54
55 // Storing the language
56 if(lang==="es"){
57 // Loading Keshif interface texts
58 kshf.lang.cur = kshf.lang.es;
59 // TODO: Loading Explorify interface texts
60 //explorify.lang.cur = explorify.lang.es;
61 } else if(lang==="fr"){
62 // Loading Keshif interface texts
63 kshf.lang.cur = kshf.lang.fr;
64 // TODO: Loading Explorify interface texts
65 //explorify.lang.cur = explorify.lang.fr;
66 } else {
67 // Loading Keshif interface texts
68 kshf.lang.cur = kshf.lang.en;
69 // TODO: Loading Explorify interface texts
70 //explorify.lang.cur = explorify.lang.en;
71 }
72
73 // Requesting a new path to the csv file if any of the files is missing
74 if (folder==null || sheet==null || extension==null ) {
75 // TODO: make a call to grab a new file because something was missing
76
77 }
78 // Loading this in the welcome tab
79 browser = new kshf.Browser({
80 domID: "#chart_div",
81 /*
82 *********************************************************
83 Defining general attributes for the browser
84 *********************************************************
85 */
86 leftPanelLabelWidth: 80,
87 rightPanelLabelWidth: 80,
88 itemName: " registers loaded",
89 /*
90 *********************************************************
91 Grabbing the sources
92 *********************************************************
93 */
94 source: {
95 //url: "http://localhost:30230/",
96 dirPath: "/get_temporal_data/", //folder, //"../",
97 fileType: "csv", // extension, //"csv",
98 sheets: "profiles", //sheet//,"profiles",
99 },
100 /*
101 *********************************************************
102 Defining the summaries here
103 *********************************************************
104 */
105 summaries: [
106 // Panel izquierdo
107 {
108 title: "Platform",
109 layout: 'left',
110 value: function(){
111 return kshf.dt_id.profiles[this.id].data.i3visio_platform;
112 },
113 },
114 {
115 title: "Language",
116 layout: 'left',
117 value: function(){
118 return kshf.dt_id.profiles[this.id].data._language
119 },
120 },
121 {
122 title: "# of Publications",
123 layout: 'left',
124 value: function(){
125 return kshf.dt_id.profiles[this.id].data._publications_count;
126 },
127 },
128 {
129 title: "# of Friends",
130 layout: 'left',
131 value: function(){
132 return kshf.dt_id.profiles[this.id].data._friends_count;
133 },
134 },
135 {
136 title: "# of Followers",
137 layout: 'left',
138 value: function(){
139 return kshf.dt_id.profiles[this.id].data._followers_count;
140 },
141 },
142 {
143 title: "# of Favorites",
144 layout: 'left',
145 collapsed: true,
146 value: function(){
147 return kshf.dt_id.profiles[this.id].data._favourites_count;
148 },
149 },
150 {
151 title: "# of Times Listed",
152 layout: 'left',
153 collapsed: true,
154 value: function(){
155 return kshf.dt_id.profiles[this.id].data._listed_count;
156 },
157 },
158 {
159 title: "Private Profiles",
160 layout: 'left',
161 value: function(){
162 return kshf.dt_id.profiles[this.id].data._protected;
163 },
164 },
165 {
166 title: "Verified Profiles",
167 layout: 'left',
168 collapsed: true,
169 value: function(){
170 return kshf.dt_id.profiles[this.id].data._verified;
171 },
172 },
173 {
174 title: "Geolocation Active",
175 layout: 'left',
176 collapsed: true,
177 value: function(){
178 return kshf.dt_id.profiles[this.id].data._geoenabled;
179 },
180 },
181 // Panel derecho
182 {
183 title: "Country",
184 layout: 'right',
185 value: function(){
186 return kshf.dt_id.profiles[this.id].data["i3visio_location.country"]
187 },
188 },
189 {
190 title: "Region",
191 layout: 'right',
192 value: function(){
193 return kshf.dt_id.profiles[this.id].data["i3visio_location.province"]
194 },
195 },
196 {
197 title: "City",
198 layout: 'right',
199 value: function(){
200 return kshf.dt_id.profiles[this.id].data["i3visio_location.city"]
201 },
202 },
203 {
204 title: "Time Zone",
205 layout: 'right',
206 collapsed: true,
207 value: function(){
208 return kshf.dt_id.profiles[this.id].data._time_zone
209 },
210 },
211 {
212 title: "Registrar",
213 layout: 'right',
214 collapsed: true,
215 value: function(){
216 return kshf.dt_id.profiles[this.id].data.i3visio_registrar
217 },
218 },
219 {
220 title: "TLD Type",
221 layout: 'right',
222 collapsed: true,
223 value: function(){
224 return kshf.dt_id.profiles[this.id].data.i3visio_tld_type
225 },
226 },
227 {
228 title: "IPv4",
229 layout: 'right',
230 collapsed: true,
231 value: function(){
232 return kshf.dt_id.profiles[this.id].data.i3visio_ipv4
233 },
234 },
235 ],
236 /*
237 *********************************************************
238 Defining the central tab
239 *********************************************************
240 */
241 itemDisplay: {
242 // The organization of the central display. Commented it will be a list
243 displayType: 'grid',
244 // Sorting the display by the selected column
245 sortingOpts: [
246 {
247 title: "_friends_count",
248 inverse: false
249 },
250 {
251 title: "_followers_count",
252 inverse: false
253 },
254 {
255 title: "_publications_count",
256 inverse: false
257 },
258 {
259 title: "_favourites_count",
260 inverse: false
261 },
262 {
263 title: "_listed_count",
264 inverse: false
265 },
266 ],
267 // Configuring the search
268 textSearch: {
269 // Message to be shown in the display
270 title: "<write here the username to look by it>",
271 value: function () {
272 var user = kshf.dt_id.profiles[this.id];
273 if (user.data.i3visio_alias == "[N/A]") {
274 return user.data.i3visio_fullname;
275 }
276 return user.data.i3visio_alias;
277 }
278 },
279
280 recordView: function(){
281 // Grabbing each user
282 var record = kshf.dt_id.profiles[this.id];
283
284 // Printing the results
285 var visibleHTML = "";
286 if (record.data.i3visio_platform != "[N/A]" && record.data.i3visio_alias != "[N/A]") {
287 // This is a user
288 visibleHTML = "<span class='thumbnail'><img class='thumbImg'></a></span>";
289 visibleHTML += "<span class='regTitle'>" + record.data.i3visio_alias + "</span></br>";
290 visibleHTML += "<span class='regSubtitle'> " + record.data.i3visio_platform + "</span></br>";
291 visibleHTML += "<center>";
292 visibleHTML += '<span class="tooltip-right" title="View profile in '+ record.data.i3visio_platform + '."><a class="button green small" target="_blank" rel="noopener noreferrer" href="' + record.data.i3visio_uri + '"><i class="fa fa-eye"></i></a></span>';
293 visibleHTML += '<span class="tooltip-right" title="Launch usufy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/usufy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-user"></i></a></span>';
294 visibleHTML += '<span class="tooltip-right" title="Launch mailfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/mailfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-envelope"></i></a></span>';
295 visibleHTML += '<span class="tooltip-right" title="Launch domainfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/domainfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-globe"></i></a></span>';
296 visibleHTML += '<span class="tooltip-right" title="Launch searchfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/searchfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-search"></i></a></span>';
297 visibleHTML += '<span class="tooltip-right" title="Phonefy cannot be launched."><a class="button small"><i class="fa fa-phone"></i></a></span>';
298 visibleHTML += "</center>";
299 }
300
301 else if (record.data.i3visio_tld_type != "[N/A]" && record.data.i3visio_ipv4 != "[N/A]") {
302 // This is a domain!
303 visibleHTML = "<span class='thumbnail'><img class='thumbImg'></a></span>";
304 visibleHTML += "<span class='regTitle'>"+record.data.i3visio_domain+"</span></br>";
305 visibleHTML += "<span class='regSubtitle'> "+record.data.i3visio_registrar+"</span></br>";
306 visibleHTML += "<center>";
307 visibleHTML += '<span class="tooltip-right" title="Open '+ record.data.i3visio_domain +'."><a class="button green small" target="_blank" rel="noopener noreferrer" href="'+record.data.i3visio_domain+'"><i class="fa fa-eye"></i></a></span>';
308 visibleHTML += '<span class="tooltip-right" title="Launch usufy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/usufy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-user"></i></a></span>';
309 visibleHTML += '<span class="tooltip-right" title="Launch mailfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/mailfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-envelope"></i></a></span>';
310 visibleHTML += '<span class="tooltip-right" title="Launch domainfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/domainfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-globe"></i></a></span>';
311 visibleHTML += '<span class="tooltip-right" title="Launch searchfy for ' + record.data.i3visio_email + '."><a class="button blue small" href="/research/searchfy?query_text=' + record.data.i3visio_email + '#tab-ui"><i class="fa fa-search"></i></a></span>';
312 visibleHTML += '<span class="tooltip-right" title="Phonefy cannot be launched."><a class="button small"><i class="fa fa-phone"></i></a></span>';
313 visibleHTML += "</center>";
314 }
315 else if (record.data.i3visio_domain != "[N/A]") {
316 // This is a mail!
317 visibleHTML = "<span class='thumbnail'><img class='thumbImg'></a></span>";
318 visibleHTML += "<span class='regTitle'>"+record.data.i3visio_email+"</span></br>";
319 visibleHTML += "<span class='regSubtitle'> "+record.data.i3visio_alias+"</span></br>";
320 visibleHTML += "</center>";
321 visibleHTML += '<span class="tooltip-right" title="Send an email '+ record.data.i3visio_domain +'."><a class="button green small" target="_blank" rel="noopener noreferrer" href="mailto://'+record.data.i3visio_mail+'"><i class="fa fa-envelope"></i></a></span>';
322 visibleHTML += '<span class="tooltip-right" title="Launch usufy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/usufy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-user"></i></a></span>';
323 visibleHTML += '<span class="tooltip-right" title="Launch mailfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/mailfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-envelope"></i></a></span>';
324 visibleHTML += '<span class="tooltip-right" title="Launch domainfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/domainfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-globe"></i></a></span>';
325 visibleHTML += '<span class="tooltip-right" title="Launch searchfy for ' + record.data.i3visio_email + '."><a class="button blue small" href="/research/searchfy?query_text=' + record.data.i3visio_email + '#tab-ui"><i class="fa fa-search"></i></a></span>';
326 visibleHTML += '<span class="tooltip-right" title="Phonefy cannot be launched."><a class="button small"><i class="fa fa-phone"></i></a></span>';
327 visibleHTML += "</center>";
328 }
329 else if (record.data.i3visio_fullname != "[N/A]") {
330 // This is a phone!
331 visibleHTML = "<span class='thumbnail'><img class='thumbImg'></a></span>";
332 visibleHTML += "<span class='regTitle'>"+record.data.i3visio_phone+"</span></br>";
333 visibleHTML += "<span class='regSubtitle'> "+record.data.i3visio_fullname+"</span></br>";
334 visibleHTML += "</center>";
335 visibleHTML += '<span class="tooltip-right" title="View profile in '+ record.data.i3visio_uri +'."><a class="button green small" target="_blank" rel="noopener noreferrer" href="mailto://'+record.data.i3visio_mail+'"><i class="fa fa-envelope"></i></a></span>';
336 visibleHTML += '<span class="tooltip-right" title="Usufy cannot be launched."><a class="button small"><i class="fa fa-user"></i></a></span>';
337 visibleHTML += '<span class="tooltip-right" title="Mailfy cannot be launched."><a class="button small"><i class="fa fa-envelope"></i></a></span>';
338 visibleHTML += '<span class="tooltip-right" title="Domainfy cannot be launched."><a class="button small"><i class="fa fa-globe"></i></a></span>';
339 visibleHTML += '<span class="tooltip-right" title="Launch searchfy for ' + record.data.i3visio_phone + '."><a class="button blue small" href="/research/searchfy?query_text=' + record.data.i3visio_email + '#tab-ui"><i class="fa fa-search"></i></a></span>';
340 visibleHTML += '<span class="tooltip-right" title="Phonefy cannot be launched."><a class="button small"><i class="fa fa-phone"></i></a></span>';
341 visibleHTML += "</center>";
342 }
343 else {
344 // Any other case...
345 visibleHTML = "<span class='thumbnail'><img class='thumbImg'></a></span>";
346 visibleHTML += "<span class='regTitle'>"+record.data.i3visio_alias+"</span></br>";
347 visibleHTML += "<span class='regSubtitle'> "+record.data.i3visio_platform+"</span></br>";
348 visibleHTML += "</center>";
349 visibleHTML += '<span class="tooltip-right" title="View profile in '+ record.data.i3visio_platform + '."><a class="button green small" target="_blank" rel="noopener noreferrer" href="' + record.data.i3visio_uri + '"><i class="fa fa-eye"></i></a></span>';
350 visibleHTML += '<span class="tooltip-right" title="Launch usufy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/usufy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-user"></i></a></span>';
351 visibleHTML += '<span class="tooltip-right" title="Launch mailfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/mailfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-envelope"></i></a></span>';
352 visibleHTML += '<span class="tooltip-right" title="Launch domainfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/domainfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-globe"></i></a></span>';
353 visibleHTML += '<span class="tooltip-right" title="Launch searchfy for ' + record.data.i3visio_alias + '."><a class="button blue small" href="/research/searchfy?query_text=' + record.data.i3visio_alias + '#tab-ui"><i class="fa fa-search"></i></a></span>';
354 visibleHTML += '<span class="tooltip-right" title="Phonefy cannot be launched."><a class="button small"><i class="fa fa-phone"></i></a></span>';
355 visibleHTML += "</center>";
356
357 }
358
359 return visibleHTML;
360 },
361 /*
362 *********************************************************
363 Grabbing the profile url
364 *********************************************************
365 */
366 visibleCb: function(d){
367 var record = kshf.dt_id.profiles[this.id];
368 // Grabbing the URL stored in one of the columns
369 var imgUrl = record.data.i3visio_uri_image_profile;
370
371 // Confirming the image url
372 if (imgUrl == null || imgUrl == "[N/A]") {
373 // If it does not exist, we will set it a default one
374 if (record.data.i3visio_platform != "[N/A]" && record.data.i3visio_alias != "[N/A]") {
375 // This is a user
376 imgUrl = "/img/user.png";
377 }
378 else if (record.data.i3visio_tld_type != "[N/A]" && record.data.i3visio_alias != "[N/A]") {
379 // This is a mail!
380 imgUrl = "/img/globe.png";
381 }
382 else if (record.data.i3visio_domain != "[N/A]") {
383 // This is a domain!
384 imgUrl = "/img/mail.png";
385 }
386 else if (record.data.i3visio_fullname != "[N/A]") {
387 // This is a domain!
388 imgUrl = "/img/phone.png";
389 }
390 else {
391 imgUrl = "/img/other.png";
392 }
393 }
394
395 // Showing the image
396 d3.select(d.DOM.record).select("img").attr("src",imgUrl);
397 d3.select(d.DOM.record).select("img").attr("width","64");
398 d3.select(d.DOM.record).select("img").attr("height","128");
399 },
400 },
401 });
402 });
403 </script>
0 <ul class="tabs">
1 <li><a href="#tab-terminal"> <i class="fa fa-terminal black"></i> Terminal emulation</a></li>
2 <li><a href="#tab-ui"> <i class="fa fa-desktop"></i> Windowed configuration</a></li>
3 </ul>
0 <ul class="menu vertical">
1 <li {{ mr_main }}><a href="/research"> Research Menu</a></li>
2 <li {{ mr_usufy }}><a href="/research/usufy"><i class="fa fa-user"></i> <code>usufy.py</code></a></li>
3 <li {{ mr_domainfy }}><a href="/research/domainfy"><i class="fa fa-globe"></i> <code>domainfy.py</code></a></li>
4 <li {{ mr_mailfy }}><a href="/research/mailfy"><i class="fa fa-envelope"></i> <code>mailfy.py</code></a></li>
5 <li {{ mr_phonefy }}><a href="/research/phonefy"><i class="fa fa-phone"></i> <code>phonefy.py</code></a></li>
6 <li {{ mr_searchfy }}><a href="/research/searchfy"><i class="fa fa-group"></i> <code>searchfy.py</code></a></li>
7 </ul>
0 <ul class="menu center">
1 <li {{ mt_home }}><a href="/"><i class="fa fa-home"></i> Home</a></li>
2 <li {{ mt_research }}><a href="/research"><i class="fa fa-search"></i> Research</a></li>
3 <li {{ mt_explore }}><a href="/explore"><i class="fa fa-bar-chart"></i> Explore</a></li>
4 <li><a href=""><i class="fa fa-book"></i> Help</a>
5 <ul>
6 <li {{ mt_tutorials }}><a target="_blank" rel="noopener noreferer" href="https://github.com/i3visio/osrframework/tree/master/doc"><i class="fa fa-mortar-board"></i> Tutorials</a></li>
7 <li {{ mt_faq }}><a target="_blank" rel="noopener noreferer" "href="https://github.com/i3visio/osrframework/issues"><i class="fa fa-question-circle"></i> FAQ</a></li>
8 </ul>
9 <li><a href=""><i class="fa fa-beer"></i> Contact</a>
10 <ul>
11 <li><a href="https://i3visio.com" target="_blank" rel="noopener noreferrer"><i class="fa fa-globe"></i> Web</a></li>
12 <li><a href="https://twitter.com/i3visio" target="_blank" rel="noopener noreferrer"><i class="fa fa-twitter"></i> Twitter</a></li>
13 <li><a href="https://github.com/i3visio" target="_blank" rel="noopener noreferrer"><i class="fa fa-github"></i> Github</a></li>
14 <li><a href="https://i3visio.com" target="_blank" rel="noopener noreferrer"><i class="fa fa-comments-o"></i> Blog</a></li>
15 <li><a href="mailto:[email protected]"><i class="fa fa-envelope"></i> Email</a></li>
16 <li class="divider"><a href="https://www.gnu.org/licenses/agpl-3.0-standalone.html" target="_blank" rel="noopener noreferrer"><i class="fa fa-code-fork"></i> License</a></li>
17 </ul>
18 </li>
19 <!--<li {{ tm_shutdown }}><a href="/shutdown"><i class="fa fa-sign-out"></i> Exit</a></li>-->
20 </ul>
0 <fieldset>
1 <legend>Export options</legend>
2 <p>These parameters are optional. If none is selected, the default options will be chosen.</p>
3 <!-- Checkbox -->
4 <input type="checkbox" id="export_csv" name="export_csv"/><label for="export_csv" class="inline"> csv</label> <br>
5 <input type="checkbox" id="export_xls" name="export_xls"/><label for="export_xls" class="inline"> xls</label> <br>
6 <input type="checkbox" id="export_xlsx" name="export_xlsx"/><label for="export_xlsx" class="inline"> xlsx</label> <br>
7 <input type="checkbox" id="export_ods" name="export_ods"/><label for="export_ods" class="inline"> ods</label> <br>
8 <input type="checkbox" id="export_json" name="export_json"/><label for="export_json" class="inline"> json</label> <br>
9 <input type="checkbox" id="export_gml" name="export_gml"/><label for="export_gml" class="inline"> gml</label> <br>
10 </fieldset>
0 <fieldset>
1 <legend>Other options</legend>
2 <p>These parameters are optional. If none is selected, the default options will be chosen.</p>
3 <!-- Checkbox -->
4 <input type="checkbox" id="open_url" name="open_url" selected="selected"/><label for="open_url" class="inline"> Open in the web browser</label> <br>
5 <label for="tex_filename" class="inline" placeholder="profiles"> Case file name: </label> <input type="text" id="tex_filename" name="tex_filename" style="width: 100%;" value="profiles"/> <br>
6 </fieldset>
0 <fieldset>
1 <legend>Platforms</legend>
2 <!-- Select -->
3 <label for="select_platforms">Select platforms. You can choose more than one using Ctrl key.</label><br>
4 <select id="select_platforms" name="select_platforms" multiple="multiple" class="fancy" style="height: 500px;">
5 {% for plat in plat_options %}
6 <option value="{{ plat }}"{% if plat=="all" %} selected="selected"{% endif %}>{{ plat }}</option>
7 {% endfor %}
8 </select>
9 </fieldset>
0
1 {% if text_results is defined %}
2 <div class="col_12">
3 <!-- Success -->
4 <div class="notice success"><i class="fa fa-check"></i> The command launched is: <code>{{ command }}</code></div>
5 <fieldset>
6 <div>
7 <center>
8 <a class="button blue" href="/explore"><i class="fa fa-bar-chart"></i> Explore these results now!</a>
9 </center>
10 </div>
11 <legend><i class="fa fa-table"></i> Results collected</legend>
12 <pre id="terminal-results">{{ text_results }}</pre>
13 </fieldset>
14 </div>
15 {% endif %}
0 <meta name="description" content="Explorify, the cyberidentities exporer developed by i3visio.">
1 <meta name="author" content="F. Brezo and Y. Rubio (i3visio) 2015-2017">
2
3 <title>Explorify - A GUI for i3visio's OSRFramework</title>
4 <meta charset="utf-8">
5 <meta http-equiv="X-UA-Compatible" content="IE=edge">
6
7 <!-- Kickstart Scripts -->
8 <script type="text/javascript" src="/js/jquery.min.js"></script>
9 <script type="text/javascript" src="/js/kickstart.js"></script>
10 <!-- Kickstart CSS -->
11 <link rel="stylesheet" type="text/css" href="/css/kickstart.css" media="all" />
12 <link rel="stylesheet" type="text/css" href="/css/kickstart-style.css" media="all" />
13
14 <link rel="shortcut icon" href="/favicon.ico" />
15
16 <!-- OSRFramework Scripts -->
17
18 <!-- OSRFramework CSS -->
19 <link rel="stylesheet" type="text/css" href="/css/explorify.css" media="all" />
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> Ooops! Something happened! </a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <!-- Menu Vertical Left -->
21 <div class="col_6">
22 <center>
23 <img src="/img/thanks.gif" />
24 </center>
25 </div>
26
27 <div class="col_6">
28 <h5><i class="fa fa-close icon-large"></i> HTTP Status Code: {{ errorCode }} </h5>
29 <p>{{ errorDescription }}</p>
30 <p>Please, check the parameters provided.</p>
31 <p>If the error persists, post an issue on the <a href="https://github.com/i3visio/osrframework/issues">Github's repository</a> to keep track of it.</p>
32 </div>
33 </div>
34 </div>
35
36 {% include '_footer.html' %}
37
38 </body>
39 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_keshif-headers.html' %}
8 {% include '_shared-headers.html' %}
9
10 </head>
11
12 <body>
13
14 {% include '_menu-top.html' %}
15
16 <div id="body" class="grid clearfix">
17 <ul class="tabs">
18 <li><a href="#type-main"> Exploring data from your files</a></li>
19 </ul>
20
21 <div id="type-main" class="tab-content">
22 <h4>Explore the data </h4>
23
24 <div id="welcome">
25 In the following tabs you can choose different ways of exploring the data collected. But first, you will have to load it from your hard drive.
26 </div>
27 <!-- Loading instructions -->
28 <div class="col_12">
29 {% if alert is defined %}
30 <div class="col_12">
31 <!-- Success -->
32 <div class="notice {{ alert['type'] }}">
33 <i class="fa fa-{{ alert['icon'] }}"></i> {{ alert['message'] }}
34 </div>
35 </div>
36 {% endif %}
37
38 <form method=post enctype=multipart/form-data>
39 <input type=file name=file>
40 <input class="orange" type=submit value=Upload>
41 </form>
42
43 <ul class="tabs">
44 <li><a href="#tab-keshif"> <i class="fa fa-pie-chart black"></i> Explore it</a></li>
45 <li><a href="#tab-csv"> <i class="fa fa-file-text"></i> CSV</a></li>
46 <!--<li><a href="#tab-json"> <i class="fa fa-file-code-o"></i> Json</a></li>
47 <li><a href="#tab-gml"> <i class="fa fa-dot-circle-o"></i> GML</a></li>-->
48 </ul>
49
50 <div id="tab-keshif" class="tab-content">
51 <center>
52 <div class="contents">
53
54 {% if csvData is defined %}
55 <div id="chart_div" style="min-width: 100px; width: 100%;"</div>
56 {% else %}
57 <!-- Warning -->
58 <div class="notice warning"><i class="fa fa-warning icon-large"></i> No data has been loaded yet.</div>
59 {% endif %}
60 </div>
61 </center>
62 </div>
63 <div id="tab-csv" class="tab-content">
64 <pre>{% if csvData is defined %}{{ csvData }}{% else %}No data found.{% endif %}</pre>
65 </div>
66 <!--<div id="tab-json" class="tab-content">
67 <pre>{% if jsonData is defined %}{{ jsonData }}{% else %}No data found.{% endif %}</pre>
68 </div>
69 <div id="tab-gml" class="tab-content">
70 <pre>{% if gmlData is defined %}{{ gmlData }}{% else %}No data found.{% endif %}</pre>
71 </div>-->
72 </div>
73 </div>
74
75 {% include '_footer.html' %}
76
77 </body>
78 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> A GUI for i3visio's OSRFramework</a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <div class="col_6">
21 <h4><i class="fa fa-users"></i> Hi! This is... Explorify!</h4>
22
23 <!-- Brief introduction -->
24 <p>Explorify wouldn't be what it is without <b>OSRFramework</b>. As a <a href="https://www.gnu.org/licenses/agpl-3.0-standalone.html">GNU AGPLv3+</a> set of libraries, it has been by us (we use the shared name of <a href="https://i3visio.com">i3visio</a>) to perform Open Source Intelligence tasks that we (like maybe you) face everyday. They include references to a bunch of different applications related to username checking, DNS lookups, information leaks research, deep web search, regular expressions extraction and many others.</p>
25 <p>In OSRFramework you can use <code>usufy.py</code> to look for the existence of a given alias in different platforms, <code>domainfy.py</code> to check whether certain domains are registered or <code>mailfy.py</code> to check the existence of an email address. We know that privacy matters and you don't have to trust us: you can always check what the application does in the <a href="https://github.com/i3visio/osrframework">Github repo</a> because it is free software. Help is always welcome there but, in any case, you can always invite us for a beer <i class="fa fa-beer"></i>!</p>
26
27 <center>
28 <a class="button blue" href="/research"><i class="fa fa-search"></i> Start researching now!</a>
29 </center>
30
31 <h6>OSRFramework status</h6>
32
33 <!-- Success -->
34 <div class="notice {{ notice['type'] }}">
35 <i class="fa fa-{{ notice['icon'] }}"></i> {{ notice['message'] }}
36 </div>
37
38 </div>
39 <div class="col_6">
40 <center>
41 <img src="./img/osrframework-full.png" width="375px" height="450px">
42 </center>
43 </div>
44 </div>
45 </div>
46
47 {% include '_footer.html' %}
48
49 </body>
50 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> Researching using OSRFramework tools</a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <!-- Menu Vertical Left -->
21 <div class="col_3">
22 {% include '_menu-research.html' %}
23 </div>
24
25 <div class="col_9">
26 <h5><i class="fa fa-globe"></i> <b>Domainfy</b>: Looking for domains</h5>
27 <p>In the case of having an alias or a trademark and wanting to know if there exist any active registered domains, you can use <code>domainfy.py</code> to automatically grab that information.</p>
28
29 {% include '_menu-launcher.html' %}
30
31 <div id="tab-terminal" class="tab-content tabConfiguration">
32 <form action="/research/domainfy" method="post">
33 <fieldset>
34 <legend>Manual configuration</legend>
35 <label for="lab_command"><i class="fa fa-terminal black"></i> <code>domainfy.py</code></label>
36 <input id="tex_command" name="tex_command" type="text" size="40" placeholder="e. g.: -n i3visio" />
37
38 <span class="tooltip-bottom" title="Launch the app as if you were in a terminal. The app name is not needed.">
39 <button name="terminal-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
40 </span>
41 </fieldset>
42 </form>
43 </div>
44
45 <div id="tab-ui" class="tab-content tabConfiguration">
46 <form action="/research/domainfy" method="post">
47 <fieldset>
48 <legend>Selecting targets</legend>
49 <label for="lab_command"><i class="fa fa-search"></i> Targets: </label>
50 <input id="tex_query" name="tex_query" type="text" size="40" placeholder="e. g.: i3visio yrubiosec febrezo"{% if query_text is defined %} value='{{ query_text }}'{% endif %}/>
51 <span class="tooltip-bottom" title="Launch the app">
52 <button name="windowed-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
53 </span>
54 </fieldset>
55 <fieldset>
56 <legend>Other options</legend>
57 <div class="col_6">
58 {% include '_options-platforms.html' %}
59 </div>
60 <div class="col_6">
61 {% include '_options-export.html' %}
62 {% include '_options-other.html' %}
63 </div>
64 </fieldset>
65 </form>
66 </div>
67 </div>
68
69 {% include '_research-terminal.html' %}
70
71 </div>
72 </div>
73
74 {% include '_footer.html' %}
75
76 </body>
77 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> Researching using OSRFramework tools</a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <!-- Menu Vertical Left -->
21 <div class="col_3">
22 {% include '_menu-research.html' %}
23 </div>
24
25 <div class="col_9">
26 <h5><i class="fa fa-envelope icon-large"></i> <b>Mailfy</b>: Looking for email addresses</h5>
27 <p>Some email providers still mantain the (bad) custom of letting users verify if an email address exist. Using <code>mailfy.py</code> you can check if they exist.</p>
28
29 {% include '_menu-launcher.html' %}
30
31 <div id="tab-terminal" class="tab-content tabConfiguration">
32 <form action="/research/mailfy" method="post">
33 <fieldset>
34 <legend>Manual configuration</legend>
35 <label for="lab_command"><i class="fa fa-terminal black"></i> <code>mailfy.py</code></label>
36 <input id="tex_command" name="tex_command" type="text" size="60" placeholder="e. g.: -n i3visio" />
37
38 <span class="tooltip-bottom" title="Launch the app as if you were in a terminal. The app name is not needed">
39 <button name="terminal-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
40 </span>
41 </fieldset>
42 </form>
43 </div>
44
45 <div id="tab-ui" class="tab-content tabConfiguration">
46 <form action="/research/mailfy" method="post">
47 <fieldset>
48 <legend>Selecting targets</legend>
49 <label for="lab_command"><i class="fa fa-search"></i> Targets: </label>
50 <input id="tex_query" name="tex_query" type="text" size="40" placeholder="e. g.: i3visio yrubiosec febrezo"{% if query_text is defined %} value='{{ query_text }}'{% endif %}/>
51 <span class="tooltip-bottom" title="Launch the app">
52 <button name="windowed-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
53 </span>
54 </fieldset>
55 <fieldset>
56 <legend>Other options</legend>
57 <div class="col_6">
58 {% include '_options-platforms.html' %}
59 </div>
60 <div class="col_6">
61 {% include '_options-export.html' %}
62 {% include '_options-other.html' %}
63 </div>
64 </fieldset>
65 </form>
66 </div>
67 </div>
68
69 {% include '_research-terminal.html' %}
70
71 </div>
72 </div>
73
74 {% include '_footer.html' %}
75
76 </body>
77 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> Researching using OSRFramework tools</a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <!-- Menu Vertical Left -->
21 <div class="col_3">
22 {% include '_menu-research.html' %}
23 </div>
24
25 <div class="col_9">
26 <h5><i class="fa fa-phone icon-large"></i> <b>Phonefy</b>: Looking for phone numbers in spam lists</h5>
27 <p>In the case of researching about a phone number, you may want to check if it has been linked to any known practice. You can check about it using <code>phonefy.py</code>.</p>
28
29 {% include '_menu-launcher.html' %}
30
31 <div id="tab-terminal" class="tab-content tabConfiguration">
32 <form action="/research/phonefy" method="post">
33 <fieldset>
34 <legend>Manual configuration</legend>
35 <label for="lab_command"><i class="fa fa-terminal black"></i> <code>phonefy.py</code></label>
36 <input id="tex_command" name="tex_command" type="text" size="60" placeholder="e. g.: -n 91XXXXXXX" />
37
38 <span class="tooltip-bottom" title="Launch the app as if you were in a terminal. The app name is not needed">
39 <button name="terminal-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
40 </span>
41 </fieldset>
42 </form>
43 </div>
44
45 <div id="tab-ui" class="tab-content tabConfiguration">
46 <form action="/research/phonefy" method="post">
47 <fieldset>
48 <legend>Selecting targets</legend>
49 <label for="lab_command"><i class="fa fa-search"></i> Targets: </label>
50 <input id="tex_query" name="tex_query" type="text" size="40" placeholder="e. g.: i3visio yrubiosec febrezo"{% if query_text is defined %} value='{{ query_text }}'{% endif %}/>
51 <span class="tooltip-bottom" title="Launch the app">
52 <button name="windowed-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
53 </span>
54 </fieldset>
55 <fieldset>
56 <legend>Other options</legend>
57 <div class="col_6">
58 {% include '_options-platforms.html' %}
59 </div>
60 <div class="col_6">
61 {% include '_options-export.html' %}
62 {% include '_options-other.html' %}
63 </div>
64 </fieldset>
65 </form>
66 </div>
67
68 {% include '_research-terminal.html' %}
69
70 </div>
71 </div>
72
73 {% include '_footer.html' %}
74
75 </body>
76 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> Researching using OSRFramework tools</a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <!-- Menu Vertical Left -->
21 <div class="col_3">
22 {% include '_menu-research.html' %}
23 </div>
24
25 <div class="col_9">
26 <h5><i class="fa fa-group icon-large"></i> <b>Searchfy</b>: Looking for text</h5>
27 <p>If you don't have an alias, you may want to search for them in several networks. In this case, <code>searchfy.py</code> is a tool that will help you to identify potentially interesting profiles.</p>
28
29 {% include '_menu-launcher.html' %}
30
31 <div id="tab-terminal" class="tab-content tabConfiguration">
32 <form action="/research/searchfy" method="post">
33 <fieldset>
34 <legend>Manual configuration</legend>
35 <label for="lab_command"><i class="fa fa-terminal black"></i> <code>searchfy.py</code></label>
36 <input id="tex_command" name="tex_command" type="text" size="60" placeholder="e. g.: -q 'John Doe'" />
37
38 <span class="tooltip-bottom" title="Launch the app as if you were in a terminal. The app name is not needed">
39 <button name="terminal-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
40 </span>
41 </fieldset>
42 </form>
43 </div>
44
45 <div id="tab-ui" class="tab-content tabConfiguration">
46 <form action="/research/searchfy" method="post">
47 <fieldset>
48 <legend>Selecting targets</legend>
49 <label for="lab_command"><i class="fa fa-search"></i> Targets: </label>
50 <input id="tex_query" name="tex_query" type="text" size="40" placeholder="e. g.: i3visio yrubiosec febrezo"{% if query_text is defined %} value='{{ query_text }}'{% endif %}/>
51 <span class="tooltip-bottom" title="Launch the app">
52 <button name="windowed-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
53 </span>
54 </fieldset>
55 <fieldset>
56 <legend>Other options</legend>
57 <div class="col_6">
58 {% include '_options-platforms.html' %}
59 </div>
60 <div class="col_6">
61 {% include '_options-export.html' %}
62 {% include '_options-other.html' %}
63 </div>
64 </fieldset>
65 </form>
66 </div>
67 </div>
68
69 {% include '_research-terminal.html' %}
70
71 </div>
72 </div>
73
74 {% include '_footer.html' %}
75
76 </body>
77 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8 <script type="text/javascript">// <![CDATA[
9 function loading(){
10 $("#loading").show();
11 $("#content").hide();
12 }
13 // ]]>
14 </script>
15 </head>
16
17 <body>
18
19 {% include '_menu-top.html' %}
20
21 <div id="body" class="grid clearfix">
22 <ul class="tabs">
23 <li><a href="#type-main"> Researching using OSRFramework tools</a></li>
24 </ul>
25 <div id="type-main" class="tab-content">
26 <!-- Menu Vertical Left -->
27 <div class="col_3">
28 {% include '_menu-research.html' %}
29 </div>
30
31 <div class="col_9">
32 <h5><i class="fa fa-user icon-large"></i> <b>Usufy</b>: Looking for usernames</h5>
33 <p>Users tend to get registered in several platform using the same alias. If you come across one of them and you want to check if it exists in several platforms you can use <code>usufy.py</code>.<p>
34
35 {% include '_menu-launcher.html' %}
36
37 <div id="tab-terminal" class="tab-content tabConfiguration">
38 <form action="/research/usufy" method="post">
39 <fieldset>
40 <legend>Manual configuration</legend>
41 <label for="lab_command"><i class="fa fa-terminal black"></i> <code>usufy.py</code></label>
42 <input id="tex_command" name="tex_command" type="text" size="40" placeholder="e. g.: -n i3visio -p all" />
43
44 <span class="tooltip-bottom" title="Launch the app as if you were in a terminal. The app name is not needed.">
45 <button name="terminal-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
46 </span>
47 </fieldset>
48 </form>
49 </div>
50
51 <div id="tab-ui" class="tab-content tabConfiguration">
52 <form action="/research/usufy" method="post">
53 <fieldset>
54 <legend>Selecting targets</legend>
55 <label for="lab_command"><i class="fa fa-search"></i> Targets: </label>
56 <input id="tex_query" name="tex_query" type="text" size="40" placeholder="e. g.: i3visio yrubiosec febrezo"{% if query_text is defined %} value='{{ query_text }}'{% endif %}/>
57 <span class="tooltip-bottom" title="Launch the app.">
58 <button name="windowed-form" class="fa fa-cogs orange" onclick="loading();"> Launch</button>
59 </span>
60 </fieldset>
61 <fieldset>
62 <legend>Other options</legend>
63 <div class="col_6">
64 {% include '_options-platforms.html' %}
65 </div>
66 <div class="col_6">
67 {% include '_options-export.html' %}
68 {% include '_options-other.html' %}
69 </div>
70 </fieldset>
71 </form>
72 </div>
73 </div>
74
75 {% include '_research-terminal.html' %}
76
77 </div>
78 </div>
79
80 {% include '_footer.html' %}
81
82 </body>
83 </html>
0 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1
2 {% include '_banner.html' %}
3
4 <html xmlns="http://www.w3.org/1999/xhtml" lang="es">
5 <head>
6
7 {% include '_shared-headers.html' %}
8
9 </head>
10
11 <body>
12
13 {% include '_menu-top.html' %}
14
15 <div id="body" class="grid clearfix">
16 <ul class="tabs">
17 <li><a href="#type-main"> Researching using OSRFramework tools</a></li>
18 </ul>
19 <div id="type-main" class="tab-content">
20 <!-- Menu Vertical Left -->
21 <div class="col_3">
22 {% include '_menu-research.html' %}
23 </div>
24
25 <div class="col_9">
26 <p>In this section you will be able to launch the different tools in the framework. Choose the one you need depending on the type of information you already have:</p>
27 <ul class="icons">
28 <li><i class="fa fa-check"></i> If you want to check if an <b>alias</b> is registered in several platforms, you can use <a href="/research/usufy"><code>usufy.py</code></a>.</li>
29 <li><i class="fa fa-check"></i> When you need to find if there exist some <b>domains</b> registered using a given alias, you can use <a href="/research/domainfy"><code>domainfy.py</code></a>.</li>
30 <li><i class="fa fa-check"></i> If you want to check if an <b>email address</b> exists, you can use <a href="/research/mailfy"><code>mailfy.py</code></a>.</li>
31 <li><i class="fa fa-check"></i> If you are investigating a <b>mobile phone</b> that may be linked to spam, opt for <a href="/research/phonefy"><code>phonefy.py</code></a>.</li>
32 <li><i class="fa fa-check"></i> If you want to find users searching by <b>any text</b> in several platforms, you might like <a href="/research/searchfy"><code>searchfy.py</code></a>.</li>
33 </ul>
34 <p>Remember that you can always use the command line applications to automate certain tasks as well as <code>osrfconsole.py</code> as an alternative UI.</p>
35 </div>
36 </div>
37 </div>
38
39 {% include '_footer.html' %}
40
41 </body>
42 </html>
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22 # Calling the logger when being imported
23 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties")
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22 # Calling the logger when being imported
23 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.blockchain_info")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import sys
23 import urllib2
24
25 def getBitcoinAddressDetails(address=None):
26 '''
27 Method that checks the presence of a Bitcoin Address in blockchain.info:
28 {
29 "total_sent": 41301084,
30 "total_received": 52195147,
31 "final_balance": 10894063,
32 "address": "1APKyS2TEdFMjXjJfMCgavFtoWuv2QNXTw",
33 "hash160": "66f21efc754af07e87913db46bf24df2eb0d5075",
34 ...
35 }
36
37 :param address: Bitcoin address to verify.
38
39 :return: Python structure for the json received. If nothing was found, it will return an empty dictionary.
40 '''
41 try:
42 apiURL = "https://blockchain.info/rawaddr/" + str(address)
43
44 # Accessing the HIBP API
45 data = urllib2.urlopen(apiURL).read()
46
47 # Reading the text data onto python structures
48 jsonData = json.loads(data)
49 return jsonData
50 except:
51 # No information was found, then we return a null entity
52 return {}
53
54 if __name__ == "__main__":
55 parser = argparse.ArgumentParser(description='A library that wraps the search about a Bitcoin address in blockchain.info.', prog='getBitcoinAddressDetails.py', epilog="", add_help=False)
56 # Adding the main options
57 # Defining the mutually exclusive group for the main options
58 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to blockchain.info.', required=True)
59
60 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
61 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
62 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
63
64 args = parser.parse_args()
65
66 print json.dumps(getBitcoinAddressDetails(address=args.query), indent=2)
67
68
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24
25 import osrframework.thirdparties.haveibeenpwned_com.checkIfEmailWasHacked as HIBP
26
27 if __name__ == "__main__":
28 parser = argparse.ArgumentParser(description='A library that wraps an account search onto haveibeenpwned.com.', prog='checkIfEmailWasHacked.py', epilog="", add_help=False)
29 # Adding the main options
30 # Defining the mutually exclusive group for the main options
31 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to haveibeenpwned.com.', required=True)
32
33 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
34 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
35 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
36
37 args = parser.parse_args()
38
39 print json.dumps(HIBP.checkIfEmailWasHacked(email=args.query), indent=2)
40
41
42
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23
24 import osrframework.thirdparties.md5crack_com.checkIfHashIsCracked as md5crack_com
25
26 if __name__ == "__main__":
27 parser = argparse.ArgumentParser(description='A library that wraps a search onto md5crack.com.', prog='checkIfHashIsCracked.py', epilog="NOTE: if not provided, the API key will be searched in the config_api_keys.py file.", add_help=False)
28 # Adding the main options
29 # Defining the mutually exclusive group for the main options
30 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to md5crack.com.', required=True)
31 parser.add_argument('-a', '--api_key', action='store', help='API key in md5crack.com to be used.', required=False, default=None)
32
33 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
34 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
35 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
36
37 args = parser.parse_args()
38
39 print json.dumps(md5crack_com.checkIfHashIsCracked(hash=args.query, api_key=args.api_key), indent=2)
40
41
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24
25 import osrframework.thirdparties.skype.checkInSkype as skype
26
27 def checkInSkype(args):
28 '''
29 '''
30 if args.query != None:
31 return skype.checkInSkype(args.query)
32 elif args.file != None:
33 results = []
34 with open(args.file, "r") as iF:
35 queries = iF.read().splitlines()
36
37 for q in queries:
38 print "Performing query:\t"+q
39 results += skype.checkInSkype(args.query)
40 return results
41
42 if __name__ == "__main__":
43 parser = argparse.ArgumentParser(description='A library that wraps a search onto Skype4Py.', prog='checkInSkype.py', epilog="NOTE: you must be logged in into Skype to use this program.", add_help=False)
44
45 # Adding the main options
46 # Defining the mutually exclusive group for the main options
47 general = parser.add_mutually_exclusive_group(required=True)
48 general.add_argument('-q', '--query', metavar='<text_to_search>', action='store', help='query to be launched.')
49 general.add_argument('-f', '--file', metavar='<path_to_search_file>', action='store', help='path to the search file.')
50
51 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
52 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
53 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
54
55 args = parser.parse_args()
56
57 print json.dumps(checkInSkype(args), indent = 2)
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24
25 import osrframework.thirdparties.ip_api_com.checkIpDetails as ip_api_com
26
27 if __name__ == "__main__":
28 parser = argparse.ArgumentParser(description='A library that wraps a search onto ip-api.com.', prog='checkIpDetails.py', epilog="", add_help=False)
29 # Adding the main options
30 # Defining the mutually exclusive group for the main options
31 general = parser.add_mutually_exclusive_group(required=True)
32 general.add_argument('-q', '--query', metavar='<ip_or_domain>', action='store', help='query to be resolved by ip-api.com.')
33
34 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
35 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
36 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.2.0', help='shows the version of the program and exists.')
37
38 args = parser.parse_args()
39
40 print json.dumps(ip_api_com.checkIpDetails(query=args.query), indent=2)
41
42
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24
25 import osrframework.thirdparties.resolvethem_com.processing as resolvethem_com
26
27 if __name__ == "__main__":
28 parser = argparse.ArgumentParser(description='A library that wraps a search onto resolvethem.com.', prog='checkIPFromAlias.py', epilog="", add_help=False)
29 # Adding the main options
30 # Defining the mutually exclusive group for the main options
31 parser.add_argument('-q', '--query', metavar='<ALIAS>', action='store', help='query to be performed to resolvethem.com.', required=True)
32
33 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
34 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
35 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
36
37 args = parser.parse_args()
38
39 print json.dumps(resolvethem_com.checkIPFromAlias(alias=args.query), indent=2)
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import sys
25 import urllib2
26
27 import osrframework.thirdparties.infobel_com.checkPhoneDetails as infobel_com
28
29 if __name__ == "__main__":
30 parser = argparse.ArgumentParser(description='A library that wraps a search onto infobel.com via Google.', prog='checkPhoneDetails.py', add_help=False)
31 # Adding the main options
32 # Defining the mutually exclusive group for the main options
33 parser.add_argument('-q', '--query', metavar='<query>', action='store', help='query to be performed to infobel.com.', required=True)
34
35 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
36 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
37 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
38
39 args = parser.parse_args()
40
41 print json.dumps(infobel_com.checkPhoneDetails(query=args.query), indent=2)
42
43
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24
25 import osframework.thirdparties.blockchain_info as blockchain_info
26
27 if __name__ == "__main__":
28 parser = argparse.ArgumentParser(description='A library that wraps the search about a Bitcoin address in blockchain.info.', prog='getBitcoinAddressDetails.py', epilog="", add_help=False)
29 # Adding the main options
30 # Defining the mutually exclusive group for the main options
31 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to blockchain.info.', required=True)
32
33 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
34 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
35 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
36
37 args = parser.parse_args()
38
39 print json.dumps(blockchain_info.getBitcoinAddressDetails(address=args.query), indent=2)
40
41
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22 # Calling the logger when being imported
23 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.haveibeenpwned_com")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import requests
23 import sys
24 import time
25
26 def checkIfEmailWasHacked(email=None, sleepSeconds=1.5):
27 """
28 Method that checks if the given email is stored in the HIBP website.
29
30 This function automatically waits a second to avoid problems with the API
31 rate limit. An example of the json received:
32 ```
33 [{"Title":"Adobe","Name":"Adobe","Domain":"adobe.com","BreachDate":"2013-10-4","AddedDate":"2013-12-04T00:12Z","PwnCount":152445165,"Description":"The big one. In October 2013, 153 million Adobe accounts were breached with each containing an internal ID, username, email, <em>encrypted</em> password and a password hint in plain text. The password cryptography was poorly done and <a href=\"http://stricture-group.com/files/adobe-top100.txt\" target=\"_blank\">many were quickly resolved back to plain text</a>. The unencrypted hints also <a href=\"http://www.troyhunt.com/2013/11/adobe-credentials-and-serious.html\" target=\"_blank\">disclosed much about the passwords</a> adding further to the risk that hundreds of millions of Adobe customers already faced.","DataClasses":["Email addresses","Password hints","Passwords","Usernames"]}]
34 ```
35
36 Args:
37 -----
38 email: Email to verify in HIBP.
39
40 Returns:
41 --------
42 A python structure for the json received. If nothing was found, it will
43 return an empty list.
44 """
45 # Sleeping a second
46 time.sleep(sleepSeconds)
47
48 # Building API query
49 apiURL= "https://haveibeenpwned.com/api/v2/breachedaccount/" + email
50 # Accessing the HIBP API
51 try:
52 data = requests.get(apiURL).text
53
54 # Reading the text data onto python structures
55 jsonData = json.loads(data)
56
57 leaks = []
58
59 # Building the i3visio like structure
60 for e in jsonData:
61 new = {}
62 new["value"] = e["Name"]
63 new["type"] = "i3visio.platform_leaked"
64 new["attributes"] = [
65 {
66 "value": "i3visio_uri",
67 "type": apiURL,
68 "attributes": []
69 }
70 ]
71
72 leaks.append(new)
73
74 return leaks
75
76 except:
77 # No information was found, then we return a null entity
78 return []
79
80
81 if __name__ == "__main__":
82 parser = argparse.ArgumentParser(description='A library that wraps an account search onto haveibeenpwned.com.', prog='checkIfEmailWasHacked.py', epilog="", add_help=False)
83 # Adding the main options
84 # Defining the mutually exclusive group for the main options
85 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to haveibeenpwned.com.', required=True)
86
87 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
88 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
89 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
90
91 args = parser.parse_args()
92 print("Results found for " + args.query + ":\n")
93 print(json.dumps(checkIfEmailWasHacked(email=args.query), indent=2))
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # OSRFramework is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ##################################################################################
18
19 import osrframework.utils.logger
20
21 # Calling the logger when being imported
22 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.infobel_com")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import sys
23 import urllib2
24
25 import osrframework.searchengines.google as google
26 import osrframework.thirdparties.infobel_com.processing as processing
27
28 def checkPhoneDetails(query=None):
29 '''
30 Method that checks if the given hash is stored in the md5crack.com website.
31
32 :param query: query to verify.
33
34 :return: Python structure.
35 '''
36 results = []
37
38 #TO-DO executing the query against Google and grab the results
39 # The query should be something like "<QUERY> site:infobel.com"
40 search = query + " site:infobel.com"
41
42 # This will return a list of i3visio.uri objects
43 uriObjects = google.processSearch(search)
44
45 #TO-DO: grabbing the phone details for the QUERY
46 for uri in uriObjects:
47 # Recovering the website
48 # Accessing the resources
49 textResults = processing.getResults(uri["value"])
50 # Iterating over every result to process it and recover a person object
51 for r in textResults:
52 person = {}
53 fullname = ""
54 person["type"]="i3visio.person"
55 person["value"] = "FULLNAME_NOT_FOUND"
56 person["attributes"] = processing.extractFieldsFromResult(r)
57
58 for entity in person["attributes"]:
59 if entity["type"] == "i3visio.fullname":
60 person["value"] = entity["value"]
61 break
62
63 # Appending the Uri of the infobel record:
64 aux = {}
65 aux["type"]= "i3visio.uri"
66 aux["value"] = uri["value"]
67 aux["attributes"] = []
68 person["attributes"].append(aux)
69
70 # Appending the platform of the infobel record:
71 aux = {}
72 aux["type"]= "i3visio.platform"
73 aux["value"] = "Infobel"
74 aux["attributes"] = []
75 person["attributes"].append(aux)
76
77 # Appending to the results
78 results.append(person)
79
80 return results
81
82 if __name__ == "__main__":
83 parser = argparse.ArgumentParser(description='A library that wraps a search onto infobel.com via Google.', prog='checkPhoneDetails.py', add_help=False)
84 # Adding the main options
85 # Defining the mutually exclusive group for the main options
86 parser.add_argument('-q', '--query', metavar='<query>', action='store', help='query to be performed to infobel.com.', required=True)
87
88 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
89 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
90 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
91
92 args = parser.parse_args()
93
94 print json.dumps(checkPhoneDetails(query=args.query), indent=2)
95
96
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import re
23 import sys
24
25 import osrframework.utils.browser as browser
26
27 def extractFieldsFromResult(data):
28 '''
29 Method that parses Infobel textual information to return a series of attributes.
30
31 :return: a list of i3visio-like objects.
32 '''
33
34 entities = []
35
36 # Defining the objects to extract
37 fieldsRegExp = {}
38 fieldsRegExp["i3visio.fullname"] = "<span class=\"fn\">([^<]*)</span>"
39 fieldsRegExp["i3visio.name"] = " por <strong>[^ ]* ([^<]*)</strong>"
40 fieldsRegExp["i3visio.surname"] = " por <strong>([^ ]*) "
41 fieldsRegExp["i3visio.location.address"] = "itemprop=\"streetAddress\">([^<]*)</span>"
42 fieldsRegExp["i3visio.location.city"] = "addressLocality\">([^<]*)</span>"
43 fieldsRegExp["i3visio.location.postalcode"] = "postalCode\">([^<]*)</span>"
44 fieldsRegExp["i3visio.phone"] = "document.write\('([0-9]+)'"
45
46 for field in fieldsRegExp.keys():
47 listRecovered = re.findall(fieldsRegExp[field], data)
48 if len(listRecovered) >0:
49 aux = {}
50 aux["type"]= field
51 aux["value"] = listRecovered[0].replace('\xa0', ' ')
52 aux["attributes"] = []
53 entities.append(aux)
54
55 return entities
56
57 def getResults(uri):
58 '''
59 Method that recovers the text for each result in infobel.com
60
61 :param uri: Infobel uri
62
63 :return: A list of textual information to be processed
64 '''
65 # Using i3visio browser to avoid certain issues...
66 i3Browser = browser.Browser()
67
68 data = i3Browser.recoverURL(uri)
69
70 # Strings to be searched
71 regExp = "<!-- Results -->(.*)<!-- /Results -->"
72 # re.DOTALL is needed to match any character INCLUDING \n
73 results = re.findall(regExp, data, re.DOTALL)
74
75 return results
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22
23 # Calling the logger when being imported
24 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.ip_api_com")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import sys
23 import urllib2
24
25 def checkIpDetails(query=None):
26 '''
27 Method that checks if the given hash is stored in the md5crack.com website. An example of the json received:
28 {
29 "as": "AS8560 1\u00261 Internet AG",
30 "city": "",
31 "country": "Germany",
32 "countryCode": "DE",
33 "isp": "1\u00261 Internet AG",
34 "lat": 51,
35 "lon": 9,
36 "org": "1\u00261 Internet AG",
37 "query": "217.160.251.126",
38 "region": "",
39 "regionName": "",
40 "status": "success",
41 "timezone": "",
42 "zip": ""
43 }
44
45 :param query: Query to verify. It can be either a domain or an IPv4 address.
46
47 :return: Python structure for the json received. If nothing was found, it will return an empty dictionary.
48 [
49 {
50 "attributes": [
51 {
52 "attributes": [],
53 "type": "i3visio.text",
54 "value": "DE"
55 }
56 ],
57 "type": "i3visio.location.country",
58 "value": "Germany"
59 },
60 {
61 "attributes": [],
62 "type": "i3visio.text",
63 "value": "1&1 Internet AG"
64 },
65 {
66 "attributes": [],
67 "type": "i3visio.ipv4",
68 "value": "217.160.129.99"
69 },
70 {
71 "attributes": [],
72 "type": "i3visio.location.geo",
73 "value": "51, 9"
74 }
75 ]
76 '''
77 try:
78 apiURL = "http://ip-api.com/json/" + query
79
80
81 # Accessing the ip-api.com RESTful API
82 data = urllib2.urlopen(apiURL).read()
83
84 # Reading the text data onto python structures
85 apiData = json.loads(data)
86
87 # i3visio structure to be returned
88 jsonData = []
89
90 if apiData["status"] == "success":
91 for key in apiData:
92 value = apiData[key]
93 if value != "":
94 aux = {}
95 if key == "city":
96 aux["type"] = "i3visio.location." + key
97 aux["value"] = value
98 aux["attributes"] = []
99 # Appending to the list of results
100 jsonData.append(aux)
101 elif key == "country":
102 aux["type"] = "i3visio.location." + key
103 aux["value"] = value
104 # Adding a new attribute
105 att ={}
106 att["type"] = "i3visio.text"
107 att["value"] = apiData["countryCode"]
108 att["attributes"] = []
109 aux["attributes"] = [att]
110 # Appending to the list of results
111 jsonData.append(aux)
112 elif key == "isp":
113 aux["type"] = "i3visio.text"
114 aux["value"] = value
115 aux["attributes"] = []
116 # Appending to the list of results
117 jsonData.append(aux)
118 elif key == "lat":
119 aux["type"] = "i3visio.location.geo"
120 aux["value"] = str(apiData["lat"]) + ", " + str(apiData["lon"])
121 aux["attributes"] = []
122 # Appending to the list of results
123 jsonData.append(aux)
124 elif key == "region":
125 aux["type"] = "i3visio.location.province"
126 aux["value"] = value
127 # Adding a new attribute
128 att ={}
129 att["type"] = "i3visio.text"
130 att["value"] = apiData["regionName"]
131 att["attributes"] = []
132 aux["attributes"] = [att]
133 # Appending to the list of results
134 jsonData.append(aux)
135 elif key == "timezone":
136 aux["type"] = "i3visio.text"
137 aux["value"] = value
138 aux["attributes"] = []
139 # Appending to the list of results
140 jsonData.append(aux)
141 elif key == "zip":
142 aux["type"] = "i3visio.location.postalcode"
143 aux["value"] = value
144 aux["attributes"] = []
145 # Appending to the list of results
146 jsonData.append(aux)
147 elif key == "query":
148 aux["type"] = "i3visio.ipv4"
149 aux["value"] = value
150 aux["attributes"] = []
151 # Appending to the list of results
152 jsonData.append(aux)
153
154 #print json.dumps(jsonData, indent = 2)
155 return jsonData
156 except:
157 # No information was found, then we return a null entity
158 return {}
159
160 if __name__ == "__main__":
161 parser = argparse.ArgumentParser(description='A library that wraps a search onto ip-api.com.', prog='checkIPDetails.py', epilog="", add_help=False)
162 # Adding the main options
163 # Defining the mutually exclusive group for the main options
164 general = parser.add_mutually_exclusive_group(required=True)
165 general.add_argument('-q', '--query', metavar='<ip_or_domain>', action='store', help='query to be resolved by ip-api.com.')
166
167 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
168 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
169 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.2.0', help='shows the version of the program and exists.')
170
171 args = parser.parse_args()
172
173 print json.dumps(checkIpDetails(query=args.query), indent=2)
174
175
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22
23 # Calling the logger when being imported
24 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.md5crack_com")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import osrframework.utils.config_api_keys as config_api_keys
23 import sys
24 import urllib2
25
26 def checkIfHashIsCracked(hash=None, api_key=None):
27 '''
28 Method that checks if the given hash is stored in the md5crack.com website.
29
30 :param hash: hash to verify.
31 :param api_key: api_key to be used in md5crack.com. If not provided, the API key will be searched in the config_api_keys.py file.
32
33 :return: Python structure for the Json received. It has the following structure:
34 {
35 "phrase": "4d186321c1a7f0f354b297e8914ab240",
36 "code": 6,
37 "parsed": "hola",
38 "response": "The MD5 hash was cracked."
39 }
40 '''
41 # This is for i3visio
42 if api_key==None:
43 #api_key = raw_input("Insert the API KEY here:\t")
44 allKeys = config_api_keys.returnListOfAPIKeys()
45 try:
46 api_key_data = allKeys["md5crack_com"]
47 api_key = api_key_data["api_key"]
48 except:
49 # API_Key not found
50 return {}
51
52 apiURL = "http://api.md5crack.com/crack/"+ api_key +"/" + hash
53
54 # Accessing the HIBP API
55 data = urllib2.urlopen(apiURL).read()
56 if "\"parsed\":null" in data:
57 data = data.replace("\"parsed\":null", "\"parsed\":\"\"")
58
59 # Reading the text data onto python structures
60 jsonData = json.loads(data)
61 #print json.dumps(jsonData, indent = 2)
62 return jsonData
63
64 if __name__ == "__main__":
65 parser = argparse.ArgumentParser(description='A library that wraps a search onto md5crack.com.', prog='checkIfHashIsCracked.py', epilog="NOTE: if not provided, the API key will be searched in the config_api_keys.py file.", add_help=False)
66 # Adding the main options
67 # Defining the mutually exclusive group for the main options
68 parser.add_argument('-q', '--query', metavar='<hash>', action='store', help='query to be performed to md5crack.com.', required=True)
69 parser.add_argument('-a', '--api_key', action='store', help='API key in md5crack.com to be used.', required=False, default=None)
70
71 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
72 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
73 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
74
75 args = parser.parse_args()
76
77 print json.dumps(checkIfHashIsCracked(hash=args.query, api_key=args.api_key), indent=2)
78
79
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22
23 # Calling the logger when being imported
24 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.pipl_com")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import json
22 import osrframework.utils.config_api_keys as config_api_keys
23 import sys
24 import urllib2
25
26 from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest, SearchAPIError
27 from osrframework.thirdparties.pipl_com.lib import Person, Name, Address, Job
28
29 def checkInfo(email=None, username=None, api_key=None):
30 '''
31 Method that checks if the given hash is stored in the pipl.com website.
32
33 :param email: queries to be launched.
34 :param api_key: api_key to be used in pipl.com. If not provided, the API key will be searched in the config_api_keys.py file.
35
36 :return: Python structure for the Json received. It has the following structure:
37 '''
38 # This is for i3visio
39 if api_key==None:
40 #api_key = raw_input("Insert the API KEY here:\t")
41 allKeys = config_api_keys.returnListOfAPIKeys()
42 try:
43 api_key = allKeys["pipl_com"]
44 except:
45 # API_Key not found. The samplekey will be used but it has a limit of 10 queries/day.
46 api_key = "samplekey"
47
48 results = {}
49 results["person"] = []
50 results["records"] = []
51
52 if username != None:
53 request = SearchAPIRequest( username=username, api_key=api_key)
54 person, records = launchRequest(request)
55 # Appending the results
56 results["person"].append(person)
57 results["records"].append(records)
58 if email != None:
59 request = SearchAPIRequest( email=email, api_key=api_key)
60 person, records = launchRequest(request)
61 # Appending the results
62 results["person"].append(person)
63 results["records"].append(records)
64 return results
65
66
67 def launchRequest(request):
68 '''
69 Method to launch a given request.
70
71 :param request: The request object.
72
73 :return: A dictionary containinf the results of the person and a list of dicts containing the references for the record.
74 '''
75 person = {}
76 records = []
77
78 try:
79 response = request.send()
80 # Trying to recover a person object. This is a dict:
81 try:
82 person = (response.person).to_dict()
83 except:
84 pass
85 # Trying to recover a list of record objects. This is a list dicts
86 try:
87 aux = response.records
88 records = [r.to_dict() for r in aux]
89 except:
90 pass
91 except SearchAPIError as e:
92 print e.http_status_code, e
93
94 return person, records
95
96 if __name__ == "__main__":
97 parser = argparse.ArgumentParser(description='A library that wraps a search onto pipl.com API.', prog='checkInfo.py', epilog="NOTE: if not provided, the API key will be searched in the config_api_keys.py file.", add_help=False)
98 # Adding the main options
99
100 parser.add_argument('-a', '--api_key', action='store', help='API key in pipl.com to be used.', required=False)
101
102 # Defining the mutually exclusive group for the main options
103 groupQueries = parser.add_mutually_exclusive_group(required=True)
104 groupQueries.add_argument('-e', '--email', metavar='<email>', action='store', help='query to be performed to pipl.com.')
105 groupQueries.add_argument('-u', '--username', metavar='<email>', action='store', help='query to be performed to pipl.com.')
106
107 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
108 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
109 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
110
111 args = parser.parse_args()
112
113 print json.dumps(checkInfo(email=args.email, username=args.username, api_key=args.api_key), indent=2)
114
115
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 import osrframework.utils.logger
23
24 # Calling the logger when being imported
25 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.pipl_com.lib")
26
27
28 __version__ = '1.0'
29 """Python implementation of Pipl's data model.
30 The data model is basically Record/Person objects (avaialable in
31 osrframework.thirdparties.pipl_com.lib.containers) with their source (available in osrframework.thirdparties.pipl_com.lib.source)
32 and their fields (available in osrframework.thirdparties.pipl_com.lib.fields).
33 Importing can be done either with:
34 from osrframework.thirdparties.pipl_com.lib.containers import Record, Person
35 from osrframework.thirdparties.pipl_com.lib.fields import Name, Address
36 from osrframework.thirdparties.pipl_com.lib.source import Source
37 or simply with:
38 from osrframework.thirdparties.pipl_com.lib import Record, Person, Name, Address, Source
39 """
40 from osrframework.thirdparties.pipl_com.lib.containers import Record, Person
41 from osrframework.thirdparties.pipl_com.lib.source import Source
42 from osrframework.thirdparties.pipl_com.lib.fields import *
0 from osrframework.thirdparties.pipl_com.lib.fields import *
1 from osrframework.thirdparties.pipl_com.lib.source import Source
2 from osrframework.thirdparties.pipl_com.lib.utils import *
3
4
5 __all__ = ['Record', 'Person']
6
7
8 class FieldsContainer(object):
9
10 """The base class of Record and Person, made only for inheritance."""
11
12 class_container = {
13 Name: 'names',
14 Address: 'addresses',
15 Phone: 'phones',
16 Email: 'emails',
17 Job: 'jobs',
18 Education: 'educations',
19 Image: 'images',
20 Username: 'usernames',
21 UserID: 'user_ids',
22 DOB: 'dobs',
23 RelatedURL: 'related_urls',
24 Relationship: 'relationships',
25 Tag: 'tags',
26 }
27
28 def __init__(self, fields=None):
29 """`fields` is an iterable of field objects from
30 osrframework.thirdparties.pipl_com.lib.fields."""
31 self.names = []
32 self.addresses = []
33 self.phones = []
34 self.emails = []
35 self.jobs = []
36 self.educations = []
37 self.images = []
38 self.usernames = []
39 self.user_ids = []
40 self.dobs = []
41 self.related_urls = []
42 self.relationships = []
43 self.tags = []
44
45 self.add_fields(fields or [])
46
47 def add_fields(self, fields):
48 """Add the fields to their corresponding container.
49
50 `fields` is an iterable of field objects from osrframework.thirdparties.pipl_com.lib.fields.
51
52 """
53 for field in fields:
54 cls = field.__class__
55 try:
56 container = FieldsContainer.class_container[cls]
57 except KeyError:
58 raise ValueError('Object of type %s is an invalid field' % cls)
59 getattr(self, container).append(field)
60
61 @property
62 def all_fields(self):
63 """A list with all the fields contained in this object."""
64 return [field
65 for container in FieldsContainer.class_container.values()
66 for field in getattr(self, container)]
67
68 @staticmethod
69 def fields_from_dict(d):
70 """Load the fields from the dict, return a list with all the fields."""
71 class_container = FieldsContainer.class_container
72 fields = [field_cls.from_dict(field_dict)
73 for field_cls, container in class_container.iteritems()
74 for field_dict in d.get(container, [])]
75 return fields
76
77 def fields_to_dict(self):
78 """Transform the object to a dict and return the dict."""
79 d = {}
80 for container in FieldsContainer.class_container.values():
81 fields = getattr(self, container)
82 if fields:
83 d[container] = [field.to_dict() for field in fields]
84 return d
85
86
87 class Record(Serializable, FieldsContainer):
88
89 """A record is all the data available in a specific source.
90
91 Every record object is based on a source which is basically the URL of the
92 page where the data is available, and the data itself that comes as field
93 objects (Name, Address, Email etc. see osrframework.thirdparties.pipl_com.lib.fields).
94
95 Each type of field has its own container (note that Record is a subclass
96 of FieldsContainer).
97 For example:
98
99 >>> from osrframework.thirdparties.pipl_com.lib import Record, Email, Phone
100 >>> fields = [Email(address='[email protected]'), Phone(number=999888777)]
101 >>> record = Record(fields=fields)
102 >>> record.emails
103 [Email(address=u'[email protected]')]
104 >>> record.phones
105 [Phone(number=999888777)]
106
107 Records come as results for a query and therefore they have attributes that
108 indicate if and how much they match the query. They also have a validity
109 timestamp available as an attribute.
110
111 """
112
113 def __init__(self, fields=None, source=None, query_params_match=None,
114 query_person_match=None, valid_since=None):
115 """Extend FieldsContainer.__init__ and set the record's source
116 and attributes.
117
118 Args:
119
120 fields -- An iterable of fields (from osrframework.thirdparties.pipl_com.lib.fields).
121 source -- A Source object (osrframework.thirdparties.pipl_com.lib.source.Source).
122 query_params_match -- A bool value that indicates whether the record
123 contains all the params from the query or not.
124 query_person_match -- A float between 0.0 and 1.0 that indicates how
125 likely it is that this record holds data about
126 the person from the query.
127 Higher value means higher likelihood, value
128 of 1.0 means "this is definitely him".
129 This value is based on Pipl's statistical
130 algorithm that takes into account many parameters
131 like the popularity of the name/address (if there
132 was a name/address in the query) etc.
133 valid_since -- A datetime.datetime object, this is the first time
134 Pipl's crawlers saw this record.
135
136 """
137 FieldsContainer.__init__(self, fields)
138 self.source = source or Source()
139 self.query_params_match = query_params_match
140 self.query_person_match = query_person_match
141 self.valid_since = valid_since
142
143 @staticmethod
144 def from_dict(d):
145 """Transform the dict to a record object and return the record."""
146 query_params_match = d.get('@query_params_match')
147 query_person_match = d.get('@query_person_match')
148 valid_since = d.get('@valid_since')
149 if valid_since:
150 valid_since = str_to_datetime(valid_since)
151 source = Source.from_dict(d.get('source', {}))
152 fields = Record.fields_from_dict(d)
153 return Record(source=source, fields=fields,
154 query_params_match=query_params_match,
155 query_person_match=query_person_match,
156 valid_since=valid_since)
157
158 def to_dict(self):
159 """Return a dict representation of the record."""
160 d = {}
161 if self.query_params_match is not None:
162 d['@query_params_match'] = self.query_params_match
163 if self.query_person_match is not None:
164 d['@query_person_match'] = self.query_person_match
165 if self.valid_since is not None:
166 d['@valid_since'] = datetime_to_str(self.valid_since)
167 if self.source is not None:
168 d['source'] = self.source.to_dict()
169 d.update(self.fields_to_dict())
170 return d
171
172
173 class Person(Serializable, FieldsContainer):
174
175 """A Person object is all the data available on an individual.
176
177 The Person object is essentially very similar in its structure to the
178 Record object, the main difference is that data about an individual can
179 come from multiple sources while a record is data from one source.
180
181 The person's data comes as field objects (Name, Address, Email etc. see
182 osrframework.thirdparties.pipl_com.lib.fields).
183 Each type of field has its on container (note that Person is a subclass
184 of FieldsContainer).
185 For example:
186
187 >>> from osrframework.thirdparties.pipl_com.lib import Person, Email, Phone
188 >>> fields = [Email(address='[email protected]'), Phone(number=999888777)]
189 >>> person = Person(fields=fields)
190 >>> person.emails
191 [Email(address=u'[email protected]')]
192 >>> person.phones
193 [Phone(number=999888777)]
194
195 Note that a person object is used in the Search API in two ways:
196 - It might come back as a result for a query (see SearchResponse).
197 - It's possible to build a person object with all the information you
198 already have about the person you're looking for and send this object as
199 the query (see SearchRequest).
200
201 """
202
203 def __init__(self, fields=None, sources=None, query_params_match=None):
204 """Extend FieldsContainer.__init__ and set the record's sources
205 and query_params_match attribute.
206
207 Args:
208
209 fields -- An iterable of fields (from osrframework.thirdparties.pipl_com.lib.fields).
210 sources -- A list of Source objects (osrframework.thirdparties.pipl_com.lib.source.Source).
211 query_params_match -- A bool value that indicates whether the record
212 contains all the params from the query or not.
213
214 """
215
216 FieldsContainer.__init__(self, fields)
217 self.sources = sources or []
218 self.query_params_match = query_params_match
219
220 @property
221 def is_searchable(self):
222 """A bool value that indicates whether the person has enough data and
223 can be sent as a query to the API."""
224 filter_func = lambda field: field.is_searchable
225 return bool(filter(filter_func, self.names) or
226 filter(filter_func, self.emails) or
227 filter(filter_func, self.phones) or
228 filter(filter_func, self.usernames))
229
230 @property
231 def unsearchable_fields(self):
232 """A list of all the fields that can't be searched by.
233
234 For example: names/usernames that are too short, emails that are
235 invalid etc.
236
237 """
238 filter_func = lambda field: not field.is_searchable
239 return filter(filter_func, self.names) + \
240 filter(filter_func, self.emails) + \
241 filter(filter_func, self.phones) + \
242 filter(filter_func, self.usernames) + \
243 filter(filter_func, self.addresses) + \
244 filter(filter_func, self.dobs)
245
246 @staticmethod
247 def from_dict(d):
248 """Transform the dict to a person object and return the person."""
249 query_params_match = d.get('@query_params_match')
250 sources = [Source.from_dict(source) for source in d.get('sources', [])]
251 fields = Person.fields_from_dict(d)
252 return Person(fields=fields, sources=sources,
253 query_params_match=query_params_match)
254
255 def to_dict(self):
256 """Return a dict representation of the person."""
257 d = {}
258 if self.query_params_match is not None:
259 d['@query_params_match'] = self.query_params_match
260 if self.sources:
261 d['sources'] = [source.to_dict() for source in self.sources]
262 d.update(self.fields_to_dict())
263 return d
0 from osrframework.thirdparties.pipl_com.lib.utils import Serializable
1
2
3 class APIError(Exception, Serializable):
4
5 """An exception raised when the response from the API contains an error."""
6
7 def __init__(self, error, http_status_code):
8 """Extend Exception.__init___ and set two extra attributes -
9 error (unicode) and http_status_code (int)."""
10 Exception.__init__(self, error)
11 self.error = error
12 self.http_status_code = http_status_code
13
14 @property
15 def is_user_error(self):
16 """A bool that indicates whether the error is on the user's side."""
17 return 400 <= self.http_status_code < 500
18
19 @property
20 def is_pipl_error(self):
21 """A bool that indicates whether the error is on Pipl's side."""
22 return not self.is_user_error
23
24 @classmethod
25 def from_dict(cls, d):
26 """Transform the dict to a error object and return the error."""
27 return cls(d.get('error'), d.get('@http_status_code'))
28
29 def to_dict(self):
30 """Return a dict representation of the error."""
31 return {'error': self.error, '@http_status_code': self.http_status_code}
32
0 import re
1 import datetime
2
3 from osrframework.thirdparties.pipl_com.lib.utils import *
4
5
6 __all__ = ['Name', 'Address', 'Phone', 'Email', 'Job', 'Education', 'Image',
7 'Username', 'UserID', 'DOB', 'RelatedURL', 'Relationship', 'Tag',
8 'DateRange']
9
10
11 class Field(Serializable):
12
13 """Base class of all data fields, made only for inheritance."""
14
15 attributes = ()
16 children = ('content',)
17
18 def __init__(self, valid_since=None):
19 self.valid_since = valid_since
20
21 def __setattr__(self, attr, value):
22 """Extend the default object.__setattr___ and make sure that str values
23 are converted to unicode and that assigning to the `type` attribute is
24 only from the allowed values.
25
26 Setting an str value for an attribute is impossible, if an str is
27 provided then it must be in utf8 encoding and it will be automatically
28 converted to a unicode object.
29
30 Example:
31 >>> from osrframework.thirdparties.pipl_com.lib.data import Name
32 >>> name = Name(first='eric')
33 >>> name.first
34 u'eric'
35
36 """
37 if isinstance(value, str):
38 try:
39 value = value.decode('utf8')
40 except UnicodeDecodeError:
41 raise ValueError('Tried to assign a non utf8 string to ' + attr)
42 if attr == 'type':
43 self.validate_type(value)
44 object.__setattr__(self, attr, value)
45
46 def __unicode__(self):
47 """Return the unicode representation of the object."""
48 children = list(self.children)
49 if 'raw' in children:
50 children.remove('raw')
51 values = [getattr(self, child) for child in children]
52 return u' '.join([unicode(val) for val in values if val is not None])
53
54 def __str__(self):
55 """Return the str representation of the object (encoded with utf8)."""
56 return unicode(self).encode('utf8')
57
58 def __repr__(self):
59 """Return a representation of the object (a valid value for eval())."""
60 attrs = list(self.attributes + self.children)
61 attrs.append('valid_since')
62 attrs_values = [(attr, getattr(self, attr)) for attr in attrs]
63 attrs_values = [(attr, value) if attr != 'type' else ('type_', value)
64 for attr, value in attrs_values]
65 args = ['%s=%s' % (attr, repr(value))
66 for attr, value in attrs_values if value is not None]
67 return '%s(%s)' % (self.__class__.__name__, ', '.join(args))
68
69 def __eq__(self, other):
70 """Bool, indicates whether `self` and `other` have exactly the same
71 data."""
72 return repr(self) == repr(other)
73
74 def validate_type(self, type_):
75 """Take an str/unicode `type_` and raise a ValueError if it's not
76 a valid type for the object.
77
78 A valid type for a field is a value from the types_set attribute of
79 that field's class.
80
81 """
82 if type_ is not None and type_ not in self.types_set:
83 raise ValueError('Invalid type for %s:%s' % (self.__class__, type_))
84
85 @classmethod
86 def from_dict(cls, d):
87 """Transform the dict to a field object and return the field."""
88 kwargs = {}
89 for key, val in d.iteritems():
90 if key.startswith('display'): # includes phone.display_international
91 continue
92 if key.startswith('@'):
93 key = key[1:]
94 if key == 'type':
95 key = 'type_'
96 elif key == 'valid_since':
97 val = str_to_datetime(val)
98 elif key == 'date_range':
99 val = DateRange.from_dict(val)
100 kwargs[key.encode('ascii')] = val
101 return cls(**kwargs)
102
103 def to_dict(self):
104 """Return a dict representation of the field."""
105 d = {}
106 if self.valid_since is not None:
107 d['@valid_since'] = datetime_to_str(self.valid_since)
108 for attr_list, prefix in [(self.attributes, '@'), (self.children, '')]:
109 for attr in attr_list:
110 value = getattr(self, attr)
111 if isinstance(value, Serializable):
112 value = value.to_dict()
113 if value or isinstance(value, (bool, int, long)):
114 d[prefix + attr] = value
115 if hasattr(self, 'display') and self.display:
116 d['display'] = self.display
117 return d
118
119
120 class Name(Field):
121
122 """A name of a person."""
123
124 attributes = ('type',)
125 children = ('prefix', 'first', 'middle', 'last', 'suffix', 'raw')
126 types_set = set(['present', 'maiden', 'former', 'alias'])
127
128 def __init__(self, prefix=None, first=None, middle=None, last=None,
129 suffix=None, raw=None, type_=None, valid_since=None):
130 """`prefix`, `first`, `middle`, `last`, `suffix`, `raw`, `type_`,
131 should all be unicode objects or utf8 encoded strs (will be decoded
132 automatically).
133
134 `raw` is an unparsed name like "Eric T Van Cartman", usefull when you
135 want to search by name and don't want to work hard to parse it.
136 Note that in response data there's never name.raw, the names in
137 the response are always parsed, this is only for querying with
138 an unparsed name.
139
140 `type_` is one of Name.types_set.
141
142 `valid_since` is a datetime.datetime object, it's the first time Pipl's
143 crawlers found this data on the page.
144
145 """
146 Field.__init__(self, valid_since)
147 self.prefix = prefix
148 self.first = first
149 self.middle = middle
150 self.last = last
151 self.suffix = suffix
152 self.raw = raw
153 self.type = type_
154
155 @property
156 def display(self):
157 """A unicode value with the object's data, to be used for displaying
158 the object in your application."""
159 return unicode(self)
160
161 @property
162 def is_searchable(self):
163 """A bool value that indicates whether the name is a valid name to
164 search by."""
165 first = alpha_chars(self.first or u'')
166 last = alpha_chars(self.last or u'')
167 raw = alpha_chars(self.raw or u'')
168 return (len(first) >= 2 and len(last) >= 2) or len(raw) >= 4
169
170
171 class Address(Field):
172
173 """An address of a person."""
174
175 attributes = ('type',)
176 children = ('country', 'state', 'city', 'po_box',
177 'street', 'house', 'apartment', 'raw')
178 types_set = set(['home', 'work', 'old'])
179
180 def __init__(self, country=None, state=None, city=None, po_box=None,
181 street=None, house=None, apartment=None, raw=None, type_=None,
182 valid_since=None):
183 """`country`, `state`, `city`, `po_box`, `street`, `house`, `apartment`,
184 `raw`, `type_`, should all be unicode objects or utf8 encoded strs
185 (will be decoded automatically).
186
187 `country` and `state` are country code (like "US") and state code
188 (like "NY"), note that the full value is available as
189 address.country_full and address.state_full.
190
191 `raw` is an unparsed address like "123 Marina Blvd, San Francisco,
192 California, US", usefull when you want to search by address and don't
193 want to work hard to parse it.
194 Note that in response data there's never address.raw, the addresses in
195 the response are always parsed, this is only for querying with
196 an unparsed address.
197
198 `type_` is one of Address.types_set.
199
200 `valid_since` is a datetime.datetime object, it's the first time Pipl's
201 crawlers found this data on the page.
202
203 """
204 Field.__init__(self, valid_since)
205 self.country = country
206 self.state = state
207 self.city = city
208 self.po_box = po_box
209 self.street = street
210 self.house = house
211 self.apartment = apartment
212 self.raw = raw
213 self.type = type_
214
215 @property
216 def display(self):
217 """A unicode value with the object's data, to be used for displaying
218 the object in your application."""
219 country = self.country if self.state else self.country_full
220 state = self.state if self.city else self.state_full
221 vals = (self.street, self.city, state, country)
222 disp = u', '.join(filter(None, vals))
223 if self.street and (self.house or self.apartment):
224 prefix = u'-'.join([val for val in (self.house, self.apartment)
225 if val])
226 disp = prefix + u' ' + (disp or u'')
227 if self.po_box and not self.street:
228 disp = u' '.join([u'P.O. Box', self.po_box, (disp or u'')])
229 return disp
230
231 @property
232 def is_searchable(self):
233 """A bool value that indicates whether the address is a valid address
234 to search by."""
235 return self.raw or (self.is_valid_country and
236 (not self.state or self.is_valid_state))
237
238 @property
239 def is_valid_country(self):
240 """A bool value that indicates whether the object's country is a valid
241 country code."""
242 return self.country is not None and self.country.upper() in COUNTRIES
243
244 @property
245 def is_valid_state(self):
246 """A bool value that indicates whether the object's state is a valid
247 state code."""
248 return self.is_valid_country and self.country.upper() in STATES and \
249 self.state is not None and \
250 self.state.upper() in STATES[self.country.upper()]
251
252 @property
253 def country_full(self):
254 """unicode, the full name of the object's country.
255
256 >>> address = Address(country='FR')
257 >>> address.country
258 u'FR'
259 >>> address.country_full
260 u'France'
261
262 """
263 if self.country:
264 return COUNTRIES.get(self.country.upper())
265
266 @property
267 def state_full(self):
268 """unicode, the full name of the object's state.
269
270 >>> address = Address(country='US', state='CO')
271 >>> address.state
272 u'CO'
273 >>> address.state_full
274 u'Colorado'
275
276 """
277
278 if self.is_valid_state:
279 return STATES[self.country.upper()].get(self.state.upper())
280
281
282 class Phone(Field):
283
284 """A phone number of a person."""
285
286 attributes = ('type',)
287 children = ('country_code', 'number', 'extension')
288 types_set = set(['mobile', 'home_phone', 'home_fax', 'work_phone',
289 'work_fax', 'pager'])
290
291 def __init__(self, country_code=None, number=None, extension=None,
292 type_=None, valid_since=None):
293 """`country_code`, `number` and `extension` should all be int/long.
294
295 `type_` is one of Phone.types_set.
296
297 `valid_since` is a datetime.datetime object, it's the first time Pipl's
298 crawlers found this data on the page.
299
300 """
301 Field.__init__(self, valid_since)
302 self.country_code = country_code
303 self.number = number
304 self.extension = extension
305 self.type = type_
306 # The two following display attributes are available when working with
307 # a response from the API, both hold unicode values that can be used to
308 # display the phone in your application.
309 # Note that in other fields the display attribute is a property, this
310 # is not the case here since generating the display for a phone is
311 # country specific and requires a special library.
312 self.display = u''
313 self.display_international = u''
314
315 @property
316 def is_searchable(self):
317 """A bool value that indicates whether the phone is a valid phone
318 to search by."""
319 return self.number is not None and \
320 (not self.country_code or self.country_code == 1)
321
322 @staticmethod
323 def from_text(text):
324 """Strip `text` (unicode/str) from all non-digit chars and return a new
325 Phone object with the number from text.
326
327 >>> phone = Phone.from_text('(888) 777-666')
328 >>> phone.number
329 888777666
330
331 """
332 number = int(filter(unicode.isdigit, unicode(text)))
333 return Phone(number=number)
334
335 @classmethod
336 def from_dict(cls, d):
337 """Extend Field.from_dict, set display/display_international
338 attributes."""
339 phone = super(cls, cls).from_dict(d)
340 phone.display = d.get('display', u'')
341 phone.display_international = d.get('display_international', u'')
342 return phone
343
344 def to_dict(self):
345 """Extend Field.to_dict, take the display_international attribute."""
346 d = Field.to_dict(self)
347 if self.display_international:
348 d['display_international'] = self.display_international
349 return d
350
351
352 class Email(Field):
353
354 """An email address of a person with the md5 of the address, might come
355 in some cases without the address itself and just the md5 (for privacy
356 reasons).
357
358 """
359
360 attributes = ('type',)
361 children = ('address', 'address_md5')
362 types_set = set(['personal', 'work'])
363 re_email = re.compile('^[\w.%\-+]+@[\w.%\-]+\.[a-zA-Z]{2,6}$')
364
365 def __init__(self, address=None, address_md5=None, type_=None,
366 valid_since=None):
367 """`address`, `address_md5`, `type_` should be unicode objects or utf8
368 encoded strs (will be decoded automatically).
369
370 `type_` is one of Email.types_set.
371
372 `valid_since` is a datetime.datetime object, it's the first time Pipl's
373 crawlers found this data on the page.
374
375 """
376 Field.__init__(self, valid_since)
377 self.address = address
378 self.address_md5 = address_md5
379 self.type = type_
380
381 @property
382 def is_valid_email(self):
383 """A bool value that indicates whether the address is a valid
384 email address.
385
386 Note that the check is done be matching to the regular expression
387 at Email.re_email which is very basic and far from covering end-cases...
388
389 """
390 return bool(self.address and Email.re_email.match(self.address))
391
392 @property
393 def is_searchable(self):
394 """A bool value that indicates whether the email is a valid email
395 to search by."""
396 return self.is_valid_email
397
398 @property
399 def username(self):
400 """unicode, the username part of the email or None if the email is
401 invalid.
402
403 >>> email = Email(address='[email protected]')
404 >>> email.username
405 u'eric'
406
407 """
408 if not self.is_valid_email:
409 return
410 return self.address.split('@')[0]
411
412 @property
413 def domain(self):
414 """unicode, the domain part of the email or None if the email is
415 invalid.
416
417 >>> email = Email(address='[email protected]')
418 >>> email.domain
419 u'cartman.com'
420
421 """
422 if not self.is_valid_email:
423 return
424 return self.address.split('@')[1]
425
426
427 class Job(Field):
428
429 """Job information of a person."""
430
431 children = ('title', 'organization', 'industry', 'date_range')
432
433 def __init__(self, title=None, organization=None, industry=None,
434 date_range=None, valid_since=None):
435 """`title`, `organization`, `industry`, should all be unicode objects
436 or utf8 encoded strs (will be decoded automatically).
437
438 `date_range` is A DateRange object (osrframework.thirdparties.pipl_com.lib.fields.DateRange),
439 that's the time the person held this job.
440
441 `valid_since` is a datetime.datetime object, it's the first time Pipl's
442 crawlers found this data on the page.
443
444 """
445 Field.__init__(self, valid_since)
446 self.title = title
447 self.organization = organization
448 self.industry = industry
449 self.date_range = date_range
450
451 @property
452 def display(self):
453 """A unicode value with the object's data, to be used for displaying
454 the object in your application."""
455 if self.title and self.organization:
456 disp = self.title + u' at ' + self.organization
457 else:
458 disp = self.title or self.organization or None
459 if disp and self.industry:
460 if self.date_range is not None:
461 disp += u' (%s, %d-%d)' % ((self.industry,) + \
462 self.date_range.years_range)
463 else:
464 disp += u' (%s)' % self.industry
465 else:
466 disp = ((disp or u'') + u' ' + (self.industry or u'')).strip()
467 if disp and self.date_range is not None:
468 disp += u' (%d-%d)' % self.date_range.years_range
469 return disp
470
471
472 class Education(Field):
473
474 """Education information of a person."""
475
476 children = ('degree', 'school', 'date_range')
477
478 def __init__(self, degree=None, school=None, date_range=None,
479 valid_since=None):
480 """`degree` and `school` should both be unicode objects or utf8 encoded
481 strs (will be decoded automatically).
482
483 `date_range` is A DateRange object (osrframework.thirdparties.pipl_com.lib.fields.DateRange),
484 that's the time the person was studying.
485
486 `valid_since` is a datetime.datetime object, it's the first time Pipl's
487 crawlers found this data on the page.
488
489 """
490 Field.__init__(self, valid_since)
491 self.degree = degree
492 self.school = school
493 self.date_range = date_range
494
495 @property
496 def display(self):
497 """A unicode value with the object's data, to be used for displaying
498 the object in your application."""
499 if self.degree and self.school:
500 disp = self.degree + u' from ' + self.school
501 else:
502 disp = self.degree or self.school or None
503 if disp is not None and self.date_range is not None:
504 disp += u' (%d-%d)' % self.date_range.years_range
505 return disp or u''
506
507
508 class Image(Field):
509
510 """A URL of an image of a person."""
511
512 children = ('url',)
513
514 def __init__(self, url=None, valid_since=None):
515 """`url` should be a unicode object or utf8 encoded str (will be decoded
516 automatically).
517
518 `valid_since` is a datetime.datetime object, it's the first time Pipl's
519 crawlers found this data on the page.
520
521 """
522 Field.__init__(self, valid_since)
523 self.url = url
524
525 @property
526 def is_valid_url(self):
527 """A bool value that indicates whether the image URL is a valid URL."""
528 return bool(self.url and is_valid_url(self.url))
529
530
531 class Username(Field):
532
533 """A username/screen-name associated with the person.
534
535 Note that even though in many sites the username uniquely identifies one
536 person it's not guarenteed, some sites allow different people to use the
537 same username.
538
539 """
540
541 def __init__(self, content=None, valid_since=None):
542 """`content` is the username itself, it should be a unicode object or
543 a utf8 encoded str (will be decoded automatically).
544
545 `valid_since` is a datetime.datetime object, it's the first time Pipl's
546 crawlers found this data on the page.
547
548 """
549 Field.__init__(self, valid_since)
550 self.content = content
551
552 @property
553 def is_searchable(self):
554 """A bool value that indicates whether the username is a valid username
555 to search by."""
556 return len(alnum_chars(self.content or u'')) >= 4
557
558
559 class UserID(Field):
560
561 """An ID associated with a person.
562
563 The ID is a string that's used by the site to uniquely identify a person,
564 it's guaranteed that in the site this string identifies exactly one person.
565
566 """
567
568 def __init__(self, content=None, valid_since=None):
569 """`content` is the ID itself, it should be a unicode object or a utf8
570 encoded str (will be decoded automatically).
571
572 `valid_since` is a datetime.datetime object, it's the first time Pipl's
573 crawlers found this data on the page.
574
575 """
576 Field.__init__(self, valid_since)
577 self.content = content
578
579
580 class DOB(Field):
581
582 """Date-of-birth of A person.
583 Comes as a date-range (the exact date is within the range, if the exact
584 date is known the range will simply be with start=end).
585
586 """
587
588 children = ('date_range',)
589
590 def __init__(self, date_range=None, valid_since=None):
591 """`date_range` is A DateRange object (osrframework.thirdparties.pipl_com.lib.fields.DateRange),
592 the date-of-birth is within this range.
593
594 `valid_since` is a datetime.datetime object, it's the first time Pipl's
595 crawlers found this data on the page.
596
597 """
598 Field.__init__(self, valid_since)
599 self.date_range = date_range
600
601 @property
602 def display(self):
603 """A unicode value with the object's data, to be used for displaying
604 the object in your application.
605
606 Note: in a DOB object the display is the estimated age.
607
608 """
609 if self.age is None:
610 return u''
611 return unicode(self.age)
612
613 @property
614 def is_searchable(self):
615 return self.date_range is not None
616
617 @property
618 def age(self):
619 """int, the estimated age of the person.
620
621 Note that A DOB object is based on a date-range and the exact date is
622 usually unknown so for age calculation the the middle of the range is
623 assumed to be the real date-of-birth.
624
625 """
626 if self.date_range is None:
627 return
628 dob = self.date_range.middle
629 today = datetime.date.today()
630 if (today.month, today.day) < (dob.month, dob.day):
631 return today.year - dob.year - 1
632 else:
633 return today.year - dob.year
634
635 @property
636 def age_range(self):
637 """A tuple of two ints - the minimum and maximum age of the person."""
638 if self.date_range is None:
639 return None, None
640 start_date = DateRange(self.date_range.start, self.date_range.start)
641 end_date = DateRange(self.date_range.end, self.date_range.end)
642 start_age = DOB(date_range=end_date).age
643 end_age = DOB(date_range=start_date).age
644 return start_age, end_age
645
646 @staticmethod
647 def from_birth_year(birth_year):
648 """Take a person's birth year (int) and return a new DOB object
649 suitable for him."""
650 if birth_year <= 0:
651 raise ValueError('birth_year must be positive')
652 date_range = DateRange.from_years_range(birth_year, birth_year)
653 return DOB(date_range=date_range)
654
655 @staticmethod
656 def from_birth_date(birth_date):
657 """Take a person's birth date (datetime.date) and return a new DOB
658 object suitable for him."""
659 if birth_date > datetime.date.today():
660 raise ValueError('birth_date can\'t be in the future')
661 date_range = DateRange(birth_date, birth_date)
662 return DOB(date_range=date_range)
663
664 @staticmethod
665 def from_age(age):
666 """Take a person's age (int) and return a new DOB object
667 suitable for him."""
668 return DOB.from_age_range(age, age)
669
670 @staticmethod
671 def from_age_range(start_age, end_age):
672 """Take a person's minimal and maximal age and return a new DOB object
673 suitable for him."""
674 if start_age < 0 or end_age < 0:
675 raise ValueError('start_age and end_age can\'t be negative')
676
677 if start_age > end_age:
678 start_age, end_age = end_age, start_age
679
680 today = datetime.date.today()
681
682 try:
683 start_date = today.replace(year=today.year - end_age - 1)
684 except ValueError: # February 29
685 start_date = today.replace(year=today.year - end_age - 1, day=28)
686 start_date += datetime.timedelta(days=1)
687
688 try:
689 end_date = today.replace(year=today.year - start_age)
690 except ValueError: # February 29
691 end_date = today.replace(year=today.year - start_age, day=28)
692
693 date_range = DateRange(start_date, end_date)
694 return DOB(date_range=date_range)
695
696
697 class RelatedURL(Field):
698
699 """A URL that's related to a person (blog, personal page in the work
700 website, profile in some other website).
701
702 IMPORTANT: This URL is NOT the origin of the data about the person, it's
703 just an extra piece of information available on him.
704
705 """
706
707 attributes = ('type',)
708 types_set = set(['personal', 'work', 'blog'])
709
710 def __init__(self, content=None, type_=None, valid_since=None):
711 """`content` is the URL address itself, both content and type_ should
712 be unicode objects or utf8 encoded strs (will be decoded automatically).
713
714 `type_` is one of RelatedURL.types_set.
715
716 `valid_since` is a datetime.datetime object, it's the first time Pipl's
717 crawlers found this data on the page.
718
719 """
720 Field.__init__(self, valid_since)
721 self.content = content
722 self.type = type_
723
724 @property
725 def is_valid_url(self):
726 """A bool value that indicates whether the URL is a valid URL."""
727 return bool(self.content and is_valid_url(self.content))
728
729
730 class Relationship(Field):
731
732 """Name of another person related to this person."""
733
734 attributes = ('type', 'subtype')
735 children = ('name',)
736 types_set = set(['friend', 'family', 'work', 'other'])
737
738 def __init__(self, name=None, type_=None, subtype=None,
739 valid_since=None):
740 """`name` is a Name object (osrframework.thirdparties.pipl_com.lib.fields.Name).
741
742 `type_` and `subtype` should both be unicode objects or utf8 encoded
743 strs (will be decoded automatically).
744
745 `type_` is one of RelatedURL.types_set.
746
747 `subtype` is not restricted to a specific list of possible values (for
748 example, if type_ is "family" then subtype can be "Father", "Mother",
749 "Son" and many other things).
750
751 `valid_since` is a datetime.datetime object, it's the first time Pipl's
752 crawlers found this data on the page.
753
754 """
755 Field.__init__(self, valid_since)
756 self.name = name
757 self.type = type_
758 self.subtype = subtype
759
760 @classmethod
761 def from_dict(cls, d):
762 """Extend Field.from_dict and also load the name from the dict."""
763 relationship = super(cls, cls).from_dict(d)
764 if relationship.name is not None:
765 relationship.name = Name.from_dict(relationship.name)
766 return relationship
767
768
769 class Tag(Field):
770
771 """A general purpose element that holds any meaningful string that's
772 related to the person.
773 Used for holding data about the person that either couldn't be clearly
774 classified or was classified as something different than the available
775 data fields.
776
777 """
778
779 attributes = ('classification',)
780
781 def __init__(self, content=None, classification=None, valid_since=None):
782 """`content` is the tag itself, both `content` and `classification`
783 should be unicode objects or utf8 encoded strs (will be decoded
784 automatically).
785
786 `valid_since` is a datetime.datetime object, it's the first time Pipl's
787 crawlers found this data on the page.
788
789 """
790 Field.__init__(self, valid_since)
791 self.content = content
792 self.classification = classification
793
794
795 class DateRange(Serializable):
796
797 """A time intervel represented as a range of two dates.
798
799 DateRange objects are used inside DOB, Job and Education objects.
800
801 """
802
803 def __init__(self, start, end):
804 """`start` and `end` are datetime.date objects, both are required.
805
806 For creating a DateRange object for an exact date (like if exact
807 date-of-birth is known) just pass the same value for `start` and `end`.
808
809 """
810 if start > end:
811 start, end = end, start
812 self.start = start
813 self.end = end
814
815 def __unicode__(self):
816 """Return the unicode representation of the object."""
817 return u' - '.join([unicode(self.start), unicode(self.end)])
818
819 def __repr__(self):
820 """Return a representation of the object (a valid value for eval())."""
821 return 'DateRange(%s, %s)' % (repr(self.start), repr(self.end))
822
823 def __eq__(self, other):
824 """Bool, indicates whether `self` and `other` have exactly the same
825 start date and end date."""
826 return repr(self) == repr(other)
827
828 @property
829 def is_exact(self):
830 """True if the object holds an exact date (start=end),
831 False otherwise."""
832 return self.start == self.end
833
834 @property
835 def middle(self):
836 """The middle of the date range (a datetime.date object)."""
837 return self.start + (self.end - self.start) / 2
838
839 @property
840 def years_range(self):
841 """A tuple of two ints - the year of the start date and the year of the
842 end date."""
843 return self.start.year, self.end.year
844
845 @staticmethod
846 def from_years_range(start_year, end_year):
847 """Transform a range of years (two ints) to a DateRange object."""
848 start = datetime.date(start_year, 1 , 1)
849 end = datetime.date(end_year, 12 , 31)
850 return DateRange(start, end)
851
852 @staticmethod
853 def from_dict(d):
854 """Transform the dict to a DateRange object."""
855 start = d.get('start')
856 end = d.get('end')
857 if not (start and end):
858 raise ValueError('DateRange must have both start and end')
859 start = str_to_date(start)
860 end = str_to_date(end)
861 return DateRange(start, end)
862
863 def to_dict(self):
864 """Transform the date-range to a dict."""
865 d = {}
866 d['start'] = date_to_str(self.start)
867 d['end'] = date_to_str(self.end)
868 return d
869
0 """Python wrapper for easily making calls to Pipl's Search API.
1
2 Pipl's Search API allows you to query with the information you have about
3 a person (his name, address, email, phone, username and more) and in response
4 get all the data available on him on the web.
5
6 The classes contained in this module are:
7 - SearchAPIRequest -- Build your request and send it.
8 - SearchAPIResponse -- Holds the response from the API in case it contains data.
9 - SearchAPIError -- An exception raised when the API response is an error.
10
11 The classes are based on the person data-model that's implemented here in the
12 sub-package osrframework.thirdparties.pipl_com.lib.
13
14 """
15 import urllib
16 import urllib2
17 import itertools
18 import threading
19
20 import osrframework.thirdparties.pipl_com
21 from osrframework.thirdparties.pipl_com.lib.error import APIError
22 from osrframework.thirdparties.pipl_com.lib import *
23 from osrframework.thirdparties.pipl_com.lib.utils import Serializable
24
25
26 # Default API key value, you can set your key globally in this variable instead
27 # of passing it to each request object.
28 # >>> import osrframework.thirdparties.pipl_com.lib.search
29 # >>> osrframework.thirdparties.pipl_com.lib.search.default_api_key = '<your_key>'
30 default_api_key = None
31
32
33 class SearchAPIRequest(object):
34
35 """A request to Pipl's Search API.
36
37 Building the request from the query parameters can be done in two ways:
38
39 Option 1 - directly and quickly (for simple requests with only few
40 parameters):
41
42 >>> from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest
43 >>> request = SearchAPIRequest(api_key='samplekey',
44 email='[email protected]')
45 >>> response = request.send()
46
47 Option 2 - using the data-model (useful for more complex queries; for
48 example, when there are multiple parameters of the same type
49 such as few phones or a few addresses or when you'd like to use
50 information beyond the usual identifiers such as name or email,
51 information like education, job, relationships etc):
52
53 >>> from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest
54 >>> from osrframework.thirdparties.pipl_com.lib import Person, Name, Address, Job
55 >>> fields = [Name(first='Eric', last='Cartman'),
56 Address(country='US', state='CO', city='South Park'),
57 Address(country='US', state='NY'),
58 Job(title='Actor')]
59 >>> request = SearchAPIRequest(api_key='samplekey',
60 person=Person(fields=fields))
61 >>> response = request.send()
62
63 The request also supports prioritizing/filtering the type of records you
64 prefer to get in the response (see the append_priority_rule and
65 add_records_filter methods).
66
67 Sending the request and getting the response is very simple and can be done
68 by either making a blocking call to request.send() or by making
69 a non-blocking call to request.send_async(callback) which sends the request
70 asynchronously.
71
72 """
73
74 HEADERS = {'User-Agent': 'osrframework.thirdparties.pipl_com/python/%s' % osrframework.thirdparties.pipl_com.lib.__version__}
75 BASE_URL = 'http://api.pipl.com/search/v3/json/?'
76 # HTTPS is also supported:
77 #BASE_URL = 'https://api.pipl.com/search/v3/json/?'
78
79 def __init__(self, api_key=None, first_name=None, middle_name=None,
80 last_name=None, raw_name=None, email=None, phone=None,
81 username=None, country=None, state=None, city=None,
82 raw_address=None, from_age=None, to_age=None, person=None,
83 query_params_mode='and', exact_name=False):
84 """Initiate a new request object with given query params.
85
86 Each request must have at least one searchable parameter, meaning
87 a name (at least first and last name), email, phone or username.
88 Multiple query params are possible (for example querying by both email
89 and phone of the person).
90
91 Args:
92
93 api_key -- str, a valid API key (use "samplekey" for experimenting).
94 Note that you can set a default API key
95 (osrframework.thirdparties.pipl_com.lib.search.default_api_key = '<your_key>') instead of
96 passing it to each request object.
97 first_name -- unicode, minimum 2 chars.
98 middle_name -- unicode.
99 last_name -- unicode, minimum 2 chars.
100 raw_name -- unicode, an unparsed name containing at least a first name
101 and a last name.
102 email -- unicode.
103 phone -- int/long. If a unicode/str is passed instead then it'll be
104 striped from all non-digit characters and converted to int.
105 IMPORTANT: Currently only US/Canada phones can be searched by
106 so country code is assumed to be 1, phones with different
107 country codes are considered invalid and will be ignored.
108 username -- unicode, minimum 4 chars.
109 country -- unicode, a 2 letter country code from:
110 http://en.wikipedia.org/wiki/ISO_3166-2
111 state -- unicode, a state code from:
112 http://en.wikipedia.org/wiki/ISO_3166-2%3AUS
113 http://en.wikipedia.org/wiki/ISO_3166-2%3ACA
114 city -- unicode.
115 raw_address -- unicode, an unparsed address.
116 from_age -- int.
117 to_age -- int.
118 person -- A Person object (available at osrframework.thirdparties.pipl_com.lib.Person).
119 The person can contain every field allowed by the data-model
120 (see osrframework.thirdparties.pipl_com.lib.fields) and can hold multiple fields of
121 the same type (for example: two emails, three addresses etc.)
122 query_params_mode -- str, one of "and"/"or" (default "and").
123 Advanced parameter, use only if you care about the
124 value of record.query_params_match in the response
125 records.
126 Each record in the response has an attribute
127 "query_params_match" which indicates whether the
128 record has the all fields from the query or not.
129 When set to "and" all query params are required in
130 order to get query_params_match=True, when set to
131 "or" it's enough that the record has at least one
132 of each field type (so if you search with a name
133 and two addresses, a record with the name and one
134 of the addresses will have query_params_match=True)
135 exact_name -- bool (default False).
136 If set to True the names in the query will be matched
137 "as is" without compensating for nicknames or multiple
138 family names. For example "Jane Brown-Smith" won't return
139 results for "Jane Brown" in the same way "Alexandra Pitt"
140 won't return results for "Alex Pitt".
141
142 Each of the arguments that should have a unicode value accepts both
143 unicode objects and utf8 encoded str (will be decoded automatically).
144
145 """
146 if person is None:
147 person = Person()
148 if first_name or middle_name or last_name:
149 name = Name(first=first_name, middle=middle_name, last=last_name)
150 person.add_fields([name])
151 if raw_name:
152 person.add_fields([Name(raw=raw_name)])
153 if email:
154 person.add_fields([Email(address=email)])
155 if phone:
156 if isinstance(phone, basestring):
157 person.add_fields([Phone.from_text(phone)])
158 else:
159 person.add_fields([Phone(number=phone)])
160 if username:
161 person.add_fields([Username(content=username)])
162 if country or state or city:
163 address = Address(country=country, state=state, city=city)
164 person.add_fields([address])
165 if raw_address:
166 person.add_fields([Address(raw=raw_address)])
167 if from_age is not None or to_age is not None:
168 dob = DOB.from_age_range(from_age or 0, to_age or 1000)
169 person.add_fields([dob])
170
171 self.api_key = api_key
172 self.person = person
173 self.query_params_mode = query_params_mode
174 self.exact_name = exact_name
175 self._filter_records_by = []
176 self._prioritize_records_by = []
177
178 @staticmethod
179 def _prepare_filtering_params(domain=None, category=None,
180 sponsored_source=None, has_field=None,
181 has_fields=None, query_params_match=None,
182 query_person_match=None, **kwargs):
183 """Transform the params to the API format, return a list of params."""
184 if query_params_match not in (None, True):
185 raise ValueError('query_params_match can only be `True`')
186 if query_person_match not in (None, True):
187 raise ValueError('query_person_match can only be `True`')
188
189 params = []
190 if domain is not None:
191 params.append('domain:%s' % domain)
192 if category is not None:
193 Source.validate_categories([category])
194 params.append('category:%s' % category)
195 if sponsored_source is not None:
196 params.append('sponsored_source:%s' % sponsored_source)
197 if query_params_match is not None:
198 params.append('query_params_match')
199 if query_person_match is not None:
200 params.append('query_person_match')
201 has_fields = has_fields or []
202 if has_field is not None:
203 has_fields.append(has_field)
204 for has_field in has_fields:
205 params.append('has_field:%s' % has_field.__name__)
206 return params
207
208 def add_records_filter(self, domain=None, category=None,
209 sponsored_source=None, has_fields=None,
210 query_params_match=None, query_person_match=None):
211 """Add a new "and" filter for the records returned in the response.
212
213 IMPORTANT: This method can be called multiple times per request for
214 adding multiple "and" filters, each of these "and" filters is
215 interpreted as "or" with the other filters.
216 For example:
217
218 >>> from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest
219 >>> from osrframework.thirdparties.pipl_com.lib import Phone, Job
220 >>> request = SearchAPIRequest('samplekey', username='eric123')
221 >>> request.add_records_filter(domain='linkedin', has_fields=[Phone])
222 >>> request.add_records_filter(has_fields=[Phone, Job])
223
224 The above request is only for records that are:
225 (from LinkedIn AND has a phone) OR (has a phone AND has a job).
226 Records that don't match this rule will not come back in the response.
227
228 Please note that in case there are too many results for the query,
229 adding filters to the request can significantly improve the number of
230 useful results; when you define which records interest you, you'll
231 get records that would have otherwise be cut-off by the limit on the
232 number of records per query.
233
234 Args:
235
236 domain -- str, for example "linkedin.com", you may also use "linkedin"
237 but note that it'll match "linkedin.*" and "*.linkedin.*"
238 (any sub-domain and any TLD).
239 category -- str, any one of the categories defined in
240 osrframework.thirdparties.pipl_com.lib.source.Source.categories.
241 sponsored_source -- bool, True means you want just the records that
242 come from a sponsored source and False means you
243 don't want these records.
244 has_fields -- A list of fields classes from osrframework.thirdparties.pipl_com.lib.fields,
245 records must have content in all these fields.
246 For example: [Name, Phone] means you only want records
247 that has at least one name and at least one phone.
248 query_params_match -- True is the only possible value and it means you
249 want records that match all the params you passed
250 in the query.
251 query_person_match -- True is the only possible value and it means you
252 want records that are the same person you
253 queried by (only records with
254 query_person_match == 1.0, see the documentation
255 of record.query_person_match for more details).
256
257 ValueError is raised in any case of an invalid parameter.
258
259 """
260 params = SearchAPIRequest._prepare_filtering_params(**locals())
261 if params:
262 self._filter_records_by.append(' AND '.join(params))
263
264 def append_priority_rule(self, domain=None, category=None,
265 sponsored_source=None, has_field=None,
266 query_params_match=None, query_person_match=None):
267 """Append a new priority rule for the records returned in the response.
268
269 IMPORTANT: This method can be called multiple times per request for
270 adding multiple priority rules, each call can be with only one argument
271 and the order of the calls matter (the first rule added is the highest
272 priority, the second is second priority etc).
273 For example:
274
275 >>> from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest
276 >>> from osrframework.thirdparties.pipl_com.lib import Phone
277 >>> request = SearchAPIRequest('samplekey', username='eric123')
278 >>> request.append_priority_rule(domain='linkedin')
279 >>> request.append_priority_rule(has_field=Phone)
280
281 In the response to the above request records from LinkedIn will be
282 returned before records that aren't from LinkedIn and records with
283 phone will be returned before records without phone.
284
285 Please note that in case there are too many results for the query,
286 adding priority rules to the request does not only affect the order
287 of the records but can significantly improve the number of useful
288 results; when you define which records interest you, you'll get records
289 that would have otherwise be cut-off by the limit on the number
290 of records per query.
291
292 Args:
293
294 domain -- str, for example "linkedin.com", "linkedin" is also possible
295 and it'll match "linkedin.*".
296 category -- str, any one of the categories defined in
297 osrframework.thirdparties.pipl_com.lib.source.Source.categories.
298 sponsored_source -- bool, True will bring the records that
299 come from a sponsored source first and False
300 will bring the non-sponsored records first.
301 has_fields -- A field class from osrframework.thirdparties.pipl_com.lib.fields.
302 For example: has_field=Phone means you want to give
303 a priority to records that has at least one phone.
304 query_params_match -- True is the only possible value and it means you
305 want to give a priority to records that match all
306 the params you passed in the query.
307 query_person_match -- True is the only possible value and it means you
308 want to give a priority to records with higher
309 query_person_match (see the documentation of
310 record.query_person_match for more details).
311
312 ValueError is raised in any case of an invalid parameter.
313
314 """
315 params = SearchAPIRequest._prepare_filtering_params(**locals())
316 if len(params) > 1:
317 raise ValueError('The function should be called with one argument')
318 if params:
319 self._prioritize_records_by.append(params[0])
320
321 def validate_query_params(self, strict=True):
322 """Check if the request is valid and can be sent, raise ValueError if
323 not.
324
325 `strict` is a boolean argument that defaults to True which means an
326 exception is raised on every invalid query parameter, if set to False
327 an exception is raised only when the search request cannot be performed
328 because required query params are missing.
329
330 """
331 if not (self.api_key or default_api_key):
332 raise ValueError('API key is missing')
333 if strict and self.query_params_mode not in (None, 'and', 'or'):
334 raise ValueError('query_params_match should be one of "and"/"or"')
335 if not self.person.is_searchable:
336 raise ValueError('No valid name/username/phone/email in request')
337 if strict and self.person.unsearchable_fields:
338 raise ValueError('Some fields are unsearchable: %s'
339 % self.person.unsearchable_fields)
340
341 @property
342 def url(self):
343 """The URL of the request (str)."""
344 query = {
345 'key': self.api_key or default_api_key,
346 'person': self.person.to_json(),
347 'query_params_mode': self.query_params_mode,
348 'exact_name': self.exact_name,
349 'prioritize_records_by': ','.join(self._prioritize_records_by),
350 'filter_records_by': self._filter_records_by,
351 }
352 return SearchAPIRequest.BASE_URL + urllib.urlencode(query, doseq=True)
353
354 def send(self, strict_validation=True):
355 """Send the request and return the response or raise SearchAPIError.
356
357 Calling this method blocks the program until the response is returned,
358 if you want the request to be sent asynchronously please refer to the
359 send_async method.
360
361 The response is returned as a SearchAPIResponse object.
362
363 `strict_vailidation` is a bool argument that's passed to the
364 validate_query_params method.
365
366 Raises ValueError (raised from validate_query_params),
367 HttpError/URLError and SearchAPIError (when the response is returned
368 but contains an error).
369
370 Example:
371
372 >>> from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest, SearchAPIError
373 >>> request = SearchAPIRequest('samplekey', email='[email protected]')
374 >>> try:
375 ... response = request.send()
376 ... except SearchAPIError as e:
377 ... print e.http_status_code, e
378
379 """
380 self.validate_query_params(strict=strict_validation)
381 query = {
382 'key': self.api_key or default_api_key,
383 'person': self.person.to_json(),
384 'query_params_mode': self.query_params_mode,
385 'exact_name': self.exact_name,
386 'prioritize_records_by': ','.join(self._prioritize_records_by),
387 'filter_records_by': self._filter_records_by,
388 }
389 request = urllib2.Request(url=SearchAPIRequest.BASE_URL, data=urllib.urlencode(query, True), headers=SearchAPIRequest.HEADERS)
390 try:
391 json_response = urllib2.urlopen(request).read()
392 except urllib2.HTTPError as e:
393 json_error = e.read()
394 if not json_error:
395 raise e
396 try:
397 raise SearchAPIError.from_json(json_error)
398 except ValueError:
399 raise e
400 return SearchAPIResponse.from_json(json_response)
401
402 def send_async(self, callback, strict_validation=True):
403 """Same as send() but in a non-blocking way.
404
405 Use this method if you want to send the request asynchronously so your
406 program can do other things while waiting for the response.
407
408 `callback` is a function (or other callable) with the following
409 signature:
410 callback(response=None, error=None)
411
412 Example:
413
414 >>> from osrframework.thirdparties.pipl_com.lib.search import SearchAPIRequest
415 >>>
416 >>> def my_callback(response=None, error=None):
417 ... print response or error
418 ...
419 >>> request = SearchAPIRequest('samplekey', email='[email protected]')
420 >>> request.send_async(my_callback)
421 >>> do_other_things()
422
423 """
424 def target():
425 try:
426 response = self.send(strict_validation)
427 callback(response=response)
428 except Exception as e:
429 callback(error=e)
430 threading.Thread(target=target).start()
431
432
433 class SearchAPIResponse(Serializable):
434
435 """A response from Pipl's Search API.
436
437 A response comprises the two things returned as a result to your query:
438
439 - A person (osrframework.thirdparties.pipl_com.lib.containers.Person) that is the deta object
440 representing all the information available for the person you were
441 looking for.
442 This object will only be returned when our identity-resolution engine is
443 convinced that the information is of the person represented by your query.
444 Obviously, if the query was for "John Smith" there's no way for our
445 identity-resolution engine to know which of the hundreds of thousands of
446 people named John Smith you were referring to, therefore you can expect
447 that the response will not contain a person object.
448 On the other hand, if you search by a unique identifier such as email or
449 a combination of identifiers that only lead to one person, such as
450 "Eric Cartman, Age 22, From South Park, CO, US", you can expect to get
451 a response containing a single person object.
452
453 - A list of records (osrframework.thirdparties.pipl_com.lib.containers.Record) that fully/partially
454 match the person from your query, if the query was for "Eric Cartman from
455 Colorado US" the response might also contain records of "Eric Cartman
456 from US" (without Colorado), if you need to differentiate between records
457 with full match to the query and partial match or if you want to get a
458 score on how likely is that record to be related to the person you are
459 searching please refer to the record's attributes
460 record.query_params_match and record.query_person_match.
461
462 The response also contains the query as it was interpreted by Pipl. This
463 part is useful for verification and debugging, if some query parameters
464 were invalid you can see in response.query that they were ignored, you can
465 also see how the name/address from your query were parsed in case you
466 passed raw_name/raw_address in the query.
467
468 In some cases when the query isn't focused enough and can't be matched to
469 a specific person, such as "John Smith from US", the response also contains
470 a list of suggested searches. This is a list of Record objects, each of
471 these is an expansion of the original query, giving additional query
472 parameters so the you can zoom in on the right person.
473
474 """
475
476 def __init__(self, query=None, person=None, records=None,
477 suggested_searches=None, warnings_=None):
478 """Args:
479
480 query -- A Person object with the query as interpreted by Pipl.
481 person -- A Person object with data about the person in the query.
482 records -- A list of Record objects with full/partial match to the
483 query.
484 suggested_searches -- A list of Record objects, each of these is an
485 expansion of the original query, giving additional
486 query parameters to zoom in on the right person.
487 warnings_ -- A list of unicodes. A warning is returned when the query
488 contains a non-critical error and the search can still run.
489
490 """
491 self.query = query
492 self.person = person
493 self.records = records or []
494 self.suggested_searches = suggested_searches or []
495 self.warnings = warnings_ or []
496
497 @property
498 def query_params_matched_records(self):
499 """Records that match all the params in the query."""
500 return [rec for rec in self.records if rec.query_params_match]
501
502 @property
503 def query_person_matched_records(self):
504 """Records that match the person from the query.
505
506 Note that the meaning of "match the person from the query" means "Pipl
507 is convinced that these records hold data about the person you're
508 looking for".
509 Remember that when Pipl is convinced about which person you're looking
510 for, the response also contains a Person object. This person is
511 created by merging all the fields and sources of these records.
512
513 """
514 return [rec for rec in self.records if rec.query_person_match == 1.]
515
516 def group_records(self, key_function):
517 """Return a dict with the records grouped by the key returned by
518 `key_function`.
519
520 `key_function` takes a record and returns the value from the record to
521 group by (see examples in the group_records_by_* methods below).
522
523 The return value is a dict, a key in this dict is a key returned by
524 `key_function` and the value is a list of all the records with this key.
525
526 """
527 sorted_records = sorted(self.records, key=key_function)
528 grouped_records = itertools.groupby(sorted_records, key=key_function)
529 return dict([(key, list(group)) for key, group in grouped_records])
530
531 def group_records_by_domain(self):
532 """Return the records grouped by the domain they came from.
533
534 The return value is a dict, a key in this dict is a domain
535 and the value is a list of all the records with this domain.
536
537 """
538 key_function = lambda record: record.source.domain
539 return self.group_records(key_function)
540
541 def group_records_by_category(self):
542 """Return the records grouped by the category of their source.
543
544 The return value is a dict, a key in this dict is a category
545 and the value is a list of all the records with this category.
546
547 """
548 Source.validate_categories(categories)
549 key_function = lambda record: record.source.category
550 return self.group_records(key_function)
551
552 def group_records_by_query_params_match(self):
553 """Return the records grouped by their query_params_match attribute.
554
555 The return value is a dict, a key in this dict is a query_params_match
556 bool (so the keys can be just True or False) and the value is a list
557 of all the records with this query_params_match value.
558
559 """
560 key_function = lambda record: record.query_params_match
561 return self.group_records(key_function)
562
563 def group_records_by_query_person_match(self):
564 """Return the records grouped by their query_person_match attribute.
565
566 The return value is a dict, a key in this dict is a query_person_match
567 float and the value is a list of all the records with this
568 query_person_match value.
569
570 """
571 key_function = lambda record: record.query_person_match
572 return self.group_records(key_function)
573
574 @staticmethod
575 def from_dict(d):
576 """Transform the dict to a response object and return the response."""
577 warnings_ = d.get('warnings', [])
578 query = d.get('query') or None
579 if query:
580 query = Person.from_dict(query)
581 person = d.get('person') or None
582 if person:
583 person = Person.from_dict(person)
584 records = d.get('records')
585 if records:
586 records = [Record.from_dict(record) for record in records]
587 suggested_searches = d.get('suggested_searches')
588 if suggested_searches:
589 suggested_searches = [Record.from_dict(record)
590 for record in suggested_searches]
591 return SearchAPIResponse(query=query, person=person, records=records,
592 suggested_searches=suggested_searches,
593 warnings_=warnings_)
594
595 def to_dict(self):
596 """Return a dict representation of the response."""
597 d = {}
598 if self.warnings:
599 d['warnings'] = self.warnings
600 if self.query is not None:
601 d['query'] = self.query.to_dict()
602 if self.person is not None:
603 d['person'] = self.person.to_dict()
604 if self.records:
605 d['records'] = [record.to_dict() for record in self.records]
606 if self.suggested_searches:
607 d['suggested_searches'] = [record.to_dict()
608 for record in self.suggested_searches]
609 return d
610
611
612 class SearchAPIError(APIError):
613
614 """An exception raised when the response from the search API contains an
615 error."""
616
617 pass
0 from osrframework.thirdparties.pipl_com.lib.fields import Field
1 from osrframework.thirdparties.pipl_com.lib.utils import is_valid_url
2
3
4 class Source(Field):
5
6 """A source of data that's available in a Record/Person object.
7
8 The source is simply the URL of the page where the data was found, for
9 convenience it also contains some meta-data about the data-source (like
10 its full name and the category it belongs to).
11
12 Note that this class is a subclass of Field even though a source is not
13 exactly a data field, it's just because the functionality implemented in
14 Field is usefull here too.
15
16 """
17
18 attributes = ('is_sponsored',)
19 children = ('name', 'category', 'url', 'domain')
20 categories = set(['background_reports', 'contact_details',
21 'email_address', 'media', 'personal_profiles',
22 'professional_and_business', 'public_records',
23 'publications', 'school_and_classmates', 'web_pages'])
24
25 def __init__(self, name=None, category=None, url=None, domain=None,
26 is_sponsored=None):
27 """`name`, `category`, `url` and `domain` should all be unicode or utf8
28 encoded strs (will be decoded automatically).
29
30 `is_sponsored` is a bool value that indicates whether the source is from
31 one of Pipl's sponsored sources.
32
33 `category` is one of Source.categories.
34
35 """
36 Field.__init__(self)
37 self.name = name
38 self.category = category
39 self.url = url
40 self.domain = domain
41 self.is_sponsored = is_sponsored
42
43 @property
44 def is_valid_url(self):
45 """A bool that indicates whether the URL is valid."""
46 return bool(self.url and is_valid_url(self.url))
47
48 @staticmethod
49 def validate_categories(categories):
50 """Take an iterable of source categories and raise ValueError if some
51 of them are invalid."""
52 if not set(categories) <= Source.categories:
53 invalid = list(set(categories) - Source.categories)
54 raise ValueError('Invalid categories: %s' % invalid)
55
0 """Python wrapper for Pipl's Thumbnail API.
1
2 Pipl's thumbnail API provides a thumbnailing service for presenting images in
3 your application. The images can be from the results you got from our Search
4 API but it can also be any web URI of an image.
5
6 The thumbnails returned by the API are in the height/width defined in the
7 request. Additional features of the API are:
8 - Detect and Zoom-in on human faces (in case there's a human face in the image).
9 - Optionally adding to the thumbnail the favicon of the website where the image
10 is from (for attribution, recommended for copyright reasons).
11
12 This module contains only one function - generate_thumbnail_url() that can be
13 used for transforming an image URL into a thumbnail API URL.
14
15 """
16 import urllib
17
18 from osrframework.thirdparties.pipl_com.lib import Image
19 from osrframework.thirdparties.pipl_com.lib.utils import to_utf8
20
21
22 BASE_URL = 'http://api.pipl.com/thumbnail/v2/?'
23 # HTTPS is also supported:
24 #BASE_URL = 'https://api.pipl.com/thumbnail/v2/?'
25
26 MAX_PIXELS = 500
27
28
29 # Default API key value, you can set your key globally in this variable instead
30 # of passing it in each call to generate_thumbnail_url().
31 # >>> import osrframework.thirdparties.pipl_com.lib.thumbnail
32 # >>> osrframework.thirdparties.pipl_com.lib.thumbnail.default_api_key = '<your_key>'
33 default_api_key = None
34
35
36 def generate_thumbnail_url(image_url, height, width, favicon_domain=None,
37 zoom_face=True, api_key=None):
38 """Take an image URL and generate a thumbnail URL for that image.
39
40 Args:
41
42 image_url -- unicode (or utf8 encoded str), URL of the image you want to
43 thumbnail.
44 height -- int, requested thumbnail height in pixels, maximum 500.
45 width -- int, requested thumbnail width in pixels, maximum 500.
46 favicon_domain -- unicode (or utf8 encoded str), optional, the domain of
47 the website where the image came from, the favicon will
48 be added to the corner of the thumbnail, recommended for
49 copyright reasones.
50 IMPORTANT: Don't assume that the domain of the website is
51 the domain from `image_url`, it's possible that
52 domain1.com hosts its images on domain2.com.
53 zoom_face -- bool, indicates whether you want the thumbnail to zoom on the
54 face in the image (in case there is a face) or not.
55 api_key -- str, a valid API key (use "samplekey" for experimenting).
56 Note that you can set a default API key
57 (osrframework.thirdparties.pipl_com.lib.thumbnail.default_api_key = '<your_key>') instead of
58 passing your key in each call.
59
60 ValueError is raised in case of illegal parameters.
61
62 Example (thumbnail URL from an image URL):
63
64 >>> from osrframework.thirdparties.pipl_com.lib.thumbnail import generate_thumbnail_url
65 >>> image_url = 'http://a7.twimg.com/a/ab76f.jpg'
66 >>> generate_thumbnail_url(image_url, 100, 100,
67 favicon_domain='twitter.com',
68 api_key='samplekey')
69 'http://api.pipl.com/thumbnail/v2/?key=samplekey&
70 favicon_domain=twitter.com&height=100&width=100&zoom_face=True&
71 image_url=http%3A%2F%2Fa7.twimg.com%2Fa%2Fab76f.jpg'
72
73 Example (thumbnail URL from a record that came in the response of our
74 Search API):
75
76 >>> from osrframework.thirdparties.pipl_com.lib.thumbnail import generate_thumbnail_url
77 >>> generate_thumbnail_url(record.images[0].url, 100, 100,
78 favicon_domain=record.source.domain,
79 api_key='samplekey')
80 'http://api.pipl.com/thumbnail/v2/?key=samplekey&
81 favicon_domain=twitter.com&height=100&width=100&zoom_face=True&
82 image_url=http%3A%2F%2Fa7.twimg.com%2Fa%2Fab76f.jpg'
83
84 """
85 if not (api_key or default_api_key):
86 raise ValueError('A valid API key is required')
87 if not Image(url=image_url).is_valid_url:
88 raise ValueError('image_url is not a valid URL')
89 if not (0 < height <= MAX_PIXELS and 0 < width <= MAX_PIXELS):
90 raise ValueError('height/width must be between 0 and %d' % MAX_PIXELS)
91 query = {
92 'key': to_utf8(api_key or default_api_key),
93 'image_url': urllib.unquote(to_utf8(image_url)),
94 'height': height,
95 'width': width,
96 'favicon_domain': to_utf8(favicon_domain or ''),
97 'zoom_face': zoom_face,
98 }
99 return BASE_URL + urllib.urlencode(query)
0 import re
1 import json
2 import datetime
3
4
5 STATES = {
6 u'US': {u'WA': u'Washington', u'VA': u'Virginia', u'DE': u'Delaware', u'DC': u'District Of Columbia', u'WI': u'Wisconsin', u'WV': u'West Virginia', u'HI': u'Hawaii', u'FL': u'Florida', u'YT': u'Yukon', u'WY': u'Wyoming', u'PR': u'Puerto Rico', u'NJ': u'New Jersey', u'NM': u'New Mexico', u'TX': u'Texas', u'LA': u'Louisiana', u'NC': u'North Carolina', u'ND': u'North Dakota', u'NE': u'Nebraska', u'FM': u'Federated States Of Micronesia', u'TN': u'Tennessee', u'NY': u'New York', u'PA': u'Pennsylvania', u'CT': u'Connecticut', u'RI': u'Rhode Island', u'NV': u'Nevada', u'NH': u'New Hampshire', u'GU': u'Guam', u'CO': u'Colorado', u'VI': u'Virgin Islands', u'AK': u'Alaska', u'AL': u'Alabama', u'AS': u'American Samoa', u'AR': u'Arkansas', u'VT': u'Vermont', u'IL': u'Illinois', u'GA': u'Georgia', u'IN': u'Indiana', u'IA': u'Iowa', u'MA': u'Massachusetts', u'AZ': u'Arizona', u'CA': u'California', u'ID': u'Idaho', u'PW': u'Palau', u'ME': u'Maine', u'MD': u'Maryland', u'OK': u'Oklahoma', u'OH': u'Ohio', u'UT': u'Utah', u'MO': u'Missouri', u'MN': u'Minnesota', u'MI': u'Michigan', u'MH': u'Marshall Islands', u'KS': u'Kansas', u'MT': u'Montana', u'MP': u'Northern Mariana Islands', u'MS': u'Mississippi', u'SC': u'South Carolina', u'KY': u'Kentucky', u'OR': u'Oregon', u'SD': u'South Dakota'},
7 u'CA': {u'AB': u'Alberta', u'BC': u'British Columbia', u'MB': u'Manitoba', u'NB': u'New Brunswick', u'NT': u'Northwest Territories', u'NS': u'Nova Scotia', u'NU': u'Nunavut', u'ON': u'Ontario', u'PE': u'Prince Edward Island', u'QC': u'Quebec', u'SK': u'Saskatchewan', u'YU': u'Yukon', u'NL': u'Newfoundland and Labrador'},
8 u'AU': {u'WA': u'State of Western Australia', u'SA': u'State of South Australia', u'NT': u'Northern Territory', u'VIC': u'State of Victoria', u'TAS': u'State of Tasmania', u'QLD': u'State of Queensland', u'NSW': u'State of New South Wales', u'ACT': u'Australian Capital Territory'},
9 u'GB': {u'WLS': u'Wales', u'SCT': u'Scotland', u'NIR': u'Northern Ireland', u'ENG': u'England'},
10 }
11 COUNTRIES = {u'BD': u'Bangladesh', u'WF': u'Wallis And Futuna Islands', u'BF': u'Burkina Faso', u'PY': u'Paraguay', u'BA': u'Bosnia And Herzegovina', u'BB': u'Barbados', u'BE': u'Belgium', u'BM': u'Bermuda', u'BN': u'Brunei Darussalam', u'BO': u'Bolivia', u'BH': u'Bahrain', u'BI': u'Burundi', u'BJ': u'Benin', u'BT': u'Bhutan', u'JM': u'Jamaica', u'BV': u'Bouvet Island', u'BW': u'Botswana', u'WS': u'Samoa', u'BR': u'Brazil', u'BS': u'Bahamas', u'JE': u'Jersey', u'BY': u'Belarus', u'BZ': u'Belize', u'RU': u'Russian Federation', u'RW': u'Rwanda', u'LT': u'Lithuania', u'RE': u'Reunion', u'TM': u'Turkmenistan', u'TJ': u'Tajikistan', u'RO': u'Romania', u'LS': u'Lesotho', u'GW': u'Guinea-bissau', u'GU': u'Guam', u'GT': u'Guatemala', u'GS': u'South Georgia And South Sandwich Islands', u'GR': u'Greece', u'GQ': u'Equatorial Guinea', u'GP': u'Guadeloupe', u'JP': u'Japan', u'GY': u'Guyana', u'GG': u'Guernsey', u'GF': u'French Guiana', u'GE': u'Georgia', u'GD': u'Grenada', u'GB': u'Great Britain', u'GA': u'Gabon', u'GN': u'Guinea', u'GM': u'Gambia', u'GL': u'Greenland', u'GI': u'Gibraltar', u'GH': u'Ghana', u'OM': u'Oman', u'TN': u'Tunisia', u'JO': u'Jordan', u'HR': u'Croatia', u'HT': u'Haiti', u'SV': u'El Salvador', u'HK': u'Hong Kong', u'HN': u'Honduras', u'HM': u'Heard And Mcdonald Islands', u'AD': u'Andorra', u'PR': u'Puerto Rico', u'PS': u'Palestine', u'PW': u'Palau', u'PT': u'Portugal', u'SJ': u'Svalbard And Jan Mayen Islands', u'VG': u'Virgin Islands, British', u'AI': u'Anguilla', u'KP': u'North Korea', u'PF': u'French Polynesia', u'PG': u'Papua New Guinea', u'PE': u'Peru', u'PK': u'Pakistan', u'PH': u'Philippines', u'PN': u'Pitcairn', u'PL': u'Poland', u'PM': u'Saint Pierre And Miquelon', u'ZM': u'Zambia', u'EH': u'Western Sahara', u'EE': u'Estonia', u'EG': u'Egypt', u'ZA': u'South Africa', u'EC': u'Ecuador', u'IT': u'Italy', u'AO': u'Angola', u'KZ': u'Kazakhstan', u'ET': u'Ethiopia', u'ZW': u'Zimbabwe', u'SA': u'Saudi Arabia', u'ES': u'Spain', u'ER': u'Eritrea', u'ME': u'Montenegro', u'MD': u'Moldova', u'MG': u'Madagascar', u'MA': u'Morocco', u'MC': u'Monaco', u'UZ': u'Uzbekistan', u'MM': u'Myanmar', u'ML': u'Mali', u'MO': u'Macau', u'MN': u'Mongolia', u'MH': u'Marshall Islands', u'US': u'United States', u'UM': u'United States Minor Outlying Islands', u'MT': u'Malta', u'MW': u'Malawi', u'MV': u'Maldives', u'MQ': u'Martinique', u'MP': u'Northern Mariana Islands', u'MS': u'Montserrat', u'NA': u'Namibia', u'IM': u'Isle Of Man', u'UG': u'Uganda', u'MY': u'Malaysia', u'MX': u'Mexico', u'IL': u'Israel', u'BG': u'Bulgaria', u'FR': u'France', u'AW': u'Aruba', u'AX': u'\xc3\x85land', u'FI': u'Finland', u'FJ': u'Fiji', u'FK': u'Falkland Islands', u'FM': u'Micronesia', u'FO': u'Faroe Islands', u'NI': u'Nicaragua', u'NL': u'Netherlands', u'NO': u'Norway', u'SO': u'Somalia', u'NC': u'New Caledonia', u'NE': u'Niger', u'NF': u'Norfolk Island', u'NG': u'Nigeria', u'NZ': u'New Zealand', u'NP': u'Nepal', u'NR': u'Nauru', u'NU': u'Niue', u'MR': u'Mauritania', u'CK': u'Cook Islands', u'CI': "C\xc3\xb4te D'ivoire", 'CH': u'Switzerland', u'CO': u'Colombia', u'CN': u'China', u'CM': u'Cameroon', u'CL': u'Chile', u'CC': u'Cocos (keeling) Islands', u'CA': u'Canada', u'CG': u'Congo (brazzaville)', u'CF': u'Central African Republic', u'CD': u'Congo (kinshasa)', u'CZ': u'Czech Republic', u'CY': u'Cyprus', u'CX': u'Christmas Island', u'CS': u'Serbia', u'CR': u'Costa Rica', u'HU': u'Hungary', u'CV': u'Cape Verde', u'CU': u'Cuba', u'SZ': u'Swaziland', u'SY': u'Syria', u'KG': u'Kyrgyzstan', u'KE': u'Kenya', u'SR': u'Suriname', u'KI': u'Kiribati', u'KH': u'Cambodia', u'KN': u'Saint Kitts And Nevis', u'KM': u'Comoros', u'ST': u'Sao Tome And Principe', u'SK': u'Slovakia', u'KR': u'South Korea', u'SI': u'Slovenia', u'SH': u'Saint Helena', u'KW': u'Kuwait', u'SN': u'Senegal', u'SM': u'San Marino', u'SL': u'Sierra Leone', u'SC': u'Seychelles', u'SB': u'Solomon Islands', u'KY': u'Cayman Islands', u'SG': u'Singapore', u'SE': u'Sweden', u'SD': u'Sudan', u'DO': u'Dominican Republic', u'DM': u'Dominica', u'DJ': u'Djibouti', u'DK': u'Denmark', u'DE': u'Germany', u'YE': u'Yemen', u'AT': u'Austria', u'DZ': u'Algeria', u'MK': u'Macedonia', u'UY': u'Uruguay', u'YT': u'Mayotte', u'MU': u'Mauritius', u'TZ': u'Tanzania', u'LC': u'Saint Lucia', u'LA': u'Laos', u'TV': u'Tuvalu', u'TW': u'Taiwan', u'TT': u'Trinidad And Tobago', u'TR': u'Turkey', u'LK': u'Sri Lanka', u'LI': u'Liechtenstein', u'LV': u'Latvia', u'TO': u'Tonga', u'TL': u'Timor-leste', u'LU': u'Luxembourg', u'LR': u'Liberia', u'TK': u'Tokelau', u'TH': u'Thailand', u'TF': u'French Southern Lands', u'TG': u'Togo', u'TD': u'Chad', u'TC': u'Turks And Caicos Islands', u'LY': u'Libya', u'VA': u'Vatican City', u'AC': u'Ascension Island', u'VC': u'Saint Vincent And The Grenadines', u'AE': u'United Arab Emirates', u'VE': u'Venezuela', u'AG': u'Antigua And Barbuda', u'AF': u'Afghanistan', u'IQ': u'Iraq', u'VI': u'Virgin Islands, U.s.', u'IS': u'Iceland', u'IR': u'Iran', u'AM': u'Armenia', u'AL': u'Albania', u'VN': u'Vietnam', u'AN': u'Netherlands Antilles', u'AQ': u'Antarctica', u'AS': u'American Samoa', u'AR': u'Argentina', u'AU': u'Australia', u'VU': u'Vanuatu', u'IO': u'British Indian Ocean Territory', u'IN': u'India', u'LB': u'Lebanon', u'AZ': u'Azerbaijan', u'IE': u'Ireland', u'ID': u'Indonesia', u'PA': u'Panama', u'UA': u'Ukraine', u'QA': u'Qatar', u'MZ': u'Mozambique'}
12
13 TIMESTAMP_FORMAT = '%Y-%m-%dT%H:%M:%S'
14 DATE_FORMAT = '%Y-%m-%d'
15
16 VALID_URL_REGEX = re.compile('^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$')
17
18
19
20 class Serializable(object):
21
22 """The base class of every class in the library that needs the ability to
23 be serialized/deserialized to/from a JSON string.
24
25 Every inherited class must implement its own to_dict method that transforms
26 an object to a dict and from_dict method that transforms a dict to
27 an object.
28
29 """
30
31 @classmethod
32 def from_json(cls, json_str):
33 """Deserialize the object from a JSON string."""
34 d = json.loads(json_str)
35 return cls.from_dict(d)
36
37 def to_json(self):
38 """Serialize the object to a JSON string."""
39 d = self.to_dict()
40 return json.dumps(d)
41
42
43 def str_to_datetime(s):
44 """Transform an str object to a datetime object."""
45 return datetime.datetime.strptime(s, TIMESTAMP_FORMAT)
46
47
48 def datetime_to_str(dt):
49 """Transform a datetime object to an str object."""
50 return dt.isoformat()
51
52
53 def str_to_date(s):
54 """Transform an str object to a date object."""
55 return datetime.datetime.strptime(s, DATE_FORMAT).date()
56
57
58 def date_to_str(d):
59 """Transform a date object to an str object."""
60 return d.isoformat()
61
62
63 def is_valid_url(url):
64 """Return True if `url` (str/unicode) is a valid URL, False otherwise."""
65 return bool(VALID_URL_REGEX.search(url))
66
67
68 def alpha_chars(s):
69 """Strip all non alphabetic characters from the str/unicode `s`."""
70 return ''.join([c for c in s if c.isalpha()])
71
72
73 def alnum_chars(s):
74 """Strip all non alphanumeric characters from the str/unicode `s`."""
75 return ''.join([c for c in s if c.isalnum()])
76
77
78 def to_utf8(obj):
79 """Return str representation of obj, if s is a unicode object it's encoded
80 with utf8."""
81 if isinstance(obj, unicode):
82 return obj.encode('utf8')
83 return str(obj)
84
85
86 def to_unicode(obj):
87 """Return unicode representation of obj, if s is an str object it's decoded
88 with utf8."""
89 if isinstance(obj, str):
90 return obj.decode('utf8')
91 return unicode(obj)
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22 # Calling the logger when being imported
23 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.resolvethem.com")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import re
22 import requests
23 import urllib
24
25 def checkIPFromAlias(alias=None):
26 '''
27 Method that checks if the given alias is currently connected to Skype and returns its IP address.
28
29 :param alias: Alias to be searched.
30
31 :return: Python structure for the Json received. It has the following structure:
32 {
33 "type": "i3visio.ip",
34 "value": "1.1.1.1",
35 "attributes" : []
36 }
37 '''
38 headers = {
39 "Content-type": "text/html",
40 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
41 "Accept-Encoding": " gzip, deflate",
42 "Accept-Language": " es-ES,es;q=0.8,en-US;q=0.5,en;q=0.3",
43 "Connection": "keep-alive",
44 "DNT": "1",
45 "Host": "www.resolvethem.com",
46 "Referer": "http://www.resolvethem.com/index.php",
47 "User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0",
48 "Content-Length": "26",
49 "Content-Type": "application/x-www-form-urlencoded",
50 }
51
52 req = requests.post("http://www.resolvethem.com/index.php",headers=headers,data={'skypeUsername': alias,'submit':''})
53 # Data returned
54 data = req.content
55 # Compilation of the regular expression
56 p = re.compile("class='alert alert-success'>([0-9\.]*)<")
57 allMatches = p.findall(data)
58 if len(allMatches)> 0:
59 jsonData = {}
60 jsonData["type"]="i3visio.ip"
61 jsonData["value"]=allMatches[0]
62 jsonData["attributes"]=[]
63 return jsonData
64 return {}
65
66
67
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger
22 # Calling the logger when being imported
23 osrframework.utils.logger.setupLogger(loggerName="osrframework.thirdparties.skype")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of apify. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import argparse
21 import codecs
22 import json
23 import os
24 import Skype4Py
25 import sys
26
27 def checkInSkype(query=None):
28 '''
29 Method that checks if the given email is associated to any Skype account using the Skype4Py API.
30
31 :param query: query to be performed to verify.
32
33 :return: a Python structure for the Json received. If nothing was found, it will return an empty dictionary.
34 '''
35 jsonData = []
36 try:
37 # Instantianting Skype object, all further actions are done
38 # using this object.
39 skype = Skype4Py.Skype()
40
41 # Start Skype if it's not already running.
42 try:
43 # Checking if Skype is running...
44 if not skype.Client.IsRunning:
45 print(general.warning("[!] Skype is NOT running... Open it and try again.\n"))
46 # Commented to avoid messages. Users should manually open the app
47 #skype.Client.Start()
48 return jsonData
49
50 # Set our application name.
51 skype.FriendlyName = 'OSRFramework - Skype'
52
53 # Attach to Skype. This may cause Skype to open a confirmation
54 # dialog.
55 try:
56 # Attaching the session
57 skype.Attach()
58
59 # Set up an event handler.
60 def new_skype_status(status):
61 # If Skype is closed and reopened, it informs us about it
62 # so we can reattach.
63 print(general.warning("[!] Trying to reattach the handler..."))
64 if status == Skype4Py.apiAttachAvailable:
65 skype.Attach()
66 skype.OnAttachmentStatus = new_skype_status
67
68 #print "[*] We will try to perform the Skype searches now..."
69 try:
70 # Search for users and display their Skype name, full name
71 # and country.
72
73 resultados = skype.SearchForUsers(query)
74
75 #print "[*] Results found: " + str(len(resultados))
76 for user in resultados:
77 userData = {}
78
79 userData ["type"] = "i3visio.profile"
80 userData ["value"] = "Skype - " + user.Handle
81 userData ["attributes"] = []
82 atts = {}
83 atts ["i3visio.platform"] = "Skype"
84 atts ["i3visio.search"] = query
85 try:
86 if str(user.Handle) != "":
87 atts ["i3visio.alias"] = str(user.Handle)
88 if str(user.Aliases) != "[]":
89 atts ["i3visio.aliases"] = str(user.Aliases)
90 if str(user.Homepage) != "":
91 atts ["i3visio.uri.homepage"] = str(user.Homepage)
92 if str(user.Birthday) != "None":
93 atts ["i3visio.birthday"] = str(user.Birthday)
94 if str(user.PhoneHome) != "":
95 atts ["i3visio.phone.home"] = str(user.PhoneHome)
96 if str(user.PhoneMobile) != "":
97 atts ["i3visio.phone.mobile"] = str(user.PhoneMobile)
98 if str(user.PhoneOffice) != "":
99 atts ["i3visio.phone.office"] = str(user.PhoneOffice)
100 if str(user.LastOnline) != "0.0":
101 atts ["i3visio.lastonline"] = str(user.LastOnline)
102 if str(user.OnlineStatus) != "":
103 atts ["i3visio.online"] = str(user.OnlineStatus)
104 if str(user.MoodText) != "":
105 atts ["i3visio.text"] = str(user.MoodText)
106 if str(user.FullName) != "":
107 atts ["i3visio.fullname"] = str(user.FullName)
108 if str(user.Country) != "":
109 atts ["i3visio.location.country"] = str(user.Country)
110 if str(user.Province) != "":
111 atts ["i3visio.location.province"] = str(user.Province)
112 if str(user.City) != "":
113 atts ["i3visio.location.city"] = str(user.City)
114
115 except:
116 # Sth happened when parsing
117 #print "WARNING: something happened when parsing the attributes in Skype. A problem with The program will continue with the execution..."
118 pass
119 for key in atts.keys():
120 aux = {}
121 aux["type"] = key
122 aux["value"] = atts[key]
123 aux["attributes"] = []
124 userData ["attributes"].append(aux)
125 jsonData.append(userData)
126 #print "[* ] We are in checkInSkype.py: " + str(jsonData)
127
128 except Exception as e:
129 print(general.warning("[!] WARNING. Something happened when performing the search in Skype."))
130 print(general.warning( "[!] Exception grabbed: " + str(e)))
131 print
132
133 except Exception as e:
134 print(general.warning( "[!] WARNING. Something happened when trying to attach OSRFramework to a valid Skype session."))
135 print(general.warning( "[!] Exception grabbed: " + str(e)))
136 print(general.warning( "[!] Are you logged in?\n"))
137
138 except Exception as e:
139 print(general.warning("[!] WARNING. Something happened when trying to create a valid Skype session."))
140 print(general.warning("[!] Exception grabbed: " + str(e)))
141 print(general.warning("[!] This usually happens when you do NOT have any version of Skype installed in this machine.\n"))
142
143 except Exception as e:
144 print(general.warning("WARNING. Something happened when trying to link to a valid Skype session."))
145 print(general.warning("Exception grabbed: " + str(e)))
146 print(general.warning("This usually happens when you do NOT have any version of Skype logged in in this machine. Although you may omit this message, you can also fix it by: "))
147 print(general.warning("\ta) Install any version of Skype and log in"))
148 print(general.warning("\tb) If Skype is installed, the log in window will be appearing. You will need to log in and perform the search again (or run it with '-p skype' only) to get results from Skype."))
149 print(general.warning("In spite of this message, execution is going on.\n"))
150
151 return jsonData
152
153 if __name__ == "__main__":
154 parser = argparse.ArgumentParser(description='A library that wraps a search onto Skype4Py.', prog='checkInSkype.py', epilog="NOTE: you must be logged in into Skype to use this program.", add_help=False)
155
156 # Adding the main options
157 # Defining the mutually exclusive group for the main options
158 general = parser.add_mutually_exclusive_group(required=True)
159 general.add_argument('-q', '--query', metavar='<text_to_search>', action='store', help='query to be launched.')
160
161 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
162 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
163 groupAbout.add_argument('--version', action='version', version='%(prog)s 0.1.0', help='shows the version of the program and exists.')
164
165 args = parser.parse_args()
166
167 print(general.success(json.dumps(checkInSkype(args.query), indent = 2)))
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This file is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import osrframework.utils.logger as logger
22
23 # Calling the logger when being imported
24 logger.setupLogger(loggerName="osrframework.transforms")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.thirdparties.skype.checkInSkype as skype
27
28 def aliasToSkypeAccounts(query=None):
29 '''
30 Method that checks if a given alias appears in Skype.
31
32 :param query: query to verify.
33
34 '''
35 me = MaltegoTransform()
36
37 jsonData = skype.checkInSkype(query=query)
38
39 # This returns a dictionary like:
40 # [{}]
41
42 #print json.dumps(entities, indent=2)
43 for user in jsonData:
44 newEnt = me.addEntity("i3visio.profile","Skype - " +str(user["i3visio.alias"]))
45 aliasEnt = me.addEntity("i3visio.alias",user["i3visio.alias"])
46
47 newEnt.setDisplayInformation("<h3>" + user["i3visio.alias"] +"</h3><p>");# + json.dumps(user, sort_keys=True, indent=2) + "!</p>");
48 newEnt.addAdditionalFields("i3visio.platform","i3visio.platform",True,"Skype")
49 for field in user.keys():
50 #if field != "i3visio.alias":
51 # [TO-DO] Appending all the information from the json:
52 #if field == "i3visio.aliases":
53 # listAliases = [user["i3visio.alias"]]
54 # listAliases += user[field]
55 # # in this case, this is a list
56 # for alias in user[field]:
57 # aliasEnt = me.addEntity("i3visio.alias",alias.encode('utf-8'))
58 #elif user[field] != None:
59 if user[field] != None:
60 try:
61 newEnt.addAdditionalFields(field,field,True,str(user[field]).encode('utf-8'))
62 except:
63 # Something passed...
64 pass
65
66 # Returning the output text...
67 me.returnOutput()
68
69 if __name__ == "__main__":
70 aliasToSkypeAccounts(query=sys.argv[1])
71
72
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 from osrframework import domainfy
27
28 def aliasToKnownEmails(query=None, parType="global"):
29 '''
30 Method that checks if there exist domains for a given a alias.
31
32 :param query: alias to verify.
33
34 '''
35 me = MaltegoTransform()
36
37
38 # Processing the options returned to remove the "all" option
39 tlds = []
40 for typeTld in domainfy.TLD.keys():
41 if typeTld == parType:
42 for tld in domainfy.TLD[typeTld]:
43 tlds.append({ "tld" : tld, "type" : typeTld })
44
45 domains = domainfy.createDomains(tlds, nicks = [query])
46
47 jsonData = domainfy.performSearch(domains)
48 #print json.dumps(jsonData, indent=2)
49 me.addListOfEntities(jsonData)
50
51 # Returning the output text...
52 me.returnOutput()
53
54 if __name__ == "__main__":
55 # We avoi using additional parameters
56 aliasToKnownEmails(parType=sys.argv[1], query=sys.argv[2])
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 from osrframework import mailfy
27
28 def aliasToKnownEmails(query=None):
29 '''
30 Method that checks if there exist emails for a given a alias.
31
32 :param query: email to verify.
33
34 '''
35 me = MaltegoTransform()
36 emails = mailfy.grabEmails(nicks = [query])
37
38 jsonData = mailfy.performSearch(emails)
39
40 me.addListOfEntities(jsonData)
41
42 # Returning the output text...
43 me.returnOutput()
44
45 if __name__ == "__main__":
46 aliasToKnownEmails(query=sys.argv[1])
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.thirdparties.skype.checkInSkype as skype
27
28 def aliasToSkypeAccounts(query=None):
29 '''
30 Method that checks if a given alias appears in Skype.
31
32 :param query: query to verify.
33
34 '''
35 me = MaltegoTransform()
36
37 jsonData = skype.checkInSkype(query=query)
38
39 # This returns a dictionary like:
40 # [{}]
41 newEntities = []
42
43 #print json.dumps(entities, indent=2)
44 for user in jsonData:
45 # Defining the main entity
46 aux ={}
47 aux["type"] = "i3visio.profile"
48 aux["value"] = "Skype - " + str(user["i3visio.alias"])
49 aux["attributes"] = []
50
51 # Defining the attributes recovered
52 att ={}
53 att["type"] = "i3visio.platform"
54 att["value"] = str("Skype")
55 att["attributes"] = []
56 aux["attributes"].append(att)
57
58 for field in user.keys():
59 # [TO-DO] Appending all the information from the json:
60 if user[field] != None:
61 try:
62 att ={}
63 att["type"] = field
64 att["value"] = str(user[field]).encode('utf-8')
65 att["attributes"] = []
66 aux["attributes"].append(att)
67 except:
68 # Something passed...
69 pass
70 # Appending the entity
71 newEntities.append(aux)
72
73 me.addListOfEntities(newEntities)
74
75 # Returning the output text...
76 me.returnOutput()
77
78
79 if __name__ == "__main__":
80 aliasToSkypeAccounts(query=sys.argv[1])
81
82
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.thirdparties.resolvethem_com.processing as resolvethem_com
27
28 def aliasToSkypeIP(query=None):
29 '''
30 Method that checks if a given alias appears in Skype.
31
32 :param query: query to verify.
33
34 '''
35 me = MaltegoTransform()
36
37 jsonData = resolvethem_com.checkIPFromAlias(alias=query)
38
39 newEntities = []
40
41 # Checking if something has been found
42 if jsonData != {}:
43 newEntities.append(jsonData)
44
45 me.addListOfEntities(newEntities)
46
47 # Returning the output text...
48 me.returnOutput()
49
50 if __name__ == "__main__":
51 aliasToSkypeIP(query=sys.argv[1])
52
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import urllib2
25
26 from osrframework.transforms.lib.maltego import *
27 import osrframework.thirdparties.blockchain_info.getBitcoinAddressDetails as blockchain
28
29 def bitcoinAddressToBlockchainDetails(bitcoinAddress=None):
30 '''
31 Method that checks if the given bitcoinAddress is stored in the HIBP website.
32
33 :param bitcoinAddress: bitcoinAddress to verify.
34
35 '''
36
37 jsonData = blockchain.getBitcoinAddressDetails(address=bitcoinAddress)
38
39 me = MaltegoTransform()
40
41 newEntities = []
42
43 aux = {}
44 aux["type"] = "i3visio.bitcoin.address"
45 aux["value"] = bitcoinAddress
46 aux["attributes"] = []
47
48 att ={}
49 att["type"] = "@final_balance"
50 att["value"] = str(jsonData["final_balance"])
51 att["attributes"] = []
52 aux["attributes"].append(att)
53
54 att ={}
55 att["type"] = "@number_transactions"
56 att["value"] = str(jsonData["n_tx"])
57 att["attributes"] = []
58 aux["attributes"].append(att)
59
60 att ={}
61 att["type"] = "@total_received"
62 att["value"] = str(jsonData["total_received"])
63 att["attributes"] = []
64 aux["attributes"].append(att)
65
66 att ={}
67 att["type"] = "@total_sent"
68 att["value"] = str(jsonData["total_sent"])
69 att["attributes"] = []
70 aux["attributes"].append(att)
71
72 newEntities.append(aux)
73
74 me.addListOfEntities(newEntities)
75
76 # Returning the output text...
77 me.returnOutput()
78
79
80 if __name__ == "__main__":
81 bitcoinAddressToBlockchainDetails(bitcoinAddress=sys.argv[1])
82
83
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import webbrowser as wb
23
24 from osrframework.transforms.lib.maltego import *
25
26 def coordinatesToGoogleMapsBrowser(coord=None):
27 '''
28 Method that launches the URI in the default browser of the system for the Google Maps Browser. This returns no new entity.
29
30 :param coord: uri to open.
31 '''
32 me = MaltegoTransform()
33
34 # Building Google Maps coordinates
35 uri = "https://www.google.es/maps/place/"+coord.replace(' ','')
36
37 wb.open(uri, new=2)
38
39 me.returnOutput()
40
41
42 if __name__ == "__main__":
43 coordinatesToGoogleMapsBrowser(coord=sys.argv[1])
44
45
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import webbrowser as wb
23
24 from osrframework.transforms.lib.maltego import *
25
26 def coordinatesToTwitterBrowser(coord=None, proximity="20km"):
27 '''
28 Method that launches the URI in the default browser of the system with all the tweets in a given location. This returns no new entity.
29
30 :param coord: coordinates in which the lookup will be done.
31 '''
32 me = MaltegoTransform()
33
34 # Building Google Maps coordinates
35 coord = coord.replace(' ','')
36 coord = coord.replace(',','%2C')
37 uri = "https://twitter.com/search?q=geocode%3A"+coord+"%2C"+proximity+"&src=typd"
38
39 wb.open(uri, new=2)
40
41 me.returnOutput()
42
43
44 if __name__ == "__main__":
45 coordinatesToTwitterBrowser(coord=sys.argv[1], proximity="20km")
46
47
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.searchengines.google as google
27
28 def domainToGoogleSearchUriWithEmails(argv):
29 '''
30 List of URI entities corresponding to the results of a Google Search that tries to find emails from a domain.
31
32 :param argv: the parameters to be searched.
33
34 :return: Nothing is returned but the code of the entities is created.
35 '''
36 me = MaltegoTransform(argv)
37
38 """entity = me.getVar("@serialized")
39 jsonData = json.loads(entity) """
40
41 # Recovering the Uri value
42 try:
43 domain = me.getVar("@value")
44 except:
45 domain = me.getValue()
46
47 query = "\"*@" + domain + "\""
48
49 # Loading onto the Json data the information
50 #jsonData["attributes"] = google.processSearch(query)
51 newEntities = google.processSearch(query)
52 # This returns a dictionary like the following:
53 """
54 [{
55 'attributes': [],
56 'type': 'i3visio.uri',
57 'value': 'http://foo.com'
58 }, {
59 'attributes': [],
60 'type': 'i3visio.uri',
61 'value': 'http://bar.com'
62 },
63 ...
64 ]
65 """
66 me.addListOfEntities(newEntities)
67 #me.createAndShowListOfEntities(jsonData)
68
69 #print json.dumps(entities, indent=2)
70 #for uri in uriList:
71 # newEnt = me.addEntity(uri["type"],uri["value"])
72 # newEnt.setDisplayInformation("<h3>" + uri["value"] +"</h3><p>"+str(uri["attributes"])+"</p>")
73 # for extraAtt in uri["attributes"]:
74 # newEnt.addAdditionalFields(str(extraAtt['type']), str(extraAtt['type']), True, str(extraAtt['value']))
75
76 # Returning the output text...
77 me.returnOutput()
78
79 if __name__ == "__main__":
80 domainToGoogleSearchUriWithEmails(argv =sys.argv)
81
82
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 from osrframework.transforms.lib.maltego import *
26
27 def domainToTld(argv=None):
28 '''
29 Method that extract the TLD from a domain.
30
31 :param argv: the serialized entity.
32
33 '''
34 me = MaltegoTransform(argv)
35
36 # Recovering the domain value
37 try:
38 domain = me.getVar("@value")
39 except:
40 domain = me.getValue()
41
42 tld = domain.split('.')[-1]
43
44 newEntities = []
45
46 # Creation of a temp entity
47 aux = {}
48 aux["type"] = "i3visio.tld"
49 aux["value"] = tld
50 aux["attributes"] = []
51 newEntities.append(aux)
52
53 me.addListOfEntities(newEntities)
54
55 # Returning the output text...
56 me.returnOutput()
57
58 if __name__ == "__main__":
59 domainToTld(argv=sys.argv)
60
61
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 from osrframework.transforms.lib.maltego import *
24
25 def emailToAlias(email=None):
26 '''
27 Method that recovers the alias of the given email.
28
29 :param email: email to extract the alias from.
30
31 '''
32 me = MaltegoTransform()
33
34 aux = {}
35 aux["type"] = "i3visio.alias"
36 aux["value"] = email.split('@')[0]
37 aux["attributes"] = []
38
39 me.addListOfEntities([aux])
40
41 # Returning the output text...
42 me.returnOutput()
43
44 if __name__ == "__main__":
45 emailToAlias(email=sys.argv[1])
46
47
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import urllib2
25
26 from osrframework.transforms.lib.maltego import *
27 import osrframework.thirdparties.haveibeenpwned_com.checkIfEmailWasHacked as HIBP
28
29 def emailToBreachedAccounts(email=None):
30 '''
31 Method that checks if the given email is stored in the HIBP website.
32
33 :param email: email to verify.
34
35 '''
36 me = MaltegoTransform()
37
38 jsonData = HIBP.checkIfEmailWasHacked(email=email)
39
40 # This returns a dictionary like:
41 # [{"Title":"Adobe","Name":"Adobe","Domain":"adobe.com","BreachDate":"2013-10-4","AddedDate":"2013-12-04T00:12Z","PwnCount":152445165,"Description":"The big one. In October 2013, 153 million Adobe accounts were breached with each containing an internal ID, username, email, <em>encrypted</em> password and a password hint in plain text. The password cryptography was poorly done and <a href=\"http://stricture-group.com/files/adobe-top100.txt\" target=\"_blank\">many were quickly resolved back to plain text</a>. The unencrypted hints also <a href=\"http://www.troyhunt.com/2013/11/adobe-credentials-and-serious.html\" target=\"_blank\">disclosed much about the passwords</a> adding further to the risk that hundreds of millions of Adobe customers already faced.","DataClasses":["Email addresses","Password hints","Passwords","Usernames"]}]
42
43 newEntities = []
44
45 for breach in jsonData:
46 # Defining the main entity
47 aux ={}
48 aux["type"] = "i3visio.breach"
49 aux["value"] = str(breach["Title"])
50 aux["attributes"] = []
51
52 # Defining the attributes recovered
53 att ={}
54 att["type"] = "i3visio.domain"
55 att["value"] = str(breach["Domain"])
56 att["attributes"] = []
57 aux["attributes"].append(att)
58
59 att ={}
60 att["type"] = "@added_date"
61 att["value"] = str(breach["AddedDate"])
62 att["attributes"] = []
63 aux["attributes"].append(att)
64
65 att ={}
66 att["type"] = "@breach_date"
67 att["value"] = str(breach["BreachDate"])
68 att["attributes"] = []
69 aux["attributes"].append(att)
70
71 att ={}
72 att["type"] = "@total_pwned"
73 att["value"] = str(breach["PwnCount"])
74 att["attributes"] = []
75 aux["attributes"].append(att)
76
77 att ={}
78 att["type"] = "@description"
79 att["value"] = str(breach["Description"])
80 att["attributes"] = []
81 aux["attributes"].append(att)
82
83 # Appending the entity
84 newEntities.append(aux)
85
86 me.addListOfEntities(newEntities)
87
88 # Returning the output text...
89 me.returnOutput()
90
91 if __name__ == "__main__":
92 emailToBreachedAccounts(email=sys.argv[1])
93
94
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import urllib2
25
26 from osrframework.transforms.lib.maltego import *
27
28 def emailToDomain(email=None):
29 '''
30 Method that recovers the entity of the domain of the given mail.
31
32 :param email: email to verify.
33
34 '''
35 me = MaltegoTransform()
36
37 aux = {}
38 aux["type"] = "i3visio.domain"
39 aux["value"] = email.split('@')[1]
40 aux["attributes"] = []
41
42 me.addListOfEntities([aux])
43
44 # Returning the output text...
45 me.returnOutput()
46
47 if __name__ == "__main__":
48 emailToDomain(email=sys.argv[1])
49
50
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.thirdparties.skype.checkInSkype as skype
27
28 def emailToSkypeAccount(query=None):
29 '''
30 Method that checks if the given email is appears in Skype.
31
32 :param query: query to verify.
33
34 '''
35 me = MaltegoTransform()
36
37 jsonData = skype.checkInSkype(query=query)
38
39 # This returns a dictionary like:
40 # [{}]
41 newEntities = []
42
43 for user in jsonData:
44 # Defining the main entity
45 aux ={}
46 aux["type"] = user["type"]
47 aux["value"] = user["value"]
48 aux["attributes"] = []
49
50 for field in user.keys():
51 # [TO-DO] Appending all the information from the json:
52 if user[field] != None:
53 try:
54 att ={}
55 att["type"] = field
56 att["value"] = str(user[field]).encode('utf-8')
57 att["attributes"] = []
58 aux["attributes"].append(att)
59 except:
60 # Something passed...
61 pass
62 # Appending the entity
63 newEntities.append(aux)
64
65 me.addListOfEntities(newEntities)
66
67 # Returning the output text...
68 me.returnOutput()
69
70 if __name__ == "__main__":
71 emailToSkypeAccount(query=sys.argv[1])
72
73
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 from osrframework.transforms.lib.maltego import *
23 import sys
24 import json
25 import osrframework.transforms.lib.constants as constants
26
27 def expandPropertiesFromI3visioEntity(argv):
28 '''
29 Method that expands the properties from a given i3visio entity. It is useful to create new Entities based on the contents of the properties.
30 :param argv: the serialized entity.
31
32 :return: Nothing is returned but the code of the entities is created.
33 '''
34 me = MaltegoTransform(argv)
35 newEntities = []
36
37 try:
38 # Trying to recover pending entities if they exist.
39 # If so, it means that it is NOT the first time that this info is recovered
40 if str(me.getVar("@number_pending")) != "0" and me.getVar("@number_pending") != None:
41 entitiesToShow = me.getVar("@pending")
42 #print entitiesToShow
43 newEntities = json.loads(entitiesToShow)
44 me.addListOfEntities(newEntities)
45 else:
46 # We will try to expand the rest of the attributes
47 for field in constants.I3VISIO_FIELDS:
48 value = me.getVar(field)
49 #print field, value
50
51 if value != None and value != " " and value != "":
52 aux = {}
53 aux["type"] = field
54 aux["value"] = value
55 aux["attributes"] = []
56 newEntities.append(aux)
57 except:
58 # In case of errors, we will try to expand the rest of the attributes
59 for field in constants.I3VISIO_FIELDS:
60 value = me.getVar(field)
61 #print field, value
62
63 if value != None and value != " " and value != "":
64 aux = {}
65 aux["type"] = field
66 aux["value"] = value
67 aux["attributes"] = []
68 newEntities.append(aux)
69 me.addListOfEntities(newEntities)
70 # Returning the output text...
71 me.returnOutput()
72
73 if __name__ == "__main__":
74 expandPropertiesFromI3visioEntity(sys.argv)
75
76
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import json
24 import sys
25 import urllib2
26
27 from osrframework.transforms.lib.maltego import *
28 import osrframework.thirdparties.md5crack_com.checkIfHashIsCracked as md5crack
29
30 def hashToMD5crackDotCom(argv=None):
31 '''
32 Method that checks if the given hash is stored in the md5crack.com.
33
34 :param argv: hash to verify.
35
36 '''
37 me = MaltegoTransform(argv)
38
39 # Recovering the phone value
40 try:
41 query = me.getVar("@value")
42 except:
43 query = me.getValue()
44
45 newEntities = md5crack.checkIfHashIsCracked(hash=query)
46
47 # This returns a dictionary like:
48 """
49 [
50 {
51 "attributes": [
52 {
53 "attributes": [],
54 "type": "i3visio.text",
55 "value": "DE"
56 }
57 ],
58 "type": "i3visio.location.country",
59 "value": "Germany"
60 },
61 {
62 "attributes": [],
63 "type": "i3visio.text",
64 "value": "1&1 Internet AG"
65 },
66 {
67 "attributes": [],
68 "type": "i3visio.ipv4",
69 "value": "217.160.129.99"
70 },
71 {
72 "attributes": [],
73 "type": "i3visio.location.geo",
74 "value": "51, 9"
75 }
76 ]
77 """
78
79 # Adding the new entities
80 me.addListOfEntities(newEntities)
81
82 # Returning the output text...
83 me.returnOutput()
84
85
86 if __name__ == "__main__":
87 hashToMD5crackDotCom(argv=sys.argv)
88
89
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import json
24 import sys
25 import urllib2
26
27 from osrframework.transforms.lib.maltego import *
28 import osrframework.thirdparties.ip_api_com.checkIpDetails as ip_api
29
30 def getIp_ApiInformation(argv=None):
31 '''
32 Method that checks if the given email is stored in the md5crack.com.
33
34 :param argv: query to be executed. Note that if the query is a domain, this will be resolved.
35 '''
36 me = MaltegoTransform(argv)
37
38 # Recovering the phone value
39 try:
40 query = me.getVar("@value")
41 except:
42 query = me.getValue()
43
44 newEntities = ip_api.checkIpDetails(query=query)
45 """
46 [
47 {
48 "attributes": [
49 {
50 "attributes": [],
51 "type": "i3visio.text",
52 "value": "DE"
53 }
54 ],
55 "type": "i3visio.location.country",
56 "value": "Germany"
57 },
58 {
59 "attributes": [],
60 "type": "i3visio.text",
61 "value": "1&1 Internet AG"
62 },
63 {
64 "attributes": [],
65 "type": "i3visio.ipv4",
66 "value": "217.160.129.99"
67 },
68 {
69 "attributes": [],
70 "type": "i3visio.location.geo",
71 "value": "51, 9"
72 }
73 ]
74 """
75 # Adding the new entities
76 me.addListOfEntities(newEntities)
77
78 # Returning the output text...
79 me.returnOutput()
80
81 if __name__ == "__main__":
82 getIp_ApiInformation(argv=sys.argv)
83
84
0 So here is a small python lib for creating your own transforms, just takes out some of the hassle Smiley
1
2 Basic Examples: (will create a Person Entity with a value of "Andrew MacPherson")
3
4 Hello World
5
6 This transform merely returns "hello world" as a phrase, it doesn't depend on the input entity at all
7 from MaltegoTransform import *
8 me = MaltegoTransform()
9 me.addEntity("maltego.Phrase","hello world");
10 me.returnOutput()
11
12 Reading Input
13
14 This is simple transform to show reading input from an entity and returning it to the graph (in this case working with a domain and returning a phrase with that domain in it):
15 from MaltegoTransform import *
16 import sys
17
18 domain = sys.argv[1]
19
20 me = MaltegoTransform()
21 me.addEntity("maltego.Phrase","hello “ + domain)
22 me.returnOutput()
23
24 Reading Entity Properties
25
26 This example simply illustrates using the library to read the properties of an entity and printing them out *note* this is just a snippet, not a transform!
27 from MaltegoTransform import *
28 import sys
29
30 me = MaltegoTransform()
31 me.parseArguments(sys.argv);
32
33 longitude = me.getVar("longitude")
34 latitude = me.getVar("latitude")
35
36 print longitude
37 print latitude
38
39 Returning a complex entity
40
41 This transform example shows reading an entity in as well as setting properties, additional fields, a UI message and the weight of the entity (run on a domain):
42 from MaltegoTransform import *
43 import sys
44
45 me = MaltegoTransform()
46 domain = sys.argv[1]
47
48 thisent = me.addEntity("maltego.Domain","hello " + domain)
49
50 thisent.setType("maltego.Domain")
51 thisent.setValue("Complex." + domain)
52 thisent.setWeight(200)
53
54 thisent.setDisplayInformation("<h3>Heading</h3><p>content here about" + domain + "!</p>");
55 thisent.addAdditionalFields("variable","Display Value",True,domain)
56
57 me.addUIMessage("completed!")
58 me.returnOutput()
59
60
61 Available Functions:
62
63 Maltego Transform:
64 ==============
65 addEntity(enType,enValue):
66 enType: Entity Type
67 enValue: Entity Value
68
69 addEntityToMessage(maltegoEntity):
70 maltegoEntity: MaltegoEntity Object to be added to the outputted "message"
71
72 addUIMessage(message,messageType="Inform"):
73 message: The Message to be displayed
74 messageType: FatalError/PartialError/Inform/Debug - note this defaults to "Inform" see documentation for additional information
75
76 addException(exceptionString):
77 exceptionString: Exception message to be thrown (eg "Error! Could not connect to 10.4.0.1")
78
79 throwExceptions():
80 Simply return exception XML to the application
81
82 returnOutput():
83 Function to return all the added entities as well as the UI Messages
84
85 writeSTDERR(msg):
86 Function to write msg to STDErr
87
88 heartbeat():
89 Function to produce a "heartbeat"
90
91 progress(percent):
92 Function to output progress, eg MaltegoTransform.progress(20); #20% done
93
94 debug(msg)
95 msg: Debug message to be sent out
96
97
98 Maltego Entity
99 ===========
100
101 __init__(eT,v)
102 eT: Entity Type (eg. Person,IPAddress)
103 v: Value for this entity
104
105 setType(type)
106 Setter for the entity Type property
107
108 setValue(value)
109 Setter for the entity Value property
110
111 setWeight(weight)
112 Setter for the entity Weight property
113
114 setDisplayInformation(displayinformation)
115 Setter for the entity Display Information property
116
117 addAdditionalFields(fieldName=None,displayName=None,matchingRule=False,value=None)
118 Set additional fields for the entity
119 fieldName: Name used on the code side, eg displayName may be "Age of Person", but the app and your transform will see it as the fieldName variable
120 displayName: display name of the field shown within the entity properties
121 matchingRule: either "strict" for strict matching on this specific field or false
122 value: The additional fields value
123
124 setIconURL(iconURL)
125 Setter for the entity Icon URL (entity Icon) property
126
127 returnEntity()
128 Prints the entity with the correct XML formatting
129
130
131
132 UPDATE:
133 def parseArguments(self,argv):
134 *This function will parse the system arguments for you so that you dont have to!*
135 usage example: myMaltegoTransform.parseArguments(sys.argv);
136
137 These can then be called with the following:
138
139 def getValue(self):
140 *This function will return the value parameter, ie the value displayed on the graph*
141 usage example: theValue = myMaltegoTransform.getValue()
142
143 def getVar(self,varName):
144 *This function will return the entity property value for the variable given in varName*
145 usage example: entityValue = myMaltegoTransform.getVar("ESSID")
146
147
148 If you have any issues feel free to contact me -- [email protected]
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8
9 # it under the terms of the GNU General Public License as published by
10 # the Free Software Foundation, either version 3 of the License, or
11 # (at your option) any later version.
12 #
13 # This program is distributed in the hope that it will be useful,
14 # but WITHOUT ANY WARRANTY; without even the implied warranty of
15 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 # GNU General Public License for more details.
17 #
18 # You should have received a copy of the GNU General Public License
19 # along with this program. If not, see <http://www.gnu.org/licenses/>.
20 #
21 ##################################################################################
22
23 import osrframework.utils.logger as logger
24
25 # Calling the logger when being imported
26 logger.setupLogger(loggerName="osrframework.transforms.lib")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import os
23 import zipfile
24 import argparse
25 import shutil, errno
26
27 import osrframework
28 import osrframework.utils.configuration as configuration
29
30 VERSION = "v0.11"
31
32 def copyAnything(src="./osrframework-maltego-settings", dst=os.path.join("./", "tmp", "osrframework-maltego-settings") ):
33 '''
34 :param src: Source folder.
35 :param dst: Destination folder.
36 '''
37 # first of all trying to delete the folder
38 try:
39 shutil.rmtree(dst)
40 except:
41 pass
42
43 try:
44 shutil.copytree(src, dst)
45 except OSError as exc: # python >2.5
46 if exc.errno == errno.ENOTDIR:
47 shutil.copy(src, dst)
48 else: raise
49
50 def setNewPath(iPath=None, dst=None):
51 '''
52 :param iPath: The new installation path where the transforms will be searched. Concretely, the configuration folder.
53 :param dst: Path where the files have been copied.
54 '''
55 pathFolder = dst + "/TransformRepositories/Local"
56 for file in os.listdir( pathFolder):
57 if file.endswith("transformsettings") or file.endswith("transform"):
58 cont = ""
59 # reading the contents of such file
60 with open(os.path.join(pathFolder, file), "r") as iF:
61 cont = iF.read()
62 # replacing the working directory
63 cont = cont.replace("<CUSTOM_WORKING_DIRECTORY>", iPath)
64 # Writing the output
65 with open(os.path.join(pathFolder, file), "w") as oF:
66 oF.write(cont)
67
68 def setDebugMode(dst=None, debug="false"):
69 '''
70 :param dst: Path where the files have been copied.
71 :param debug: Whether the transforms will be launched in debug mode.
72 '''
73 pathFolder = dst + "/TransformRepositories/Local"
74 for file in os.listdir( pathFolder):
75 if file.endswith("transformsettings") or file.endswith("transform"):
76 cont = ""
77 # reading the contents of such file
78 with open(os.path.join(pathFolder, file), "r") as iF:
79 cont = iF.read()
80 # replacing the working directory
81 cont = cont.replace('<Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>','<Property name="transform.local.debug" type="boolean" popup="false">'+ debug + '</Property>')
82 # Writing the output
83 with open(os.path.join(pathFolder, file), "w") as oF:
84 oF.write(cont)
85
86 def zip(pathFolder=None):
87 '''
88 Zipping a file onto a mtz file.
89
90 :param pathFolder: Source folder or files.
91 '''
92 filePath = "%s.mtz" % (pathFolder)
93
94 zf = zipfile.ZipFile(filePath, "w", zipfile.ZIP_DEFLATED)
95
96 abs_src = os.path.abspath(pathFolder)
97 for dirname, subdirs, files in os.walk(pathFolder):
98 for filename in files:
99 absname = os.path.abspath(os.path.join(dirname, filename))
100 arcname = absname[len(abs_src) + 1:]
101 #print 'zipping %s as %s' % (os.path.join(dirname, filename), arcname)
102 zf.write(absname, arcname)
103 zf.close()
104
105 # After everything, deleting the previously created folder
106 try:
107 shutil.rmtree(pathFolder)
108 except:
109 pass
110
111 return filePath
112
113 def configureMaltego(transformsConfigFolder=None, base=None, wFolder=None, debug=False, mainPath=os.path.expanduser('~/'), backupPath=None):
114 '''
115 '''
116 # Defining the name of the output file
117 settingsFile = "osrframework-maltego-settings" + "_" + VERSION
118
119 # Defining the full path to the folder in which the configuration files will be created
120 dst=os.path.join("./", "tmp", settingsFile)
121
122 # copying anything in the config folder
123 copyAnything(src=base, dst=dst)
124
125 print "Configuring OSRFramework working directory for Maltego..."
126 # Setting the new path for
127 setNewPath(iPath = transformsConfigFolder, dst=dst)
128
129 # Setting the new path for
130 setDebugMode(dst=dst, debug=str(debug).lower())
131
132 print "Building the .mtz file."
133 # Zipping the new configuration
134 filePath = zip(pathFolder=dst)
135
136 folder, fileName = os.path.split(filePath)
137
138 # Make copies of the file
139 if mainPath != None:
140 print "Moving the .mtz file to the following folder: " + os.path.join(mainPath, fileName)
141 shutil.copy2(filePath, mainPath)
142
143 if backupPath != None:
144 print "Moving the .mtz file to the backup folder: " + os.path.join(backupPath, fileName)
145 shutil.copy2(filePath, backupPath)
146
147 # Remove tmp files.
148 shutil.rmtree(os.path.join("./", "tmp"))
149
150 if __name__ == "__main__":
151 parser = argparse.ArgumentParser(description='configure_maltego.py - A function to automatically generate Maltego configuration files.', prog='configure_maltego.py', epilog="", add_help=False)
152 # Adding the main options
153 # Defining the mutually exclusive group for the main options
154 parser.add_argument('-b', '--base', metavar='<path>', action='store', help="name of the base folder.", required=False, default="./osrframework-maltego-settings[Base]")
155 parser.add_argument('-d', '--debug', action='store_true', help="storing the value of whether the transforms will be displaying a debug window when launched.", default=False, required=False)
156 parser.add_argument('-o', '--output', action='store_true', help="Path where the files will be copied.", default=False, required=False)
157
158 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
159 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
160 groupAbout.add_argument('--version', action='version', version=VERSION, help='shows the version of the program and exists.')
161
162 args = parser.parse_args()
163
164 # Creating the application paths
165 paths = configuration.getConfigPath()
166
167 configureMaltego(transformsConfigFolder=paths["appPathTransforms"], base=args.base, debug=args.debug, mainPath=paths["appPath"], backupPath=paths["appPathDefaults"])
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 I3VISIO_FIELDS = [
23 "i3visio.alias",
24 "i3visio.bitcoin.address",
25 "i3visio.breach",
26 "i3visio.dni",
27 "i3visio.document",
28 "i3visio.dogecoin.address",
29 "i3visio.domain",
30 "i3visio.email",
31 "i3visio.file",
32 "i3visio.fullname",
33 "i3visio.hash",
34 "i3visio.litecoin.address",
35 "i3visio.location",
36 "i3visio.location.address",
37 "i3visio.location.city",
38 "i3visio.location.country",
39 "i3visio.location.postalcode",
40 "i3visio.location.province",
41 "i3visio.md5",
42 "i3visio.name",
43 "i3visio.object",
44 "i3visio.namecoin.address",
45 "i3visio.peercoin.address",
46 "i3visio.phone",
47 "i3visio.phone.home",
48 "i3visio.phone.mobile",
49 "i3visio.phone.office",
50 "i3visio.platform",
51 "i3visio.port",
52 "i3visio.profile",
53 "i3visio.protocol",
54 "i3visio.sha1",
55 "i3visio.sha256",
56 "i3visio.surname1",
57 "i3visio.surname2",
58 "i3visio.tag",
59 "i3visio.text",
60 "i3visio.tld",
61 "i3visio.uri",
62 ]
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2
3 ################################################################################
4 #
5 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the Affero GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22 #############################################################
23 # The code is based on an unlicensed Paterva's development. #
24 # The only disclaimer of this code is below. #
25 #############################################################
26 # Maltego Python Local Transform Helper #
27 # Version 0.2 #
28 # #
29 # Local transform specification can be found at: #
30 # http://ctas.paterva.com/view/Specification #
31 # #
32 # For more help and other local transforms #
33 # try the forum or mail me: #
34 # #
35 # http://www.paterva.com/forum #
36 # #
37 # Andrew MacPherson [ andrew <<at>> Paterva.com ] #
38 # #
39 #############################################################
40
41 import sys
42 import json
43 import yaml
44
45
46 class MaltegoEntity(object):
47 value = ""
48 weight = 100
49 displayInformation = None
50 additionalFields = []
51 iconURL = ""
52 entityType = "Phrase"
53
54 def __init__(self, eT=None, v=None):
55 if (eT is not None):
56 self.entityType = eT
57 if (v is not None):
58 self.value = sanitise(v)
59 self.additionalFields = []
60 self.displayInformation = None
61 self.bookmarks = 4
62
63 def setType(self, eT=None):
64 if (eT is not None):
65 self.entityType = eT
66
67 def setValue(self, eV=None):
68 if (eV is not None):
69 self.value = sanitise(eV)
70
71 def setWeight(self, w=None):
72 if (w is not None):
73 self.weight = w
74
75 def setDisplayInformation(self, di=None):
76 if (di is not None):
77 self.displayInformation = di
78
79 def addAdditionalFields(self, fieldName=None, displayName=None, matchingRule=False, value=None):
80 self.additionalFields.append([sanitise(fieldName),sanitise(displayName),matchingRule,sanitise(value)])
81
82 def setIconURL(self, iU=None):
83 if (iU is not None):
84 self.iconURL = iU
85
86 def returnEntity(self):
87 """Method to print the XML information that Maltego will be reading.
88 """
89 print self.getEntityText()
90
91 def getEntityText(self):
92 """Generating the Entity Type text based on the parameters of the entity.
93
94 :return: The entity text.
95 """
96 entityOutput = ""
97 entityOutput += "<Entity Type=\"" + stringify(self.entityType) + "\">"
98 entityOutput += "<Value>" + stringify(self.value) + "</Value>"
99 entityOutput += "<Weight>" + stringify(self.weight) + "</Weight>"
100 if (self.displayInformation is not None):
101 entityOutput += "<DisplayInformation><Label Name=\"\" Type=\"text/html\"><![CDATA[" + stringify(self.displayInformation) + "]]></Label></DisplayInformation>"
102 if (len(self.additionalFields) > 0):
103 entityOutput += "<AdditionalFields>"
104 for i in range(len(self.additionalFields)):
105 if (stringify(self.additionalFields[i][2]) <> "strict"):
106 entityOutput += "<Field Name=\"" + stringify(self.additionalFields[i][0]) + "\" DisplayName=\"" + stringify(self.additionalFields[i][1]) + "\">" + stringify(self.additionalFields[i][3]) + "</Field>"
107 else:
108 entityOutput += "<Field MatchingRule=\"" + stringify(self.additionalFields[i][2]) + "\" Name=\"" + stringify(self.additionalFields[i][0]) + "\" DisplayName=\"" + stringify(self.additionalFields[i][1]) + "\">" + stringify(self.additionalFields[i][3]) + "</Field>"
109 entityOutput += "</AdditionalFields>"
110 if (len(self.iconURL) > 0):
111 entityOutput += "<IconURL>" + self.iconURL + "</IconURL>"
112 entityOutput += "</Entity>"
113
114 return entityOutput
115
116 class MaltegoTransform(object):
117 entities = []
118 exceptions = []
119 UIMessages = []
120 values = {}
121
122 def __init__(self, argv = ""):
123 """The initialization will automatically perform the parameter parsing.
124
125 :param argv: Parameters passed by Maltego.
126 """
127 values = {}
128 value = None
129 self.parseArguments(argv)
130
131
132 def parseArguments(self, argv):
133 try:
134 if (argv[1] is not None):
135 self.value = argv[1]
136 except:
137 # If no info was provided
138 self.value = self.getVar("@value")
139 if (len(argv) > 2):
140 if (argv[2] is not None):
141 vars = argv[2].split('#')
142 for x in range(0, len(vars)):
143 vars_values = vars[x].split('=')
144 if (len(vars_values) == 2):
145 self.values[vars_values[0]] = vars_values[1]
146
147 def getValue(self):
148 if (self.value is not None):
149 return self.value
150
151
152 def getVar(self, varName):
153 if (varName in self.values.keys()):
154 if (self.values[varName] is not None):
155 return self.values[varName]
156
157
158 def getFatherEntity(self):
159 """Method that returns the i3visio-like entity
160
161 :param argv: Parameters transferred,
162
163 :return: An i3visio-like dictionary as the following:
164 {
165 "type": "i3visio.object",
166 "value": "example",
167 "attributes": []
168 }
169 """
170 try:
171 # Trying to load the full json object onto a new dictionary
172 temp = json.loads(self.getVar("@serialized"))
173 except:
174 # If the information is NOT found, it may be because the entity was created by the user...
175 temp = {}
176 # We will have to save the entity type to pass it even when
177 aux = self.getVar("@entity_type")
178 if aux != None:
179 temp["type"] = aux
180 else:
181 # If by any circumsntance, the @entity_type is NOT passed, we will create an i3visio.object
182 temp["type"] = "i3visio.object"
183 #return {}
184 temp["value"] = self.getValue()
185 temp["attributes"] = []
186 return temp
187
188
189 def addEntity(self, enType, enValue):
190 values = yaml.safe_load(enValue)
191
192 self.addUIMessage("Value: " + enValue)
193
194 if type(values) is not list:
195 values = [values]
196
197 for val in values:
198 self.addUIMessage("Value: " + val.decode("utf-8"))
199 me = MaltegoEntity(enType, val.decode("utf-8"))
200 self.addEntityToMessage(me)
201
202 return self.entities[len(self.entities)-len(values):]
203
204
205 def displayNewEntity(self, ent, pendingEntities=[]):
206 """Method that receives an i3visio-like object and build an entity from it.
207
208 :param ent: the dict object containing the i3visio-like entity.
209 :param pendingEntities: list of entities which are to be shown in future executions of the transforms.
210 """
211 # Creating the new entities
212 newEnts = self.addEntity(ent["type"], ent["value"])
213
214 for newEnt in newEnts:
215 # Establishing the new value for the entity..
216 newEnt.addAdditionalFields("@value", "@value", True, stringify(ent["value"]))
217
218 # Establishing the new entity type.
219 newEnt.addAdditionalFields("@entity_type", "@entity_type", True, stringify(ent["type"]))
220
221 # This field will contain the number of entities yet to be shown in the GUI
222 newEnt.addAdditionalFields("@number_pending", "@number_pending", True, stringify(len(pendingEntities)))
223
224 # This field will contain the entities that have not been shown yet in the GUI in its attribute field.
225 newEnt.addAdditionalFields("@pending", "@pending", True, json.dumps(pendingEntities))
226
227 # Creating the _serialized field containing a string representation of the object.
228 newEnt.addAdditionalFields("@serialized", "@serialized", True, json.dumps(ent))
229
230 # Iterating to create the new fields based on the attributes.
231 for att in ent["attributes"]:
232 newEnt.addAdditionalFields(att["type"], att["type"], True, att["value"])
233
234 # Displaying the full information in the tab...
235 newEnt.setDisplayInformation("<h3>" + stringify(ent["value"]) +"</h3><p>" + json.dumps(ent, indent=2) + "</p>")
236 newEnt.setDisplayInformation(json.dumps(ent, indent=2))
237
238
239 def addListOfEntities(self, newEntities):
240 """Method to display a series of entities in a transform. Usable when the transform is expected to recover more than one entity to capture all the results.
241
242 :param newEntities: it is always a list containing the dicts representing the new entities to be added.
243 """
244 # Reviewed entities
245 reviewedEntities =[]
246 # Defining a list to include the already added entities.
247 addedEntities = []
248
249 nextID = 0
250 # Generating up to 11 new entities
251 for new in newEntities:
252 # Increasing the iterating factor of the NEXT entity
253 nextID+=1
254 reviewedEntities.append(new)
255 # We do this to avoid processing attributes which will start with '@'
256 if new["value"][0] != "@":
257 addedEntities.append(new)
258 if len(addedEntities) >= 12:
259 # We stop, as Maltego in the Community edition does NOT show more than 12 entities per transform. THIS WILL BE CHANGED IN FUTURE VERSIONS TO LET UPDATE THE PROPERTY NUM_PNEDING OF THE CURRENT ENTITY.
260 self.addException("The entities to be shown is greater than 12, so not all entities can be shown in Community version.")
261 break
262
263 # Creating the addedEntities
264 for ent in addedEntities:
265 self.displayNewEntity(ent)
266
267 if len(addedEntities) <= len(newEntities):
268 self.addUIMessage("All the entities have been displayed!")
269 else:
270 self.addUIMessage("Ooops! Too many entities to display!")
271 self.addUIMessage("The following entities could not be added because of the limits in Maltego Community Edition:\n"+json.dumps(json.dumps(newEntities, indent=2)))
272
273 # Now, we are updating some information in the father entity. To display these updates, the father entity needs to be recreated to represent these updates
274 # First of all, we recover the information of the transform that was called.
275 ####fatherEnt = self.getFatherEntity()
276
277 # Now, we want to collect all those entities which have not been displayed.
278 ####pending = [ x for x in newEntities if x not in reviewedEntities ]
279 # These entities will be stored in the father entity which will need to be recreated to store in a new variable "@pending"
280 ####self.displayNewEntity(fatherEnt, pendingEntities = pending)
281
282
283 def addEntityToMessage(self, maltegoEntity):
284 self.entities.append(maltegoEntity)
285
286
287 def addUIMessage(self, message, messageType="Inform"):
288 # changed added to avoid problems when displaying messages that last more than one line
289 lines = message.splitlines()
290 for line in lines:
291 # we add a just to make the texts more readable
292 self.UIMessages.append([messageType, line.ljust(80, ".")])
293
294
295 def addException(self, exceptionString):
296 self.exceptions.append(exceptionString)
297
298
299 def throwExceptions(self):
300 print "<MaltegoMessage>"
301 print "<MaltegoTransformExceptionMessage>"
302 print "<Exceptions>"
303
304 for i in range(len(self.exceptions)):
305 print "<Exception>" + self.exceptions[i] + "</Exception>"
306 print "</Exceptions>"
307 print "</MaltegoTransformExceptionMessage>"
308 print "</MaltegoMessage>"
309 exit()
310
311
312 def returnOutput(self):
313 """Method that print the output text to let Maltego operate with it.
314 """
315 print self.getOutput()
316
317
318 def getOutput(self):
319 """Returning a the Output text.
320
321 :return : Textual output to be displayed.
322 """
323 maltegoOutput = ""
324 maltegoOutput += "<MaltegoMessage>"
325 maltegoOutput += "<MaltegoTransformResponseMessage>"
326
327 maltegoOutput += "<Entities>"
328 for i in range(len(self.entities)):
329 maltegoOutput += self.entities[i].getEntityText()
330 maltegoOutput += "</Entities>"
331
332 maltegoOutput += "<UIMessages>"
333 for i in range(len(self.UIMessages)):
334 maltegoOutput += "<UIMessage MessageType=\"" + self.UIMessages[i][0] + "\">" + self.UIMessages[i][1] + "</UIMessage>"
335 maltegoOutput += "</UIMessages>"
336
337 maltegoOutput += "</MaltegoTransformResponseMessage>"
338 maltegoOutput += "</MaltegoMessage>"
339 return maltegoOutput
340
341
342 def writeSTDERR(self, msg):
343 sys.stderr.write(stringify(msg))
344
345
346 def heartbeat(self):
347 self.writeSTDERR("+")
348
349
350 def progress(self, percent):
351 self.writeSTDERR("%" + stringify(percent))
352
353
354 def debug(self, msg):
355 self.writeSTDERR("D:" + stringify(msg))
356
357
358 def stringify(value):
359 try:
360 return sanitise(json.dumps(value)[1:-1])
361 except:
362 return sanitise(value)
363
364
365 def sanitise(value):
366 replace_these = ["&", ">", "<", '\\"', "\\"]
367 replace_with = ["&amp;", "&gt;", "&lt;", "", ""]
368 tempvalue = value
369 for i in range(0, len(replace_these)):
370 tempvalue = tempvalue.replace(replace_these[i], replace_with[i])
371 return tempvalue
0 <MaltegoEntity id="i3visio.alias" displayName="i3visio - Alias" displayNamePlural="i3visio - Aliases" description="Any valid alias to be checked." category="i3visio.person" smallIconResource="IdGolden" largeIconResource="IdGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-alias">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" displayName="@entity_type" description="This field contains a generic property that stores the type of the given entity.">
12 <DefaultValue>i3visio.alias</DefaultValue>
13 <SampleValue>i3visio.alias</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.alias', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.alias', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.bitcoin.address" displayName="i3visio - Bitcoin Address" displayNamePlural="i3visio - Bitcoin Addresses" description="A Bitcoin address" category="i3visio.currencies" smallIconResource="bitcoin_large" largeIconResource="bitcoin_large" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-bitcoin-address">
5 <Fields>
6 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
7 <DefaultValue>-</DefaultValue>
8 <SampleValue>-</SampleValue>
9 </Field>
10 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" displayName="@entity_type" description="This field contains a generic property that stores the type of the given entity.">
11 <DefaultValue>i3visio.bitcoin.address</DefaultValue>
12 <SampleValue>i3visio.bitcoin.address</SampleValue>
13 </Field>
14 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
15 <DefaultValue>{'type': 'i3visio.bitcoin.address', 'value':'Default', 'attributes':[]}</DefaultValue>
16 <SampleValue>{'type': 'i3visio.bitcoin.address', 'value':'Sample', 'attributes':[]}</SampleValue>
17 </Field>
18 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
19 <DefaultValue>0</DefaultValue>
20 <SampleValue>0</SampleValue>
21 </Field>
22 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
23 <DefaultValue>[]</DefaultValue>
24 <SampleValue>[]</SampleValue>
25 </Field>
26 </Fields>
27 </Properties>
28 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.breach" displayName="i3visio - Breach" displayNamePlural="i3visio - Breachs" description="Sites where an email has been breached." category="i3visio.person" smallIconResource="Murder" largeIconResource="Murder" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-breach">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" displayName="@entity_type" description="This field contains a generic property that stores the type of the given entity.">
12 <DefaultValue>i3visio.breach</DefaultValue>
13 <SampleValue>i3visio.breach</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.breach', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.breach', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.dni" displayName="i3visio - DNI" displayNamePlural="i3visio - DNIs" description="A valid Spanish DNI." category="i3visio.person" smallIconResource="Passport" largeIconResource="Passport" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-dni">
5 <Fields>
6 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
7 <DefaultValue>-</DefaultValue>
8 <SampleValue>-</SampleValue>
9 </Field>
10 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" displayName="@entity_type" description="This field contains a generic property that stores the type of the given entity.">
11 <DefaultValue>i3visio.dni</DefaultValue>
12 <SampleValue>i3visio.dni</SampleValue>
13 </Field>
14 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
15 <DefaultValue>{'type': 'i3visio.dni', 'value':'Default', 'attributes':[]}</DefaultValue>
16 <SampleValue>{'type': 'i3visio.dni', 'value':'Sample', 'attributes':[]}</SampleValue>
17 </Field>
18 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
19 <DefaultValue>0</DefaultValue>
20 <SampleValue>0</SampleValue>
21 </Field>
22 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
23 <DefaultValue>[]</DefaultValue>
24 <SampleValue>[]</SampleValue>
25 </Field>
26 </Fields>
27 </Properties>
28 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.dogecoin.address" displayName="i3visio - Dogecoin Address" displayNamePlural="i3visio - Dogecoin Addresses" description="Any Dogecoin address." category="i3visio.currencies" smallIconResource="dogecoin_large" largeIconResource="dogecoin_large" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-dogecoin-address">
5 <Fields>
6 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
7 <DefaultValue>-</DefaultValue>
8 <SampleValue>-</SampleValue>
9 </Field>
10 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
11 <DefaultValue>i3visio.dogecoin.address</DefaultValue>
12 <SampleValue>i3visio.dogecoin.address</SampleValue>
13 </Field>
14 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
15 <DefaultValue>{'type': 'i3visio.dogecoin.address', 'value':'Default', 'attributes':[]}</DefaultValue>
16 <SampleValue>{'type': 'i3visio.dogecoin.address', 'value':'Sample', 'attributes':[]}</SampleValue>
17 </Field>
18 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
19 <DefaultValue>0</DefaultValue>
20 <SampleValue>0</SampleValue>
21 </Field>
22 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
23 <DefaultValue>[]</DefaultValue>
24 <SampleValue>[]</SampleValue>
25 </Field>
26 </Fields>
27 </Properties>
28 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.domain" displayName="i3visio - Domain" displayNamePlural="i3visio - Domains" description="Any domain or subdomain found." category="i3visio.web" smallIconResource="DNS Name" largeIconResource="DNS Name" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-domain">
5 <Fields>
6 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
7 <DefaultValue>-</DefaultValue>
8 <SampleValue>-</SampleValue>
9 </Field>
10 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
11 <DefaultValue>i3visio.domain</DefaultValue>
12 <SampleValue>i3visio.domain</SampleValue>
13 </Field>
14 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
15 <DefaultValue>{'type': 'i3visio.domain', 'value':'Default', 'attributes':[]}</DefaultValue>
16 <SampleValue>{'type': 'i3visio.domain', 'value':'Sample', 'attributes':[]}</SampleValue>
17 </Field>
18 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
19 <DefaultValue>0</DefaultValue>
20 <SampleValue>0</SampleValue>
21 </Field>
22 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
23 <DefaultValue>[]</DefaultValue>
24 <SampleValue>[]</SampleValue>
25 </Field>
26 </Fields>
27 </Properties>
28 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.email" displayName="i3visio - Email" displayNamePlural="i3visio - Emails" description="This is an i3visio email." category="i3visio.person" smallIconResource="EmailConversation" largeIconResource="EmailConversation" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-email">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.email</DefaultValue>
13 <SampleValue>i3visio.email</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.email', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.email', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.file" displayName="i3visio - File" displayNamePlural="i3visio - Files" description="The filepath or filename of any file." category="i3visio.web" smallIconResource="List" largeIconResource="List" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-file">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.file</DefaultValue>
13 <SampleValue>i3visio.file</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.file', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.file', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.fullname" displayName="i3visio - Fullname" displayNamePlural="i3visio - Fullnames" description="The fullname of a person." category="i3visio.person" smallIconResource="TextField" largeIconResource="TextField" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-fullname">
5 <Fields>
6 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
7 <DefaultValue>-</DefaultValue>
8 <SampleValue>-</SampleValue>
9 </Field>
10 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
11 <DefaultValue>i3visio.fullname</DefaultValue>
12 <SampleValue>i3visio.fullname</SampleValue>
13 </Field>
14 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
15 <DefaultValue>{'type': 'i3visio.fullname', 'value':'Default', 'attributes':[]}</DefaultValue>
16 <SampleValue>{'type': 'i3visio.fullname', 'value':'Sample', 'attributes':[]}</SampleValue>
17 </Field>
18 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
19 <DefaultValue>0</DefaultValue>
20 <SampleValue>0</SampleValue>
21 </Field>
22 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
23 <DefaultValue>[]</DefaultValue>
24 <SampleValue>[]</SampleValue>
25 </Field>
26 </Fields>
27 </Properties>
28 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.hash" displayName="i3visio - Hash" displayNamePlural="i3visio - Hashs" description="Any type of hash." category="i3visio.hash" smallIconResource="BitGolden" largeIconResource="BitGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-hash">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.hash</DefaultValue>
13 <SampleValue>i3visio.hash</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.hash', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.hash', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.ipv4" displayName="i3visio - IPv4 address" displayNamePlural="i3visio - IPv4 addresses" description="Any IPv4 address." category="i3visio.web" smallIconResource="Ip" largeIconResource="Document" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-ipv4">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.ipv4</DefaultValue>
13 <SampleValue>i3visio.ipv4</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.ipv4', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.ipv4', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.litecoin.address" displayName="i3visio - Litecoin Address" displayNamePlural="i3visio - Litecoin Addresses" description="Any Litecoin address." category="i3visio.currencies" smallIconResource="litecoin_large" largeIconResource="litecoin_large" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-litecoin-address">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.litecoin.address</DefaultValue>
13 <SampleValue>i3visio.litecoin.address</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.litecoin.address', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.litecoin.address', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location.address" displayName="i3visio - Address" displayNamePlural="i3visio - Addresses" description="A postal address." category="i3visio.location" smallIconResource="Geography" largeIconResource="Geography" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.location</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location-address">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location.address</DefaultValue>
13 <SampleValue>i3visio.location.address</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location.address', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location.address', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location.city" displayName="i3visio - City" displayNamePlural="i3visio - Cities" description="The name of a city." category="i3visio.location" smallIconResource="Geography" largeIconResource="Geography" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.location</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location-city">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location.city</DefaultValue>
13 <SampleValue>i3visio.locatin.city</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location.city', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location.city', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location.country" displayName="i3visio - Country" displayNamePlural="i3visio - Countrys" description="A country name." category="i3visio.location" smallIconResource="Geography" largeIconResource="Geography" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.location</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location-country">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location.country</DefaultValue>
13 <SampleValue>i3visio.location.country</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location.country', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location.country', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location" displayName="i3visio - Location" displayNamePlural="i3visio - Locations" description="A location entity." category="i3visio.location" smallIconResource="FixGolden" largeIconResource="FixGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location</DefaultValue>
13 <SampleValue>i3visio.location</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location.geo" displayName="i3visio - Geocoordinates" displayNamePlural="i3visio - Geocoordinates" description="A pair of geocoordinates." category="i3visio.location" smallIconResource="Geography" largeIconResource="Geography" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.location</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location-geo">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location.geo</DefaultValue>
13 <SampleValue>i3visio.location.geo</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location.geo', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location.geo', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location.postalcode" displayName="i3visio - Postalcode" displayNamePlural="i3visio - Postalcodes" description="A postalcode." category="i3visio.location" smallIconResource="Geography" largeIconResource="Geography" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.location</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location-postalcode">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location.postalcode</DefaultValue>
13 <SampleValue>i3visio.location.postalcode</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location.postalcode', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location.postalcode', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.location.province" displayName="i3visio - Province" displayNamePlural="i3visio - Provinces" description="A province." category="i3visio.location" smallIconResource="Geography" largeIconResource="Geography" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.location</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-location-province">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.location.province</DefaultValue>
13 <SampleValue>i3visio.location.province</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.location.province', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.location.province', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.md5" displayName="i3visio - MD5" displayNamePlural="i3visio - MD5" description="A MD5 hash." category="i3visio.hash" smallIconResource="BitGolden" largeIconResource="BitGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.hash</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-md5">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.md5</DefaultValue>
13 <SampleValue>i3visio.md5</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.md5', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.md5', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.name" displayName="i3visio - Name" displayNamePlural="i3visio - Names" description="The first name of a person." category="i3visio.person" smallIconResource="TextField" largeIconResource="TextField" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-name">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.name</DefaultValue>
13 <SampleValue>i3visio.name</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.name', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.name', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.namecoin.address" displayName="i3visio - Namecoin Address" displayNamePlural="i3visio - Namecoin Addresses" description="A Namecoin address" category="i3visio.currencies" smallIconResource="namecoin_large" largeIconResource="namecoin_large" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-namecoin-address">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.namecoin.address</DefaultValue>
13 <SampleValue>i3visio.namecoin.address</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.namecoin.address', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.namecoin.address', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.object" displayName="i3visio - Object" displayNamePlural="i3visio - Objects" description="The generic i3visio object in which any other i3visio object is based. Useful for deploying generic transforms like expandPropertiesFromI3visioEntity." category="i3visio" smallIconResource="GPS" largeIconResource="GPS" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <Properties value="properties.i3visio-object">
2 <Groups/>
3 <Fields>
4 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
5 <DefaultValue>-</DefaultValue>
6 <SampleValue>-</SampleValue>
7 </Field>
8 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
9 <DefaultValue>i3visio.object</DefaultValue>
10 <SampleValue>i3visio.object</SampleValue>
11 </Field>
12 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
13 <DefaultValue>{'type': 'i3visio.object', 'value':'Default', 'attributes':[]}</DefaultValue>
14 <SampleValue>{'type': 'i3visio.object', 'value':'Sample', 'attributes':[]}</SampleValue>
15 </Field>
16 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
17 <DefaultValue>0</DefaultValue>
18 <SampleValue>0</SampleValue>
19 </Field>
20 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
21 <DefaultValue>[]</DefaultValue>
22 <SampleValue>[]</SampleValue>
23 </Field>
24 </Fields>
25 </Properties>
26 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.peercoin.address" displayName="i3visio - Peercoin Address" displayNamePlural="i3visio - Peercoin Addresses" description="A Peercoin address" category="i3visio.currencies" smallIconResource="peercoin_large" largeIconResource="peercoin_large" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-peercoin-address">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.peercoin.address</DefaultValue>
13 <SampleValue>i3visio.peercoin.address</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.peercoin.address', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.peercoin.address', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.person" displayName="i3visio - Person" displayNamePlural="i3visio - Persons" description="Any person." category="i3visio.person" smallIconResource="Person" largeIconResource="Person" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4
5 <Properties value="properties.i3visio-person">
6 <Groups/>
7 <Fields>
8 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
9 <DefaultValue>-</DefaultValue>
10 <SampleValue>-</SampleValue>
11 </Field>
12 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
13 <DefaultValue>i3visio.person</DefaultValue>
14 <SampleValue>i3visio.person</SampleValue>
15 </Field>
16 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
17 <DefaultValue>{'type': 'i3visio.person', 'value':'Default', 'attributes':[]}</DefaultValue>
18 <SampleValue>{'type': 'i3visio.person', 'value':'Sample', 'attributes':[]}</SampleValue>
19 </Field>
20 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
21 <DefaultValue>0</DefaultValue>
22 <SampleValue>0</SampleValue>
23 </Field>
24 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
25 <DefaultValue>[]</DefaultValue>
26 <SampleValue>[]</SampleValue>
27 </Field>
28 <Field name="i3visio.fullname" type="string" nullable="true" hidden="false" readonly="false" description="The fullname of the target person." displayName="i3visio - Fullname">
29 <DefaultValue> </DefaultValue>
30 <SampleValue>Alicia Álvarez Abad</SampleValue>
31 </Field>
32 <Field name="i3visio.name" type="string" nullable="true" hidden="false" readonly="false" description="The first name of the target person." displayName="i3visio - Name">
33 <DefaultValue> </DefaultValue>
34 <SampleValue>Alicia</SampleValue>
35 </Field>
36 <Field name="i3visio.surname1" type="string" nullable="true" hidden="false" readonly="false" description="The first surname of the target person." displayName="i3visio - 1st surname">
37 <DefaultValue> </DefaultValue>
38 <SampleValue>Álvarez</SampleValue>
39 </Field>
40 <Field name="i3visio.surname2" type="string" nullable="true" hidden="false" readonly="false" description="The second surname of the target person." displayName="i3visio - 2nd surname">
41 <DefaultValue> </DefaultValue>
42 <SampleValue>Abad</SampleValue>
43 </Field>
44 <Field name="i3visio.location.address" type="string" nullable="true" hidden="false" readonly="false" description="The address of the target person." displayName="i3visio - Address">
45 <DefaultValue> </DefaultValue>
46 <SampleValue>Gran Vía 1</SampleValue>
47 </Field>
48 <Field name="i3visio.location.postalcode" type="string" nullable="true" hidden="false" readonly="false" description="The postalcode of the target person." displayName="i3visio - Postalcode">
49 <DefaultValue> </DefaultValue>
50 <SampleValue>28001</SampleValue>
51 </Field>
52 <Field name="i3visio.location.city" type="string" nullable="true" hidden="false" readonly="false" description="The city of the target person." displayName="i3visio - City">
53 <DefaultValue> </DefaultValue>
54 <SampleValue>Madrid</SampleValue>
55 </Field>
56 <Field name="i3visio.location.province" type="string" nullable="true" hidden="false" readonly="false" description="The province of the target person." displayName="i3visio - Province">
57 <DefaultValue> </DefaultValue>
58 <SampleValue>Madrid</SampleValue>
59 </Field>
60 <Field name="i3visio.location.country" type="string" nullable="true" hidden="false" readonly="false" description="The country of the target person." displayName="i3visio - Country">
61 <DefaultValue> </DefaultValue>
62 <SampleValue>Spain</SampleValue>
63 </Field>
64 </Fields>
65 </Properties>
66
67 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.phone" displayName="i3visio - Phone" displayNamePlural="i3visio - Phones" description="Any kind of phone entity." category="i3visio.phone" smallIconResource="PhoneConversation" largeIconResource="PhoneConversation" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-phone">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.phone</DefaultValue>
13 <SampleValue>i3visio.phone</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.phone', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.phone', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.phone.home" displayName="i3visio - Phone Home" displayNamePlural="i3visio - Phone Homes" description="A phone number from home." category="i3visio.phone" smallIconResource="Phone" largeIconResource="Phone" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.phone</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-phone-home">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.phone.home</DefaultValue>
13 <SampleValue>i3visio.phone.home</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.phone.home', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.phone.home', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.phone.mobile" displayName="i3visio - Mobile" displayNamePlural="i3visio - Mobiles" description="A mobile phone number." category="i3visio.phone" smallIconResource="Smartphone" largeIconResource="Smartphone" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.phone</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-phone-mobile">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.phone.mobile</DefaultValue>
13 <SampleValue>i3visio.phone.mobile</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.phone.mobile', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.phone.mobile', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.phone.office" displayName="i3visio - Phone Office" displayNamePlural="i3visio - Phone Offices" description="An office phone number." category="i3visio.phone" smallIconResource="CommutatorGolden" largeIconResource="CommutatorGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.phone</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-phone-office">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.phone.office</DefaultValue>
13 <SampleValue>i3visio.phone.office</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.phone.office', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.phone.office', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.platform" displayName="i3visio - Platform" displayNamePlural="i3visio - Platforms" description="This is a platform extracted by OSRFramework." category="i3visio.web" smallIconResource="Nic" largeIconResource="Nic" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-platform">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.platform</DefaultValue>
13 <SampleValue>i3visio.platform</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.platform', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.platform', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.port" displayName="i3visio - Port" displayNamePlural="i3visio - Ports" description="Any telecommunication port found in the system ." category="i3visio.web" smallIconResource="PortGolden" largeIconResource="PortGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-port">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.port</DefaultValue>
13 <SampleValue>i3visio.port</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.port', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.port', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.profile" displayName="i3visio - Profile" displayNamePlural="i3visio - Profiles" description="This is a profile found." category="i3visio.person" smallIconResource="UserId" largeIconResource="UserId" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-profile">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.profile</DefaultValue>
13 <SampleValue>i3visio.profile</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.profile', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.profile', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.protocol" displayName="i3visio - Protocol" displayNamePlural="i3visio - Protocols" description="Any communication protocol found such as HTTP, HTTPS, FTP, etc.." category="i3visio.web" smallIconResource="Protocol" largeIconResource="Datagram" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-protocol">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.protocol</DefaultValue>
13 <SampleValue>i3visio.protocol</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.protocol', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.protocol', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.result" displayName="i3visio - Result" displayNamePlural="i3visio - Resultss" description="This is a generic result found." category="i3visio.web" smallIconResource="UserId" largeIconResource="UserId" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-result">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.result</DefaultValue>
13 <SampleValue>i3visio.result</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.result', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.result', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.sha1" displayName="i3visio - SHA1" displayNamePlural="i3visio - SHA1" description="A SHA1 hash." category="i3visio.hash" smallIconResource="BitGolden" largeIconResource="BitGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.hash</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-sha1">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.sha1</DefaultValue>
13 <SampleValue>i3visio.sha1</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.sha1', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.sha1', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.sha256" displayName="i3visio - SHA256" displayNamePlural="i3visio - SHA256" description="A SHA256 hash." category="i3visio.hash" smallIconResource="BitGolden" largeIconResource="BitGolden" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.hash</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-sha256">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.sha256</DefaultValue>
13 <SampleValue>i3visio.sha256</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.sha256', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.sha256', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.surname1" displayName="i3visio - 1st Surname " displayNamePlural="i3visio - 1st Surnames" description="The first surname of a person." category="i3visio.person" smallIconResource="TextField" largeIconResource="TextField" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-surname1">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.surname1</DefaultValue>
13 <SampleValue>i3visio.surname1</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.surname1', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.surname1', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.surname2" displayName="i3visio - 2nd Surname" displayNamePlural="i3visio - 2nd Surnames" description="The second surname of a person." category="i3visio.person" smallIconResource="TextField" largeIconResource="TextField" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.text</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-surname2">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.surname2</DefaultValue>
13 <SampleValue>i3visio.surname2</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.surname2', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.surname2', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.tag" displayName="i3visio - Tag" displayNamePlural="i3visio - Tags" description="Tags for the i3visio platforms." category="i3visio" smallIconResource="Image" largeIconResource="Image" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-tag">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.tag</DefaultValue>
13 <SampleValue>i3visio.tag</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.tag', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.tag', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.text" displayName="i3visio - Text" displayNamePlural="i3visio - Texts" description="Any kind of textual data." category="i3visio" smallIconResource="TextField" largeIconResource="TextField" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-text">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.text</DefaultValue>
13 <SampleValue>i3visio.text</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.text', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.text', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.tld" displayName="i3visio - TLD" displayNamePlural="i3visio - TLDs" description="The TLD of a domain." category="i3visio.web" smallIconResource="DNS Name" largeIconResource="DNS Name" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.domain</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-tld">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.tld</DefaultValue>
13 <SampleValue>i3visio.tld</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.tld', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.tld', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoEntity id="i3visio.uri" displayName="i3visio - URI" displayNamePlural="i3visio - URIs" description="Any URI to be used." category="i3visio.web" smallIconResource="Document" largeIconResource="Document" allowedRoot="true" conversionOrder="2147483647" visible="true">
1 <BaseEntities>
2 <BaseEntity>i3visio.object</BaseEntity>
3 </BaseEntities>
4 <Properties value="properties.i3visio-uri">
5 <Groups/>
6 <Fields>
7 <Field name="@value" displayName="@value" type="string" nullable="true" hidden="False" readonly="False" description="This field contains the value of the given entity.">
8 <DefaultValue>-</DefaultValue>
9 <SampleValue>-</SampleValue>
10 </Field>
11 <Field name="@entity_type" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a generic property that stores the type of the given entity." displayName="@entity_type">
12 <DefaultValue>i3visio.uri</DefaultValue>
13 <SampleValue>i3visio.uri</SampleValue>
14 </Field>
15 <Field name="@serialized" type="string" nullable="true" hidden="True" readonly="True" description="This field contains the serialized object." displayName="@pending">
16 <DefaultValue>{'type': 'i3visio.uri', 'value':'Default', 'attributes':[]}</DefaultValue>
17 <SampleValue>{'type': 'i3visio.uri', 'value':'Sample', 'attributes':[]}</SampleValue>
18 </Field>
19 <Field name="@number_pending" type="string" nullable="true" hidden="False" readonly="True" description="This field contains the number of pending entities to be shown yet." displayName="@number_pending">
20 <DefaultValue>0</DefaultValue>
21 <SampleValue>0</SampleValue>
22 </Field>
23 <Field name="@pending" type="string" nullable="true" hidden="True" readonly="True" description="This field contains a list of the attributes still to be shown." displayName="@pending">
24 <DefaultValue>[]</DefaultValue>
25 <SampleValue>[]</SampleValue>
26 </Field>
27 </Fields>
28 </Properties>
29 </MaltegoEntity>
0 <MaltegoServer name="Local" enabled="true" description="Local transforms coded by i3visio to be executed in the machine" url="http://localhost">
1 <LastSync>2015-1-14 7:00:00.000 CET</LastSync>
2 <Protocol version="0.0"/>
3 <Authentication type="none"/>
4 <Transforms>
5 <Transform name="i3visio.aliasToAllProfiles"/>
6 <Transform name="i3visio.aliasToFamousPlatforms"/>
7 <Transform name="i3visio.aliasToSelectedPlatforms"/>
8 <Transform name="i3visio.aliasToKnownEmails"/>
9 <Transform name="i3visio.aliasToAllKnownDomains"/>
10 <Transform name="i3visio.aliasToGlobalKnownDomains"/>
11 <Transform name="i3visio.aliasToSkypeAccounts"/>
12 <Transform name="i3visio.aliasToSkypeIP"/>
13 <Transform name="i3visio.bitcoinAddressToBlockchainDetails"/>
14 <Transform name="i3visio.coordinatesToGoogleMapsBrowser"/>
15 <Transform name="i3visio.coordinatesToTwitterBrowser"/>
16 <Transform name="i3visio.domainToIp_ApiInformation"/>
17 <Transform name="i3visio.domainToTld"/>
18 <Transform name="i3visio.emailToAlias"/>
19 <Transform name="i3visio.emailToBreachedAccounts"/>
20 <Transform name="i3visio.emailToDomain"/>
21 <Transform name="i3visio.emailToSkypeAccounts"/>
22 <Transform name="i3visio.expandPropertiesFromI3visioEntity"/>
23 <Transform name="i3visio.hashToMD5crackDotCom"/>
24 <Transform name="i3visio.ipToIp_ApiInformation"/>
25 <Transform name="i3visio.textToPhoneDetails"/>
26 <Transform name="i3visio.phoneToMoreInfoListspam"/>
27 <Transform name="i3visio.textToAllEntities"/>
28 <Transform name="i3visio.textToGoogleSearchUri"/>
29 <Transform name="i3visio.textToTwitterProfiles"/>
30 <Transform name="i3visio.textToFacebookProfiles"/>
31 <Transform name="i3visio.textToSkypeProfiles"/>
32 <Transform name="i3visio.uriToAllEntities"/>
33 <Transform name="i3visio.uriToBrowser"/>
34 <Transform name="i3visio.uriToDomain"/>
35 <Transform name="i3visio.uriToGoogleCacheUri"/>
36 <Transform name="i3visio.uriToPort"/>
37 <Transform name="i3visio.uriToProtocol"/>
38 </Transforms>
39 </MaltegoServer>
40
0 <MaltegoTransform name="i3visio.aliasToAllKnownDomains" displayName="i3visio - aliasToAllKnownDomains" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">aliasToKnownDomains.py all </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY>/</Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.aliasToAllProfiles" displayName="i3visio - aliasToAllProfiles" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.usufy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">usufy.py -p all --maltego -T 12 -n </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.aliasToFamousPlatforms" displayName="i3visio - aliasToFamousPlatforms" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.usufy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">usufy.py -p badoo facebook forocoches github googleplus kali linkedin pastebin twitter youtube --maltego -T 12 -n </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.aliasToGlobalKnownDomains" displayName="i3visio - aliasToGlobalKnownDomains" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">aliasToKnownDomains.py global </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY>/</Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.aliasToKnownEmails" displayName="i3visio - aliasToKnownEmails" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">aliasToKnownEmails.py </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY>/</Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.aliasToSelectedPlatforms" displayName="i3visio - aliasToSelectedPlatforms" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" auth="false" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" auth="false" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" auth="false" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" auth="false" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.usufy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true" runWithAll="true" favorite="false">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="true">usufy.py -p INSERT_YOUR_PLATFORMS_HERE -T 12 --maltego -n </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.aliasToSkypeIP" displayName="i3visio - aliasToSkypeIP" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.alias" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">aliasToSkypeIP.py </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.bitcoinAddressToBlockchainDetails" displayName="i3visio - bitcoinAddressToBlockchainDetails" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.bitcoin.address" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">bitcoinAddressToBlockchainDetails.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.coordinatesToGoogleMapsBrowser" displayName="i3visio - coordinatesToGoogleMapsBrowser" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.location.geo" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">coordinatesToGoogleMapsBrowser.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.coordinatesToTwitterBrowser" displayName="i3visio - coordinatesToTwitterBrowser" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.location.geo" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">coordinatesToTwitterBrowser.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.domainToGoogleSearchUriWithEmails" displayName="i3visio - domainToGoogleSearchUriWithEmails" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.domain" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">domainToGoogleSearchUriWithEmails.py </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.domainToIp_ApiInformation" displayName="i3visio - domainToIp_ApiInformation" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.domain" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">ipToIp_ApiInformation.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.domainToTld" displayName="i3visio - domainToTld" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.domain" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">domainToTld.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.emailToAlias" displayName="i3visio - emailToAlias" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.email" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">emailToAlias.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.emailToBreachedAccounts" displayName="i3visio - emailToBreachedAccounts" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.email" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">emailToBreachedAccounts.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.emailToDomain" displayName="i3visio - emailToDomain" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.email" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">emailToDomain.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.emailToSkypeAccounts" displayName="i3visio - emailToSkypeAccounts" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.email" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">emailToSkypeAccounts.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.expandPropertiesFromI3visioEntity" displayName="i3visio - expandPropertiesFromI3visioEntity" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.object" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets/>
24 <StealthLevel>0</StealthLevel>
25 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">expandPropertiesFromI3visioEntity.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.hashToMD5crackDotCom" displayName="i3visio - hashToMD5crackDotCom" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.hash" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">hashToMD5crackDotCom.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.ipToIp_ApiInformation" displayName="i3visio - ipToIp_ApiInformation" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.ipv4" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">ipToIp_ApiInformation.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.phoneToMoreInfoListspam" displayName="i3visio - phoneToMoreInfoListspam" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.phone" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">phoneToMoreInfo.py listspam</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToAllEntities" displayName="i3visio - textToAllEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py all </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToBitcoinAddressEntities" displayName="i3visio - textToBitcoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.bitcoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToDeepWebSearch" displayName="i3visio - textToDeepWebSearch" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToDeepWebSearch.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToDniEntities" displayName="i3visio - textToDniEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.dni </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToDogecoinAddressEntities" displayName="i3visio - textToDogecoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.dogecoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToEmailEntities" displayName="i3visio - textToEmailEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.email </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToFacebookProfiles" displayName="i3visio - textToFacebookProfiles" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.searchfy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">searchfy.py -p facebook --maltego -q </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToGoogleSearchUri" displayName="i3visio - textToGoogleSearchUri" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToGoogleSearchUri.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToIPv4Entities" displayName="i3visio - textToIPv4Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.ipv4 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToLitecoinAddressEntities" displayName="i3visio - textToLitecoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.litecoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToMD5Entities" displayName="i3visio - textToMD5Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.md5 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToNamecoinAddressEntities" displayName="i3visio - textToNamecoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.namecoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToPeercoinAddressEntities" displayName="i3visio - textToPeercoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.peercoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToPhoneDetails" displayName="i3visio - textToPhoneDetails" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">phoneToPerson.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToPlatformSearch" displayName="i3visio - textToPlatformSearch" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToPlatformSearch.py </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY>/</Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToTwitterProfiles" displayName="i3visio - textToTwitterProfiles" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.searchfy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python </Property>
3 <Property name="transform.local.parameters" type="string" popup="false">searchfy.py -p twitter --maltego -q </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToSHA1Entities" displayName="i3visio - textToSHA1Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.sha1 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToSHA256Entities" displayName="i3visio - textToSHA256Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.sha256 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToSkypeProfiles" displayName="i3visio - textToSkypeProfiles" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.searchfy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">searchfy.py -p skype --maltego -q </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToTwitterProfiles" displayName="i3visio - textToTwitterProfiles" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio.searchfy"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">searchfy.py -p twitter --maltego -q </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.textToUriEntities" displayName="i3visio - textToUriEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.text" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">textToEntities.py i3visio.uri </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToAllEntities" displayName="i3visio - uriToAllEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py all </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToBitcoinAddressEntities" displayName="i3visio - uriToBitcoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.bitcoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToBrowser" displayName="i3visio - uriToBrowser" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToBrowser.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToDniEntities" displayName="i3visio - uriToDniEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.dni </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToDogecoinAddressEntities" displayName="i3visio - uriToDogecoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.dogecoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToDomain" displayName="i3visio - uriToDomain" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToDomain.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToEmailEntities" displayName="i3visio - uriToEmailEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.email </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToGoogleCacheUri" displayName="i3visio - uriToGoogleCacheUri" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToGoogleCacheUri.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToIPv4Entities" displayName="i3visio - uriToIPv4Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.ipv4 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToLitecoinAddressEntities" displayName="i3visio - uriToLitecoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.litecoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToMD5Entities" displayName="i3visio - uriToMD5Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.md5 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToNamecoinAddressEntities" displayName="i3visio - uriToNamecoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.namecoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToPeercoinAddressEntities" displayName="i3visio - uriToPeercoinAddressEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.peercoin.address </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToPort" displayName="i3visio - uriToPort" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToPort.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToProtocol" displayName="i3visio - uriToProtocol" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToProtocol.py</Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToSHA1Entities" displayName="i3visio - uriToSHA1Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.sha1 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToSHA256Entities" displayName="i3visio - uriToSHA256Entities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.sha256 </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <MaltegoTransform name="i3visio.uriToUriEntities" displayName="i3visio - uriToUriEntities" abstract="false" template="false" visibility="public" author="i3visio" requireDisplayInfo="false">
1 <TransformAdapter>com.paterva.maltego.transform.protocol.v2api.LocalTransformAdapterV2</TransformAdapter>
2 <Properties>
3 <Fields>
4 <Property name="transform.local.command" type="string" nullable="false" hidden="false" readonly="false" description="The command to execute for this transform" popup="false" abstract="false" visibility="public" displayName="Command line">
5 <SampleValue></SampleValue>
6 </Property>
7 <Property name="transform.local.parameters" type="string" nullable="true" hidden="false" readonly="false" description="The parameters to pass to the transform command" popup="false" abstract="false" visibility="public" displayName="Command parameters">
8 <SampleValue></SampleValue>
9 </Property>
10 <Property name="transform.local.working-directory" type="string" nullable="true" hidden="false" readonly="false" description="The working directory used when invoking the executable" popup="false" abstract="false" visibility="public" displayName="Working directory">
11 <DefaultValue><CUSTOM_WORKING_DIRECTORY></DefaultValue>
12 <SampleValue></SampleValue>
13 </Property>
14 <Property name="transform.local.debug" type="boolean" nullable="true" hidden="false" readonly="false" description="When this is set, the transform&apos;s text output will be printed to the output window" popup="false" abstract="false" visibility="public" displayName="Show debug info">
15 <SampleValue>false</SampleValue>
16 </Property>
17 </Fields>
18 </Properties>
19 <InputConstraints>
20 <Entity type="i3visio.uri" min="1" max="1"/>
21 </InputConstraints>
22 <OutputEntities/>
23 <defaultSets>
24 <Set name="i3visio"/>
25 </defaultSets>
26 <StealthLevel>0</StealthLevel>
27 </MaltegoTransform>
0 <TransformSettings enabled="true" disclaimerAccepted="false" showHelp="true">
1 <Properties>
2 <Property name="transform.local.command" type="string" popup="false">python</Property>
3 <Property name="transform.local.parameters" type="string" popup="false">uriToEntities.py i3visio.uri </Property>
4 <Property name="transform.local.working-directory" type="string" popup="false"><CUSTOM_WORKING_DIRECTORY></Property>
5 <Property name="transform.local.debug" type="boolean" popup="false"><DEBUG_MODE></Property>
6 </Properties>
7 </TransformSettings>
0 <TransformSet name="i3visio - Cryptocurrencies" description="Set of transforms to look for information about the cryptocurrencies.">
1 <Transforms>
2 <Transform name="i3visio.bitcoinAddressToBlockchainDetails"/>
3 </Transforms>
4 </TransformSet>
0 <TransformSet name="i3visio - domainfy.py" description="Searching for domains using domainfy.py utility.">
1 <Transforms>
2 <Transform name="i3visio.aliasToAllKnownDomains"/>
3 <Transform name="i3visio.aliasToGlobalKnownDomains"/>
4 </Transforms>
5 </TransformSet>
6
0 <TransformSet name="i3visio - Entities extraction" description="Set of transforms from i3visio to extract entities using entify package and its regular expressions.">
1 <Transforms>
2 <Transform name="i3visio.textToBitcoinAddressEntities"/>
3 <Transform name="i3visio.textToDniEntities"/>
4 <Transform name="i3visio.textToDogecoinAddressEntities"/>
5 <Transform name="i3visio.textToEmailEntities"/>
6 <Transform name="i3visio.textToIPv4Entities"/>
7 <Transform name="i3visio.textToLitecoinAddressEntities"/>
8 <Transform name="i3visio.textToMD5Entities"/>
9 <Transform name="i3visio.textToNamecoinAddressEntities"/>
10 <Transform name="i3visio.textToPeercoinAddressEntities"/>
11 <Transform name="i3visio.textToSHA1Entities"/>
12 <Transform name="i3visio.textToSHA256Entities"/>
13 <Transform name="i3visio.textToUriEntities"/>
14
15 <Transform name="i3visio.uriToBitcoinAddressEntities"/>
16 <Transform name="i3visio.uriToDniEntities"/>
17 <Transform name="i3visio.uriToDogecoinAddressEntities"/>
18 <Transform name="i3visio.uriToEmailEntities"/>
19 <Transform name="i3visio.uriToIPv4Entities"/>
20 <Transform name="i3visio.uriToLitecoinAddressEntities"/>
21 <Transform name="i3visio.uriToMD5Entities"/>
22 <Transform name="i3visio.uriToNamecoinAddressEntities"/>
23 <Transform name="i3visio.uriToPeercoinAddressEntities"/>
24 <Transform name="i3visio.uriToSHA1Entities"/>
25 <Transform name="i3visio.uriToSHA256Entities"/>
26 <Transform name="i3visio.uriToUriEntities"/>
27 </Transforms>
28 </TransformSet>
0 <TransformSet name="i3visio - Network operations" description="Set of transforms from i3visio to perform common operations with network-related entities.">
1 <Transforms>
2 <Transform name="i3visio.domainToIp_ApiInformation"/>
3 <Transform name="i3visio.domainToTld"/>
4 <Transform name="i3visio.ipToIp_ApiInformation"/>
5 <Transform name="i3visio.uriToBrowser"/>
6 <Transform name="i3visio.uriToDomain"/>
7 <Transform name="i3visio.uriToGoogleCacheUri"/>
8 <Transform name="i3visio.uriToPort"/>
9 <Transform name="i3visio.uriToProtocol"/>
10 </Transforms>
11 </TransformSet>
0 <TransformSet name="i3visio - Phone spam" description="Set of transforms from i3visio to perform searches on the misuses of certain phone numbers.">
1 <Transforms>
2 <Transform name="i3visio.phoneToMoreInfoListspam"/>
3 </Transforms>
4 </TransformSet>
0 <TransformSet name="i3visio - Search engines" description="Set of transforms from i3visio to perform searches using different types of search engines.">
1 <Transforms>
2 <Transform name="i3visio.coordinatesToGoogleMapsBrowser"/>
3 <Transform name="i3visio.coordinatesToTwitterBrowser"/>
4 <Transform name="i3visio.domainToGoogleSearchUriWithEmails"/>
5 <Transform name="i3visio.textToGoogleSearchUri"/>
6 <Transform name="i3visio.textToDeepWebSearch"/>
7 <Transform name="i3visio.textToPhoneDetails"/>
8 </Transforms>
9 </TransformSet>
0 <TransformSet name="i3visio - searchfy.py" description="Searching for profiles in different platforms using searchfy.py utility.">
1 <Transforms>
2 <Transform name="i3visio.textToTwitterProfiles"/>
3 <Transform name="i3visio.textToFacebookProfiles"/>
4 <Transform name="i3visio.textToSkypeProfiles"/>
5 </Transforms>
6 </TransformSet>
7
0 <TransformSet name="i3visio [Global]" description="Set of global transforms from i3visio for OSINT.">
1 <Transforms>
2 <Transform name="i3visio.aliasToKnownEmails"/>
3 <Transform name="i3visio.aliasToSkypeAccounts"/>
4 <Transform name="i3visio.aliasToSkypeIP"/>
5 <Transform name="i3visio.emailToAlias"/>
6 <Transform name="i3visio.emailToBreachedAccounts"/>
7 <Transform name="i3visio.emailToDomain"/>
8 <Transform name="i3visio.emailToSkypeAccounts"/>
9 <Transform name="i3visio.expandPropertiesFromI3visioEntity"/>
10 <Transform name="i3visio.hashToMD5crackDotCom"/>
11 <Transform name="i3visio.textToAllEntities"/>
12 <Transform name="i3visio.textToGoogleSearchUri"/>
13 <Transform name="i3visio.textToPlatformSearch"/>
14 <Transform name="i3visio.uriToAllEntities"/>
15 </Transforms>
16 </TransformSet>
0 <TransformSet name="i3visio - usufy.py" description="Set of transforms to check the existence of usernames in different platforms using usufy.py utility.">
1 <Transforms>
2 <Transform name="i3visio.aliasToAllProfiles"/>
3 <Transform name="i3visio.aliasToFamousPlatforms"/>
4 <Transform name="i3visio.aliasToSelectedPlatforms"/>
5 </Transforms>
6 </TransformSet>
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 import osrframework.utils.platform_selection as platform_selection
26 import osrframework.phonefy as phonefy
27 #import osframework.transforms.lib.constants as constants
28 from osrframework.transforms.lib.maltego import *
29
30
31 def phoneToMoreInfo(argv ):
32 '''
33 Method that obtains all the entities in a given profile.
34
35 :param argv: the serialized entity. First parameter is always the platform and the second parameter is always the phone.
36
37 :return: Nothing is returned but the code of the entities is created.
38 '''
39 me = MaltegoTransform(argv)
40 #me.parseArguments(argv);
41 platform = argv[1]
42 platforms = platform_selection.getPlatformsByName([platform])
43
44 phone = argv[2]
45 numbers = [phone]
46
47 # Trying to recover all the possible i3visio entities
48 results = phonefy.processPhoneList(platforms=platforms, numbers=numbers)
49
50 newEntities = []
51
52 # Getting the first and unique object retrieved
53 if len(results) >0:
54 entities = results[0]["attributes"]
55 # This returns a dictionary like the following:
56 """
57 [
58 {
59 "attributes": [],
60 "type": "i3visio.location.country",
61 "value": "Espa\u00f1a"
62 },
63 {
64 "attributes": [],
65 "type": "i3visio.location.province",
66 "value": "Sevilla"
67 },
68 {
69 "attributes": [],
70 "type": "i3visio.text",
71 "value": "Por <span>An\u00f3nimo</span>&nbsp;hace 2 meses </h4><p class=\"co
72 mment_text\">Gentuza. se vayan mirando esto http://ccaa.elpais.com/ccaa/2013/11/
73 20/madrid/<a target='_blank' href='busca.php?Telefono=1384983847'>1384983847</a>
74 _<a target='_blank' href='busca.php?Telefono=570086'>570086</a>.html"
75 },
76 {
77 "attributes": [],
78 "type": "i3visio.text",
79 "value": "Por <span>An\u00f3nimo</span>&nbsp;hace 5 meses </h4><p class=\"co
80 mment_text\">Los mejores clientes de todas las telefonicas son los centros de ll
81 amadas,hay mucho dinero en juego."
82 }
83 ]
84 """
85
86 #print json.dumps(entities, indent=2)
87 for elem in entities:
88 newEntities.append(elem)
89
90 """
91 newEnt = me.addEntity(elem["type"],elem["value"])
92
93 otherIssues = []
94
95 for att in elem["attributes"]:
96 # This will create new entities linked to the telephone
97 if att["type"] == "i3visio.location.country" or att["type"] == "i3visio.location.province":
98 me.addEntity(att["type"],att["value"])
99 if att:
100 otherIssues.append(att)
101
102 newEnt.setDisplayInformation("<h3>" + elem["value"] +"</h3><p>" + json.dumps(elem["attributes"], sort_keys=True, indent=2) + "!</p>"); """
103
104 # Adding the new entities
105 me.addListOfEntities(newEntities)
106
107 # Returning the output text...
108 me.returnOutput()
109
110
111
112 if __name__ == "__main__":
113 phoneToMoreInfo(sys.argv)
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 import osrframework.thirdparties.infobel_com.checkPhoneDetails as infobel_com
26 from osrframework.transforms.lib.maltego import *
27
28
29 def phoneToPerson(argv ):
30 '''
31 Method that obtains all the entities in a given profile.
32
33 :param argv: the serialized entity. First parameter is always the platform and the second parameter is always the phone.
34
35 :return: Nothing is returned but the code of the entities is created.
36 '''
37 me = MaltegoTransform(argv)
38
39 # Recovering the phone value
40 try:
41 phone = me.getVar("@value")
42 except:
43 phone = me.getValue()
44
45 # Trying to recover all the possible i3visio entities
46 newEntities = infobel_com.checkPhoneDetails(phone)
47 # This returns a dictionary like the following:
48 """
49 [
50 {
51 "attributes": [
52 {
53 "attributes": [],
54 "type": "i3visio.fullname",
55 "value": "-----"
56 },
57 {
58 "attributes": [],
59 "type": "i3visio.location.postalcode",
60 "value": "-----"
61 },
62 {
63 "attributes": [],
64 "type": "i3visio.location.city",
65 "value": "-----"
66 },
67 {
68 "attributes": [],
69 "type": "i3visio.location.address",
70 "value": "-----"
71 },
72 {
73 "attributes": [],
74 "type": "i3visio.uri",
75 "value": "-----"
76 },
77 {
78 "attributes": [],
79 "type": "i3visio.platform",
80 "value": "Infobel"
81 }
82 ],
83 "type": "i3visio.person",
84 "value": "-----"
85 }
86 ]
87 """
88 # Adding the new entities
89 me.addListOfEntities(newEntities)
90
91 # Returning the output text...
92 me.returnOutput()
93
94
95 if __name__ == "__main__":
96 phoneToPerson(sys.argv)
97
98
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25
26 from osrframework.transforms.lib.maltego import *
27 import osrframework.transforms.lib.constants as constants
28 #import osrframework.thirdparties.blockchain_info.getBitcoinAddressDetails as blockchain
29 import osrframework.entify as entify
30 import osrframework.utils.regexp_selection as regexp_selection
31
32 def textToI3visioEntities(argv, platform='all'):
33 '''
34 Method that obtains all the entities in a given i3visio.text entity.
35
36 :param argv: the uri to be received.
37 :param platform: a platform string representing the regular expression to be used.
38
39 :return: Nothing is returned but the code of the entities is created.
40 '''
41 me = MaltegoTransform(argv)
42
43 # Trying to recover all the possible i3visio entities
44 found_fields = {}
45
46 # Getting the list of <RegExp> objects from entify
47 lRegexp = regexp_selection.getRegexpsByName([platform])
48
49 newEntities = entify.getEntitiesByRegexp(data=data, listRegexp = lRegexp)
50 # This returns a dictionary like the following:
51 """
52 [{
53 'attributes': [],
54 'type': 'i3visio.sha256',
55 'value': 'a9b8c5d848205db514d4097d2b78f4528d01a79f39601e0f9c5c40ed689471'
56 }, {
57 'attributes': [],
58 'type': 'i3visio.sha256',
59 'value': 'b28b896e6eeb8d651cacd5f4a4d1490fbe9d05dbc92221609350b0ce7a68e9'
60 }, {
61 'attributes': [],
62 'type': 'i3visio.sha256',
63 'value': 'd727fed4d969b14b28165c75ad12d7dddd56c0198fa70cedc3fdad7ac395b2'
64 }, {
65 'attributes': [],
66 'type': 'i3visio.sha256',
67 'value': '3e9a2204fcfc6f7dde250e61ca35353411880024102cba14a0bd45f05f1e74'
68 }]
69 """
70
71 # Adding the new entities
72 me.addListOfEntities(newEntities)
73
74 # Returning the output text...
75 me.returnOutput()
76
77 if __name__ == "__main__":
78 textToI3visioEntities(argv=sys.argv[2], platform = sys.argv[1])
79
80
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.searchengines.google as google
27
28 def textToGoogleSearchUri(argv):
29 '''
30 List of URI entities corresponding to the results of a Google Search.
31
32 :param argv: the text to be searched.
33
34 :return: Nothing is returned but the code of the entities is created.
35 '''
36 me = MaltegoTransform(argv)
37
38 # Recovering the text value
39 try:
40 text = me.getVar("@value")
41 except:
42 text = me.getValue()
43
44 newEntities = google.processSearch(text)
45 # This returns a dictionary like the following:
46 """
47 [{
48 'attributes': [],
49 'type': 'i3visio.uri',
50 'value': 'http://foo.com'
51 }, {
52 'attributes': [],
53 'type': 'i3visio.uri',
54 'value': 'http://bar.com'
55 },
56 ...
57 ]
58 """
59 # Adding the new entities
60 me.addListOfEntities(newEntities)
61
62 # Returning the output text...
63 me.returnOutput()
64
65 if __name__ == "__main__":
66 textToGoogleSearchUri(sys.argv)
67
68
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 from osrframework import searchfy
27
28 def textToPlatformSearch(query=None, platformNames = ["all"]):
29 '''
30 Method that checks if there exist emails for a given a alias.
31
32 :param query: query to be done.
33 :param platformNames: names of the platforms to be searched
34
35 '''
36 me = MaltegoTransform()
37
38 jsonData = searchfy.performSearch(platformNames = platformNames, queries = [query])
39
40 # This returns a dictionary like:
41 # [{}]
42
43 me.addListOfEntities(jsonData)
44
45 # Returning the output text...
46 me.returnOutput()
47
48 if __name__ == "__main__":
49 # Grabbing the parameters
50 q=sys.argv[1]
51 #pN=sys.argv[2:]
52
53 # Performing the search
54 textToPlatformSearch(query=q) #, platformNames = pN)
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 import sys
24 import json
25 from osrframework.transforms.lib.maltego import *
26 import osrframework.thirdparties.skype.checkInSkype as skype
27
28 def aliasToSkypeAccounts(query=None):
29 '''
30 Method that checks if a given alias appears in Skype.
31
32 :param query: query to verify.
33
34 '''
35 me = MaltegoTransform()
36
37 jsonData = skype.checkInSkype(query=query)
38
39 # This returns a dictionary like:
40 # [{}]
41
42 #print json.dumps(entities, indent=2)
43 for user in jsonData:
44 newEnt = me.addEntity("i3visio.profile","Skype - " +str(user["i3visio.alias"]))
45 aliasEnt = me.addEntity("i3visio.alias",user["i3visio.alias"])
46
47 newEnt.setDisplayInformation("<h3>" + user["i3visio.alias"] +"</h3><p>");# + json.dumps(user, sort_keys=True, indent=2) + "!</p>");
48 newEnt.addAdditionalFields("i3visio.platform","i3visio.platform",True,"Skype")
49 for field in user.keys():
50 #if field != "i3visio.alias":
51 # [TO-DO] Appending all the information from the json:
52 #if field == "i3visio.aliases":
53 # listAliases = [user["i3visio.alias"]]
54 # listAliases += user[field]
55 # # in this case, this is a list
56 # for alias in user[field]:
57 # aliasEnt = me.addEntity("i3visio.alias",alias.encode('utf-8'))
58 #elif user[field] != None:
59 if user[field] != None:
60 try:
61 newEnt.addAdditionalFields(field,field,True,str(user[field]).encode('utf-8'))
62 except:
63 # Something passed...
64 pass
65
66 # Returning the output text...
67 me.returnOutput()
68
69 if __name__ == "__main__":
70 aliasToSkypeAccounts(query=sys.argv[1])
71
72
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import webbrowser as wb
23
24 from osrframework.transforms.lib.maltego import *
25
26 def uriToBrowser(uri=None):
27 '''
28 Method that launches the URI in the default browser of the system. This returns no new entity.
29
30 :param uri: uri to open.
31 '''
32 me = MaltegoTransform()
33
34 # Opening the Tor URI using onion.cab proxy
35 if ".onion" in uri:
36 wb.open(uri.replace(".onion", ".onion.cab"), new=2)
37 else:
38 wb.open(uri, new=2)
39
40 me.returnOutput()
41
42
43 if __name__ == "__main__":
44 uriToBrowser(uri=sys.argv[1])
45
46
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import re
25
26 from osrframework.transforms.lib.maltego import *
27
28 def uriToDomain(argv=None):
29 '''
30 Method that recovers the domain from a URI.
31
32 :param argv: the serialized entity.
33
34 '''
35 me = MaltegoTransform(argv)
36
37 # Recovering the Uri value
38 try:
39 uri = me.getVar("@value")
40 except:
41 uri = me.getValue()
42
43 # We add a trailing '/' to the uri if there is not a trailing one
44 if uri.count('/') == 2:
45 uri+='/'
46
47 domainRegExp = "(?:https?|s?ftp)://([a-zA-Z0-9\_\.\-]+)(?:\:|/)"
48 found = re.findall(domainRegExp, uri)
49
50 newEntities = []
51
52 if len(found) > 0:
53 aux = {}
54 aux["type"] = "i3visio.domain"
55 aux["value"] = found[0]
56 aux["attributes"] = []
57 newEntities.append(aux)
58
59 me.addListOfEntities(newEntities)
60
61 # Returning the output text...
62 me.returnOutput()
63
64 if __name__ == "__main__":
65 uriToDomain(sys.argv)
66
67
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24
25 import osrframework.utils.browser as browser
26
27 from osrframework.transforms.lib.maltego import *
28 import osrframework.transforms.lib.constants as constants
29 #import osrframework.thirdparties.blockchain_info.getBitcoinAddressDetails as blockchain
30 import osrframework.entify as entify
31 import osrframework.utils.regexp_selection as regexp_selection
32
33 def uriToI3visioEntities(argv, platform='all'):
34 '''
35 Method that obtains all the entities in a given profile.
36
37 :param argv: the uri to be received.
38 :param platform: a platform string representing the regular expression to be used.
39
40 :return: Nothing is returned but the code of the entities is created.
41 '''
42 me = MaltegoTransform(argv)
43
44 # Recovering the Uri value
45 try:
46 uri = argv
47 except:
48 uri = me.getVar("@value")
49
50
51 #print uri
52 newEntities = []
53
54 # Defining the main entity
55 aux ={}
56 aux["type"] = "i3visio.uri"
57 aux["value"] = uri
58 aux["attributes"] = []
59 newEntities.append(aux)
60
61 # Using i3visio browser to avoid certain issues...
62 i3Browser = browser.Browser()
63 # Accessing the resources
64 data = i3Browser.recoverURL(uri)
65
66 # Getting the list of <RegExp> objects from entify
67 lRegexp = regexp_selection.getRegexpsByName([platform])
68
69 newEntities = entify.getEntitiesByRegexp(data=data, listRegexp = lRegexp)
70 # This returns a dictionary like the following:
71 """
72 [{
73 'attributes': [],
74 'type': 'i3visio.sha256',
75 'value': 'a9b8c5d848205db514d4097d2b78f4528d01a79f39601e0f9c5c40ed689471'
76 }, {
77 'attributes': [],
78 'type': 'i3visio.sha256',
79 'value': 'b28b896e6eeb8d651cacd5f4a4d1490fbe9d05dbc92221609350b0ce7a68e9'
80 }, {
81 'attributes': [],
82 'type': 'i3visio.sha256',
83 'value': 'd727fed4d969b14b28165c75ad12d7dddd56c0198fa70cedc3fdad7ac395b2'
84 }, {
85 'attributes': [],
86 'type': 'i3visio.sha256',
87 'value': '3e9a2204fcfc6f7dde250e61ca35353411880024102cba14a0bd45f05f1e74'
88 }]
89 """
90 # Adding list of entities to be displayed
91 me.addListOfEntities(newEntities)
92 #print json.dumps(entities, indent=2)
93 #for elem in entities:
94 # newEnt = me.addEntity(elem["type"],elem["value"])
95 # newEnt.setDisplayInformation("<h3>" + elem["value"] +"</h3><p>"+str(elem["attributes"])+"</p>")
96 # for extraAtt in elem["attributes"]:
97 # newEnt.addAdditionalFields(str(extraAtt['type']), str(extraAtt['type']), True, str(extraAtt['value']))
98
99 # Returning the output text...
100 me.returnOutput()
101
102
103 if __name__ == "__main__":
104 args = sys.argv
105 uriToI3visioEntities(args[2], platform = args[1])
106
107
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import re
25
26 from osrframework.transforms.lib.maltego import *
27
28 def uriToGoogleCacheUri(argv=None):
29 '''
30 Method that recovers the domain from a URI.
31
32 :param argv: the serialized entity.
33
34 '''
35 me = MaltegoTransform(argv)
36
37 # Recovering the Uri value
38 try:
39 uri = me.getVar("@value")
40 except:
41 uri = me.getValue()
42
43 # We add a trailing '/' to the uri if there is not a trailing one
44 if uri.count('/') == 2:
45 uri+='/'
46
47 newEntities = []
48
49 # Google Cache Base URI
50 baseCacheURI = "http://webcache.googleusercontent.com/search?q=cache:"
51
52 aux = {}
53 aux["type"] = "i3visio.uri"
54 aux["value"] = baseCacheURI + uri
55 aux["attributes"] = []
56 newEntities.append(aux)
57
58 me.addListOfEntities(newEntities)
59
60 # Returning the output text...
61 me.returnOutput()
62
63 if __name__ == "__main__":
64 uriToGoogleCacheUri(sys.argv)
65
66
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import re
25
26 from osrframework.transforms.lib.maltego import *
27
28 def uriToPort(argv=None):
29 '''
30 Method that recovers the port from a URI.
31
32 :param argv: the serialized entity.
33
34 '''
35 me = MaltegoTransform(argv)
36
37 # Recovering the Uri value
38 try:
39 uri = me.getVar("@value")
40 except:
41 uri = me.getValue()
42
43 # We add a trailing '/' to the uri if there is not a trailing one
44 if uri.count('/') == 2:
45 uri+='/'
46
47 portRegExp = "(?:https?|s?ftp)://[a-zA-Z0-9\_\.\-]+:([0-9]{1,5})/"
48 found = re.findall(portRegExp, uri)
49
50 newEntities = []
51
52 if len(found) > 0:
53 aux = {}
54 aux["type"] = "i3visio.port"
55 aux["value"] = found[0]
56 aux["attributes"] = []
57 newEntities.append(aux)
58
59 me.addListOfEntities(newEntities)
60
61 # Returning the output text...
62 me.returnOutput()
63
64 if __name__ == "__main__":
65 uriToPort(sys.argv)
66
67
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import json
23 import sys
24 import re
25
26 from osrframework.transforms.lib.maltego import *
27
28 def uriToProtocol(argv=None):
29 '''
30 Method that recovers the protocol from a URI.
31
32 :param argv: the serialized entity.
33
34 '''
35 me = MaltegoTransform(argv)
36
37 # Recovering the Uri value
38 try:
39 uri = me.getVar("@value")
40 except:
41 uri = me.getValue()
42
43 # We add a trailing '/' to the uri if there is not a trailing one
44 if uri.count('/') == 2:
45 uri+='/'
46
47 protocolRegExp = "((?:https?|s?ftp|file))://"
48 found = re.findall(protocolRegExp, uri)
49
50 newEntities = []
51
52 if len(found) > 0:
53 aux = {}
54 aux["type"] = "i3visio.protocol"
55 aux["value"] = found[0]
56 aux["attributes"] = []
57 newEntities.append(aux)
58
59 me.addListOfEntities(newEntities)
60
61 # Returning the output text...
62 me.returnOutput()
63
64 if __name__ == "__main__":
65 uriToProtocol(sys.argv)
66
67
0 #!/usr/bin/env python2
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2014-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22
23 __author__ = "Felix Brezo, Yaiza Rubio "
24 __copyright__ = "Copyright 2014-2017, i3visio"
25 __credits__ = ["Felix Brezo", "Yaiza Rubio"]
26 __license__ = "AGPLv3+"
27 __version__ = "v6.0"
28 __maintainer__ = "Felix Brezo, Yaiza Rubio"
29 __email__ = "[email protected]"
30
31
32 import argparse
33 import colorama
34 import datetime as dt
35 import json
36 import logging
37 import os
38 # Preparing to capture interruptions smoothly
39 import signal
40 import traceback
41
42 colorama.init(autoreset=True)
43
44 # global issues for multiprocessing
45 from multiprocessing import Process, Queue, Pool
46
47 # configuration and utils
48 import osrframework.utils.platform_selection as platform_selection
49 import osrframework.utils.configuration as configuration
50 import osrframework.utils.banner as banner
51 import osrframework.utils.benchmark as benchmark
52 import osrframework.utils.browser as browser
53 import osrframework.utils.general as general
54
55 from osrframework.utils.general import error, warning, success, info, title, emphasis
56
57 # logging imports
58 import osrframework.utils.logger
59
60
61 def fuzzUsufy(fDomains = None, fFuzzStruct = None):
62 """
63 Method to guess the usufy path against a list of domains or subdomains.
64
65 Args:
66 -----
67 fDomains: A list to strings containing the domains and (optionally) a
68 nick.
69 fFuzzStruct: A list to strings containing the transforms to be
70 performed.
71
72 Returns:
73 --------
74 dict: A dictionary of the form of `{"domain": "url"}`.
75 """
76 logger = logging.getLogger("osrframework.usufy")
77
78 if fFuzzStruct == None:
79 # Loading these structures by default
80 fuzzingStructures = [
81 "http://<DOMAIN>/<USERNAME>",
82 "http://<DOMAIN>/~<USERNAME>",
83 "http://<DOMAIN>/?action=profile;user=<USERNAME>",
84 "http://<DOMAIN>/causes/author/<USERNAME>",
85 "http://<DOMAIN>/channel/<USERNAME>",
86 "http://<DOMAIN>/community/profile/<USERNAME>",
87 "http://<DOMAIN>/component/comprofiler/userprofiler/<USERNAME>",
88 "http://<DOMAIN>/details/@<USERNAME>",
89 "http://<DOMAIN>/foros/member.php?username=<USERNAME>",
90 "http://<DOMAIN>/forum/member/<USERNAME>",
91 "http://<DOMAIN>/forum/member.php?username=<USERNAME>",
92 "http://<DOMAIN>/forum/profile.php?mode=viewprofile&u=<USERNAME>",
93 "http://<DOMAIN>/home/<USERNAME>",
94 "http://<DOMAIN>/index.php?action=profile;user=<USERNAME>",
95 "http://<DOMAIN>/member_profile.php?u=<USERNAME>",
96 "http://<DOMAIN>/member.php?username=<USERNAME>",
97 "http://<DOMAIN>/members/?username=<USERNAME>",
98 "http://<DOMAIN>/members/<USERNAME>",
99 "http://<DOMAIN>/members/view/<USERNAME>",
100 "http://<DOMAIN>/mi-espacio/<USERNAME>",
101 "http://<DOMAIN>/u<USERNAME>",
102 "http://<DOMAIN>/u/<USERNAME>",
103 "http://<DOMAIN>/user-<USERNAME>",
104 "http://<DOMAIN>/user/<USERNAME>",
105 "http://<DOMAIN>/user/<USERNAME>.html",
106 "http://<DOMAIN>/users/<USERNAME>",
107 "http://<DOMAIN>/usr/<USERNAME>",
108 "http://<DOMAIN>/usuario/<USERNAME>",
109 "http://<DOMAIN>/usuarios/<USERNAME>",
110 "http://<DOMAIN>/en/users/<USERNAME>",
111 "http://<DOMAIN>/people/<USERNAME>",
112 "http://<DOMAIN>/profil/<USERNAME>",
113 "http://<DOMAIN>/profile/<USERNAME>",
114 "http://<DOMAIN>/profile/page/<USERNAME>",
115 "http://<DOMAIN>/rapidforum/index.php?action=profile;user=<USERNAME>",
116 "http://<DOMAIN>/social/usuarios/<USERNAME>",
117 "http://<USERNAME>.<DOMAIN>",
118 "http://<USERNAME>.<DOMAIN>/user/"
119 ]
120 else:
121 try:
122 fuzzingStructures = fFuzzStruct.read().splitlines()
123 except:
124 logger.error("Usufy could NOT open the following file: " + fFuzzStruct )
125
126 res = {}
127
128 lines = fDomains.read().splitlines()
129
130 # Going through all the lines
131 for l in lines:
132 domain = l.split()[0]
133 print("Performing tests for" + domain + "...")
134
135 # selecting the number of nicks to be tested in this domain
136 nick = l.split()[1]
137
138 # Choosing the errors from the input file
139 #errors = l.split('\t')[2:]
140
141 # possibleURLs found
142 possibleURL = []
143
144 for struct in fuzzingStructures:
145 # initiating list
146 urlToTry = struct.replace("<DOMAIN>", domain)
147 test = urlToTry.replace("<USERNAME>", nick.lower())
148 print("Processing "+ test + "...")
149 i3Browser = browser.Browser()
150 try:
151 html = i3Browser.recoverURL(test)
152 if nick in html:
153 possibleURL.append(test)
154 print(general.success("\tPossible usufy found!!!\n"))
155 except:
156 logger.error("The resource could not be downloaded.")
157
158 res[domain] = possibleURL
159
160 print(json.dumps(res, indent = 2))
161 return res
162
163
164 def getPageWrapper(p, nick, rutaDescarga, avoidProcessing = True, avoidDownload = True, outQueue=None):
165 """
166 Method that wraps the call to the getInfo. Before it was getUserPage.
167
168 Args:
169 -----
170 pName: Platform where the information is stored. It is a string.
171 nick: Nick to be searched.
172 rutaDescarga: Local file where saving the obtained information.
173 avoidProcessing: Boolean var that defines whether the profiles will NOT
174 be processed (stored in this version).
175 avoidDownload: Boolean var that defines whether the profiles will NOT be
176 downloaded (stored in this version).
177 outQueue: Queue where the information will be stored.
178 maltego: Parameter to tell usufy.py that he has been invoked by Malego.
179
180 Returns:
181 --------
182 None if a queue is provided. Note that the values will be stored in the
183 outQueue or a dictionary is returned.
184 """
185 logger = logging.getLogger("osrframework.usufy")
186
187 logger.debug("\tLooking for profiles in " + str(p) + "...")
188 #res = p.getUserPage(nick, rutaDescarga, avoidProcessing = avoidProcessing, avoidDownload = avoidDownload)
189 try:
190 res = p.getInfo(query=nick, mode="usufy", process=True)#rutaDescarga, avoidProcessing = avoidProcessing, avoidDownload = avoidDownload)
191
192 if res != []:
193 if outQueue != None:
194 # Storing in the output queue the values
195 outQueue.put((res))
196 else:
197 # If no queue was given, return the value normally
198 return res
199 else:
200 logger.debug("\t" + str(p) +" - User profile not found...")
201 return []
202 except:
203 print(general.error("ERROR: something happened when processing " + str(p) +". You may like to deactivate this wrapper if the error persist."))
204 return []
205
206
207 def pool_function(p, nick, rutaDescarga, avoidProcessing = True, avoidDownload = True, outQueue=None):
208 """
209 Wrapper for being able to launch all the threads of getPageWrapper.
210
211 Args:
212 -----
213 args: We receive the parameters for getPageWrapper as a tuple.
214 """
215 try:
216 res = getPageWrapper(p, nick, rutaDescarga, avoidProcessing, avoidDownload, outQueue)
217 return {"platform" : str(p), "status": "DONE", "data": res}
218 except Exception as e:
219 print(general.error("\tERROR: " + str(p)))
220 return {"platform" : str(p), "status": "ERROR", "data": []}
221
222
223 def processNickList(nicks, platforms=None, rutaDescarga="./", avoidProcessing=True, avoidDownload=True, nThreads=12, maltego=False, verbosity=1, logFolder="./logs"):
224 """
225 Process a list of nicks to check whether they exist.
226
227 This method receives as a parameter a series of nicks and verifies whether
228 those nicks have a profile associated in different social networks.
229
230 Args:
231 -----
232 nicks: List of nicks to process.
233 platforms: List of <Platform> objects to be processed.
234 rutaDescarga: Local file where saving the obtained information.
235 avoidProcessing: A boolean var that defines whether the profiles will
236 NOT be processed.
237 avoidDownload: A boolean var that defines whether the profiles will NOT
238 be downloaded.
239 maltego: A parameter to tell usufy.py that he has been invoked by Malego.
240 verbosity: The level of verbosity to be used.
241 logFolder: The path to the log folder.
242
243 Returns:
244 --------
245 A dictionary where the key is the nick and the value another dictionary
246 where the keys are the social networks and the value is the
247 corresponding URL.
248 """
249 osrframework.utils.logger.setupLogger(loggerName="osrframework.usufy", verbosity=verbosity, logFolder=logFolder)
250 logger = logging.getLogger("osrframework.usufy")
251
252 if platforms == None:
253 platforms = platform_selection.getAllPlatformNames("usufy")
254
255 # Defining the output results variable
256 res = []
257 # Processing the whole list of terms...
258 for nick in nicks:
259 logger.info("Looking for '" + nick + "' in " + str(len(platforms)) + " different platforms:\n" +str( [ str(plat) for plat in platforms ] ) )
260
261 # If the process is executed by the current app, we use the Processes. It is faster than pools.
262 if nThreads <= 0 or nThreads > len(platforms):
263 nThreads = len(platforms)
264 logger.info("Launching " + str(nThreads) + " different threads...")
265
266 # Using threads in a pool if we are not running the program in main
267 # Example catched from: https://stackoverflow.com/questions/11312525/catch-ctrlc-sigint-and-exit-multiprocesses-gracefully-in-python
268 try:
269 original_sigint_handler = signal.signal(signal.SIGINT, signal.SIG_IGN)
270 pool = Pool(nThreads)
271 signal.signal(signal.SIGINT, original_sigint_handler)
272 except ValueError:
273 # To avoid: ValueError: signal only works in main thread
274 pool = Pool(nThreads)
275
276 poolResults = []
277 try:
278 def log_result(result):
279 # This is called whenever foo_pool(i) returns a result.
280 # result_list is modified only by the main process, not the pool workers.
281 poolResults.append(result)
282
283 for plat in platforms:
284 # We need to create all the arguments that will be needed
285 parameters = ( plat, nick, rutaDescarga, avoidProcessing, avoidDownload, )
286 pool.apply_async (pool_function, args= parameters, callback = log_result )
287
288 # Waiting for results to be finished
289 while len(poolResults) < len(platforms):
290 pass
291
292 # Closing normal termination
293 pool.close()
294 except KeyboardInterrupt:
295 print(general.warning("\n[!] Process manually stopped by the user. Terminating workers.\n"))
296 pool.terminate()
297 print(general.warning("[!] The following platforms were not processed:"))
298 pending = ""
299 for p in platforms:
300 processed = False
301 for processedPlatform in poolResults:
302 if str(p) == processedPlatform["platform"]:
303 processed = True
304 break
305 if not processed:
306 print("\t- " + str(p))
307 pending += " " + str(p).lower()
308 print("\n")
309 print(general.warning("If you want to relaunch the app with these platforms you can always run the command with: "))
310 print("\t usufy.py ... -p " + general.emphasis(pending))
311 print("\n")
312 print(general.warning("If you prefer to avoid these platforms you can manually evade them for whatever reason with: "))
313 print("\t usufy.py ... -x " + general.emphasis(pending))
314 print("\n")
315 pool.join()
316
317 profiles = []
318
319 # Processing the results
320 # ----------------------
321 for serArray in poolResults:
322 data = serArray["data"]
323 # We need to recover the results and check if they are not an empty json or None
324 if data != None:
325 array = json.loads(data)
326 for r in array:
327 if r != "{}":
328 profiles.append(r)
329 res+=profiles
330 return res
331
332
333 def main(args):
334 """
335 Main function to launch usufy.
336
337 The function is created in this way so as to let other applications make
338 use of the full configuration capabilities of the application. The
339 parameters received are used as parsed by this modules `getParser()`.
340
341 Args:
342 -----
343 args: The parameters as processed by this modules `getParser()`.
344
345 Returns:
346 --------
347 dict: A Json representing the matching results.
348 """
349 # Recovering the logger
350 # Calling the logger when being imported
351 osrframework.utils.logger.setupLogger(loggerName="osrframework.usufy", verbosity=args.verbose, logFolder=args.logfolder)
352 # From now on, the logger can be recovered like this:
353 logger = logging.getLogger("osrframework.usufy")
354
355 if not args.maltego:
356 print(general.title(banner.text))
357
358 sayingHello = """
359 usufy.py Copyright (C) F. Brezo and Y. Rubio (i3visio) 2014-2017
360
361 This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you
362 are welcome to redistribute it under certain conditions. For additional info,
363 visit """ + general.LICENSE_URL + "\n"
364 logger.info(sayingHello)
365 print(general.title(sayingHello))
366 logger.info("Starting usufy.py...")
367
368 if args.license:
369 general.showLicense()
370 elif args.fuzz:
371 logger.info("Performing the fuzzing tasks...")
372 res = fuzzUsufy(args.fuzz, args.fuzz_config)
373 logger.info("Recovered platforms:\n" + str(res))
374 else:
375 logger.debug("Recovering the list of platforms to be processed...")
376 # Recovering the list of platforms to be launched
377 listPlatforms = platform_selection.getPlatformsByName(platformNames=args.platforms, tags=args.tags, mode="usufy", excludePlatformNames=args.exclude)
378 logger.debug("Platforms recovered.")
379
380 if args.info:
381 # Information actions...
382 if args.info == 'list_platforms':
383 infoPlatforms="Listing the platforms:\n"
384 for p in listPlatforms:
385 infoPlatforms += "\t\t" + (str(p) + ": ").ljust(16, ' ') + str(p.tags)+"\n"
386 logger.info(infoPlatforms)
387 return infoPlatforms
388 elif args.info == 'list_tags':
389 logger.info("Listing the tags:")
390 tags = {}
391 # Going through all the selected platforms to get their tags
392 for p in listPlatforms:
393 for t in p.tags:
394 if t not in tags.keys():
395 tags[t] = 1
396 else:
397 tags[t] += 1
398 infoTags = "List of tags:\n"
399 # Displaying the results in a sorted list
400 for t in tags.keys():
401 infoTags += "\t\t" + (t + ": ").ljust(16, ' ') + str(tags[t]) + " time(s)\n"
402 logger.info(infoTags)
403 return infoTags
404 else:
405 pass
406
407 # performing the test
408 elif args.benchmark:
409 logger.warning("The benchmark mode may last some minutes as it will be performing similar queries to the ones performed by the program in production. ")
410 logger.info("Launching the benchmarking tests...")
411 platforms = platform_selection.getAllPlatformNames("usufy")
412 res = benchmark.doBenchmark(platforms)
413 strTimes = ""
414 for e in sorted(res.keys()):
415 strTimes += str(e) + "\t" + str(res[e]) + "\n"
416 logger.info(strTimes)
417 return strTimes
418
419 # showing the tags of the usufy platforms
420 elif args.show_tags:
421 logger.info("Collecting the list of tags...")
422 tags = platform_selection.getAllPlatformNamesByTag("usufy")
423 logger.info(json.dumps(tags, indent=2))
424 print(general.info("This is the list of platforms grouped by tag.\n"))
425 print(json.dumps(tags, indent=2, sort_keys=True))
426 print(general.info("[Tip] Remember that you can always launch the platform using the -t option followed by any of the aforementioned.\n"))
427 return tags
428
429 # Executing the corresponding process...
430 else:
431 # Showing the execution time...
432 if not args.maltego:
433 startTime= dt.datetime.now()
434 print(str(startTime) + "\tStarting search in " + general.emphasis(str(len(listPlatforms))) + " platform(s)... Relax!\n")
435 print(general.emphasis("\tPress <Ctrl + C> to stop...\n"))
436
437 # Defining the list of users to monitor
438 nicks = []
439 logger.debug("Recovering nicknames to be processed...")
440 if args.nicks:
441 for n in args.nicks:
442 # TO-DO
443 # A trick to avoid having the processing of the properties when being queried by Maltego
444 if "properties.i3visio" not in n:
445 nicks.append(n)
446 else:
447 # Reading the nick files
448 try:
449 nicks = args.list.read().splitlines()
450 except:
451 logger.error("ERROR: there has been an error when opening the file that stores the nicks.\tPlease, check the existence of this file.")
452
453 # Definning the results
454 res = []
455
456 if args.output_folder != None:
457 # if Verifying an output folder was selected
458 logger.debug("Preparing the output folder...")
459 if not args.maltego:
460 if not os.path.exists(args.output_folder):
461 logger.warning("The output folder \'" + args.output_folder + "\' does not exist. The system will try to create it.")
462 os.makedirs(args.output_folder)
463 # Launching the process...
464 res = processNickList(nicks, listPlatforms, args.output_folder, avoidProcessing = args.avoid_processing, avoidDownload = args.avoid_download, nThreads=args.threads, verbosity= args.verbose, logFolder=args.logfolder)
465
466 else:
467 try:
468 res = processNickList(nicks, listPlatforms, nThreads=args.threads, verbosity= args.verbose, logFolder=args.logfolder)
469 except Exception as e:
470 print(general.error("Exception grabbed when processing the nicks: " + str(e)))
471 print(general.error(traceback.print_stack()))
472
473 logger.info("Listing the results obtained...")
474 # We are going to iterate over the results...
475 strResults = "\t"
476
477 # Structure returned
478 """
479 [
480 { print
481
482 "attributes": [
483 {
484 "attributes": [],
485 "type": "i3visio.uri",
486 "value": "http://twitter.com/i3visio"
487 },
488 {
489 "attributes": [],
490 "type": "i3visio.alias",
491 "value": "i3visio"
492 },
493 {
494 "attributes": [],
495 "type": "i3visio.platform",
496 "value": "Twitter"
497 }
498 ],
499 "type": "i3visio.profile",
500 "value": "Twitter - i3visio"
501 }
502 ,
503 ...
504 ]
505 """
506 for r in res:
507 # The format of the results (attributes) for a given nick is a list as follows:
508
509 for att in r["attributes"]:
510 # iterating through the attributes
511 platform = ""
512 uri = ""
513 for details in att["attributes"]:
514 if details["type"] == "i3visio.platform":
515 platform = details["value"]
516 if details["type"] == "i3visio.uri":
517 uri = details["value"]
518 try:
519 strResults+= (str(platform) + ":").ljust(16, ' ')+ " "+ str(uri)+"\n\t\t"
520 except:
521 pass
522
523 logger.info(strResults)
524
525 # Generating summary files for each ...
526 if args.extension:
527 # Storing the file...
528 logger.info("Creating output files as requested.")
529 if not args.maltego:
530 # Verifying if the outputPath exists
531 if not os.path.exists (args.output_folder):
532 logger.warning("The output folder \'" + args.output_folder + "\' does not exist. The system will try to create it.")
533 os.makedirs(args.output_folder)
534
535 # Grabbing the results
536 fileHeader = os.path.join(args.output_folder, args.file_header)
537
538 # Iterating through the given extensions to print its values
539 for ext in args.extension:
540 # Generating output files
541 general.exportUsufy(res, ext, fileHeader)
542
543 # Generating the Maltego output
544 if args.maltego:
545 general.listToMaltego(res)
546 # Printing the results if requested
547 else:
548 now = dt.datetime.now()
549 print(str(now) + "\tA summary of the results obtained are shown in the following table:\n")
550 print(general.success(general.usufyToTextExport(res)))
551
552 if args.web_browser:
553 general.openResultsInBrowser(res)
554
555 now = dt.datetime.now()
556 print("\n" + str(now) + "\tYou can find all the information collected in the following files:")
557 for ext in args.extension:
558 # Showing the output files
559 print("\t" + general.emphasis(fileHeader + "." + ext))
560
561 # Showing the execution time...
562 endTime= dt.datetime.now()
563 print("\n" + str(endTime) +"\tFinishing execution...\n")
564 print("Total time consumed:\t" + general.emphasis(str(endTime-startTime)))
565 print("Average seconds/query:\t" + general.emphasis(str((endTime-startTime).total_seconds()/len(listPlatforms))) +" seconds\n")
566
567 # Urging users to place an issue on Github...
568 print(banner.footer)
569
570 return res
571
572
573 def getParser():
574 DEFAULT_VALUES = configuration.returnListOfConfigurationValues("usufy")
575 # Capturing errors just in case the option is not found in the configuration
576 try:
577 excludeList = [DEFAULT_VALUES["exclude_platforms"]]
578 except:
579 excludeList = []
580
581 # Recovering all the possible options
582 platOptions = platform_selection.getAllPlatformNames("usufy")
583
584 parser = argparse.ArgumentParser(description= colorama.Style.BRIGHT + 'usufy.py - Piece of software that checks the existence of a profile for a given user in up to ' + str(len(platOptions)-1)+ ' different platforms.', prog='usufy.py', epilog='Check the README.md file for further details on the usage of this program or follow us on Twitter in <http://twitter.com/i3visio>.', add_help=False)
585 parser._optionals.title = "Input options (one required)"
586
587 # Defining the mutually exclusive group for the main options
588 groupMainOptions = parser.add_mutually_exclusive_group(required=True)
589 # Adding the main options
590 groupMainOptions.add_argument('--info', metavar='<action>', choices=['list_platforms', 'list_tags'], action='store', help='select the action to be performed amongst the following: list_platforms (list the details of the selected platforms), list_tags (list the tags of the selected platforms). Afterwards, it exists.')
591 groupMainOptions.add_argument('--license', required=False, action='store_true', default=False, help='shows the AGPLv3+ license and exists.')
592 groupMainOptions.add_argument('-b', '--benchmark', action='store_true', default=False, help='perform the benchmarking tasks.')
593 groupMainOptions.add_argument('-f', '--fuzz', metavar='<path_to_fuzzing_list>', action='store', type=argparse.FileType('r'), help='this option will try to find usufy-like URLs. The list of fuzzing platforms in the file should be (one per line): <BASE_DOMAIN>\t<VALID_NICK>')
594 groupMainOptions.add_argument('-l', '--list', metavar='<path_to_nick_list>', action='store', type=argparse.FileType('r'), help='path to the file where the list of nicks to verify is stored (one per line).')
595 groupMainOptions.add_argument('-n', '--nicks', metavar='<nick>', nargs='+', action='store', help = 'the list of nicks to process (at least one is required).')
596 groupMainOptions.add_argument('--show_tags', action='store_true', default=False, help='it will show the platforms grouped by tags.')
597
598 # Selecting the platforms where performing the search
599 groupPlatforms = parser.add_argument_group('Platform selection arguments', 'Criteria for selecting the platforms where performing the search.')
600 groupPlatforms.add_argument('-p', '--platforms', metavar='<platform>', choices=platOptions, nargs='+', required=False, default=DEFAULT_VALUES["platforms"], action='store', help='select the platforms where you want to perform the search amongst the following: ' + str(platOptions) + '. More than one option can be selected.')
601 groupPlatforms.add_argument('-t', '--tags', metavar='<tag>', default = [], nargs='+', required=False, action='store', help='select the list of tags that fit the platforms in which you want to perform the search. More than one option can be selected.')
602 groupPlatforms.add_argument('-x', '--exclude', metavar='<platform>', choices=platOptions, nargs='+', required=False, default=excludeList, action='store', help='select the platforms that you want to exclude from the processing.')
603
604 # Configuring the processing options
605 groupProcessing = parser.add_argument_group('Processing arguments', 'Configuring the way in which usufy will process the identified profiles.')
606 groupProcessing.add_argument('--avoid_download', required=False, action='store_true', default=False, help='argument to force usufy NOT to store the downloadable version of the profiles.')
607 groupProcessing.add_argument('--avoid_processing', required=False, action='store_true', default=False, help='argument to force usufy NOT to perform any processing task with the valid profiles.')
608 groupProcessing.add_argument('--fuzz_config', metavar='<path_to_fuzz_list>', action='store', type=argparse.FileType('r'), help='path to the fuzzing config details. Wildcards such as the domains or the nicknames should come as: <DOMAIN>, <USERNAME>.')
609 groupProcessing.add_argument('--nonvalid', metavar='<not_valid_characters>', required=False, default = '\\|<>=', action='store', help="string containing the characters considered as not valid for nicknames." )
610 groupProcessing.add_argument('-e', '--extension', metavar='<sum_ext>', nargs='+', choices=['csv', 'gml', 'json', 'mtz', 'ods', 'png', 'txt', 'xls', 'xlsx' ], required=False, default=DEFAULT_VALUES["extension"], action='store', help='output extension for the summary files. Default: xls.')
611 groupProcessing.add_argument('-L', '--logfolder', metavar='<path_to_log_folder', required=False, default = './logs', action='store', help='path to the log folder. If none was provided, ./logs is assumed.')
612 groupProcessing.add_argument('-m', '--maltego', required=False, action='store_true', help='parameter specified to let usufy.py know that he has been launched by a Maltego Transform.')
613 groupProcessing.add_argument('-o', '--output_folder', metavar='<path_to_output_folder>', required=False, default=DEFAULT_VALUES["output_folder"], action='store', help='output folder for the generated documents. While if the paths does not exist, usufy.py will try to create; if this argument is not provided, usufy will NOT write any down any data. Check permissions if something goes wrong.')
614 groupProcessing.add_argument('-w', '--web_browser', required=False, action='store_true', help='opening the uris returned in the default web browser.')
615 # Getting a sample header for the output files
616 groupProcessing.add_argument('-F', '--file_header', metavar='<alternative_header_file>', required=False, default=DEFAULT_VALUES["file_header"], action='store', help='Header for the output filenames to be generated. If None was provided the following will be used: profiles.<extension>.' )
617 groupProcessing.add_argument('-T', '--threads', metavar='<num_threads>', required=False, action='store', default=int(DEFAULT_VALUES["threads"]), type=int, help='write down the number of threads to be used (default 32). If 0, the maximum number possible will be used, which may make the system feel unstable.')
618
619 # About options
620 groupAbout = parser.add_argument_group('About arguments', 'Showing additional information about this program.')
621 groupAbout.add_argument('-h', '--help', action='help', help='shows this help and exists.')
622 groupAbout.add_argument('-v', '--verbose', metavar='<verbosity>', choices=[0, 1, 2], required=False, action='store', default=1, help='select the verbosity level: 0 - none; 1 - normal (default); 2 - debug.', type=int)
623 groupAbout.add_argument('--version', action='version', version='%(prog)s ' +__version__, help='shows the version of the program and exists.')
624
625 return parser
626
627
628 if __name__ == "__main__":
629 # Grabbing the parser
630 parser = getParser()
631
632 args = parser.parse_args()
633
634 # Calling the main function
635 main(args)
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This program is part of OSRFramework. You can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 ##################################################################################
18
19
20 import logger
21
22 # Calling the logger when being imported
23 logger.setupLogger(loggerName="osrframework.utils")
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2015-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This file is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import colorama
22
23 import osrframework
24
25 colorama.init(autoreset=True)
26
27 text = colorama.Fore.BLUE + colorama.Style.BRIGHT + """
28 ___ ____ ____ _____ _
29 / _ \/ ___|| _ \| ___| __ __ _ _ __ ___ _____ _____ _ __| | __
30 | | | \___ \| |_) | |_ | '__/ _` | '_ ` _ \ / _ \ \ /\ / / _ \| '__| |/ /
31 | |_| |___) | _ <| _|| | | (_| | | | | | | __/\ V V / (_) | | | <
32 \___/|____/|_| \_\_| |_| \__,_|_| |_| |_|\___| \_/\_/ \___/|_| |_|\_\
33
34
35 Version: OSRFramework """ + osrframework.__version__ + """
36 Created by: Felix Brezo and Yaiza Rubio, (i3visio)
37
38 """
39
40 footer = """Did something go wrong? Is a platform reporting false positives? Do you need to
41 integrate a new one and you don't know how to start? Then, you can always place
42 an issue in the Github project:
43 https://github.com/i3visio/osrframework/issues
44 Note that otherwise, we won't know about it!
45 """
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import time
21 # global issues
22 from multiprocessing import Pool
23
24 import logging
25 import urllib2
26
27 def testFunctionWeb():
28 '''
29 Benchmarcking function...
30 '''
31 #print p
32 resp = urllib2.urlopen('http://www.i3visio.com')
33 html = resp.read()
34 return
35
36 def testFunction2():
37 '''
38 Benchmarcking function...
39 '''
40 a = 1
41 for i in range(1000):
42 a+=1
43 return
44
45 def multi_run_wrapper(args):
46 '''
47 Wrapper for being able to launch all the threads of getPageWrapper.
48 Parameters:
49 We receive the parameters for getPageWrapper as a tuple.
50 '''
51 #print args
52 return testFunctionWeb(*args)
53
54 def doBenchmark(plats):
55 '''
56 Perform the benchmark...
57 '''
58 logger = logging.getLogger("osrframework.utils")
59 # defining the results dict
60 res = {}
61
62 # args
63 args = []
64
65 #for p in plats:
66 # args.append( (str(p),) )
67
68 # selecting the number of tries to be performed
69 tries = [1, 4, 8 ,16, 24, 32, 40, 48, 56, 64]
70
71 #for i in range(1, len(plats)/10):
72 # tries.append(i*10)
73
74 logger.info("The test is starting recovering webpages by creating the following series of threads: " + str(tries))
75
76 for i in tries:
77 print "Testing creating " + str(i) + " simultaneous threads..."
78 # starting
79 t0 = time.clock()
80 pool = Pool(i)
81 # We call the wrapping function with all the args previously generated
82 poolResults = pool.map(multi_run_wrapper, args)
83
84 t1 = time.clock()
85 # storing the results
86 res[i] = t1 - t0
87 print str(i) + "\t" + str(res[i]) + "\n"
88
89 return res
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 # Required libraries
23 import mechanize
24 import cookielib
25 import ConfigParser
26 import random
27 import os
28
29
30 import osrframework.utils.configuration as configuration
31
32 # logging imports
33 import logging
34
35 class Browser():
36 """
37 Utility used to code a Browser.
38 """
39 def __init__(self):
40 """
41 Recovering an instance of a new Browser.
42 """
43
44 # Browser
45 self.br = mechanize.Browser()
46
47 # Cookie Jar
48 self.cj = cookielib.LWPCookieJar()
49 self.br.set_cookiejar(self.cj)
50
51 # Browser options
52 self.br.set_handle_equiv(True)
53 self.br.set_handle_gzip(False)
54 self.br.set_handle_redirect(True)
55 self.br.set_handle_referer(False)
56 self.br.set_handle_robots(False)
57 self.br.set_handled_schemes(['http', 'https'])
58
59 # Follows refresh 0 but not hangs on refresh > 0
60 self.br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
61
62 # Defining User Agents
63 self.userAgents = []
64
65 # Handling proxies
66 self.proxies = {}
67 self.timeout = 2
68
69 # Want debugging messages?
70 #self.br.set_debug_http(True)
71 #self.br.set_debug_redirects(True)
72 #self.br.set_debug_responses(True)
73
74 # Trying to read the configuration
75 # --------------------------------
76 # If a current.cfg has not been found, creating it by copying from default
77 configPath = configuration.getConfigPath("browser.cfg")
78 configPath = os.path.join(configuration.getConfigPath()["appPath"], "browser.cfg")
79
80 # Checking if the configuration file exists
81 if not os.path.exists(configPath):
82 try:
83 # Copy the data from the default folder
84 defaultConfigPath = os.path.join(configuration.getConfigPath()["appPathDefaults"], "browser.cfg")
85
86 with open(defaultConfigPath) as iF:
87 cont = iF.read()
88 with open(configPath, "w") as oF:
89 oF.write(cont)
90 except Exception, e:
91 print "WARNING. No configuration file could be found and the default file was not found either, so configuration will be set as default."
92 print str(e)
93 print
94 # Storing configuration as default
95 self.userAgents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36']
96 self.proxies = {}
97
98 return None
99
100 # Reading the configuration file
101 config = ConfigParser.ConfigParser()
102 config.read(configPath)
103
104 proxy = {}
105
106 # Iterating through all the sections, which contain the platforms
107 for conf in config.sections():
108 if conf == "Browser":
109 # Iterating through parametgers
110 for (param, value) in config.items(conf):
111 if param == "user_agent":
112 if value != '':
113 self.userAgents.append(value)
114 else:
115 self.userAgents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/55.0.2883.87 Chrome/55.0.2883.87 Safari/537.36']
116 if param == "timeout":
117 try:
118 self.timeout = int(value)
119 except:
120 self.timeout = 2
121 else:
122 proxy[conf] = {}
123 # Iterating through parametgers
124 for (param, value) in config.items(conf):
125 if value != '':
126 proxy[conf][param] = value
127
128 # Configuring the proxy as it will be used by br.set_proxies
129 for p in proxy.keys():
130 # p ~= ProxyHTTP --> Protocol = p.lower()[5:]
131 #print p, p.lower()[5:], proxy[p]
132 try:
133 # Adding credentials if they exist
134 self.proxies[ p.lower()[5:] ] = proxy[p]["username"] + ":" + proxy[p]["password"] + "@" + proxy[p]["host"] + ":" + proxy[p]["port"]
135 except:
136 try:
137 self.proxies[ p.lower()[5:] ] = proxy[p]["host"] + ":" + proxy[p]["port"]
138 except:
139 # We are not adding this protocol to be proxied
140 pass
141
142 def recoverURL(self,url):
143 """
144 Public method to recover a resource.
145 url
146 Platform
147
148 Returns:
149 Returns a resource that has to be read, for instance, with html = self.br.read()
150 """
151
152 logger = logging.getLogger("osrframework.utils")
153
154 # Configuring user agents...
155 self.setUserAgent()
156
157 # Configuring proxies
158 if "https://" in url:
159 self.setProxy(protocol = "https")
160 else:
161 self.setProxy(protocol = "http")
162
163 # Giving special treatment for .onion platforms
164 if ".onion" in url:
165 try:
166 # TODO: configuring manually the tor bundle
167 pass
168 except:
169 # TODO: capturing the error and eventually trying the tor2web approach
170 #url = url.replace(".onion", ".tor2web.org")
171 pass
172 url = url.replace(".onion", ".onion.cab")
173
174 logger.debug("Retrieving the resource: " + url)
175 # Opening the resource
176 recurso = self.br.open(url, timeout=self.timeout)
177
178 logger.debug("Reading html code from: " + url)
179 # [TO-DO]
180 # Additional things may be done here to load javascript.
181 html = recurso.read()
182
183 return html
184
185 def setNewPassword(self, url, username, password):
186 """
187 Public method to manually set the credentials for a url in the browser.
188 """
189 self.br.add_password(url, username, password)
190
191 def setProxy(self, protocol="http"):
192 """
193 Public method to set a proxy for the browser.
194 """
195 # Setting proxy
196 try:
197 new = { protocol: self.proxies[protocol]}
198 self.br.set_proxies( new )
199 except:
200 # No proxy defined for that protocol
201 pass
202
203 def setUserAgent(self, uA=None):
204 """
205 This method will be called whenever a new query will be executed.
206
207 :param uA: Any User Agent that was needed to be inserted. This parameter is optional.
208
209 :return: Returns True if a User Agent was inserted and False if no User Agent could be inserted.
210 """
211 logger = logging.getLogger("osrframework.utils")
212
213 if not uA:
214 # Setting the User Agents
215 if self.userAgents:
216 # User-Agent (this is cheating, ok?)
217 logger = logging.debug("Selecting a new random User Agent.")
218 uA = random.choice(self.userAgents)
219 else:
220 logger = logging.debug("No user agent was inserted.")
221 return False
222
223 #logger.debug("Setting the user agent:\t" + str(uA))
224
225 self.br.addheaders = [ ('User-agent', uA), ]
226 #self.br.addheaders = [('User-Agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11'), ('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'), ('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3'), ('Accept-Encoding', 'none'), ('Accept-Language', 'es-es,es;q=0.8'), ('Connection', 'keep-alive')]
227 #self.br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
228
229 return True
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import ConfigParser
23 import os
24
25 import osrframework.utils.configuration as configuration
26 import osrframework.utils.errors as errors
27
28 def returnListOfAPIKeys():
29 '''
30 :return: A dictionary containing the API Keys stored in a dictionary depending on the information required by each platform
31 '''
32
33 dictAPIKeys = {}
34
35 # If a api_keys.cfg has not been found, creating it by copying from default
36 configPath = os.path.join(configuration.getConfigPath()["appPath"], "api_keys.cfg")
37
38 # Checking if the configuration file exists
39 if not os.path.exists(configPath):
40 # Copy the data from the default folder
41 defaultConfigPath = os.path.join(configuration.getConfigPath()["appPathDefaults"], "api_keys.cfg")
42
43 try:
44 with open(defaultConfigPath) as iF:
45 cont = iF.read()
46 with open(configPath, "w") as oF:
47 oF.write(cont)
48 except Exception, e:
49 raise errors.ConfigurationFileNotFoundError(configPath, defaultConfigPath);
50 return dictAPIKeys
51
52 # Reading the configuration file
53 config = ConfigParser.ConfigParser()
54 config.read(configPath)
55
56 # Iterating through all the sections, which contain the platforms
57 for platform in config.sections():
58 # Initializing values
59 platform_api = {}
60
61 incomplete = False
62
63 # Iterating through parametgers
64 for (param, value) in config.items(platform):
65 if value == '':
66 incomplete = True
67 break
68 platform_api[param] = value
69
70 # Loading the info in the dict
71 if not incomplete:
72 dictAPIKeys[platform] = platform_api
73
74 return dictAPIKeys
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import ConfigParser
23 import os
24
25 import osrframework.utils.configuration as configuration
26 import osrframework.utils.errors as errors
27
28 def returnListOfCreds():
29 '''
30 :return:
31 A list of tuples containing in the first the name of the platform,
32 as read from the accounts.cfg file in the application folder. E. g.:
33
34 listCreds.append(("<platform>", "<username>", "<password>"))
35 '''
36 listCreds = []
37 # If a accounts.cfg has not been found, creating it by copying from default
38 configPath = os.path.join(configuration.getConfigPath()["appPath"], "accounts.cfg")
39
40 # Checking if the configuration file exists
41 if not os.path.exists(configPath):
42 # Copy the data from the default folder
43 defaultConfigPath = os.path.join(configuration.getConfigPath()["appPathDefaults"], "accounts.cfg")
44
45 try:
46 with open(defaultConfigPath) as iF:
47 cont = iF.read()
48 with open(configPath, "w") as oF:
49 oF.write(cont)
50 except Exception, e:
51 raise errors.ConfigurationFileNotFoundError(configPath, defaultConfigPath);
52 return listCreds
53
54 # Reading the configuration file
55 config = ConfigParser.ConfigParser()
56 config.read(configPath)
57
58 # Iterating through all the sections, which contain the platforms
59 for platform in config.sections():
60 # Initializing values
61 creds = {}
62
63 incomplete = False
64
65 # Iterating through parametgers
66 for (param, value) in config.items(platform):
67 if value == '':
68 incomplete = True
69 break
70 creds[param] = value
71
72 # Appending credentials if possible
73 try:
74 if not incomplete:
75 listCreds.append((platform, creds["login"], creds["password"]))
76 except:
77 pass
78
79 return listCreds
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import os
23 import sys
24 import osrframework.utils.errors as errors
25
26 def changePermissionsRecursively(path, uid, gid):
27 """
28 Function to recursively change the user id and group id. It sets 700
29 permissions.
30 """
31 os.chown(path, uid, gid)
32 for item in os.listdir(path):
33 itempath = os.path.join(path, item)
34 if os.path.isfile(itempath):
35 # Setting owner
36 try:
37 os.chown(itempath, uid, gid)
38 except Exception, e:
39 # If this crashes it may be because we are running the
40 # application in Windows systems, where os.chown does NOT work.
41 pass
42 # Setting permissions
43 os.chmod(itempath, 0600)
44 elif os.path.isdir(itempath):
45 # Setting owner
46 try:
47 os.chown(itempath, uid, gid)
48 except Exception, e:
49 # If this crashes it may be because we are running the
50 # application in Windows systems, where os.chown does NOT work.
51 pass
52 # Setting permissions
53 os.chmod(itempath, 6600)
54 # Recursive function to iterate the files
55 changePermissionsRecursively(itempath, uid, gid)
56
57 def getConfigPath(configFileName = None):
58 """ Auxiliar function to get the configuration paths depending on the system.
59
60 Returns a dictionary with the following keys: appPath, appPathDefaults, appPathTransforms, appPathPlugins, appPathPatterns, appPathPatterns.
61 """
62 paths = {}
63 applicationPath = "./"
64
65 # Returning the path of the configuration folder
66 if sys.platform == 'win32':
67 applicationPath = os.path.expanduser(os.path.join('~\\', 'OSRFramework'))
68 else:
69 applicationPath = os.path.expanduser(os.path.join('~/', '.config', 'OSRFramework'))
70
71 # Defining additional folders
72 paths = {
73 "appPath": applicationPath,
74 "appPathData": os.path.join(applicationPath, "data"),
75 "appPathServer": os.path.join(applicationPath, "server"),
76 "appPathServerStatic": os.path.join(applicationPath, "server", "static"),
77 "appPathServerTemplates": os.path.join(applicationPath, "server", "templates"),
78 "appPathDefaults": os.path.join(applicationPath, "default"),
79 "appPathTransforms": os.path.join(applicationPath, "transforms"),
80 "appPathPlugins": os.path.join(applicationPath, "plugins"),
81 "appPathWrappers": os.path.join(applicationPath, "plugins", "wrappers"),
82 "appPathPatterns": os.path.join(applicationPath, "plugins", "patterns"),
83 }
84
85 # Creating them if they don't exist
86 for path in paths.keys():
87 if not os.path.exists(paths[path]):
88 os.makedirs(paths[path])
89
90 return paths
91
92 # Getting default configuration info
93 import ConfigParser
94
95 def returnListOfConfigurationValues(util):
96 ''' Method that recovers the configuration information about each and every program.
97 :param util: Any of the utils that are contained in the framework: domainfy, entify, mailfy, phonefy, searchfy, usufy.
98 :return: A dictionary containing the default configuration.
99 '''
100
101 VALUES = {}
102
103 # If a api_keys.cfg has not been found, creating it by copying from default
104 configPath = os.path.join(getConfigPath()["appPath"], "general.cfg")
105
106 # Checking if the configuration file exists
107 if not os.path.exists(configPath):
108 # Copy the data from the default folder
109 defaultConfigPath = os.path.join(getConfigPath()["appPathDefaults"], "general.cfg")
110
111 try:
112 # Recovering default file
113 with open(defaultConfigPath) as iF:
114 cont = iF.read()
115 # Moving its contents as the default values
116 with open(configPath, "w") as oF:
117 oF.write(cont)
118 except Exception, e:
119 raise errors.DefaultConfigurationFileNotFoundError(configPath, defaultConfigPath);
120
121 # Reading the configuration file
122 config = ConfigParser.ConfigParser()
123 config.read(configPath)
124
125 LISTS = ["tlds", "domains", "platforms", "extension", "exclude_platforms", "exclude_domains"]
126
127 # Iterating through all the sections, which contain the platforms
128 for section in config.sections():
129 incomplete = False
130 if section.lower() == util.lower():
131 # Iterating through parameters
132 for (param, value) in config.items(section):
133 if value == '':
134 # Manually setting an empty value
135 if param in LISTS:
136 value = []
137 else:
138 value = ""
139 # Splitting the parameters to create the arrays when needed
140 elif param in LISTS:
141 value = value.split(' ')
142 # Converting threads to int
143 elif param == "threads":
144 try:
145 value = int(value)
146 except Exception as err:
147 raise errors.ConfigurationParameterNotValidError(configPath, section, param, value)
148 elif param == "debug":
149 try:
150 if int(value) == 0:
151 value = False
152 else:
153 value = True
154 except Exception as err:
155 print "Something happened when processing this debug option. Resetting to default."
156 # Copy the data from the default folder
157 defaultConfigPath = os.path.join(getConfigPath()["appPathDefaults"], "general.cfg")
158
159 try:
160 # Recovering default file
161 with open(defaultConfigPath) as iF:
162 cont = iF.read()
163 # Moving its contents as the default values
164 with open(configPath, "w") as oF:
165 oF.write(cont)
166 except Exception, e:
167 raise errors.DefaultConfigurationFileNotFoundError(configPath, defaultConfigPath);
168
169 #raise errors.ConfigurationParameterNotValidError(configPath, section, param, value)
170 VALUES[param] = value
171 break
172
173 return VALUES
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import os
21 import logging
22 import osrframework.utils.config_credentials as c_creds
23
24 class Credential():
25 """
26 Class to match the credentials needed by a platform.
27 """
28 def __init__(self, user, password):
29 """
30 Creation of the credentials.
31
32 :param user: Login name.
33 :param password: Password.
34 """
35 self.user = user
36 self.password = password
37
38
39 def getCredentials():
40 '''
41 Recovering the credentials from a file with the following structure:
42
43 :return: A dictionary with the following struture:
44 { "platform1": [C1<Credential>, C2<Credential>], "platform2": [C3<Credential>]}
45 '''
46 logger = logging.getLogger("osrframework.utils")
47 # Dictionary of lists:
48 # {'Twitter': {cred1, cred2, ...}}
49 creds = {}
50 try:
51 credsTuples = c_creds.returnListOfCreds()
52
53 for cTuple in credsTuples:
54 plat, user, password = cTuple
55
56 c = Credential(user, password)
57
58 if plat not in creds.keys():
59 creds[plat] = [c]
60 else:
61 creds[plat] = creds[plat].append(c)
62 logger.info(str(len(credsTuples)) + " credentials have been loaded.")
63 return creds
64 except Exception, e:
65 logger.error("WARNING. Something happened when loading credentials.")
66 logger.error(str(e))
67 logger.debug("No credentials were loaded.")
68 return {}
69
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 class Error(Exception):
23 """Base class for exceptions in this module.
24
25 Attributes:
26 reason -- Defines what has just happened
27 steps -- Defines what the user can do to solve this
28 post -- Additional information on how to report the bug
29 """
30
31 def __init__(self, reason="OSRFramework Generic Error.", steps = "No more information here. Just have a look at the code :(."):
32 self.reason = reason
33 self.steps = steps
34 self.post = "If you need more information on how to solve this, copy this information and ask us by placing an issue at <https://github.com/i3visio/osrframework/issues>."
35
36 def __str__(self):
37 return "\n\t- Oh! What's happening? > " + self.reason + "\n\t- How can I solve this? > " + self.steps + "\n\t- This is not enough... > " + self.post
38
39 class DefaultConfigurationFileNotFoundError(Error):
40 """Exception raised when a given configuration file is not found.
41
42 Attributes:
43 fileName -- input expression in which the error occurred
44 defaultPath -- the path where the default files should be found
45 """
46 def __init__(self, fileName, defaultPath):
47 reason = "The configuration file " + fileName + " could not be found. The system tried to get the files provided by default with OSRFramework but they were not found either."
48 steps = "Check if the configuration path exists or if it is accesible by the current user. You should be able to find the default configuration files at '" + defaultPath + "'. If they are not there, try to solve this by reinstalling OSRFramework again for this user."
49 Error.__init__(self, reason, steps)
50
51 class ConfigurationParameterNotValidError(Error):
52 """Exception raised when a given parameter is not valid for this option.
53
54 Attributes:
55 configurationFilePath -- path to the configuration file
56 application -- the application that had the problem
57 parameter -- the parameter that was not properly configured
58 value -- the value to be changed
59 """
60 def __init__(self, configurationFilePath, application, parameter, value):
61 reason = "The following parameter in " + application + " was misconfigured: " + parameter + " = " + str(value)
62 steps = "You can go to the configuration file stored at '" + configurationFilePath + "' and update it accordingly by using the examples provided in the commented lines. In any case, you can always use the backup configuration files provided with the framework."
63 Error.__init__(self, reason, steps)
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ################################################################################
4 #
5 # Copyright 2014-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ################################################################################
21
22
23 import colorama
24 colorama.init(autoreset=True)
25
26 import datetime
27 import hashlib
28 import json
29 import logging
30 import networkx as nx
31 import os
32 import urllib
33 import webbrowser as wb
34
35 from osrframework.transforms.lib.maltego import MaltegoEntity, MaltegoTransform
36
37
38 LICENSE_URL = "https://www.gnu.org/licenses/agpl-3.0.txt"
39
40
41 def exportUsufy(data, ext, fileH):
42 """
43 Method that exports the different structures onto different formats.
44
45 Args:
46 -----
47 data: Data to export.
48 ext: One of the following: csv, excel, json, ods.
49 fileH: Fileheader for the output files.
50
51 Returns:
52 --------
53 Performs the export as requested by parameter.
54 """
55 if ext == "csv":
56 usufyToCsvExport(data, fileH+"."+ext)
57 elif ext == "gml":
58 usufyToGmlExport(data, fileH+"."+ext)
59 elif ext == "json":
60 usufyToJsonExport(data, fileH+"."+ext)
61 elif ext == "mtz":
62 usufyToMaltegoExport(data, fileH+"."+ext)
63 elif ext == "ods":
64 usufyToOdsExport(data, fileH+"."+ext)
65 elif ext == "png":
66 usufyToPngExport(data, fileH+"."+ext)
67 elif ext == "txt":
68 usufyToTextExport(data, fileH+"."+ext)
69 elif ext == "xls":
70 usufyToXlsExport(data, fileH+"."+ext)
71 elif ext == "xlsx":
72 usufyToXlsxExport(data, fileH+"."+ext)
73
74
75 def _generateTabularData(res, oldTabularData = {}, isTerminal=False, canUnicode=True):
76 """
77 Method that recovers the values and columns from the current structure
78
79 This method is used by:
80 - usufyToCsvExport
81 - usufyToOdsExport
82 - usufyToXlsExport
83 - usufyToXlsxExport
84
85 Args:
86 -----
87 res: New data to export.
88 oldTabularData: The previous data stored.
89 {
90 "OSRFramework": [
91 [
92 "i3visio.alias",
93 "i3visio.platform",
94 "i3visio.uri"
95 ],
96 [
97 "i3visio",
98 "Twitter",
99 "https://twitter.com/i3visio",
100 ]
101 ]
102 }
103 isTerminal: If isTerminal is activated, only information related to
104 i3visio.alias, i3visio.platform and i3visio.uri will be displayed
105 in the terminal.
106 canUnicode: Variable that stores if the printed output can deal with
107 Unicode characters.
108
109 Returns:
110 --------
111 The values, as a dictionary containing all the information stored.
112 Values is like:
113 {
114 "OSRFramework": [
115 [
116 "i3visio.alias",
117 "i3visio.platform",
118 "i3visio.uri"
119 ],
120 [
121 "i3visio",
122 "Twitter",
123 "https://twitter.com/i3visio",
124 ],
125 [
126 "i3visio",
127 "Github",
128 "https://github.com/i3visio",
129 ]
130 ]
131 }
132 """
133 def _grabbingNewHeader(h):
134 """
135 Updates the headers to be general.
136
137 Changing the starting @ for a '_' and changing the "i3visio." for
138 "i3visio_". Changed in 0.9.4+.
139
140 Args:
141 -----
142 h: A header to be sanitised.
143
144 Returns:
145 --------
146 string: The modified header.
147 """
148 if h[0] == "@":
149 h = h.replace("@","_")
150 elif "i3visio." in h:
151 h = h.replace("i3visio.", "i3visio_")
152 return h
153
154 # Entities allowed for the output in terminal
155 allowedInTerminal = ["i3visio_alias", "i3visio_uri", "i3visio_platform", "i3visio_email", "i3visio_ipv4", "i3visio_phone", "i3visio_dni", "i3visio_domain", "i3visio_platform_leaked"]
156 # List of profiles found
157 values = {}
158 headers = ["_id"]
159 try:
160 if not isTerminal:
161 # Recovering the headers in the first line of the old Data
162 headers = oldTabularData["OSRFramework"][0]
163 else:
164 # Recovering only the printable headers if in Terminal mode
165 oldHeaders = oldTabularData["OSRFramework"][0]
166 headers = []
167 for h in oldHeaders:
168 if h == "i3visio_domain" or h == "i3visio.domain":
169 print h
170 h = _grabbingNewHeader(h)
171 if h in allowedInTerminal:
172 headers.append(h)
173 # Changing the starting @ for a '_' and changing the "i3visio." for "i3visio_". Changed in 0.9.4+
174 for i, h in enumerate(headers):
175 h = _grabbingNewHeader(h)
176 # Replacing the header
177 headers[i] = h
178 except:
179 # No previous files... Easy...
180 headers = ["_id"]
181
182 # We are assuming that we received a list of profiles.
183 for p in res:
184 # Creating the dictionaries
185 values[p["value"]] = {}
186 attributes = p["attributes"]
187 # Processing all the attributes found
188 for a in attributes:
189 # Grabbing the type in the new format
190 h = _grabbingNewHeader(a["type"])
191
192 # Default behaviour for the output methods
193 if not isTerminal:
194 values[p["value"]][h] = a["value"]
195 # Appending the column if not already included
196 if str(h) not in headers:
197 headers.append(str(h))
198 # Specific table construction for the terminal output
199 else:
200 if h in allowedInTerminal:
201 values[p["value"]][h] = a["value"]
202 # Appending the column if not already included
203 if str(h) not in headers:
204 headers.append(str(h))
205
206 data = {}
207 # Note that each row should be a list!
208 workingSheet = []
209
210 # Appending the headers
211 workingSheet.append(headers)
212
213 # First, we will iterate through the previously stored values
214 try:
215 for dataRow in oldTabularData["OSRFramework"][1:]:
216 # Recovering the previous data
217 newRow = []
218 for cell in dataRow:
219 newRow.append(cell)
220
221 # Now, we will fill the rest of the cells with "N/A" values
222 for i in range(len(headers)-len(dataRow)):
223 # Printing a Not Applicable value
224 newRow.append("[N/A]")
225
226 # Appending the newRow to the data structure
227 workingSheet.append(newRow)
228 except Exception, e:
229 # No previous value found!
230 pass
231
232 # After having all the previous data stored an updated... We will go through the rest:
233 for prof in values.keys():
234 # Creating an empty structure
235 newRow = []
236 for i, col in enumerate(headers):
237 try:
238 if col == "_id":
239 newRow.append(len(workingSheet))
240 else:
241 if canUnicode:
242 newRow.append(unicode(values[prof][col]))
243 else:
244 newRow.append(str(values[prof][col]))
245 except UnicodeEncodeError as e:
246 # Printing that an error was found
247 newRow.append("[WARNING: Unicode Encode]")
248 except:
249 # Printing that this is not applicable value
250 newRow.append("[N/A]")
251 # Appending the newRow to the data structure
252 workingSheet.append(newRow)
253
254 # Storing the workingSheet onto the data structure to be stored
255 data.update({"OSRFramework": workingSheet})
256
257 return data
258
259
260 def usufyToJsonExport(d, fPath):
261 """
262 Workaround to export to a json file.
263
264 Args:
265 -----
266 d: Data to export.
267 fPath: File path for the output file.
268 """
269 oldData = []
270 try:
271 with open (fPath) as iF:
272 oldText = iF.read()
273 if oldText != "":
274 oldData = json.loads(oldText)
275 except:
276 # No file found, so we will create it...
277 pass
278
279 jsonText = json.dumps(oldData+d, indent=2, sort_keys=True)
280
281 with open (fPath, "w") as oF:
282 oF.write(jsonText)
283
284
285 def usufyToTextExport(d, fPath=None):
286 """
287 Workaround to export to a .txt file or to show the information.
288
289 Args:
290 -----
291 d: Data to export.
292 fPath: File path for the output file. If None was provided, it will
293 assume that it has to print it.
294
295 Returns:
296 --------
297 unicode: It sometimes returns a unicode representation of the Sheet
298 received.
299 """
300 # Manual check...
301 if d == []:
302 return "+------------------+\n| No data found... |\n+------------------+"
303
304 import pyexcel as pe
305 import pyexcel.ext.text as text
306
307 if fPath == None:
308 isTerminal = True
309 else:
310 isTerminal = False
311
312 try:
313 oldData = get_data(fPath)
314 except:
315 # No information has been recovered
316 oldData = {"OSRFramework":[]}
317
318 # Generating the new tabular data
319 tabularData = _generateTabularData(d, {"OSRFramework":[[]]}, True, canUnicode=False)
320
321 # The tabular data contains a dict representing the whole book and we need only the sheet!!
322 sheet = pe.Sheet(tabularData["OSRFramework"])
323 sheet.name = "Profiles recovered (" + getCurrentStrDatetime() +")."
324 # Defining the headers
325 sheet.name_columns_by_row(0)
326 text.TABLEFMT = "grid"
327 try:
328 with open(fPath, "w") as oF:
329 oF.write(str(sheet))
330 except Exception as e:
331 # If a fPath was not provided... We will only print the info:
332 return unicode(sheet)
333
334
335 def usufyToCsvExport(d, fPath):
336 """
337 Workaround to export to a CSV file.
338
339 Args:
340 -----
341 d: Data to export.
342 fPath: File path for the output file.
343 """
344
345 from pyexcel_io import get_data
346 try:
347 oldData = {"OSRFramework": get_data(fPath) }
348 except:
349 # No information has been recovered
350 oldData = {"OSRFramework":[]}
351
352 # Generating the new tabular data.
353 tabularData = _generateTabularData(d, oldData)
354
355 from pyexcel_io import save_data
356 # Storing the file
357 # NOTE: when working with CSV files it is no longer a dict because it is a one-sheet-format
358 save_data(fPath, tabularData["OSRFramework"])
359
360
361 def usufyToOdsExport(d, fPath):
362 """
363 Workaround to export to a .ods file.
364
365 Args:
366 -----
367 d: Data to export.
368 fPath: File path for the output file.
369 """
370 from pyexcel_ods import get_data
371 try:
372 #oldData = get_data(fPath)
373 # A change in the API now returns only an array of arrays if there is only one sheet.
374 oldData = {"OSRFramework": get_data(fPath) }
375 except:
376 # No information has been recovered
377 oldData = {"OSRFramework":[]}
378
379 # Generating the new tabular data
380 tabularData = _generateTabularData(d, oldData)
381
382 from pyexcel_ods import save_data
383 # Storing the file
384 save_data(fPath, tabularData)
385
386
387 def usufyToXlsExport(d, fPath):
388 """
389 Workaround to export to a .xls file.
390
391 Args:
392 -----
393 d: Data to export.
394 fPath: File path for the output file.
395 """
396 from pyexcel_xls import get_data
397 try:
398 #oldData = get_data(fPath)
399 # A change in the API now returns only an array of arrays if there is only one sheet.
400 oldData = {"OSRFramework": get_data(fPath) }
401 except:
402 # No information has been recovered
403 oldData = {"OSRFramework":[]}
404
405 # Generating the new tabular data
406 tabularData = _generateTabularData(d, oldData)
407 from pyexcel_xls import save_data
408 # Storing the file
409 save_data(fPath, tabularData)
410
411
412 def usufyToXlsxExport(d, fPath):
413 """
414 Workaround to export to a .xlsx file.
415
416 Args:
417 -----
418 d: Data to export.
419 fPath: File path for the output file.
420 """
421 from pyexcel_xlsx import get_data
422 try:
423 #oldData = get_data(fPath)
424 # A change in the API now returns only an array of arrays if there is only one sheet.
425 oldData = {"OSRFramework": get_data(fPath) }
426 except:
427 # No information has been recovered
428 oldData = {"OSRFramework":[]}
429
430 # Generating the new tabular data
431 tabularData = _generateTabularData(d, oldData)
432
433 from pyexcel_xlsx import save_data
434 # Storing the file
435 save_data(fPath, tabularData)
436
437
438 def _generateGraphData(data, oldData=nx.Graph()):
439 """
440 Processing the data from i3visio structures to generate nodes and edges
441
442 This function uses the networkx graph library. It will create a new node
443 for each and i3visio.<something> entities while it will add properties for
444 all the attribute starting with "@".
445
446 Args:
447 -----
448 d: The i3visio structures containing a list of
449 oldData: A graph structure representing the previous information.
450
451 Returns:
452 --------
453 A graph structure representing the updated information.
454 """
455 def _addNewNode(ent, g):
456 """
457 ent: The hi3visio-like entities to be used as the identifier.
458 ent = {
459 "value":"i3visio",
460 "type":"i3visio.alias,
461 }
462 g: The graph in which the entity will be stored.
463 :return: newAtts, newEntties
464 """
465 # Serialized entity
466 serEnt = json.dumps(ent)
467
468 # Calculating the hash
469 h = hashlib.new('md5')
470 h.update(serEnt)
471 hashLabel = h.hexdigest()
472
473 # Adding the node
474 g.add_node(hashLabel)
475
476 # Creating the main attributes such as the type and value
477 g.node[hashLabel]["type"] = ent["type"]
478 try:
479 g.node[hashLabel]["value"] = unicode(ent["value"])
480 except UnicodeEncodeError as e:
481 # Printing that an error was found
482 g.node[hashLabel]["value"] = "[WARNING: Unicode Encode]"
483 except:
484 # Printing that this is not applicable value
485 g.node[hashLabel]["value"] = "[N/A]"
486
487 return hashLabel
488
489 def _processAttributes(elems, g):
490 """
491 Function that processes a list of elements to obtain new attributes.
492
493 Args:
494 -----
495 elems: List of i3visio-like entities.
496 g: The graph in which the entity will be stored.
497
498 Returns:
499 --------
500 newAtts: Dict of attributes (to be stored as attributes for the
501 given entity).
502 newEntities: List of new Entities (to be stored as attributes for
503 the given entity).
504 """
505 newAtts = {}
506 newEntities= []
507
508 for att in elems:
509 # If it is an attribute
510 if att["type"][0] == "@":
511 # Removing the @ and the _ of the attributes
512 attName = str(att["type"][1:]).replace('_', '')
513 try:
514 newAtts[attName] = int(att["value"])
515 except:
516 newAtts[attName] = att["value"]
517 elif att["type"][:8] == "i3visio.":
518 # Creating a dict to represent the pair: type, value entity.
519 ent = {
520 "value":att["value"],
521 "type":att["type"].replace("i3visio.", "i3visio_"),
522 }
523 # Appending the new Entity to the entity list
524 newEntities.append(ent)
525
526 # Appending the new node
527 hashLabel = _addNewNode(ent, g)
528
529 # Make this recursive to link the attributes in each and every att
530 newAttsInAttributes, newEntitiesInAttributes = _processAttributes(att["attributes"], g)
531
532 # Updating the attributes to the current entity
533 g.node[hashLabel].update(newAttsInAttributes)
534
535 # Creating the edges (the new entities have also been created in the _processAttributes
536 for new in newEntitiesInAttributes:
537 graphData.add_edge(hashLabel, json.dumps(new))
538 try:
539 # Here, we would add the properties of the edge
540 #graphData.edge[hashLabel][json.dumps(new)]["@times_seen"] +=1
541 pass
542 except:
543 # If the attribute does not exist, we would initialize it
544 #graphData.edge[hashLabel][json.dumps(new)]["@times_seen"] = 1
545 pass
546 else:
547 # An unexpected type
548 pass
549
550 return newAtts, newEntities
551
552 graphData = oldData
553 # Iterating through the results
554 for elem in data:
555 # Creating a dict to represent the pair: type, value entity.
556 ent = {
557 "value":elem["value"],
558 "type":elem["type"],
559 }
560
561 # Appending the new node
562 hashLabel = _addNewNode(ent, graphData)
563
564 # Processing the attributes to grab the attributes (starting with "@..." and entities)
565 newAtts, newEntities = _processAttributes(elem["attributes"], graphData)
566
567 # Updating the attributes to the current entity
568 graphData.node[hashLabel].update(newAtts)
569
570 # Creating the edges (the new entities have also been created in the _processAttributes
571 for new in newEntities:
572 # Serializing the second entity
573 serEnt = json.dumps(new)
574
575 # Calculating the hash of the second entity
576 h = hashlib.new('md5')
577 h.update(serEnt)
578 hashLabelSeconds = h.hexdigest()
579
580 # Adding the edge
581 graphData.add_edge(hashLabel, hashLabelSeconds)
582 try:
583 # Here, we would add the properties of the edge
584 #graphData.edge[hashLabel][hashLabelSeconds]["times_seen"] +=1
585 pass
586 except:
587 # If the attribute does not exist, we would initialize it
588 #graphData.edge[hashLabel][hashLabelSeconds]["times_seen"] = 1
589 pass
590
591 return graphData
592
593
594 def usufyToGmlExport(d, fPath):
595 """
596 Workaround to export data to a .gml file.
597
598 Args:
599 -----
600 d: Data to export.
601 fPath: File path for the output file.
602 """
603 # Reading the previous gml file
604 try:
605 oldData=nx.read_gml(fPath)
606 except UnicodeDecodeError as e:
607 print "UnicodeDecodeError:\t" + str(e)
608 print "Something went wrong when reading the .gml file relating to the decoding of UNICODE."
609 import time as time
610 fPath+="_" +str(time.time())
611 print "To avoid losing data, the output file will be renamed to use the timestamp as:\n" + fPath + "_" + str(time.time())
612 print
613 # No information has been recovered
614 oldData = nx.Graph()
615 except Exception as e:
616 # No information has been recovered
617 oldData = nx.Graph()
618
619 newGraph = _generateGraphData(d, oldData)
620
621 # Writing the gml file
622 nx.write_gml(newGraph,fPath)
623
624
625 def usufyToPngExport(d, fPath):
626 """
627 Workaround to export to a png file.
628
629 Args:
630 -----
631 d: Data to export.
632 fPath: File path for the output file.
633 """
634 newGraph = _generateGraphData(d)
635
636 import matplotlib.pyplot as plt
637 # Writing the png file
638 nx.draw(newGraph)
639 plt.savefig(fPath)
640
641
642 def usufyToMaltegoExport(profiles, fPath):
643 """
644 Workaround to export to a Maltego file.
645
646 Args:
647 -----
648 d: Data to export.
649 fPath: File path for the output file.
650 """
651 me = MaltegoTransform()
652 # A dictionary with the structure:
653
654 newEntities = []
655 for profile in profiles:
656 # Defining the main entity
657 """aux ={}
658 aux["type"] = "i3visio.profile"
659 aux["value"] = "Skype - " + str(user["i3visio.alias"])
660 aux["attributes"] = []
661
662 # Creation of a temp entity
663 aux = {}
664 aux["type"] = profile["value"]
665 aux["value"] = profile["type"]
666 aux["attributes"] = []"""
667 newEntities.append(profile)
668
669 me.addListOfEntities(newEntities)
670
671 # Storing the file
672 with open (fPath, "w") as oF:
673 oF.write(me.getOutput())
674
675
676 def listToMaltego(profiles):
677 """
678 Method to generate the text to be appended to a Maltego file.
679
680 May need to be revisited.
681
682 Args:
683 -----
684 profiles: A list of dictionaries with the information of the profiles
685 in the following format: `{"a_nick": [<list_of_results>]}`. An
686 example is shown below:
687 ```
688 [
689 {
690 "attributes": [
691 {
692 "attributes": [],
693 "type": "i3visio.uri",
694 "value": "http://twitter.com/i3visio"
695 },
696 {
697 "attributes": [],
698 "type": "i3visio.alias",
699 "value": "i3visio"
700 },
701 {
702 "attributes": [],
703 "type": "i3visio.platform",
704 "value": "Twitter"
705 }
706 ],
707 "type": "i3visio.profile",
708 "value": "Twitter - i3visio"
709 }
710 ,
711 ...
712 ]
713 ```
714
715 Returns:
716 --------
717 string: The .xml text to be written for a Maltego file.
718 """
719 logger = logging.getLogger("osrframework.utils")
720 logger.info( "Generating Maltego File...")
721
722 maltegoText = ""
723 logger.debug("Going through all the keys in the dictionary...")
724 me = MaltegoTransform()
725 # A dictionary with the structure:
726
727 newEntities = []
728 for profile in profiles:
729 # Defining the main entity
730 """aux ={}
731 aux["type"] = "i3visio.profile"
732 aux["value"] = "Skype - " + str(user["i3visio.alias"])
733 aux["attributes"] = []
734
735 # Creation of a temp entity
736 aux = {}
737 aux["type"] = profile["value"]
738 aux["value"] = profile["type"]
739 aux["attributes"] = []"""
740 newEntities.append(profile)
741
742 me.addListOfEntities(newEntities)
743
744 # Getting the output text
745 me.addUIMessage("Process completed!")
746 if len(newEntities)<=11:
747 me.addUIMessage("All the entities have been displayed!")
748 else:
749 me.addUIMessage("Ooops! Too many entities to display!")
750 me.addUIMessage("The following entities could not be added because of the limits in Maltego Community Edition:\n"+json.dumps(newEntities, indent=2))
751
752 # Returning the output text...
753 me.returnOutput()
754 return me.getOutput()
755
756
757 def fileToMD5(filename, block_size=256*128, binary=False):
758 """
759 A function that calculates the MD5 hash of a file.
760
761 Args:
762 -----
763 filename: Path to the file.
764 block_size: Chunks of suitable size. Block size directly depends on
765 the block size of your filesystem to avoid performances issues.
766 Blocks of 4096 octets (Default NTFS).
767 binary: A boolean representing whether the returned info is in binary
768 format or not.
769 Returns:
770 --------
771 string: The MD5 hash of the file.
772 """
773 md5 = hashlib.md5()
774 with open(filename,'rb') as f:
775 for chunk in iter(lambda: f.read(block_size), b''):
776 md5.update(chunk)
777 if not binary:
778 return md5.hexdigest()
779 return md5.digest()
780
781
782 def getCurrentStrDatetime():
783 """
784 Generating the current Datetime with a given format.
785
786 Returns:
787 --------
788 string: The string of a date.
789 """
790 # Generating current time
791 i = datetime.datetime.now()
792 strTime = "%s-%s-%s_%sh%sm" % (i.year, i.month, i.day, i.hour, i.minute)
793 return strTime
794
795
796 def getFilesFromAFolder(path):
797 """
798 Getting all the files in a folder.
799
800 Args:
801 -----
802 path: The path in which looking for the files.
803
804 Returns:
805 --------
806 list: The list of filenames found.
807 """
808 from os import listdir
809 from os.path import isfile, join
810 #onlyfiles = [ f for f in listdir(path) if isfile(join(path,f)) ]
811 onlyFiles = []
812 for f in listdir(path):
813 if isfile(join(path, f)):
814 onlyFiles.append(f)
815 return onlyFiles
816
817
818 def uriToBrowser(uri=None):
819 """
820 Method that launches the URI in the default browser of the system.
821
822 This function temporally deactivates the standard ouptut and errors to
823 prevent the system to show unwanted messages. This method is based on this
824 question from Stackoverflow.
825 https://stackoverflow.com/questions/2323080/how-can-i-disable-the-webbrowser-message-in-python
826
827 Args:
828 -----
829 uri: The string representing the URI to be opened in the browser.
830 """
831
832 # Cloning stdout (1) and stderr (2)
833 savout1 = os.dup(1)
834 savout2 = os.dup(2)
835
836 # Closing them
837 os.close(1)
838 os.close(2)
839 os.open(os.devnull, os.O_RDWR)
840
841 try:
842 # Opening the Tor URI using onion.cab proxy
843 if ".onion" in uri:
844 wb.get().open(uri.replace(".onion", ".onion.cab"), new=2)
845 else:
846 wb.get().open(uri, new=2)
847 finally:
848 # Reopening them...
849 os.dup2(savout1, 1)
850 os.dup2(savout2, 2)
851
852
853 def openResultsInBrowser(res):
854 """
855 Method that collects the URI from a list of entities and opens them.
856
857 Args:
858 -----
859 res: A list containing several i3visio entities.
860 """
861 print(emphasis("\n\tOpening URIs in the default web browser..."))
862
863 for r in res:
864 for att in r["attributes"]:
865 if att["type"] == "i3visio.uri":
866 uriToBrowser(att["value"])
867
868
869 def colorize(text, messageType=None):
870 """
871 Function that colorizes a message.
872
873 Args:
874 -----
875 text: The string to be colorized.
876 messageType: Possible options include "ERROR", "WARNING", "SUCCESS",
877 "INFO" or "BOLD".
878
879 Returns:
880 --------
881 string: Colorized if the option is correct, including a tag at the end
882 to reset the formatting.
883 """
884 formattedText = text
885 # Set colors
886 if "ERROR" in messageType:
887 formattedText = colorama.Fore.RED + formattedText
888 elif "WARNING" in messageType:
889 formattedText = colorama.Fore.YELLOW + formattedText
890 elif "SUCCESS" in messageType:
891 formattedText = colorama.Fore.GREEN + formattedText
892 elif "INFO" in messageType:
893 formattedText = colorama.Fore.BLUE + formattedText
894
895 # Set emphashis mode
896 if "BOLD" in messageType:
897 formattedText = colorama.Style.BRIGHT + formattedText
898
899 return formattedText + colorama.Style.RESET_ALL
900
901
902 def error(text):
903 return colorize(text, ["ERROR", "BOLD"])
904
905
906 def warning(text):
907 return colorize(text, ["WARNING"])
908
909
910 def success(text):
911 return colorize(text, ["SUCCESS", "BOLD"])
912
913
914 def info(text):
915 return colorize(text, ["INFO"])
916
917
918 def title(text):
919 return colorize(text, ["INFO", "BOLD"])
920
921
922 def emphasis(text):
923 return colorize(text, ["BOLD"])
924
925
926 def showLicense():
927 """
928 Method that prints the license if requested.
929
930 It tries to find the license online and manually download it. This method
931 only prints its contents in plain text.
932 """
933 print("Trying to recover the contents of the license...\n")
934 try:
935 # Grab the license online and print it.
936 text = urllib.urlopen(LICENSE_URL).read()
937 print("License retrieved from " + emphasis(LICENSE_URL) + ".")
938 raw_input("\n\tPress " + emphasis("<ENTER>") + " to print it.\n")
939 print(text)
940 except:
941 print(warning("The license could not be downloaded and printed."))
0 #!/usr/bin/env python
1 # encoding: utf-8
2 #
3 ##################################################################################
4 #
5 # Copyright 2015 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import csv
25
26 import osrframework.utils.config_api_keys as api_keys
27
28 class APIWrapper():
29 '''
30 Global API wrapper.
31 '''
32
33 def __init__(self, api_data=None):
34 '''
35 :param api_data: dictionary containing the credentials for the given platform.
36 '''
37 pass
38
39 def get_user(self, screen_name):
40 '''
41 Method to perform the usufy searches.
42
43 :param screen_name: nickname to be searched.
44
45 :return: User.
46 '''
47 return {}
48
49 def search_users(self, query, n=20, maxUsers=60):
50 '''
51 Method to perform the searchfy searches.
52
53 :param query: Query to be performed.
54 :param n: Number of results per query.
55 :param maxUsers: Max. number of users to be recovered.
56
57 :return: List of users.
58 '''
59 return []
60
61
62 def get_all_docs(self, screen_name):
63 '''
64 :param screen_name: nick from which we will try to recover the docs, i. e., tweets, publications, etc.
65
66 :return: List of publications, i. e., tweets, publications, etc.
67 '''
68 return []
69
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import logging
22 import os
23
24 def setupLogger(loggerName="osrframework", logFolder="./logs", verbosity=0):
25 """
26 Returns the logger to be used for the whole app. This method may be invoked if required by the launcher to update the verbosity syntax.
27
28 :param loggerName: Name of the package or app that is going to use this logger.
29 :param logFolder: Path to the folder where the information will be logged.
30 :param verbosity: Level of verbosity to be used:
31 - 0: Only errors.
32 - 1: Standard output.
33 - 2: Verbose level with rich outputs.
34
35 :return: The logger already created.
36 """
37 logger = logging.getLogger(loggerName)
38
39 # create a logging format
40 loginFormat = '%(asctime)s [%(filename)s] - %(levelname)s:\n\t%(message)s\n'
41
42 formatter = logging.Formatter(loginFormat)
43
44 # first, defining the type of standard output and verbosity
45 if verbosity == 0:
46 logging.basicConfig(level=logging.ERROR, format=loginFormat)
47 elif verbosity == 1:
48 logging.basicConfig(level=logging.INFO, format=loginFormat)
49 elif verbosity == 2:
50 logging.basicConfig(level=logging.DEBUG, format=loginFormat)
51
52 # trying to store the logfile
53 try:
54 # verifying if the logs folder exist
55 logFolder = os.path.join(os.path.dirname(os.path.realpath(__file__)), logFolder)
56 if not os.path.exists(logFolder):
57 os.makedirs(logFolder)
58 # create a file handler
59 logFile = os.path.join(logFolder, loggerName+".log")
60
61 # This adds a handler to write on a file
62 handler = logging.FileHandler(logFile)
63 handler.setLevel(logging.DEBUG)
64 formatterLogFile = logging.Formatter(loginFormat)
65 handler.setFormatter(formatterLogFile)
66
67 # add the handlers to the logger
68 logger.addHandler(handler)
69 except:
70 logger.warning("The log file could not be created. No log will be stored for this session.")
71
72 # Notifying correctly import
73 #logger.debug(loggerName+ " successfully imported.")
74 return logger
0 # -*- coding: utf-8 -*-
1 #
2 ################################################################################
3 #
4 # Copyright 2014-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This file is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ################################################################################
20
21 import os
22 import sys
23
24 import pkgutil
25 import importlib
26 import inspect
27 import osrframework.wrappers
28
29 import osrframework.utils.credentials as credentials
30 import osrframework.utils.configuration as configuration
31 import osrframework
32
33
34 def getAllPlatformNames(mode):
35 """Method that defines the whole list of available parameters.
36
37 :param mode: The mode of the search. The following can be chosen: ["phonefy", "usufy", "searchfy"].
38
39 Return values:
40 Returns a list [] of strings for the platform objects.
41 """
42 # Recovering all the possible platforms installed
43 platOptions = []
44 if mode in ["phonefy", "usufy", "searchfy"]:
45 allPlatforms = getAllPlatformObjects(mode=mode)
46 # Defining the platOptions
47 for p in allPlatforms:
48 try:
49 # E. g.: to use wikipedia instead of wikipedia_ca and so on
50 parameter = p.parameterName
51 except:
52 parameter = p.platformName.lower()
53
54 if parameter not in platOptions:
55 platOptions.append(parameter)
56 elif mode == "domainfy":
57 platOptions = osrframework.domainfy.TLD.keys()
58 elif mode == "mailfy":
59 platOptions = osrframework.mailfy.EMAIL_DOMAINS
60
61 platOptions = sorted(set(platOptions))
62 platOptions.insert(0, 'all')
63 return platOptions
64
65
66 def getPlatformsByName(platformNames=['all'], mode=None, tags=[], excludePlatformNames=[]):
67 """Method that recovers the names of the <Platforms> in a given list.
68
69 :param platformNames: List of strings containing the possible platforms.
70 :param mode: The mode of the search. The following can be chosen: ["phonefy", "usufy", "searchfy"].
71 :param tags: Just in case the method to select the candidates is a series of tags.
72 :param excludePlatformNames: List of strings to be excluded from the search.
73 :return: Array of <Platforms> classes.
74 """
75
76 allPlatformsList = getAllPlatformObjects(mode)
77
78 platformList = []
79
80 # Tags has priority over platform
81 if "all" in platformNames and len(tags) == 0:
82 # Last condition: checking if "all" has been provided
83 for plat in allPlatformsList:
84 if str(plat.platformName).lower() not in excludePlatformNames:
85 platformList.append(plat)
86 return platformList
87 else:
88 # going through the regexpList
89 for name in platformNames:
90 if name not in excludePlatformNames:
91 for plat in allPlatformsList:
92 # Verifying if the parameter was provided
93 if name == str(plat.platformName).lower():
94 platformList.append(plat)
95 break
96
97 # We need to perform additional checks to verify the Wikipedia platforms, which are called with a single parameter
98 try:
99 if name == str(plat.parameterName).lower():
100 platformList.append(plat)
101 break
102 except:
103 pass
104
105 # Verifying if any of the platform tags match the original tag
106 for t in plat.tags:
107 if t in tags:
108 platformList.append(plat)
109 break
110 # If the platformList is empty, we will return all
111 if platformList == []:
112 return allPlatformsList
113 else:
114 return platformList
115
116 def getAllPlatformNamesByTag (mode = None):
117 """Returns the platforms in the framework grouped by tags.
118 :param mode: The mode of the search. The following can be chosen: ["phonefy", "usufy", "searchfy"].
119 """
120 tags = {}
121
122 allPlatformsList = getAllPlatformObjects(mode)
123
124 # Iterating the list of platforms to collect the tags
125 for plat in allPlatformsList:
126 # Grabbing the tags and providing them
127 for t in plat.tags:
128 if t not in tags.keys():
129 tags[t] = [str(plat)]
130 else:
131 tags[t].append(str(plat))
132
133 return tags
134
135
136 def getAllPlatformObjects(mode = None):
137 """Method that recovers ALL the list of <Platform> classes to be processed....
138
139 :param mode: The mode of the search. The following can be chosen: ["phonefy", "usufy", "searchfy"].
140
141 :return: Returns a list [] of <Platform> objects.
142 """
143
144 listAll = []
145
146 ############################################################################
147 ############################################################################
148
149 # --------------------------------------------------------------------------
150 # Dinamically collecting all the "official" modules
151 # --------------------------------------------------------------------------
152
153 # A list that will contain all of the module names
154 all_modules = []
155
156 # Grabbing all the module names
157 for _, name, _ in pkgutil.iter_modules(osrframework.wrappers.__path__):
158 all_modules.append("osrframework.wrappers." + name)
159
160 # Iterating through all the module names to grab them
161 for moduleName in all_modules:
162 # Importing the module
163 my_module = importlib.import_module(moduleName)
164
165 # Getting all the classNames.
166 classNames = [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == moduleName]
167
168 # Dinamically grabbing the first class of the module. IT SHOULD BE ALONE!
169 MyClass = getattr(my_module, classNames[0])
170
171 # Instantiating the object
172 newInstance = MyClass()
173
174 # Adding to the list!
175 listAll.append(newInstance)
176
177 # --------------------------------------------------------------------------
178 # Loading user-defined wrappers under [OSRFrameworkHOME]/plugins/wrappers/
179 # --------------------------------------------------------------------------
180
181 # Creating the application paths
182 paths = configuration.getConfigPath()
183
184 newPath = os.path.abspath(paths["appPathWrappers"])
185
186 # Inserting in the System Path
187 if not newPath in sys.path:
188 sys.path.append(newPath)
189
190 userImportedModules = {}
191
192 for module in os.listdir(newPath):
193 if module[-3:] == '.py':
194 current = module.replace('.py', '')
195 userImportedModules[current] = __import__(current)
196
197 del newPath
198
199 userClasses = []
200
201 # Iterating through all the files
202 for userModule in userImportedModules.keys():
203
204 my_module = userImportedModules[userModule]
205 # Getting all the classNames.
206 classNames = [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == userModule]
207
208 # Dinamically grabbing the first class of the module. IT SHOULD BE ALONE!
209 MyClass = getattr(my_module, classNames[0])
210
211 # Instantiating the object
212 newInstance = MyClass()
213
214 # Adding to the list!
215 userClasses.append(newInstance)
216
217 # --------------------------------------------------------------------------
218 # Overwriting original modules with the user plugins
219 # --------------------------------------------------------------------------
220 listToAdd = []
221 for userClass in userClasses:
222 overwritten = False
223 for i, officialClass in enumerate(listAll):
224 # Checking if the name is the same
225 if str(userClass) == str(officialClass):
226 # Replacing the official module if a user module exists for it
227 listAll[i] = userClass
228 # We stop iterating this loop
229 overwritten = True
230 break
231 if not overwritten:
232 # Appending the new class
233 listToAdd.append(userClass)
234
235 # Merging listAll and listToAdd
236 listAll = listAll + listToAdd
237 ############################################################################
238 ############################################################################
239
240 creds = credentials.getCredentials()
241
242 for p in listAll:
243 # Verify if there are credentials to be loaded
244 if p.platformName.lower() in creds.keys():
245 p.setCredentials(creds[p.platformName.lower()])
246
247 if mode == None:
248 return listAll
249 else:
250 # We are returning only those platforms which are required by the mode.
251 selected = []
252 for p in listAll:
253 if p.isValidMode[mode]:
254 selected.append(p)
255 return selected
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2014-207 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This file is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import argparse
22 import json
23 import os
24 import random
25 import re
26 import sys
27 import urllib
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.credentials import Credential
32 import osrframework.utils.general as general
33 import osrframework.entify as entify
34 import osrframework.utils.config_api_keys as api_keys
35
36 # logging imports
37 import logging
38
39 class Platform():
40 '''
41 <Platform> class.
42 '''
43 def __init__(self):
44 '''
45 Constructor without parameters...
46 '''
47 pass
48
49 def __init__(self, pName, tags):
50 '''
51 Constructor with parameters. This method permits the developer to instantiate dinamically Platform objects.
52 '''
53 self.platformName = pName
54 # These tags will be the one used to label this platform
55 self.tags = tags
56
57 # Base URL
58 self.baseURL = "http://plataform.com"
59
60 # Trying to find an API... This line should be added in every platform for which we have defined an API.
61 # DO NOT FORGET TO IMPORT THE APIWRAPPER, i. e.:
62 # from osrframework.api import TwitterAPIWrapper as TwitterAPIWrapper
63 self.wrapperAPI = None
64
65 ########################
66 # Defining valid modes #
67 ########################
68 self.isValidMode = {}
69 self.isValidMode["phonefy"] = False
70 self.isValidMode["usufy"] = False
71 self.isValidMode["searchfy"] = False
72
73 ######################################
74 # Search URL for the different modes #
75 ######################################
76 # Strings with the URL for each and every mode
77 self.url = {}
78 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
79 #self.url["usufy"] = "http://anyurl.com/user/" + "<usufy>"
80 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
81
82 ######################################
83 # Whether the user needs credentials #
84 ######################################
85 self.needsCredentials = {}
86 self.needsCredentials["phonefy"] = False
87 self.needsCredentials["usufy"] = False
88 self.needsCredentials["searchfy"] = False
89
90 # Array of credentials to be used
91 self.creds = []
92
93 ###################
94 # Valid queries #
95 ###################
96 # Strings that will imply that the query number is not appearing
97 self.validQuery = {}
98 # The regular expression '.*' will match any query.
99 self.validQuery["phonefy"] = ".*"
100 self.validQuery["usufy"] = ".*"
101 self.validQuery["searchfy"] = ".*"
102
103 ###################
104 # Not_found clues #
105 ###################
106 # Strings that will imply that the query number is not appearing
107 self.notFoundText = {}
108 #self.notFoundText["phonefy"] = []
109 #self.notFoundText["usufy"] = []
110 #self.notFoundText["searchfy"] = []
111
112 #########################
113 # Fields to be searched #
114 #########################
115 self.fieldsRegExp = {}
116
117 # Definition of regular expressions to be searched in phonefy mode
118 #self.fieldsRegExp["phonefy"] = {}
119 # Example of fields:
120 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
121
122 # Definition of regular expressions to be searched in usufy mode
123 #self.fieldsRegExp["usufy"] = {}
124 # Example of fields:
125 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
126
127 # Definition of regular expressions to be searched in searchfy mode
128 #self.fieldsRegExp["searchfy"] = {}
129 # Example of fields:
130 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
131
132 def createURL(self, word, mode="phonefy"):
133 '''
134 Method to create the URL replacing the word in the appropriate URL.
135
136 :param word: Word to be searched.
137 :param mode: Mode to be executed.
138
139 :return: The URL to be queried.
140 '''
141 try:
142 if mode == "base":
143 if word[0] == "/":
144 return self.baseURL+word[1:], word
145 else:
146 return self.baseURL+word, word
147 else:
148 try:
149 return self.url[mode].replace("<"+mode+">", urllib.pathname2url(word)), word
150 except:
151 pass
152 except:
153 pass
154 # TO-DO: BaseURLNotFoundExceptionThrow base URL not found for the mode.
155
156 def getInfo(self, query=None, process = False, mode="phonefy", qURI=None):
157 '''
158 Method that checks the presence of a given query and recovers the first list of complains.
159
160 :param query: Query to verify.
161 :param proces: Calling the processing function.
162 :param mode: Mode to be executed.
163 :param qURI: A query to be checked
164
165 :return: Python structure for the html processed.
166 '''
167 # Defining variables for this process
168 results = []
169 data = ""
170 if not self.modeIsValid(mode=mode):
171 # TO-DO: InvalidModeException
172 return json.dumps(results)
173
174 # Verrifying if the mode is valid
175 if not self._isValidQuery(query, mode=mode):
176 # TO-DO: InvalidQueryException
177 return json.dumps(results)
178
179 # Verifying if the platform has an API defined
180 try:
181 if type(self.wrapperAPI) != "<type 'NoneType'>":
182 if mode == "phonefy":
183 pass
184 elif mode == "usufy":
185 results = self.wrapperAPI.get_user(query)
186 # Manually appending the URL
187 for r in results:
188 aux = {}
189 aux["type"]="i3visio.uri"
190 alias=r["value"].split(' - ')[1]
191 qURL, query = self.createURL(word=alias, mode="usufy")
192 aux["value"]= qURL
193 aux["attributes"]= []
194 r["attributes"].append(aux)
195
196 elif mode == "searchfy":
197 results = self.wrapperAPI.search_users(query)
198 # Manually appending the URL
199 for r in results:
200 aux = {}
201 aux["type"]="i3visio.uri"
202 alias=r["value"].split(' - ')[1]
203 qURL, query = self.createURL(word=alias, mode="usufy")
204 aux["value"]= qURL
205 aux["attributes"]= []
206 r["attributes"].append(aux)
207 else:
208 # NoneType returned
209 pass
210 # The platform does not have a Wrapper defined for its API... Then we will use the traditional approach...
211 except:
212 # Creating the query URL for that mode
213 if qURI != None:
214 qURL = qURI
215 else:
216 qURL, query = self.createURL(word=query, mode=mode)
217 i3Browser = browser.Browser()
218 try:
219 # check if it needs creds
220 if self.needsCredentials[mode]:
221 authenticated = self._getAuthenticated(i3Browser)
222 if authenticated:
223 # Accessing the resources
224 data = i3Browser.recoverURL(qURL)
225 else:
226 # Accessing the resources
227 data = i3Browser.recoverURL(qURL)
228 except:
229 # No information was found, then we return a null entity
230 # TO-DO: i3BrowserException
231 return json.dumps(results)
232
233 # Verifying if the platform exists
234 if self.somethingFound(data, mode=mode):
235
236 if mode == "phonefy":
237 r = {}
238 r["type"] = "i3visio.phone"
239 r["value"] = self.platformName + " - " + query
240 r["attributes"] = []
241
242 # Appending platform URI
243 aux = {}
244 aux["type"] = "i3visio.uri"
245 aux["value"] = qURL
246 aux["attributes"] = []
247 r["attributes"].append(aux)
248
249 # Appending platform name
250 aux = {}
251 aux["type"] = "i3visio.platform"
252 aux["value"] = self.platformName
253 aux["attributes"] = []
254 r["attributes"].append(aux)
255
256 # Iterating if requested to extract more entities from the URI
257 if process:
258 # This function returns a json text!
259 r["attributes"] += json.loads(self.processData(data=data, mode=mode))
260 # Appending the result to results: in this case only one profile will be grabbed
261 results.append(r)
262
263 elif mode == "usufy":
264 r = {}
265 r["type"] = "i3visio.profile"
266 r["value"] = self.platformName + " - " + query
267 r["attributes"] = []
268
269 # Appending platform URI
270 aux = {}
271 aux["type"] = "i3visio.uri"
272 aux["value"] = qURL
273 aux["attributes"] = []
274 r["attributes"].append(aux)
275 # Appending the alias
276 aux = {}
277 aux["type"] = "i3visio.alias"
278 aux["value"] = query
279 aux["attributes"] = []
280 r["attributes"].append(aux)
281 # Appending platform name
282 aux = {}
283 aux["type"] = "i3visio.platform"
284 aux["value"] = self.platformName
285 aux["attributes"] = []
286 r["attributes"].append(aux)
287
288
289 # Iterating if requested to extract more entities from the URI
290 if process:
291 # This function returns a json text!
292 r["attributes"] += json.loads(self.processData(data=data, mode=mode))
293
294 # Appending the result to results: in this case only one profile will be grabbed
295 results.append(r)
296
297 elif mode == "searchfy":
298 # Recovering all the found aliases...
299 ids = re.findall(self.searchfyAliasRegexp, data, re.DOTALL)
300
301 for j, i in enumerate(ids):
302 r = {}
303 r["type"] = "i3visio.profile"
304 r["value"] = self.platformName + " - " + i
305 r["attributes"] = []
306
307 # Appending platform URI
308 aux = {}
309 aux["type"] = "i3visio.uri"
310 # Creating the URI based on the base URL for the new profiles...
311 uri, alias = self.createURL(word=i, mode="base")
312 #uri=self.baseURL+i
313
314 aux["value"] = uri
315
316 aux["attributes"] = []
317 r["attributes"].append(aux)
318 # Appending the alias
319 aux = {}
320 aux["type"] = "i3visio.alias"
321 aux["value"] = alias
322 aux["attributes"] = []
323 r["attributes"].append(aux)
324 # Appending platform name
325 aux = {}
326 aux["type"] = "i3visio.platform"
327 aux["value"] = self.platformName
328 aux["attributes"] = []
329 r["attributes"].append(aux)
330 # Appending the query performed to grab this items
331 aux = {}
332 aux["type"] = "i3visio.search"
333 aux["value"] = query
334 aux["attributes"] = []
335 r["attributes"].append(aux)
336
337 # TO-DO:
338 # Perform additional procesing
339 # Iterating the requested profiles to extract more entities from the URI would be slow!
340 """if process:
341 # This function returns a json text in usufy format for the returned objects.
342 r["attributes"] += json.loads(self.getInfo(process = True, mode="usufy", qURI=uri, query=i))
343 # Appending the result to results: in this case only one profile will be grabbed"""
344 results.append(r)
345 return json.dumps(results)
346
347 def modeIsValid(self, mode):
348 '''
349 Verification of whether the mode is a correct option to be used.
350
351 :param mode: Mode to be executed.
352
353 :return: True if the mode exists in the three main folders.
354 '''
355 if mode in self.isValidMode.keys():
356 if mode in self.isValidMode.keys():
357 return True
358 return False
359
360 def processData(self, uri=None, data = None, mode=None):
361 '''
362 Method to process and extract the entities of a URL of this type.
363
364 :param uri: The URI of this platform to be processed.
365 :param data: The information from which the info will be extracted. This way, info will not be downloaded twice.
366 :param mode: Mode to be executed.
367
368 :return: A list of the entities found.
369 '''
370 if data == None:
371 # Accessing the resource
372 i3Browser = browser.Browser()
373 try:
374 # check if it needs creds
375 if self.needsCredentials[mode]:
376 authenticated = self._getAuthenticated(i3Browser)
377 if authenticated:
378 # Accessing the resources
379 data = i3Browser.recoverURL(uri)
380 else:
381 # Accessing the resources
382 data = i3Browser.recoverURL(uri)
383 except:
384 # No information was found, then we return a null entity
385 # TO-DO: i3BrowserException
386 return json.dumps({})
387 #else:
388 # return json.dumps({})
389 info = []
390
391 # Searchfy needs an special treatment to recover the results
392 if mode != "searchfy":
393 # Iterating through all the type of fields
394 for field in self.fieldsRegExp[mode].keys():
395 # Recovering the RegularExpression
396 try:
397 # Using the old approach of "Start" + "End"
398 regexp = self.fieldsRegExp[mode][field]["start"]+"([^\)]+)"+self.fieldsRegExp[mode][field]["end"]
399
400 tmp = re.findall(regexp, data)
401
402 # Now we are performing an operation just in case the "end" tag is found in the results, which would mean that the tag selected matches something longer in the data.
403 values = []
404 for t in tmp:
405 if self.fieldsRegExp[mode][field]["end"] in t:
406
407 values.append(t.split(self.fieldsRegExp[mode][field]["end"])[0])
408 else:
409 values.append(t)
410
411 except:
412 # Using the compact approach if start and end tags do not exist.
413 regexp = self.fieldsRegExp[mode][field]
414
415 values = re.findall(regexp, data)
416
417 for val in values:
418 aux = {}
419 aux["type"] = field
420 aux["value"] = val
421 aux["attributes"] = []
422 if aux not in info:
423 info.append(aux)
424 # Searchfy results
425 else:
426 # Grabbing the results for the search
427 resultText = re.findall(searchfyAliasRegexp, data)
428 # Analysing each and every result to parse it...
429 for resURI in resultText:
430 r = {}
431 r["type"] = "i3visio.uri"
432 r["value"] = resURI
433 r["attributes"] = []
434 """# Iterating through all the type of fields
435 i3Browser = browser.Browser()
436 try:
437 # check if the profile needs credentials in usufy mode
438 if self.needsCredentials["usufy"]:
439 authenticated = self._getAuthenticated(i3Browser)
440 if authenticated:
441 # Accessing the resources
442 data = i3Browser.recoverURL(resURI)
443 else:
444 # Accessing the resources
445 data = i3Browser.recoverURL(resURI)
446 except:
447 data = ""
448 for field in self.fieldsRegExp["usufy"].keys():
449 # Building the regular expression if the format is a "start" and "end" approach... Easier to understand but less compact.
450 try:
451 # Using the old approach of "Start" + "End"
452 regexp = self.fieldsRegExp["usufy"][field]["start"]+"([^\)]+)"+self.fieldsRegExp["usufy"][field]["end"]
453
454 # Parsing the result for the text
455 tmp = re.findall(regexp, data)
456
457 # Now we are performing an operation just in case the "end" tag is found in the results, which would mean that the tag selected matches something longer in the data.
458 values = []
459 for t in tmp:
460 if self.fieldsRegExp["usufy"][field]["end"] in t:
461
462 values.append(t.split(self.fieldsRegExp["usufy"][field]["end"])[0])
463 else:
464 values.append(t)
465 # In the case of a compact approach being used. This would happen if start and end tags do not exist, but the expected behaviour is the same.
466 except:
467 regexp = self.fieldsRegExp["usufy"][field]
468
469 values = re.findall(regexp, data)
470
471 if field == "i3visio.uri":
472 for val in values:
473 r["value"] = val
474 else:
475 for val in values:
476 aux = {}
477 aux["type"] = field
478 aux["value"] = val
479 aux["attributes"] = []
480 if aux not in r["attributes"]:
481 r["attributes"].append(aux) """
482 r["attributes"] = json.loads(self.getInfo(process = True, mode="usufy", qURI=resURI))
483 info.append(r)
484 return json.dumps(info)
485
486 def somethingFound(self,data,mode="phonefy"):
487 '''
488 Verifying if something was found.
489
490 :param data: Data where the self.notFoundText will be searched.
491 :param mode: Mode to be executed.
492
493 :return: Returns True if exists.
494 '''
495 #try:
496 for text in self.notFoundText[mode]:
497 if text in data:
498 return False
499 return True
500 #except:
501 # pass
502 # # TO-DO: Throw notFoundText not found for this mode.
503
504 def __str__(self):
505 '''
506 Function to represent the text when printing the object
507
508 :return: self.platformName
509 '''
510 try:
511 return self.parameterName
512 except:
513 return self.platformName
514
515 def __eq__(self, obj):
516 '''
517 Function to check if two wrappers are the same based on the convention.
518
519 :return: True or False
520 '''
521 return self.platformName == obj.platformName
522
523 def _getAuthenticated(self, browser):
524 '''
525 Getting authenticated. This method will be overwritten.
526
527 :param browser: The browser in which the user will be authenticated.
528 '''
529 # check if we have creds
530 if len(self.creds) > 0:
531 # choosing a cred
532 c = random.choice(self.creds)
533 # adding the credential
534 browser.setNewPassword(url, c.user, c.password)
535 return True
536 else:
537 logger.debug("No credentials have been added and this platform needs them.")
538 return False
539
540 def _isValidQuery(self, query, mode="phonefy"):
541 '''
542 Method to verify if a given query is processable by the platform. The system looks for the forbidden characters in self.Forbidden list.
543
544 :param query:
545 :param mode: To be chosen amongst phonefy, usufy and searchfy.
546 :return: True | False
547 '''
548 # Verifying if the mode supports such a query
549 try:
550 # Checking if the query matched the compiled regexp
551 compiledRegexp = re.compile("^" + self.validQuery[mode] + "$")
552 if compiledRegexp.match(query):
553 """print "VALID query:"
554 print "\tmode: ", mode
555 print "\tquery: ", query"""
556 return True
557 else:
558 # The query would have returned a bigger array
559 """print "Invalid query:"
560 print "\tMode: ", mode
561 print "\tQuery: ", query"""
562 return False
563 except Exception as e:
564 # If something happened... just returning True
565 print "Oops. Something happened when validating the query:"
566 print "\tError: ", str(e)
567 print "\tMode: ", mode
568 print "\tQuery: ", query
569 print "\tPlatform: ", self.platformName
570 return True
571
572
573 def setCredentials(self, cred):
574 """
575 Getting the credentials and appending it to self.creds.
576 """
577 try:
578 self.creds.append(cred)
579 except:
580 pass
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # This file is part of OSRFramework.
5 #
6 # OSRFramework is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21
22 import os
23 import re
24 import copy
25 # logging imports
26 import logging
27
28 class RegexpObject():
29 '''
30 <RegexpObject> class.
31 '''
32 def __init__(self):
33 '''
34 Constructor without parameters...
35 Most of the times, this will be the ONLY method needed to be overwritten.
36 '''
37 # This is the tag of the regexp
38 self.name = "<empty>"
39 # This is the string containing the regexp to be seeked
40 self.reg_exp = []
41
42
43 def __init__(self, name, reg_exp):
44 '''
45 Constructor with parameters. This method permits the developer to instantiate dinamically <RegexpObject> objects.
46
47 :param name: string containing the name of the regular expression.
48 :param reg_exp: list of strings containing the regular expresion.
49 '''
50 # This is the tag of the regexp
51 self.name = name
52 # This is the string containing the reg_exp to be seeked
53 self.reg_exp = [reg_exp]
54
55
56 def __str__(self):
57 '''
58 Function to obtain the text that represents this object.
59
60 :return: str(self.getJson())
61 '''
62 return str(self.getResults())
63
64 def getAttributes(self, found = None):
65 '''
66 Method to extract additional attributes from a given expression (i. e.: domains and ports from URL and so on). This method may be overwritten in certain child classes.
67 :param found: expression to be processed.
68 :return: The output format will be like:
69 [{"type" : "i3visio.email", "value": "[email protected]", "attributes": [] }, {"type" : "i3visio.email", "value": "[email protected]", "attributes": [] }]
70 '''
71 return []
72
73 def getEntityType(self, found = None):
74 '''
75 Method to recover the value of the entity in case it may vary. By default this method does nothing but returning the entity type. However, some plugins may have to choose the entity type. This method may be overwritten in certain child classes.
76 :param found: The expression to be analysed.
77 :return: The entity type to be provided.
78 '''
79 return self.name
80
81 def getValue(self, found = None):
82 '''
83 Method to recover the value of the entity in case it needs any kind of processing. By default this method does nothing but returning the value. However, some plugins may need transformations such as the foo[at]bar[dot]com to be [email protected]. This method may be overwritten in certain child classes.
84 :param found: The expression to be analysed.
85 :return: Any kind of transformed value.
86 '''
87 return found
88
89 def getResults(self, parFound = None):
90 '''
91 Function to obtain the Dictionarythat represents this object.
92
93 :param parFound: values to return.
94
95 :return: The output format will be like:
96 [{"type" : "i3visio.email", "value": "[email protected]", "attributes": [] }, {"type" : "i3visio.email", "value": "[email protected]", "attributes": [] }]
97 '''
98 # Defining a dictionary
99 results = []
100 # Defining a dictionary inside with a couple of fields: reg_exp for the regular expression and found_exp for the expressions found.
101 #results[self.name] = {"reg_exp" : self.reg_exp, "found_exp" : parFound}
102 #results[self.name] = parFound
103 if len(parFound ) >0:
104 for found in parFound:
105 aux = {}
106 aux["type"] = self.getEntityType(found)
107 aux["value"] = self.getValue(found)
108 aux["attributes"] = self.getAttributes(found)
109 results.append(aux)
110 return results
111
112 def isValidExp(self, exp):
113 '''
114 Method to verify if a given expression is correct just in case the used regular expression needs additional processing to verify it.
115 This method will be overwritten when necessary.
116
117 :param exp: Expression to verify.
118
119 :return: True | False
120 '''
121 return True
122
123
124 def findExp(self, data):
125 '''
126 Method to look for the current regular expression in the provided string.
127
128 :param data: string containing the text where the expressions will be looked for.
129
130 :return: a list of verified regular expressions.
131 '''
132 temp = []
133 for r in self.reg_exp:
134 try:
135 temp += re.findall(r, data)
136 except:
137 print self.name
138 print r
139 print "CABOOOOM!"
140
141 verifiedExp = []
142 # verification
143 for t in temp:
144 # Remember: the regexps include two extra charactes (before and later) that should be removed now.
145 if self.isValidExp(t):
146 if t not in verifiedExp:
147 verifiedExp.append(t)
148
149 return self.getResults(verifiedExp)
150
151
152 def __str__(self):
153 '''
154 Function to represent the text when printing the object
155
156 :return: self.platformName
157 '''
158 try:
159 return self.name
160 except:
161 return "UNKNOWN_NAME"
162
163 def __eq__(self, obj):
164 '''
165 Function to check if two wrappers are the same based on the convention.
166
167 :return: True or False
168 '''
169 return self.name == obj.name
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This file is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
15 #
16 # You should have received a copy of the GNU General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import os
22 import sys
23
24 import pkgutil
25 import importlib
26 import inspect
27
28 import copy
29
30 import osrframework.patterns
31 import osrframework.utils.configuration as configuration
32
33 def getAllRegexp():
34 '''
35 Method that recovers ALL the list of <RegexpObject> classes to be processed....
36
37 :return: Returns a list [] of <RegexpObject> classes.
38 '''
39
40 listAll = []
41
42 ############################################################################
43 ############################################################################
44
45 # --------------------------------------------------------------------------
46 # Dinamically collecting all the "official" modules
47 # --------------------------------------------------------------------------
48
49 # A list that will contain all of the module names
50 all_modules = []
51
52 # Grabbing all the module names
53 for _, name, _ in pkgutil.iter_modules(osrframework.patterns.__path__):
54 all_modules.append("osrframework.patterns." + name)
55
56 # Iterating through all the module names to grab them
57 for moduleName in all_modules:
58 # Importing the module
59 my_module = importlib.import_module(moduleName)
60
61 # Getting all the classNames.
62 classNames = [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == moduleName]
63
64 # Dinamically grabbing the first class of the module. IT SHOULD BE ALONE!
65 MyClass = getattr(my_module, classNames[0])
66
67 # Instantiating the object
68 newInstance = MyClass()
69
70 # Adding to the list!
71 listAll.append(newInstance)
72
73 # --------------------------------------------------------------------------
74 # Loading user-defined wrappers under [OSRFrameworkHOME]/plugins/patterns/
75 # --------------------------------------------------------------------------
76
77 # Creating the application paths
78 paths = configuration.getConfigPath()
79
80 newPath = os.path.abspath(paths["appPathPatterns"])
81
82 # Inserting in the System Path
83 if not newPath in sys.path:
84 sys.path.append(newPath)
85
86 userImportedModules = {}
87
88 for module in os.listdir(newPath):
89 if module[-3:] == '.py':
90 current = module.replace('.py', '')
91 userImportedModules[current] = __import__(current)
92
93 del newPath
94
95 userClasses = []
96
97 # Iterating through all the files
98 for userModule in userImportedModules.keys():
99
100 my_module = userImportedModules[userModule]
101 # Getting all the classNames.
102 classNames = [m[0] for m in inspect.getmembers(my_module, inspect.isclass) if m[1].__module__ == userModule]
103
104 # Dinamically grabbing the first class of the module. IT SHOULD BE ALONE!
105 MyClass = getattr(my_module, classNames[0])
106
107 # Instantiating the object
108 newInstance = MyClass()
109
110 # Adding to the list!
111 userClasses.append(newInstance)
112
113 # --------------------------------------------------------------------------
114 # Overwriting original modules with the user plugins
115 # --------------------------------------------------------------------------
116 listToAdd = []
117 for userClass in userClasses:
118 for i, officialClass in enumerate(listAll):
119 # Checking if the name is the same
120 if str(userClass) == str(officialClass):
121 # Replacing the official module if a user module exists for it
122 listAll[i] = userClass
123 else:
124 if userClass not in listToAdd:
125 # Appending the new class
126 listToAdd.append(userClass)
127
128 # Merging listAll and listToAdd
129 listAll = listAll + listToAdd
130 ############################################################################
131 ############################################################################
132
133 return listAll
134
135 def getAllRegexpNames(regexpList = None):
136 '''
137 Method that recovers the names of the <RegexpObject> in a given list.
138
139 :param regexpList: list of <RegexpObject>. If None, all the available <RegexpObject> will be recovered.
140
141 :return: Array of strings containing the available regexps.
142 '''
143 if regexpList == None:
144 regexpList = getAllRegexp()
145 listNames = ['all']
146 # going through the regexpList
147 for r in regexpList:
148 listNames.append(r.name)
149 return listNames
150
151 def getRegexpsByName(regexpNames = ['all']):
152 '''
153 Method that recovers the names of the <RegexpObject> in a given list.
154
155 :param regexpNames: list of strings containing the possible regexp.
156
157 :return: Array of <RegexpObject> classes.
158 '''
159
160 allRegexpList = getAllRegexp()
161 if 'all' in regexpNames:
162 return allRegexpList
163
164 regexpList = []
165 # going through the regexpList
166 for name in regexpNames:
167 for r in allRegexpList:
168 if name == r.name:
169 regexpList.append(r)
170 return regexpList
0 # -*- coding: cp1252 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2014-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This file is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 import xmlrpclib
22 import pip
23
24
25 def hasUpdatesOnPypi(packageName="osrframework"):
26 installedPackage = None
27 for dist in pip.get_installed_distributions():
28 if dist.project_name == packageName:
29 installedPackage = dist
30 break
31
32 pypi = xmlrpclib.ServerProxy('https://pypi.python.org/pypi')
33 # This is an array
34 version_available = pypi.package_releases(packageName)
35 try:
36 if version_available[0] == installedPackage.version:
37 # No updates available
38 return False, installedPackage.version
39 else:
40 # There are updates available!
41 return True, version_available[0]
42 except IndexError as e:
43 if not installedPackage:
44 # Yes, the package has no version on Pypi
45 return False, "No version found"
46
47
48 if __name__ == "__main__":
49 print hasUpdatesOnPypi()
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # This program is part of OSRFramework. You can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program. If not, see <http://www.gnu.org/licenses/>.
17 #
18 ##################################################################################
19
20 import osrframework.utils.logger
21
22 # Calling the logger when being imported
23 osrframework.utils.logger.setupLogger(loggerName="osrframework.wrappers")
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Abou(Platform):
35 """
36 A <Platform> object for Abou.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Abou"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://abou.to/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h1>404</h1>","<h2>Oops, the page you're looking for does not exist.</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<div id="h11"><h1 id="profile_info">', "end": "</h1></div>"}
103 self.fieldsRegExp["usufy"]["i3visio.alias.youtube"] = {"start": '<a href="http://youtube.com/', "end": '"'}
104 self.fieldsRegExp["usufy"]["i3visio.alias.facebook"] = {"start": '<a href="http://facebook.com/', "end": '"'}
105 self.fieldsRegExp["usufy"]["i3visio.alias.linkedin"] = {"start": 'href="http://linkedin.com/in/', "end": '"'}
106 self.fieldsRegExp["usufy"]["i3visio.alias.googleplus"] = {"start": 'href="http://google.com/', "end": '"'}
107 self.fieldsRegExp["usufy"]["i3visio.alias.twitter"] = {"start": 'href="http://twitter.com/', "end": '"'}
108 self.fieldsRegExp["usufy"]["i3visio.alias.eksisozluk"] = {"start": 'href="http://eksisozluk.com/biri/', "end": '"'}
109 self.fieldsRegExp["usufy"]["i3visio.alias.academia"] = {"start": 'href="http://pima.academia.edu/', "end": '"'}
110 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<img src="', "end": '" id="profileaimg">'}
111 # Definition of regular expressions to be searched in searchfy mode
112 #self.fieldsRegExp["searchfy"] = {}
113 # Example of fields:
114 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
115
116 ################
117 # Fields found #
118 ################
119 # This attribute will be feeded when running the program.
120 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class About(Platform):
32 """
33 A <Platform> object for About.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "About"
40 self.tags = ["blog"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://about.me/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>about.me | your personal homepage</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<title>", "end": " | about.me</title>"}
100 self.fieldsRegExp["usufy"]["i3visio.description"] = {"start": '<section class="bio" data-reactid="27"><div data-reactid="28"><p>', "end": "</p></div></section>"}
101 self.fieldsRegExp["usufy"]["i3visio.alias.twitter"] = {"start": 'title="Visit me on Twitter" href="https://www.twitter.com/', "end": '" target="_blank"'}
102 self.fieldsRegExp["usufy"]["i3visio.alias.linkedin"] = {"start": 'title="Visit me on LinkedIn" href="http://www.linkedin.com/in/', "end": '" target="_blank"'}
103 self.fieldsRegExp["usufy"]["i3visio.interests"] = {"start": '<meta name="keywords" content="', "end": '"/>'}
104 self.fieldsRegExp["usufy"]["i3visio.personal_website"] = {"start": '"text":"Visit my website","url":"', "end": '"'}
105 # Definition of regular expressions to be searched in searchfy mode
106 #self.fieldsRegExp["searchfy"] = {}
107 # Example of fields:
108 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
109
110 ################
111 # Fields found #
112 ################
113 # This attribute will be feeded when running the program.
114 self.foundFields = {}
115
116
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Affilorama(Platform):
35 """
36 A <Platform> object for Affilorama.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Affilorama"
43 self.tags = ["e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.affilorama.com/member/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Member profile unavailable | Affilorama</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<img src="', "end": '" width="125" height="125">'}
103 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": 'content="', "end": 'on Affilorama.'}
104 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<span class="location">', "end": '</span>'}
105 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<span class="location">', "end": '</span>'}
106 self.fieldsRegExp["usufy"]["i3visio.twitter"] = {"start": 'data-name="data[Member][twitter]"><a href="http://twitter.com/', "end": '"'}
107 self.fieldsRegExp["usufy"]["i3visio.facebook"] = {"start": 'data-name="data[Member][facebook]"><a href="http://facebook.com/', "end": '"'}
108 self.fieldsRegExp["usufy"]["i3visio.googleplus"] = {"start": '<a href="http://plus.google.com/', "end": '"'}
109 # Definition of regular expressions to be searched in searchfy mode
110 #self.fieldsRegExp["searchfy"] = {}
111 # Example of fields:
112 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
113
114 ################
115 # Fields found #
116 ################
117 # This attribute will be feeded when running the program.
118 self.foundFields = {}
119
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ahmia(Platform):
32 """
33 A <Platform> object for Ahmia.
34 """
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Ahmia"
40 self.tags = ["tor", "search"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = False
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 #self.url["usufy"] = "http://anyurl.com/user/" + "<usufy>"
57 self.url["searchfy"] = "https://ahmia.fi/search/?q=" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 #self.needsCredentials["usufy"] = False
65 self.needsCredentials["searchfy"] = False
66
67 ###################
68 # Valid queries #
69 ###################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 #self.validQuery["usufy"] = ".*"
75 self.validQuery["searchfy"] = ".+"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 #self.notFoundText["usufy"] = []
84 self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 #self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 self.delimiters = {}
105 # These two fields are REQUIRED to grab the results
106 self.searchfyDelimiterStart = "<li class=\"hs_site\">"
107 self.searchfyDelimiterEnd = "</li>"
108 # These rest of fields to extract
109 self.fieldsRegExp["searchfy"]["i3visio.date"] = {"start": "<p class=\"urlinfo\">", "end": "</p>"}
110 self.fieldsRegExp["searchfy"]["i3visio.text"] = {"start": "<div class=\"urltext\">", "end": "</div>"}
111 self.fieldsRegExp["searchfy"]["i3visio.title"] = {"start": "<h3><a[^\<]+>", "end": "</a></h3>"}
112 #self.fieldsRegExp["searchfy"]["i3visio.uri"] = {"start": "<p class=\"links\">Access without Tor Browser: <a href=\\\"/redirect?redirect_url=", "end": "\">"}
113 self.fieldsRegExp["searchfy"]["i3visio.uri"] = {"start": "redirect_url=", "end": "\">"}
114 ################
115 # Fields found #
116 ################
117 # This attribute will be feeded when running the program.
118 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Anarchy101(Platform):
32 """
33 A <Platform> object for Anarchy101.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Anarchy101"
40 # Add the tags for the platform
41 self.tags = ["activism"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.anarchy101.org/user/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["User not found", "Could not establish database connection. Please check the username", "Page not found"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 # User
101 self.fieldsRegExp["usufy"]["i3visio.profile.anarchy101"] = {"start": "var qa_request='user/", "end": "';"}
102 # Member for
103 self.fieldsRegExp["usufy"]["@member_for"] = {"start": "Member for:\n\t\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\">", "end": "</SPAN>"}
104 self.fieldsRegExp["usufy"]["@type"] = {"start": "Type:\n\t\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\">", "end": "</SPAN>"}
105 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": "Full name:\n\t\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\">", "end": "</SPAN>"}
106 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "Location:\n\t\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\">", "end": "</SPAN>"}
107 self.fieldsRegExp["usufy"]["i3visio.uri.home"] = {"start": "Website:\n\t\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\">", "end": "</SPAN>"}
108 # About
109 self.fieldsRegExp["usufy"]["i3visio.text"] = {"start": "About:\n\t\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\">", "end": "</SPAN>"}
110 self.fieldsRegExp["usufy"]["@score"] = {"start": "Score:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-points\">", "end": "</SPAN>"}
111 self.fieldsRegExp["usufy"]["@questions"] = {"start": "Questions:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-q-posts\">", "end": "</SPAN>"}
112 self.fieldsRegExp["usufy"]["@answers"] = {"start": "Answers:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-a-posts\">", "end": "</SPAN>"}
113 self.fieldsRegExp["usufy"]["@¢omments"] = {"start": "Comments:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-c-posts\">", "end": "</SPAN>"}
114 self.fieldsRegExp["usufy"]["@voted_on"] = {"start": "Voted on:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-q-posts\">", "end": "</SPAN>"}
115 self.fieldsRegExp["usufy"]["@gave_out"] = {"start": "Gave out:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-upvotes\">", "end": "</SPAN>"}
116 self.fieldsRegExp["usufy"]["@received"] = {"start": "Received:\n\t\t\t\t\t\t</TD>\n\t\t\t\t\t\t<TD CLASS=\"qa-form-wide-data\">\n\t\t\t\t\t\t\t<SPAN CLASS=\"qa-form-wide-static\"><SPAN CLASS=\"qa-uf-user-upvoteds\">", "end": "</SPAN>"}
117
118 # Definition of regular expressions to be searched in searchfy mode
119 #self.fieldsRegExp["searchfy"] = {}
120 # Example of fields:
121 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
122
123 ################
124 # Fields found #
125 ################
126 # This attribute will be feeded when running the program.
127 self.foundFields = {}
128
129
130
131
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Angel(Platform):
35 """
36 A <Platform> object for Angel.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Angel"
43 self.tags = ["jobs", "e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://angel.co/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['<title>Page not found - 404 - AngelList</title>', 'IP Blocked']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = "<title>(.+) - AngelList</title>"
103 self.fieldsRegExp["usufy"]["i3visio.domain"] = {"start": 'rel="nofollow noopener noreferrer me" target="_blank"></a></span><span class=\'link\'><a href="', "end": '"'}
104 self.fieldsRegExp["usufy"]["i3visio.alias_twitter"] = {"start": '<a href="http://twitter.com/', "end": '"'}
105 self.fieldsRegExp["usufy"]["i3visio.alias_facebook"] = {"start": '<a href="http://www.facebook.com/', "end": '"'}
106 self.fieldsRegExp["usufy"]["i3visio.alias_linkedin"] = {"start": '<a href="http://www.linkedin.com/in/', "end": '"'}
107 # Definition of regular expressions to be searched in searchfy mode
108 #self.fieldsRegExp["searchfy"] = {}
109 # Example of fields:
110 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
111
112 ################
113 # Fields found #
114 ################
115 # This attribute will be feeded when running the program.
116 self.foundFields = {}
117
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Archive(Platform):
32 """
33 A <Platform> object for Archive.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Archive"
40 self.tags = ["blog"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://archive.org/details/@" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["cannot find account"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<img id="file-dropper-img" src="', "end": '"'}
100 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<h1>Posts by ', "end": '</h1>'}
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Arduino(Platform):
32 """
33 A <Platform> object for Arduino.
34 """
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Arduino"
40 self.tags = ["development", "hardware"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.arduino.cc/index.php?action=profile;user=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The user whose profile you are trying to view does not exist."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": "<td><b>Name: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
100 self.fieldsRegExp["usufy"]["@total_posts"] = {"start": "<td><b>Posts: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
101 self.fieldsRegExp["usufy"]["@position"] = {"start": "<td><b>Posts: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
102 self.fieldsRegExp["usufy"]["@karma"] = {"start": "<b>Karma: </b>\n\t\t\t\t\t</td><td>\n\t\t\t\t\t\t", "end": "\n\t\t\t\t\t</td>"}
103 self.fieldsRegExp["usufy"]["i3visio.date"] = {"start": "<td><b>Date Registered: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
104 self.fieldsRegExp["usufy"]["@last_active"] = {"start": "<td><b>Last Active: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
105 self.fieldsRegExp["usufy"]["@ICQ"] = {"start": "<td><b>ICQ:</b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
106 self.fieldsRegExp["usufy"]["@AIM"] = {"start": "<td><b>AIM: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
107 self.fieldsRegExp["usufy"]["@MSN"] = {"start": "<td><b>MSN: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
108 self.fieldsRegExp["usufy"]["@YIM"] = {"start": "<td><b>YIM: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
109 self.fieldsRegExp["usufy"]["i3visio.email"] = {"start": "<td><b>Email: </b></td>\n\t\t\t\t\t<td><i>", "end": "</i>"}
110 self.fieldsRegExp["usufy"]["i3visio.uri.homepage"] = {"start": "<td><b>Website: </b></td>\n\t\t\t\t\t<td><a href=\"", "end": "\""}
111 self.fieldsRegExp["usufy"]["@current_status"] = {"start": "<td><b>Current Status: </b></td>\n\t\t\t\t\t<td>\n\t\t\t\t\t\t<i><img src=\"http://forum.arduino.cc/Themes/arduinoWide/images/useroff.gif\" alt=\"Offline\" align=\"middle\" /><span class=\"smalltext\">", "end": "</span></i>"}
112 self.fieldsRegExp["usufy"]["@gender"] = {"start": "<td><b>Gender: </b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
113 self.fieldsRegExp["usufy"]["@age"] = {"start": "<td><b>Age:</b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
114 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<td><b>Location:</b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
115 self.fieldsRegExp["usufy"]["@local_time"] = {"start": "<td><b>Local Time:</b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
116 self.fieldsRegExp["usufy"]["@language"] = {"start": "<td><b>Language:</b></td>\n\t\t\t\t\t<td>", "end": "</td>"}
117
118 # Definition of regular expressions to be searched in searchfy mode
119 #self.fieldsRegExp["searchfy"] = {}
120 # Example of fields:
121 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
122
123 ################
124 # Fields found #
125 ################
126 # This attribute will be feeded when running the program.
127 self.foundFields = {}
128
129
130
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ariva(Platform):
32 """
33 A <Platform> object for Ariva.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ariva"
40
41 self.tags = ["opinions", "professional"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.ariva.de/profil/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<b>Fehler (404)"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 self.fieldsRegExp["usufy"]["@profil"] = {"start": "</profil/", "end": ">"}
101 self.fieldsRegExp["usufy"]["@image"] = {"start": "solid #FFFFFF\" src=\"", "end": "\""}
102 self.fieldsRegExp["usufy"]["@clearfloat"] = {"start": "<div class=\"clearfloat\"></div> <div style=\"padding:5px 5px 0px 0px; line-height:16px;\">", "end": "</div>"}
103 self.fieldsRegExp["usufy"]["@mitgl. seit, Sterne"] = {"start": "Mitgl. seit, Sterne</td> <td class=\"middle\">\n\n\t\t\t\t\t", "end": "<span"}
104 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<a href=\"/forum/find.m?attr=land&val=", "end": "\""}
105 self.fieldsRegExp["usufy"]["@beruf"] = {"start": "<a href=\"/forum/find.m?attr=Beruf&amp;val=", "end": "\""}
106 self.fieldsRegExp["usufy"]["@firma"] = {"start": "<a href=\"/forum/find.m?attr=Firma&amp;val=", "end": "\""}
107 self.fieldsRegExp["usufy"]["@postings"] = {"start": "Postings</td> <td class=\"middle\">\n\n\t\t\t\t\t", "end": "\n"}
108 self.fieldsRegExp["usufy"]["@alter"] = {"start": "<a href=\"/forum/find.m?attr=Geburtstag&amp;val=", "end": "&amp"}
109 self.fieldsRegExp["usufy"]["@geschlecht"] = {"start": "<a href=\"/forum/find.m?attr=Geschlecht&amp;val=", "end": "\""}
110 self.fieldsRegExp["usufy"]["@ort"] = {"start": "<a href=\"/forum/find.m?attr=Ort&amp;val=", "end": "\""}
111 self.fieldsRegExp["usufy"]["@interest_1"] = {"start": "<a href=\"/forum/find.m?attr=Interesse1&amp;val=", "end": "\""}
112 self.fieldsRegExp["usufy"]["@interest_2"] = {"start": "<a href=\"/forum/find.m?attr=Interesse2&amp;val=", "end": "\""}
113 self.fieldsRegExp["usufy"]["@interest_3"] = {"start": "<a href=\"/forum/find.m?attr=Interesse3&amp;val=", "end": "\""}
114 self.fieldsRegExp["usufy"]["i3visio.uri.homepage"] = {"start": "Homepage</td> <td class=\"middle\"> <a href=\"", "end": "\""}
115 self.fieldsRegExp["usufy"]["@broker"] = {"start": "<a href=\"/forum/find.m?attr=broker&amp;val=", "end": "\""}
116
117 # Definition of regular expressions to be searched in searchfy mode
118 #self.fieldsRegExp["searchfy"] = {}
119 # Example of fields:
120 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
121
122 ################
123 # Fields found #
124 ################
125 # This attribute will be feeded when running the program.
126 self.foundFields = {}
127
128
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Armorgames(Platform):
32 """
33 A <Platform> object for Armorgames.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Armorgames"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://armorgames.com/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Ooops! | Armor Games</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<title>', "end": 'Profile | Armor Games</title>'}
100 self.fieldsRegExp["usufy"]["@created_at"] = {"start": '<li>Member since:', "end": '</li>'}
101 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<link rel="image_src" href="', "end": '" />'}
102
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Askfm(Platform):
32 """
33 A <Platform> object for Askfm.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Askfm"
40 self.tags = ["opinions", "social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://ask.fm/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Page not found | Ask.fm</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": 'class="blockLink">', "end": '</span>'}
100 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<link rel="image_src" href="', "end": '" />'}
101
102 # Definition of regular expressions to be searched in searchfy mode
103 #self.fieldsRegExp["searchfy"] = {}
104 # Example of fields:
105 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
106
107 ################
108 # Fields found #
109 ################
110 # This attribute will be feeded when running the program.
111 self.foundFields = {}
112
113
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Audiob(Platform):
32 """
33 A <Platform> object for Audiob.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Audiob"
40 self.tags = ["audio"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.audiob.us/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Audiobus Forum</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<title>', "end": '- Audiobus Forum</title>'}
100 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<div class="Photo PhotoWrap PhotoWrapLarge ">\n<img src="', "end": '- Audiobus Forum</title>'}
101 self.fieldsRegExp["usufy"]["@created_at"] = {"start": '<dd class="Joined"><time title="', "end": '"'}
102 self.fieldsRegExp["usufy"]["@visits"] = {"start": '<dd class="Visits">', "end": '</dd>'}
103 self.fieldsRegExp["usufy"]["@last_activity"] = {"start": '<dd class="LastActive"><time title="', "end": '"'}
104 self.fieldsRegExp["usufy"]["@roles"] = {"start": '<dd class="Roles">', "end": '</dd>'}
105
106
107 # Definition of regular expressions to be searched in searchfy mode
108 #self.fieldsRegExp["searchfy"] = {}
109 # Example of fields:
110 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
111
112 ################
113 # Fields found #
114 ################
115 # This attribute will be feeded when running the program.
116 self.foundFields = {}
117
118
119
120
121
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Audioboo(Platform):
32 """
33 A <Platform> object for Audioboo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Audioboo"
40 self.tags = ["audio"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://audioboo.fm/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Audioboo / Not Found</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<a href="/', "end": '"><img alt="avatar"'}
100 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": 'class="avatar-image avatar-image--with-image t-br-50pc di js-img-bg" style=";background-color:#db9c86"\nsrc="', "end": '" /></a>'}
101 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<p class='location'>", "end": '</p>'}
102
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
114
115
116
117
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Authorstream(Platform):
32 """
33 A <Platform> object for Authorstream.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Authorstream"
40 self.tags = ["professional"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.authorstream.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<span> We apologize for this inconvenience. "]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = {"start": '<span id="LeftPanel1_lblname">', "end": '</span></h2>'}
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98
99 # Example of fields:
100 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<span id="LeftPanel1_lblname">', "end": '</span></h2>'}
101 #self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<p class="light_text11" style="line-height: 12px">\n ', "end": ', '}
102 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<img src="', "end": '" id="LeftPanel1_imgUserPic"'}
103 self.fieldsRegExp["usufy"]["i3visio.description"] = {"start": '<p class="light_text12 dv100per" style="line-height: 14px; word-wrap: break-word">\n', "end": '\n</p>\n'}
104 self.fieldsRegExp["usufy"]["@created_at"] = {"start": '<span id="LeftPanel1_LabelJoinDate">', "end": '</span></span>'}
105 self.fieldsRegExp["usufy"]["i3visio.domain"] = {"start": '<span><strong>Website:</strong></span> <span><a rel="nofollow" target="_blank" href=\'', "end": '\'>'}
106
107 # Definition of regular expressions to be searched in searchfy mode
108 #self.fieldsRegExp["searchfy"] = {}
109 # Example of fields:
110 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
111
112 ################
113 # Fields found #
114 ################
115 # This attribute will be feeded when running the program.
116 self.foundFields = {}
117
118
119
120
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Autospies(Platform):
32 """
33 A <Platform> object for Autospies.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Autospies"
40 self.tags = ["e-commerce", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.autospies.com/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ['<span id="ctl00_middleContent_editProfile"></span>\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t<strong>My']
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 #self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
113
114
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Badoo(Platform):
32 """
33 A <Platform> object for Badoo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Badoo"
40 self.tags = ["contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://badoo.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["https://badoocdn.com/v2/-/-/i/hotornot_v2/blocker/blocker-error.7.svg"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<span class="js-location-label">', "end": '</span>'}
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Bandcamp(Platform):
35 """
36 A <Platform> object for Bandcamp.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Bandcamp"
43 self.tags = ["music"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://bandcamp.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2 class=\"signuptitle\">Sign Up for an Artist Account</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<meta property="og:site_name" content="', "end": '"'}
103 self.fieldsRegExp["usufy"]["i3visio.uri_image_profile"] = {"start": '<div id="fan-bio-pic">\n <a class="popupImage" href="', "end": '"'}
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Bebee(Platform):
35 """
36 A <Platform> object for Bebee.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Bebee"
43 self.tags = ["jobs"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://bebee.com/bee/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['<link rel="canonical" href="https://.bebee.com/bees/search">']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<title>', "end": '- beBee</title>'}
103 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<span itemprop="addressRegion">', "end": '</span>'}
104 self.fieldsRegExp["usufy"]["i3visio.alias.googleplus"] = {"start": '<div><a rel="nofollow" class="color_corp_three" href="https://plus.google.com/u/0/', "end": '"'}
105 self.fieldsRegExp["usufy"]["i3visio.alias.linkedin"] = {"start": '<div><a rel="nofollow" class="color_corp_three" href="http://br.linkedin.com/in/', "end": '"'}
106 # Definition of regular expressions to be searched in searchfy mode
107 #self.fieldsRegExp["searchfy"] = {}
108 # Example of fields:
109 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
110
111 ################
112 # Fields found #
113 ################
114 # This attribute will be feeded when running the program.
115 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Behance(Platform):
32 """
33 A <Platform> object for Behance.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Behance"
40 self.tags = ["image"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.behance.net/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Behance :: This page cannot be found</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": 'href="/search?content=users&amp;sort=appreciations&amp;country=', "end": '&amp;'}
100 self.fieldsRegExp["usufy"]["i3visio.domain"] = {"start": 'href="" href="', "end": '"'}
101 self.fieldsRegExp["usufy"]["i3visio.alias.twitter"] = {"start": 'href="http://twitter.com/', "end": '"'}
102 self.fieldsRegExp["usufy"]["i3visio.alias.facebook"] = {"start": 'href="http://facebook.com/', "end": '"'}
103 self.fieldsRegExp["usufy"]["i3visio.alias.pinterest"] = {"start": 'href="http://pinterest.com/', "end": '"'}
104 self.fieldsRegExp["usufy"]["i3visio.alias.vimeo"] = {"start": 'href="http://vimeo.com/', "end": '"'}
105 self.fieldsRegExp["usufy"]["i3visio.alias.instagram"] = {"start": 'href="http://instagram.com/', "end": '"'}
106 self.fieldsRegExp["usufy"]["i3visio.alias.wacom"] = {"start": 'href="http://gallery.wacom.com/', "end": '"'}
107 self.fieldsRegExp["usufy"]["i3visio.alias.pantone"] = {"start": 'href="http://canvas.pantone.com/', "end": '"'}
108 self.fieldsRegExp["usufy"]["i3visio.i3visio.uri_image_profile"] = {"start": 'id="profile-image" src="', "end": '"'}
109
110 # Definition of regular expressions to be searched in searchfy mode
111 #self.fieldsRegExp["searchfy"] = {}
112 # Example of fields:
113 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
114
115 ################
116 # Fields found #
117 ################
118 # This attribute will be feeded when running the program.
119 self.foundFields = {}
120
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bennugd(Platform):
32 """
33 A <Platform> object for Bennugd.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bennugd"
40 self.tags = ["gaming", "development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.bennugd.org/index.php?action=profile;user=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["El usuario cuyo perfil estás intentando editar no existe."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<div class="username"><h4>', "end": '<span'}
100 self.fieldsRegExp["usufy"]["@sex"] = {"start": '<dt>Sexo: </dt>\n\t\t\t\t\t<dd>', "end": '</dd>'}
101 self.fieldsRegExp["usufy"]["@age"] = {"start": '<dt>Edad:</dt>\n\t\t\t\t\t<dd>', "end": '</dd>'}
102 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<dt>Ubicación:</dt>\n\t\t\t\t\t<dd>', "end": '</dd>'}
103 self.fieldsRegExp["usufy"]["@last_active"] = {"start": '<dt>\xe9ltima vez activo: </dt>\n\t\t\t\t\t<dd>', "end": '</dd>'}
104 self.fieldsRegExp["usufy"]["@created_at"] = {"start": '<dt>Fecha de registro: </dt>\n\t\t\t\t\t<dd>', "end": '</dd>'}
105 self.fieldsRegExp["usufy"]["@language"] = {"start": '<dt>Idioma:</dt>\n\t\t\t\t\t<dd>', "end": '</dd>'}
106
107 # Definition of regular expressions to be searched in searchfy mode
108 #self.fieldsRegExp["searchfy"] = {}
109 # Example of fields:
110 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
111
112 ################
113 # Fields found #
114 ################
115 # This attribute will be feeded when running the program.
116 self.foundFields = {}
117
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Betblog(Platform):
32 """
33 A <Platform> object for Betblog.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Betblog"
40 self.tags = ["betting"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.betblog.com/tipster/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<span>404. Page not found.</span>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bitbucket(Platform):
32 """
33 A <Platform> object for Bitbucket.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bitbucket"
40 self.tags = ["development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://bitbucket.org/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Oops, you've found a dead link"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<h1>\n \n ', "end": '\n \n <span class="username">'}
100 self.fieldsRegExp["usufy"]["i3visio.domain"] = {"start": 'rel="me nofollow">', "end": "</a>"}
101 self.fieldsRegExp["usufy"]["@created_at"] = {"start": 'data-format="mmmm yyyy">', "end": "</time>"}
102
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bitcointa(Platform):
32 """
33 A <Platform> object for Bitcointa.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bitcointa"
40 self.tags = ["cryptocurrencies"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://bitcointa.lk/members/?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Notable Members | Bitcointa.lk</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bitcointalk(Platform):
32 """
33 A <Platform> object for Bitcointalk.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bitcointalk"
40 self.tags = ["cryptocurrencies"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://bitcointalk.org/index.php?action=profile;user=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The user whose profile you are trying to view does not exist."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": '<td><b>Name: </b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
100 self.fieldsRegExp["usufy"]["@created_at"] = {"start": '<td><b>Date Registered: </b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
101 self.fieldsRegExp["usufy"]["@last_activity"] = {"start": '<td><b>Last Active: </b></td>\n\t\t\t\t\t<td><b>', "end": "</td>"}
102 self.fieldsRegExp["usufy"]["@ICQ"] = {"start": '<td><b>ICQ:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
103 self.fieldsRegExp["usufy"]["@AIM"] = {"start": '<td><b>AIM:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
104 self.fieldsRegExp["usufy"]["@MSN"] = {"start": '<td><b>AIM:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
105 self.fieldsRegExp["usufy"]["@YIM"] = {"start": '<td><b>AIM:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
106 self.fieldsRegExp["usufy"]["@Email"] = {"start": '<td><b>AIM:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
107 self.fieldsRegExp["usufy"]["i3visio.domain"] = {"start": '<td><b>AIM:</b></td>\n\t\t\t\t\t<td><a href="', "end": '"'}
108 self.fieldsRegExp["usufy"]["@sex"] = {"start": '<td><b>Gender:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
109 self.fieldsRegExp["usufy"]["@age"] = {"start": '<td><b>Gender:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
110 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": '<td><b>Location:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
111 self.fieldsRegExp["usufy"]["@local_time"] = {"start": '<td><b>Local Time:</b></td>\n\t\t\t\t\t<td>', "end": "</td>"}
112
113 # Definition of regular expressions to be searched in searchfy mode
114 #self.fieldsRegExp["searchfy"] = {}
115 # Example of fields:
116 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
117
118 ################
119 # Fields found #
120 ################
121 # This attribute will be feeded when running the program.
122 self.foundFields = {}
123
124
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bitly(Platform):
32 """
33 A <Platform> object for Bitly.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bitly"
40 self.tags = ["tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://bitly.com/u/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>bitly | Page Not Found | 404</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Bitrated(Platform):
35 """
36 A <Platform> object for Bitrated.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Bitrated"
43 self.tags = ["cryptocurrencies"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.bitrated.com/" + "<usufy>" + ".json"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['{"message":"Page not found"}']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = "\"full_name\":\"([^\"]+)\",\"title"
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Blackplanet(Platform):
32 """
33 A <Platform> object for Blackplanet.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Blackplanet"
40 self.tags = ["contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.blackplanet.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Page not found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Blip(Platform):
32 """
33 A <Platform> object for Blip.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Blip"
40 self.tags = ["audio"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://blip.fm/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, but the page you are trying to view does not exist."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Blogmarks(Platform):
35 """
36 A <Platform> object for Blogmarks.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Blogmarks"
43 self.tags = ["blog"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://blogmarks.net/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<p>Sorry, this user does not exist.</p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Blogspot(Platform):
32 """
33 A <Platform> object for Blogspot.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Blogspot"
40 self.tags = ["blog", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + ".blogspot.com.es/"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>No se ha encontrado el blog.</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bookofmatches(Platform):
32 """
33 A <Platform> object for Bookofmatches.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bookofmatches"
40 self.tags = ["contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.bookofmatches.com/profile/page/" + "<usufy>" + ".html"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>BookofMatches.com"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Boonex(Platform):
32 """
33 A <Platform> object for Boonex.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Boonex"
40 self.tags = ["development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.boonex.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Requested profile is not available"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bordom(Platform):
32 """
33 A <Platform> object for Bordom.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bordom"
40 self.tags = ["image"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.bordom.net/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No such user by that name"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Boxedup(Platform):
32 """
33 A <Platform> object for Boxedup.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Boxedup"
40 self.tags = ["e-commerce", "tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.boxedup.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>boxedup | People</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the Affero GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.1"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Breakcom(Platform):
35 """
36 A <Platform> object for Breakcom.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Breakcom"
43 self.tags = ["video"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.break.com/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Break.com</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bubok(Platform):
32 """
33 A <Platform> object for Bubok.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bubok"
40 self.tags = ["books"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.bubok.es/autores/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["PRESENTACIONES Y EVENTOS"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Bucketlistly(Platform):
32 """
33 A <Platform> object for Bucketlistly.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Bucketlistly"
40 self.tags = ["trips"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.bucketlistly.com/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^0-9][^\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, the page you are looking for doesn't exist. (404) - Bucketlistly"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Buddypic(Platform):
35 """
36 A <Platform> object for Buddypic.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Buddypic"
43 self.tags = ["dating"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.buddypic.com/users/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = [" am sorry but that username cannot be found. Please check the spelling and try again."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Burbuja(Platform):
32 """
33 A <Platform> object for Burbuja.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Burbuja.info"
40 # Add the tags for the platform
41 self.tags = ["opinions", "activism"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.burbuja.info/inmobiliaria/member-" + "<usufy>" + ".html"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["Este usuario no se ha registrado y por lo tanto no tiene un perfil para ver.", "<title>Burbuja.info - Foro de economía</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101
102 # Definition of regular expressions to be searched in searchfy mode
103 #self.fieldsRegExp["searchfy"] = {}
104 # Example of fields:
105 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
106
107 ################
108 # Fields found #
109 ################
110 # This attribute will be feeded when running the program.
111 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Burdastyle(Platform):
32 """
33 A <Platform> object for Burdastyle.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Burdastyle"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.burdastyle.com/profiles/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h2>404 Error</h2>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Buzznet(Platform):
32 """
33 A <Platform> object for Buzznet.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Buzznet"
40 self.tags = ["audio"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.buzznet.com/author/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The page you requested was not found."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Cafemom(Platform):
32 '''
33 A <Platform> object for Cafemom.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Cafemom"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.cafemom.com/home/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["is not a CafeMom member.</p>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Canva(Platform):
35 """
36 A <Platform> object for Canva.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Canva"
43 self.tags = ["image"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.canva.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["(404)</h1>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Carbonmade(Platform):
32 """
33 A <Platform> object for Carbonmade.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Carbonmade"
40 self.tags = ["image", "tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + ".carbonmade.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>404!</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Cardinghispano(Platform):
32 """
33 A <Platform> object for Cardinghispano.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Cardinghispano"
40 self.tags = ["carding"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://cardinghispano.net/members/?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["El miembro específicado no pudo ser encontrado. Por favor ingrese el nombre completo del miembro."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Cardingmx(Platform):
32 """
33 A <Platform> object for Cardingmx.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Cardingmx"
40 self.tags = ["carding"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://cardingmx.mforos.com/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Usuarios - El usuario no existe"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Cardomain(Platform):
32 """
33 A <Platform> object for Cardomain.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Cardomain"
40 self.tags = ["e-commerce"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.cardomain.com/member/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["href=\"/css/pag-info-404.css\""]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Care2(Platform):
32 """
33 A <Platform> object for Care2.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Care2"
40 self.tags = ["activism"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.care2.com/causes/author/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Nothing found for Causes Author"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the Affero GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.1"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class CartoDB(Platform):
35 """
36 A <Platform> object for CartoDB.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "CartoDB"
43 self.tags = ["education", "maps"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://" + "<usufy>" + ".cartodb.com"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = "[^_]+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>404 Error — CartoDB</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Cash(Platform):
35 """
36 A <Platform> object for Cash.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Cash"
43 self.tags = ["payments"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://cash.me/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<p>The page you are looking for can't be found.</p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Castroller(Platform):
32 """
33 A <Platform> object for Castroller.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Castroller"
40 self.tags = ["audio", "video"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://castroller.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>404 - File or directory not found.</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Causes(Platform):
32 """
33 A <Platform> object for Causes.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Causes"
40 self.tags = ["activism"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.causes.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Not Found (404)"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ccm(Platform):
32 """
33 A <Platform> object for Ccm.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ccm"
40 self.tags = ["tech"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://es.ccm.net/profile/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["&iexcl;Uy! &iexcl;La p&aacute;gina solicitada no se encuentra!"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ccsinfo(Platform):
32 """
33 A <Platform> object for Ccsinfo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ccsinfo"
40 self.tags = ["e-commerce"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.ccsinfo.com/forum/profile.php?mode=viewprofile&u=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, but that user does not exist"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Chess(Platform):
32 """
33 A <Platform> object for Chess.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Chess"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.chess.com/members/view/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["href=\"/members/search?allnew=1\">"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Cockos(Platform):
32 """
33 A <Platform> object for Cockos.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Cockos"
40 self.tags = ["development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.cockos.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Codecademy(Platform):
35 """
36 A <Platform> object for Codecademy.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Codecademy"
43 self.tags = ["education", "development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.codecademy.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Page Not Found | Codecademy</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Codementor(Platform):
35 """
36 A <Platform> object for Codementor.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Codementor"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://codementor.io/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Codementor – Hire Expert Developers for On-Demand Mentorship & Freelance Projects"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Coderwall(Platform):
35 """
36 A <Platform> object for Coderwall.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Coderwall"
43 self.tags = ["developement", "education"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://coderwall.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>404 : Unable to handle that url</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Coinbase(Platform):
32 """
33 A <Coinbase> object for Demo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Coinbase"
40 self.tags = ["cryptocurrencies", "payments"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://coinbase.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Coinbase &mdash; 404 Not Found</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Colourlovers(Platform):
35 """
36 A <Platform> object for Colourlovers.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Colourlovers"
43 self.tags = ["art"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.colourlovers.com/lover/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h4>No one's home</h4>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Connectingsingles(Platform):
32 """
33 A <Platform> object for Connectingsingles.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Connectingsingles"
40 self.tags = ["contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.connectingsingles.com/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Profile</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Contently(Platform):
35 """
36 A <Platform> object for Contently.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Contently"
43 self.tags = ["e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://" + "<usufy>" + ".contently.com"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Oops, Page Not Found</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 ##############################################################
32 # Not working. Need a fix. #
33 ##############################################################
34
35 class Couchsurfing(Platform):
36 """
37 A <Platform> object for Coachsurfing.
38 """
39 def __init__(self):
40 """
41 Constructor...
42 """
43 self.platformName = "Couchsurfing"
44 self.tags = ["e-commerce"]
45
46 ########################
47 # Defining valid modes #
48 ########################
49 self.isValidMode = {}
50 self.isValidMode["phonefy"] = False
51 self.isValidMode["usufy"] = True
52 self.isValidMode["searchfy"] = False
53
54 ######################################
55 # Search URL for the different modes #
56 ######################################
57 # Strings with the URL for each and every mode
58 self.url = {}
59 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
60 self.url["usufy"] = "https://www.couchsurfing.org/people/" + "<usufy>"
61 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
62
63 ######################################
64 # Whether the user needs credentials #
65 ######################################
66 self.needsCredentials = {}
67 #self.needsCredentials["phonefy"] = False
68 self.needsCredentials["usufy"] = False
69 #self.needsCredentials["searchfy"] = False
70
71 #################
72 # Valid queries #
73 #################
74 # Strings that will imply that the query number is not appearing
75 self.validQuery = {}
76 # The regular expression '.+' will match any query.
77 #self.validQuery["phonefy"] = ".*"
78 self.validQuery["usufy"] = ".+"
79 #self.validQuery["searchfy"] = ".*"
80
81 ###################
82 # Not_found clues #
83 ###################
84 # Strings that will imply that the query number is not appearing
85 self.notFoundText = {}
86 #self.notFoundText["phonefy"] = []
87 self.notFoundText["usufy"] = ["<h1>404: not found</h1>"]
88 #self.notFoundText["searchfy"] = []
89
90 #########################
91 # Fields to be searched #
92 #########################
93 self.fieldsRegExp = {}
94
95 # Definition of regular expressions to be searched in phonefy mode
96 #self.fieldsRegExp["phonefy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
99
100 # Definition of regular expressions to be searched in usufy mode
101 self.fieldsRegExp["usufy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
104
105 # Definition of regular expressions to be searched in searchfy mode
106 #self.fieldsRegExp["searchfy"] = {}
107 # Example of fields:
108 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
109
110 ################
111 # Fields found #
112 ################
113 # This attribute will be feeded when running the program.
114 self.foundFields = {}
115
116 # While the issue cannot be solved on this platform
117 def _doesTheUserExist(self, html):
118 '''
119 Method that performs the verification of the existence or not of a given profile. This is a reimplementation of the method found in all the <Platform> objects. In this case, this will return ALWAYS None because the platform is no longer available.
120
121 :param html: The html text in which the self.notFoundText
122 :return : None if the user was not found in the html text and the html text if the user DOES exist.
123 '''
124 return None
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Crokes(Platform):
35 """
36 A <Platform> object for Crokes.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Crokes"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.crokes.com/" + "<usufy>" + "/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["404 Error"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Crowdin(Platform):
35 """
36 A <Platform> object for Crowdin.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Crowdin"
43 self.tags = ["translation"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://crowdin.com/profile/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h1>Seems you got in the wrong place...</h1>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 __author__ = "i3visio <[email protected]>"
22 __version__ = "1.0"
23
24 import argparse
25 import json
26 import re
27 import sys
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.platforms import Platform
32
33 class Cryptofresh(Platform):
34 """
35 A <Platform> object for Cryptofresh.
36 """
37 def __init__(self):
38 """
39 Constructor...
40 """
41 self.platformName = "Cryptofresh"
42 self.tags = ["cryptocurrencies"]
43
44 ########################
45 # Defining valid modes #
46 ########################
47 self.isValidMode = {}
48 self.isValidMode["phonefy"] = False
49 self.isValidMode["usufy"] = True
50 self.isValidMode["searchfy"] = False
51
52 ######################################
53 # Search URL for the different modes #
54 ######################################
55 # Strings with the URL for each and every mode
56 self.url = {}
57 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
58 self.url["usufy"] = "https://cryptofresh.com/u/" + "<usufy>"
59 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
60
61 ######################################
62 # Whether the user needs credentials #
63 ######################################
64 self.needsCredentials = {}
65 #self.needsCredentials["phonefy"] = False
66 self.needsCredentials["usufy"] = False
67 #self.needsCredentials["searchfy"] = False
68
69 #################
70 # Valid queries #
71 #################
72 # Strings that will imply that the query number is not appearing
73 self.validQuery = {}
74 # The regular expression '.+' will match any query
75 #self.validQuery["phonefy"] = ".*"
76 self.validQuery["usufy"] = ".+"
77 #self.validQuery["searchfy"] = ".*"
78
79 ###################
80 # Not_found clues #
81 ###################
82 # Strings that will imply that the query number is not appearing
83 self.notFoundText = {}
84 #self.notFoundText["phonefy"] = []
85 self.notFoundText["usufy"] = ['<title>Cryptofresh</title>']
86 #self.notFoundText["searchfy"] = []
87
88 #########################
89 # Fields to be searched #
90 #########################
91 self.fieldsRegExp = {}
92
93 # Definition of regular expressions to be searched in phonefy mode
94 #self.fieldsRegExp["phonefy"] = {}
95 # Example of fields:
96 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
97
98 # Definition of regular expressions to be searched in usufy mode
99 self.fieldsRegExp["usufy"] = {}
100 # Example of fields:
101 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
102 # Definition of regular expressions to be searched in searchfy mode
103 #self.fieldsRegExp["searchfy"] = {}
104 # Example of fields:
105 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
106
107 ################
108 # Fields found #
109 ################
110 # This attribute will be feeded when running the program.
111 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Dailymotion(Platform):
32 """
33 A <Platform> object for Dailymotion.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Dailymotion"
40 self.tags = ["video"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.dailymotion.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No encontramos la página que buscas."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Datpiff(Platform):
35 """
36 A <Platform> object for Datpiff.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Datpiff"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.datpiff.com/profile/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>DatPiff :: Community - Coming Soon</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Deviantart(Platform):
32 """
33 A <Platform> object for Deviantart.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Deviantart"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + ".deviantart.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The page you were looking for doesn't exist."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Digitalspy(Platform):
32 """
33 A <Platform> object for Digitalspy.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Digitalspy"
40 self.tags = ["gaming", "opinions", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forums.digitalspy.co.uk/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Disqus(Platform):
32 """
33 A <Platform> object for Disqus.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Disqus"
40 self.tags = ["tools", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://disqus.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Page not found (404) - Disqus"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Doodle(Platform):
32 """
33 A <Platform> object for Doodle.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Doodle"
40 self.tags = ["tools"]
41
42 self.forbiddenList = ['.']
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://doodle.com/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["It appears the page you were looking for doesn't exist."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101
102 # Definition of regular expressions to be searched in searchfy mode
103 #self.fieldsRegExp["searchfy"] = {}
104 # Example of fields:
105 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
106
107 ################
108 # Fields found #
109 ################
110 # This attribute will be feeded when running the program.
111 self.foundFields = {}
112
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Douban(Platform):
32 """
33 A <Platform> object for Douban.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Douban"
40 self.tags = ["social", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://site.douban.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["http://img3.douban.com/pics/douban_error.gif"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Félix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.1"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Dreamstime(Platform):
35 """
36 A <Platform> object for Dreamstime.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Dreamstime"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://es.dreamstime.com/" + "<usufy>" + "_info"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['<div class="noimgwrap">']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Dribbble(Platform):
32 """
33 A <Platform> object for Dribbble.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Dribbble"
40 self.tags = ["image"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://dribbble.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Sorry, the page you were looking for doesn't exist. (404)</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Drugbuyersforum(Platform):
32 """
33 A <Platform> object for Drugbuyersforum.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Drugbuyersforum"
40 self.tags = ["e-commerce"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://drugbuyersforum.org/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Drupal(Platform):
32 """
33 A <Platform> object for Drupal.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Drupal"
40 self.tags = ["development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.drupal.org/u/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Page not found | Drupal.org</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Dzone(Platform):
35 """
36 A <Platform> object for Dzone.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Dzone"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://dzone.com/users/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<p>We can't find the page you're looking for.</p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ebay(Platform):
32 """
33 A <Platform> object for Ebay.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ebay"
40 self.tags = ["e-commerce"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.ebay.com/usr/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The User ID you entered was not found. Please check the User ID and try again"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Echatta(Platform):
32 """
33 A <Platform> object for Echatta.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Echatta"
40 self.tags = ["conversation"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.echatta.net/component/comprofiler/userprofile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Effettua il login o registrati per visualizzare o modificare il tuo profilo."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ehow(Platform):
32 """
33 A <Platform> object for Ehow.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ehow"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.ehow.com/contributor/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, The page you were looking for could not be found - error | eHow | eHow"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class EightBitMe(Platform):
35 """
36 A <Platform> object for EightBitMe.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "EightBitMe"
43 self.tags = ["gaming"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://eightbit.me/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>EightBit: 404 Error</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 __author__ = "i3visio <[email protected]>"
22 __version__ = "1.1"
23
24 import argparse
25 import json
26 import re
27 import sys
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.platforms import Platform
32
33 class Ello(Platform):
34 """
35 A <Platform> object for Ello.
36 """
37 def __init__(self):
38 """
39 Constructor...
40 """
41 self.platformName = "Ello"
42 self.tags = ["social"]
43
44 ########################
45 # Defining valid modes #
46 ########################
47 self.isValidMode = {}
48 self.isValidMode["phonefy"] = False
49 self.isValidMode["usufy"] = True
50 self.isValidMode["searchfy"] = False
51
52 ######################################
53 # Search URL for the different modes #
54 ######################################
55 # Strings with the URL for each and every mode
56 self.url = {}
57 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
58 self.url["usufy"] = "https://ello.co/" + "<usufy>"
59 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
60
61 ######################################
62 # Whether the user needs credentials #
63 ######################################
64 self.needsCredentials = {}
65 #self.needsCredentials["phonefy"] = False
66 self.needsCredentials["usufy"] = False
67 #self.needsCredentials["searchfy"] = False
68
69 #################
70 # Valid queries #
71 #################
72 # Strings that will imply that the query number is not appearing
73 self.validQuery = {}
74 # The regular expression '.+' will match any query
75 #self.validQuery["phonefy"] = ".*"
76 self.validQuery["usufy"] = ".+"
77 #self.validQuery["searchfy"] = ".*"
78
79 ###################
80 # Not_found clues #
81 ###################
82 # Strings that will imply that the query number is not appearing
83 self.notFoundText = {}
84 #self.notFoundText["phonefy"] = []
85 self.notFoundText["usufy"] = ["| [404] Not Found</title>"]
86 #self.notFoundText["searchfy"] = []
87
88 #########################
89 # Fields to be searched #
90 #########################
91 self.fieldsRegExp = {}
92
93 # Definition of regular expressions to be searched in phonefy mode
94 #self.fieldsRegExp["phonefy"] = {}
95 # Example of fields:
96 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
97
98 # Definition of regular expressions to be searched in usufy mode
99 self.fieldsRegExp["usufy"] = {}
100 # Example of fields:
101 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
102 # Definition of regular expressions to be searched in searchfy mode
103 #self.fieldsRegExp["searchfy"] = {}
104 # Example of fields:
105 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
106
107 ################
108 # Fields found #
109 ################
110 # This attribute will be feeded when running the program.
111 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Elmundo(Platform):
32 """
33 A <Platform> object for El Mundo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "ElMundo"
40 self.tags = ["news", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.elmundo.es/social/usuarios/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h4>Error 404</h4>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Emoneyspace(Platform):
35 """
36 A <Platform> object for Emoneyspace.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Emoneyspace"
43 self.tags = ["online"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.emoneyspace.com/forum/index.php?action=profile;user=" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["The user whose profile you are trying to view does not exist"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Enfemenino(Platform):
32 '''
33 A <Platform> object for Enfemenino.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Enfemenino"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.enfemenino.com/mi-espacio/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Perfil - enfemenino</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ethereum(Platform):
32 """
33 A <Platform> object for Ethereum.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ethereum"
40 self.tags = ["cryptocurrencies", "development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://forum.ethereum.org/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>ethereum</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Etsy(Platform):
32 """
33 A <Platform> object for Etsy.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Etsy"
40 self.tags = ["e-commerce"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.etsy.com/people/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Etsy - Your place to buy and sell all things handmade, vintage, and supplies</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Eyeem(Platform):
35 """
36 A <Platform> object for Eyeem.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Eyeem"
43 self.tags = ["photos"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.eyeem.com/u/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Not Found (404) | EyeEm</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class F6s(Platform):
35 """
36 A <Platform> object for F6s.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "F6s"
43 self.tags = ["jobs"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://f6s.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>404 - Page Not Found</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Facebook(Platform):
32 """
33 A <Platform> object for Facebook.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Facebook"
40 self.tags = ["social", "contact"]
41
42 # Base URL
43 self.baseURL = "http://facebook.com/"
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = True
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.facebook.com/" + "<usufy>"
60 self.url["searchfy"] = "https://www.facebook.com/public?query=" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 self.validQuery["searchfy"] = ".+"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Esta página no está disponible", "This content is currently unavailable", "Sorry, this page isn't available"]
87 self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 self.fieldsRegExp["searchfy"] = {}
105 self.searchfyAliasRegexp = "lfloat _ohe\" href=\"https://www.facebook.com/([^\"]+)\" aria-hidden=\"true\""
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Facesaerch(Platform):
32 """
33 A <Platform> object for Facesaerch.
34 """
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Facesaerch"
40 self.tags = ["image", "search"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = False
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 #self.url["usufy"] = "http://anyurl.com/user/" + "<usufy>"
57 self.url["searchfy"] = "https://facesaerch.com/f/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 #self.needsCredentials["usufy"] = False
65 self.needsCredentials["searchfy"] = False
66
67 ###################
68 # Valid queries #
69 ###################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 #self.validQuery["usufy"] = ".*"
75 self.validQuery["searchfy"] = ".+"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 #self.notFoundText["usufy"] = []
84 self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 #self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 self.delimiters = {}
105 # These two fields are REQUIRED to grab the results
106 self.searchfyDelimiterStart = "<a class=\"facelink\""
107 self.searchfyDelimiterEnd = 'style="display:none" ></a>'#"class=\"faceimage\""# style="display:none" ></a>'
108 # These rest of fields to extract
109 self.fieldsRegExp["searchfy"]["i3visio.uri"] = {"start": '" href="', "end": '"'}
110 self.fieldsRegExp["searchfy"]["i3visio.text"] = {"start": 'alt="', "end": '"'}
111 self.fieldsRegExp["searchfy"]["i3visio.image"] = {"start": 'src="', "end": '"'}
112
113 ################
114 # Fields found #
115 ################
116 # This attribute will be feeded when running the program.
117 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Fanpop(Platform):
32 """
33 A <Platform> object for Fanpop.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Fanpop"
40 self.tags = ["social", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.fanpop.com/fans/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Fanpop - Fan clubs for everything. What are you a fan of?</title>", "<h2 class=\"module-heading\">Browse Content</h2>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Fark(Platform):
32 """
33 A <Platform> object for Fark.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Fark"
40 self.tags = ["news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.fark.com/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>FARK.com: User profiles: view</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Favstar(Platform):
32 """
33 A <Platform> object for Favstar.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Favstar"
40 # Add the tags for the platform
41 self.tags = ["social", "tools", "microblogging"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://favstar.fm/users/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = "[a-zA-Z0-9_]{1,19}"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<title>Discover New Tweets</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Fiverr(Platform):
35 """
36 A <Platform> object for Fiverr.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Fiverr"
43 self.tags = ["jobs"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://forum.fiverr.com/users/" + "<usufy>" + "/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h1 class=\"page-not-found\">¡Ups! Esa página no existe o es privada.</h1>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Flickr(Platform):
32 """
33 A <Platform> object for Flickr.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Flickr"
40 self.tags = ["image", "social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.flickr.com/photos/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<p class=\"Problem\">"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Flixster(Platform):
32 """
33 A <Platform> object for Flixster.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Flixster"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://community.flixster.com/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = True
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Oops!</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Foodspotting(Platform):
32 """
33 A <Platform> object for Foodspotting.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Foodspotting"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.foodspotting.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = re.compile(".*")
74 self.validQuery["usufy"] = "[^0-9].+"
75 #self.validQuery["searchfy"] = re.compile(".*")
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>The page you were looking for doesn't exist (404)</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Forobtc(Platform):
32 """
33 A <Platform> object for Forobtc.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Forobtc"
40 self.tags = ["cryptocurrencies"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.forobtc.com/index.php?action=profile;user=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Un error ha ocurrido!"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Forocoches(Platform):
32 """
33 A <Platform> object for Forocoches.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Forocoches"
40 self.tags = ["opinions", "activism"]
41
42 # Add the URL for enumeration below
43 #self.urlEnumeration = "http://www.forocoches.com/foro/member.php?u=" + "<HERE_GOES_THE_USER_ID>"
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.forocoches.com/foro/member.php?username=" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Usuario no registrado, por lo que no tiene un perfil.</div>","<center>Usuario especificado inv"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
114
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Foroptc(Platform):
32 """
33 A <Platform> object for Foroptc.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Foroptc"
40 self.tags = ["tech"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://foro-ptc.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Este usuario no se ha registrado y por lo tanto no tiene un perfil para ver."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Foros24h(Platform):
32 """
33 A <Platform> object for Foros24h.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Foros24h"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.foros24h.com/members/" + "<usufy>" + ".html"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Este usuario no se ha registrado y por lo tanto no tiene un perfil para ver."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Forosperu(Platform):
32 """
33 A <Platform> object for Forosperu.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Forosperu"
40 self.tags = ["opinions", "activism"]
41
42 # Add the URL for enumeration below
43 #self.urlEnumeration = "http://www.forocoches.com/foro/member.php?u=" + "<HERE_GOES_THE_USER_ID>"
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://forosperu.net/members/?username=" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["No se encontró el usuario especificado."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
114
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Forospyware(Platform):
32 """
33 A <Platform> object for Forospyware.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Forospyware"
40 self.tags = ["hacking"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forospyware.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Este usuario no se ha registrado y por lo tanto no tiene un perfil para ver."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Fotolog(Platform):
35 """
36 A <Platform> object for Fotolog.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Fotolog"
43 self.tags = ["photos"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.fotolog.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2>Error 404 : No fue posible encontrar la página solicitada</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Foursquare(Platform):
32 """
33 A <Platform> object for Badoo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Foursquare"
40 self.tags = ["social", "trips", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://foursquare.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["We couldn't find the page you're looking for."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Freelancer(Platform):
32 """
33 A <Platform> object for Freelancer.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Freelancer"
40 self.tags = ["jobs"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.freelancer.com/u/" + "<usufy>" + ".html"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["404 - Page can not be found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Freerepublic(Platform):
32 """
33 A <Platform> object for Freerepublic.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Freerepublic"
40 self.tags = ["activism"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.freerepublic.com/~" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Error</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Gamesheep(Platform):
32 """
33 A <Platform> object for Gamesheep.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Gamesheep"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.gamesheep.com/member_profile.php?u=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Member not found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Gametracker(Platform):
33 """
34 A <Platform> object for Gametracker.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Gametracker"
41 self.tags = ["gaming"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.gametracker.com/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["GameTracker.com : Profile Not Found"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Gapyear(Platform):
33 """
34 A <Platform> object for Gapyear.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Gapyear"
41 self.tags = ["trips"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.gap-year.com/en/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["Welcome to gap-year.com!"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Gather(Platform):
33 """
34 A <Platform> object for Gather.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Gather"
41 self.tags = ["social", "activism", "opinions"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://" + "<usufy>" + ".gather.com"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<title>Group or Member Unavailable | Gather</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Geeksphone(Platform):
33 """
34 A <Platform> object for Geeksphone.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Geeksphone"
41 self.tags = ["opinions"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://forum.geeksphone.com/index.php?action=profile;user=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["El usuario cuyo perfil estás intentando editar no existe.", "<title>An Error Has Occurred!</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Genspot(Platform):
33 """
34 A <Platform> object for Genspot.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Genspot"
41 self.tags = ["e-commerce", "opinions"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.genspot.com/u/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["was <b>removed</b> from GenSpot."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the Affero GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Getlocalization(Platform):
35 """
36 A <Platform> object for Getlocalization.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Getlocalization"
43 self.tags = ["translation", "development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.getlocalization.com/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["404"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Getsatisfaction(Platform):
33 """
34 A <Platform> object for Flickr.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "GetSatisfaction"
41 self.tags = ["professional", "tools"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "https://getsatisfaction.com/people/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<h1>Page not found :(</h1>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Github(Platform):
33 """
34 A <SocialNetwork> object for Github.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Github"
41 self.tags = ["development"]
42
43 # Base URL
44 self.baseURL = "http://github.com/"
45
46 ########################
47 # Defining valid modes #
48 ########################
49 self.isValidMode = {}
50 self.isValidMode["phonefy"] = False
51 self.isValidMode["usufy"] = True
52 self.isValidMode["searchfy"] = True
53
54 ######################################
55 # Search URL for the different modes #
56 ######################################
57 # Strings with the URL for each and every mode
58 self.url = {}
59 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
60 self.url["usufy"] = "https://github.com/" + "<usufy>"
61 self.url["searchfy"] = "https://github.com/search?utf8=%E2%9C%93&q=<searchfy>&type=Users&ref=searchresults"
62
63 ######################################
64 # Whether the user needs credentials #
65 ######################################
66 self.needsCredentials = {}
67 #self.needsCredentials["phonefy"] = False
68 self.needsCredentials["usufy"] = False
69 self.needsCredentials["searchfy"] = False
70
71 #################
72 # Valid queries #
73 #################
74 # Strings that will imply that the query number is not appearing
75 self.validQuery = {}
76 # The regular expression '.+' will match any query.
77 #self.validQuery["phonefy"] = ".*"
78 self.validQuery["usufy"] = ".+"
79 self.validQuery["searchfy"] = ".+"
80
81 ###################
82 # Not_found clues #
83 ###################
84 # Strings that will imply that the query number is not appearing
85 self.notFoundText = {}
86 #self.notFoundText["phonefy"] = []
87 self.notFoundText["usufy"] = ["This is not the web page you are looking for"]
88 self.notFoundText["searchfy"] = []
89
90 #########################
91 # Fields to be searched #
92 #########################
93 self.fieldsRegExp = {}
94
95 # Definition of regular expressions to be searched in phonefy mode
96 #self.fieldsRegExp["phonefy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
99
100 # Definition of regular expressions to be searched in usufy mode
101 self.fieldsRegExp["usufy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
104 # Definition of regular expressions to be searched in searchfy mode
105 self.fieldsRegExp["searchfy"] = {}
106 self.searchfyAliasRegexp = "<img alt=\"@([^\"]+)\""
107 # Example of fields:
108 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
109
110 ################
111 # Fields found #
112 ################
113 # This attribute will be feeded when running the program.
114 self.foundFields = {}
115
116
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Goblinrefuge(Platform):
35 """
36 A <Platform> object for Goblinrefuge.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Goblinrefuge"
43 self.tags = ["video", "audio", "image"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://goblinrefuge.com/mediagoblin/u/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<p>Parece que no hay ninguna página en esta dirección. ¡Lo sentimos!</p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Goodreads(Platform):
33 """
34 A <Platform> object for Goodreads.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Goodreads"
41 self.tags = ["social", "opinions"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.goodreads.com/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<title>Goodreads - Page Not Found</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class GooglePlus(Platform):
33 """
34 A <Platform> object for Google Plus.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "GooglePlus"
41 self.tags = ["social"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "https://plus.google.com/+" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["404. That’s an error."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Gravatar(Platform):
35 """
36 A <Platform> object for Gravatar.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Gravatar"
43 self.tags = ["identity"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://es.gravatar.com/" + "<usufy>" + ".json"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['"User not found"']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = '<div class="user-name fn">([^<]+)</div>'
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Gsmspain(Platform):
33 """
34 A <Platform> object for Gsmspain.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Gsmspain"
41 self.tags = ["opinions"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.gsmspain.com/foros/member.php?s=&action=getinfo&username=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<title>Perfil del usuario en los foros de gsmspain.com</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Hi5(Platform):
33 """
34 A <Platform> object for Hi5.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Hi5"
41 self.tags = ["social"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.hi5.com/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = True
66 #self.needsCredentials["searchfy"] = False
67
68 # Array of credentials to be used
69 self.creds = []
70
71 #################
72 # Valid queries #
73 #################
74 # Strings that will imply that the query number is not appearing
75 self.validQuery = {}
76 # The regular expression '.+' will match any query.
77 #self.validQuery["phonefy"] = ".*"
78 self.validQuery["usufy"] = ".+"
79 #self.validQuery["searchfy"] = ".*"
80
81 ###################
82 # Not_found clues #
83 ###################
84 # Strings that will imply that the query number is not appearing
85 self.notFoundText = {}
86 #self.notFoundText["phonefy"] = []
87 self.notFoundText["usufy"] = ["<title>hi5</title>"]
88 #self.notFoundText["searchfy"] = []
89
90 #########################
91 # Fields to be searched #
92 #########################
93 self.fieldsRegExp = {}
94
95 # Definition of regular expressions to be searched in phonefy mode
96 #self.fieldsRegExp["phonefy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
99
100 # Definition of regular expressions to be searched in usufy mode
101 self.fieldsRegExp["usufy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Houzz(Platform):
35 """
36 A <Platform> object for Houzz.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Houzz"
43 self.tags = ["jobs"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.houzz.es/pro/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h1 class=\"header-1 top\">La página solicitada no existe.</h1>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Htcmania(Platform):
32 """
33 A <Platform> object for Htcmania.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Htcmania"
40 self.tags = ["tech"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://htcmania.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Este usuario no est&aacute; registrado y por lo tanto no tiene ning&uacute;n perfil el cual poder ver."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Hubpages(Platform):
32 """
33 A <Platform> object for Hubpages.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Hubpages"
40 self.tags = ["blog"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://hubpages.com/@" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["404. That page doesn't exist."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ibosocial(Platform):
32 """
33 A <Platform> object for Ibosocial.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ibosocial"
40 self.tags = ["social", "professional", "tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.ibosocial.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>IBOsocial - 404 Error</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Identica(Platform):
32 """
33 A <Platform> object for Identica.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Identica"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://identi.ca/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>Error 404</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class IFunny(Platform):
35 """
36 A <Platform> object for IFunny.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "IFunny"
43 self.tags = ["image"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://ifunny.co/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>404 - page not found - iFunny :)</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Imgur(Platform):
32 """
33 A <Platform> object for Imgur.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Imgur"
40 self.tags = ["image"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://imgur.com/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title> imgur: the simple 404 page</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Infotelefonica(Platform):
32 '''
33 A <Platform> object for Infotelefonica.
34 '''
35 def __init__(self):
36 '''
37 Consstructor...
38 '''
39 self.platformName = "Infotelefonica"
40 self.tags = ["phone"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = True
47 self.isValidMode["usufy"] = False
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 self.url = {}
54 self.url["phonefy"] = "http://www.infotelefonica.es/" + "<phonefy>"
55 #self.url["usufy"] = "http://anyurl.com/user/" + "<phonefy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<phonefy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 self.validQuery["phonefy"] = ".+"
73 self.validQuery["usufy"] = ".+"
74 self.validQuery["searchfy"] = ".+"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the phone number is not appearing
80 self.notFoundText = {}
81 self.notFoundText["phonefy"] = ["Al dejar el primer comentario procederás a registrar este número de teléfono en en nuestro foro."]
82 #self.notFoundText["usufy"] = []
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89 # Definition of regular expressions to be searched in phonefy mode
90 self.fieldsRegExp["phonefy"] = {}
91 self.fieldsRegExp["phonefy"]["i3visio.fullname"] = 'Titular: <a href="http://bandir.infotelefonica.es/[0-9]+">([^<]+)</a><br />'
92 #self.fieldsRegExp["phonefy"]["i3visio.fullname"] = 'Titular: <a href="http://bandir.infotelefonica.es/[0-9]+">([^<]+)</a><br />'
93
94 # Definition of regular expressions to be searched in usufy mode
95 #self.fieldsRegExp["usufy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in searchfy mode
100 #self.fieldsRegExp["searchfy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
103
104 ################
105 # Fields found #
106 ################
107 # This attribute will be feeded when running the program.
108 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Inkonsky(Platform):
35 """
36 A <Platform> object for Inkonsky.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Inkonsky"
43 self.tags = ["e-commerce", "art"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://inkonsky.co/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Tatuajes y tatuadores de Colombia</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = "<title>(.+) - Tatuajes</title>"
103 self.fieldsRegExp["usufy"]["i3visio.location"] = 'class="location">([^<]+)</a></div>'
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Instagram(Platform):
32 """
33 A <Platform> object for Instagram.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Instagram"
40 self.tags = ["image", "social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.instagram.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Página no encontrada"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Instructables(Platform):
32 """
33 A <Platform> object for Instructables.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Instructables"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.instructables.com/member/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["ERROR 400: no member:"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Intfiction(Platform):
32 """
33 A <Platform> object for Intfiction.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Intfiction"
40 self.tags = ["opinions", "social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.intfiction.org/forum/memberlist.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No members found for this search criterion."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Islamicawakening(Platform):
32 """
33 A <Platform> object for Islamicawakening.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Islamicawakening"
40 self.tags = ["activism"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.islamicawakening.com/members/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view.", "<h1>Account Suspended</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Issuu(Platform):
32 """
33 A <Platform> object for Issuu.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Issuu"
40 self.tags = ["tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.issuu.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["We can't find what you're looking for."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ivoox(Platform):
32 '''
33 A <Platform> object for Ivoox.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Ivoox"
40 self.tags = ["opinions", "contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + ".ivoox.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["El contenido que estás buscando no existe."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Jamiiforums(Platform):
32 '''
33 A <Platform> object for Jamiiforums.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Jamiiforums"
40 self.tags = ["opinions", "contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://jamiiforums.com/members/?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The specified member cannot be found. Please enter a member's entire name."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kali(Platform):
32 """
33 A <Platform> object for Kali.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Kali"
40 self.tags = ["hacking"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://forums.kali.org/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Kali Linux Forums</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kanogames(Platform):
32 """
33 A <Platform> object for Kanogames.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Kanogames"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.kanogames.com/profile/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, Sorry, the page youre looking for cant be found."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Karmacracy(Platform):
32 """
33 A <Platform> object for Karmacracy.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Karmacracy"
40 self.tags = ["social", "tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://karmacracy.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["page not found", "404 error"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Keybase(Platform):
32 """
33 A <Platform> object for Keybase.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Keybase"
40 self.tags = ["pgp", "identity"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://keybase.io/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, what you are looking for...it does not exist."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kickstarter(Platform):
32 """
33 A <Platform> object for Kickstarter.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Kickstarter"
40 self.tags = ["e-commerce", "professional"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.kickstarter.com/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h2>Oh my goodness</h2>", "<h1>404</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kimatel(Platform):
32 '''
33 A <Platform> object for Infotelefonica.
34 '''
35 def __init__(self):
36 '''
37 Consstructor...
38 '''
39 self.platformName = "Kimatel"
40 self.tags = ["phone"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = True
47 self.isValidMode["usufy"] = False
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 self.url = {}
54 self.url["phonefy"] = "http://www.quienera.es/numero/n/" + "<phonefy>"
55 #self.url["usufy"] = "http://anyurl.com/user/" + "<phonefy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<phonefy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 self.validQuery["phonefy"] = ".+"
73 self.validQuery["usufy"] = ".+"
74 self.validQuery["searchfy"] = ".+"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the phone number is not appearing
80 self.notFoundText = {}
81 self.notFoundText["phonefy"] = ["""<!-- END formulaire -->
82
83
84
85
86 <!-- BEGIN aucun_commentaire -->"""]
87 #self.notFoundText["usufy"] = []
88 #self.notFoundText["searchfy"] = []
89
90 #########################
91 # Fields to be searched #
92 #########################
93 self.fieldsRegExp = {}
94 # Definition of regular expressions to be searched in phonefy mode
95 self.fieldsRegExp["phonefy"] = {}
96 self.fieldsRegExp["phonefy"]["i3visio.fullname"] = 'Titular: <a href="http://bandir.infotelefonica.es/[0-9]+">([^<]+)</a><br />'
97 #self.fieldsRegExp["phonefy"]["i3visio.fullname"] = 'Titular: <a href="http://bandir.infotelefonica.es/[0-9]+">([^<]+)</a><br />'
98
99 # Definition of regular expressions to be searched in usufy mode
100 #self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kinja(Platform):
32 """
33 A <Platform> object for Kinja.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Kinja"
40 self.tags = ["news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + ".kinja.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Kinja</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Yaiza Rubio and Félix Brezo <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Kiwi(Platform):
35 """
36 A <Platform> object for Kiwi.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "kiwi"
43 self.tags = ["social", "teenagers"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://kiwi.qa/<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = "[^\.]+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["ga('send', 'event', 'ERROR',"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": 'Location: "', "end": '"'}
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30 class Klout(Platform):
31 """
32 A <Platform> object for Klout.
33 """
34 def __init__(self):
35 """
36 Constructor...
37 """
38 self.platformName = "Klout"
39 self.tags = ["social"]
40
41 ########################
42 # Defining valid modes #
43 ########################
44 self.isValidMode = {}
45 self.isValidMode["phonefy"] = False
46 self.isValidMode["usufy"] = True
47 self.isValidMode["searchfy"] = False
48
49 ######################################
50 # Search URL for the different modes #
51 ######################################
52 # Strings with the URL for each and every mode
53 self.url = {}
54 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
55 self.url["usufy"] = "http://www.klout.com/" + "<usufy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 #self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 #self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 #self.validQuery["phonefy"] = ".*"
73 self.validQuery["usufy"] = ".+"
74 #self.validQuery["searchfy"] = ".*"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the query number is not appearing
80 self.notFoundText = {}
81 #self.notFoundText["phonefy"] = []
82 self.notFoundText["usufy"] = ["klout.com/static/images/sasquatch2.png"]
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89
90 # Definition of regular expressions to be searched in phonefy mode
91 #self.fieldsRegExp["phonefy"] = {}
92 # Example of fields:
93 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
94
95 # Definition of regular expressions to be searched in usufy mode
96 self.fieldsRegExp["usufy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
99 # Definition of regular expressions to be searched in searchfy mode
100 #self.fieldsRegExp["searchfy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
103
104 ################
105 # Fields found #
106 ################
107 # This attribute will be feeded when running the program.
108 self.foundFields = {}
109
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kongregate(Platform):
32 """
33 A <Platform> object for Kongregate.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Kongregate"
40 self.tags = ["e-commerce", "gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.kongregate.com/accounts/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h2>Sorry, no account with that name was found.</h2>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Kupika(Platform):
32 """
33 A <Platform> object for Kupika.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Kupika"
40 self.tags = ["contact", "social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://kupika.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Page Not Found - Kupika.com</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Lastfm(Platform):
32 """
33 A <Platform> object for Lastfm.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Lastfm"
40 self.tags = ["audio"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.lastfm.es/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No se ha encontrado al usuario"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Leakforums(Platform):
32 """
33 A <Platform> object for Leakforums.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Leakforums"
40 self.tags = ["leaks", "carding"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://leakforums.net/u/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ['[{"u":"-1","n":"Bad Input"}]', '[]']
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Linkedin(Platform):
32 """
33 A <Platform> object for Linkedin.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Linkedin"
40 self.tags = ["professional", "contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.linkedin.com/in/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Perfil no encontrado"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Listaspam(Platform):
32 '''
33 A <Platform> object for Listaspam.
34 '''
35 def __init__(self):
36 '''
37 Consstructor...
38 '''
39 self.platformName = "Listaspam"
40 self.tags = ["phone"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = True
47 self.isValidMode["usufy"] = False
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 self.url = {}
54 self.url["phonefy"] = "http://www.listaspam.com/busca.php?Telefono=" + "<phonefy>"
55 #self.url["usufy"] = "http://anyurl.com/user/" + "<phonefy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<phonefy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 self.validQuery["phonefy"] = ".+"
73 self.validQuery["usufy"] = ".+"
74 self.validQuery["searchfy"] = ".+"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the phone number is not appearing
80 self.notFoundText = {}
81 self.notFoundText["phonefy"] = ["No te quedes sin saber quien te llama por teléfono."]
82 #self.notFoundText["usufy"] = []
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89 # Definition of regular expressions to be searched in phonefy mode
90 self.fieldsRegExp["phonefy"] = {}
91 self.fieldsRegExp["phonefy"]["i3visio.location.province"] = "<strong class='located_label'>(.*),"
92 self.fieldsRegExp["phonefy"]["i3visio.location.country"] = "class='country_located' alt='([a-zA-Zñ]*)'"
93 self.fieldsRegExp["phonefy"]["i3visio.text"] = '<h4 class="media-heading">(.*)</p>'
94
95 # Definition of regular expressions to be searched in usufy mode
96 #self.fieldsRegExp["usufy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
99
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Livejournal(Platform):
32 """
33 A <Platform> object for Livejournal.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Livejournal"
40 self.tags = ["social", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + "." + "livejournal.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["</b> is not currently registered."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Looki(Platform):
32 '''
33 A <Platform> object for Looki.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Looki"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.looki.es/usuario/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^ ]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Looki - "]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Losviajeros(Platform):
32 """
33 A <Platform> object for Losviajeros.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Losviajeros"
40 self.tags = ["trips"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.losviajeros.com/index.php?name=Your_Account&op=userinfo&username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["¡El Usuario No Existe!"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Marca(Platform):
32 """
33 A <Platform> object for Marca.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Marca"
40 self.tags = ["news", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.marca.com/social/usuarios/" + "<usufy>" + "/"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h4>Error 404</h4>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Matchdoctor(Platform):
32 """
33 A <Platform> object for Matchdoctor.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Matchdoctor"
40 self.tags = ["contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.instagram.com/" + "<usufy>" + ".html"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>404 - File or directory not found.</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Mcneel(Platform):
32 """
33 A <Platform> object for Mcneel.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Mcneel"
40 self.tags = ["professional"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://discourse.mcneel.com/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = [">The page you requested doesn&#39;t exist or is private.</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Mediavida(Platform):
32 """
33 A <Platform> object for Mediavida.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Mediavida"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.mediavida.com/id/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>ERROR</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Medium(Platform):
32 """
33 A <Platform> object for Medium.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Medium"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://medium.com/@" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>404 Error - Medium</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Meneame(Platform):
32 """
33 A <Platform> object for Meneame.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Meneame"
40 self.tags = ["opinions", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.meneame.net/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["usuario inexistente"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Lucas Sánchez"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class MercadoLibre(Platform):
35 """
36 A <Platform> object for MercadoLibre.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "MercadoLibre"
43 self.tags = ["e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://perfil.mercadolibre.com.ar/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2>Usuario no encontrado</h2>", "<h2>Usuário não encontrado</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Metacafe(Platform):
32 """
33 A <Platform> object for Metacafe.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Metacafe"
40 self.tags = ["video"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.metacafe.com/channels/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>Channel is temporarily not available</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Meteor(Platform):
35 """
36 A <Platform> object for Meteor.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Meteor"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://forums.meteor.com/users/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Oops! That page doesn’t exist or is private."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Mig(Platform):
35 """
36 A <Platform> object for Mig.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Mig"
43 self.tags = ["gaming"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://new.mig.me/profile/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Oops, how&#x27;d you get here?!"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Migente(Platform):
32 """
33 A <Platform> object for Migente.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Migente"
40 self.tags = ["social", "contact"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.migente.com/" + "<usufy>" + "/?tracking=new_friend_center"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Página no encontrada"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Miiverse(Platform):
35 """
36 A <Platform> object for Miiverse.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Miiverse"
43 self.tags = ["gaming"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://miiverse.nintendo.net/users/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["No se ha encontrado al usuario."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Minecraft(Platform):
32 """
33 A <Platform> object for Minecraft.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Minecraft"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.minecraftforum.net/members/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Not found - Minecraft Forum </title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Moneymaker(Platform):
35 """
36 A <Platform> object for Moneymaker.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Moneymaker"
43 self.tags = ["e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.moneymakerdiscussion.com/forum/members/" + "<usufy>" + ".html"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Notable Members | Money Maker Discussion</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Mozilla(Platform):
35 """
36 A <Platform> object for Mozilla.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Mozilla"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://addons.mozilla.org/en-US/firefox/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h1>We're sorry, but we can't find what you're looking for.</h1"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Musicasacra(Platform):
32 """
33 A <Platform> object for Musicasacra.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Musicasacra"
40 self.tags = ["opinions", "audio"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.musicasacra.com/forum/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>MusicaSacra Church Music Forum</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Myeloma(Platform):
32 """
33 A <Platform> object for Myeloma.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Myeloma"
40 self.tags = ["opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.myeloma.org.uk/members/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>File Not Found</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class MyFitnessPal(Platform):
35 """
36 A <Platform> object for MyFitnessPal.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "MyFitnessPal"
43 self.tags = ["sports"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.myfitnesspal.com/user/" + "<usufy>" + "/profile/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["_gaq.push(['_trackPageview', '/404.html']);"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Myspace(Platform):
32 """
33 A <Platform> object for Myspace.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Myspace"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://myspace.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Page Not Found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Nairaland(Platform):
32 """
33 A <Nairaland> object for Nairaland.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Nairaland"
40 self.tags = ["forum"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://nairaland.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>404: Page Not Found.</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Netlog(Platform):
32 """
33 A <Platform> object for Netlog.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Netlog"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://nl.netlog.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["werd niet teruggevonden op Netlog</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Netvibes(Platform):
32 """
33 A <Platform> object for Netvibes.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Netvibes"
40 self.tags = ["tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.netvibes.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Netvibes: universe not found - Netvibes</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Newgrounds(Platform):
35 """
36 A <Platform> object for Newgrounds.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Newgrounds"
43 self.tags = ["gaming"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://" + "<usufy>" + ".newgrounds.com/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2 class=\"error\">Oops!</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Notabug(Platform):
35 """
36 A <Platform> object for Notabug.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Notabug"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://notabug.org/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<p>If you think this is an error, please open an issue on <a href=\"https://github.com/gogits/gogs/issues/new\">GitHub</a>.</p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Occupywallst(Platform):
32 """
33 A <Platform> object for Occupywallst.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Occupywallst"
40 self.tags = ["activism"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://occupywallst.org/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>404 – Page Not Found</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Odnoklassniki(Platform):
32 """
33 A <Platform> object for Vine.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Odnoklassniki"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://odnoklassniki.ru/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Odnoklassniki</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Okcupid(Platform):
35 """
36 A <Platform> object for Okcupid.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Okcupid"
43 self.tags = ["dating"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.okcupid.com/profile/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Free Online Dating | OkCupid</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Onename(Platform):
32 """
33 A <Platform> object for Onename.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Onename"
40 self.tags = ["cryptocurrencies", "identity"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://onename.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["User doesn&#39;t seem to exist"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class OpenBugBounty(Platform):
35 """
36 A <Platform> object for OpenBugBounty.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "OpenBugBounty"
43 self.tags = ["hacking"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.openbugbounty.org/researchers/" + "<usufy>" + "/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = [ "<h1>404 Error: Page Not found</h1>" ]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Openframeworks(Platform):
32 """
33 A <Platform> object for Openframeworks.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Openframeworks"
40 self.tags = ["development", "tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.openframeworks.cc/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = [">The page you requested doesn&#39;t exist or is private.</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Openstreetmap(Platform):
33 """
34 A <Platform> object for Openstreetmap.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Openstreetmap"
41 self.tags = ["maps", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "https://www.openstreetmap.org/user/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = "[^\.]+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = [ '<title>OpenStreetMap | No such user</title>' ]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Papaly(Platform):
35 """
36 A <Platform> object for Papaly.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Papaly"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://papaly.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Page not found</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Pastebin(Platform):
32 """
33 A <Platform> object for Pastebin.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Pastebin"
40 self.tags = ["tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://pastebin.com/u/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Optional Paste Settings"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Patreon(Platform):
35 """
36 A <Platform> object for Patreon.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Patreon"
43 self.tags = ["video"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.patreon.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Patreon: Page Not Found"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Pearltrees(Platform):
32 """
33 A <Platform> object for Pearltrees.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Pearltrees"
40 self.tags = ["tools"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.pearltrees.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Sorry, this page no longer exists..."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Peerbackers(Platform):
32 """
33 A <Platform> object for Peerbackers.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Peerbackers"
40 self.tags = ["e-commerce"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://peerbackers.com/members/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>peerbackers - Your Path To Capital - Crowdfunding Consulting</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Periscope(Platform):
32 """
33 A <Platform> object for Periscope.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Periscope"
40 self.tags = ["gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.periscope.tv/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ['Sorry, this page doesn\'t exist!']
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class PGPMIT(Platform):
33 """
34 A <SocialNetwork> object for the MIT PGP public keys repository.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "PGPMIT"
41 self.tags = ["mails", "cryptography"]
42
43 # Base URL
44 self.baseURL = "http://pgp.mit.edu/pks/lookup?search="
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = False
51 self.isValidMode["searchfy"] = True
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 #self.url["usufy"] = "https://github.com/" + "<usufy>"
60 self.url["searchfy"] = "http://pgp.mit.edu/pks/lookup?search=" +"<searchfy>" +"&op=index"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 #self.needsCredentials["usufy"] = False
68 self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 #self.validQuery["usufy"] = ".*"
78 self.validQuery["searchfy"] = ".+"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["This is not the web page you are looking for"]
87 self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 #self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 self.fieldsRegExp["searchfy"] = {}
105 self.searchfyAliasRegexp = "&lt;([^\&]+)&gt;"
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Phishtank(Platform):
35 """
36 A <Platform> object for Phishtank.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Phishtank"
43 self.tags = ["phishing"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.phishtank.com/user.php?username=" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>PhishTank | Join the fight against phishing</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Photobucket(Platform):
33 """
34 A <Platform> object for Photobucket.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Photobucket"
41 self.tags = ["image"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://smg.photobucket.com/user/" + "<usufy>" + "/library/?sort=3&page=1"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<h2>Sorry, the requested page does not exist.</h2>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Pixinsight(Platform):
33 """
34 A <Platform> object for Pixinsight.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Pixinsight"
41 self.tags = ["image"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://pixinsight.com/forum/index.php?action=profile;user=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["The user whose profile you are trying to view does not exist."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Pixls(Platform):
32 """
33 A <Platform> object for Pixls.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Pixls"
40 self.tags = ["image", "professional", "development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://discuss.pixls.us/users/" + "<usufy>" + "/activity"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["The page you requested doesn&#39;t exist or is private."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Pjrc(Platform):
33 """
34 A <Platform> object for Pjrc.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Pjrc"
41 self.tags = ["development", "e-commerce"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://forum.pjrc.com/member.php?username=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Pokerred(Platform):
33 '''
34 A <Platform> object for Pokerred.
35 '''
36 def __init__(self):
37 '''
38 Constructor...
39 '''
40 self.platformName = "Pokerred"
41 self.tags = ["gaming", "adult"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.poker-red.com/foros/member.php?username=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<div class=\"standard_error\">"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Pokerstrategy(Platform):
33 """
34 A <Platform> object for Pokerstrategy.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Pokerstrategy"
41 self.tags = ["gaming", "adult"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://es.pokerstrategy.com/community/profile/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = True
66 #self.needsCredentials["searchfy"] = False
67
68 # Array of credentials to be used
69 self.creds = []
70
71 #################
72 # Valid queries #
73 #################
74 # Strings that will imply that the query number is not appearing
75 self.validQuery = {}
76 # The regular expression '.+' will match any query.
77 #self.validQuery["phonefy"] = ".*"
78 self.validQuery["usufy"] = ".+"
79 #self.validQuery["searchfy"] = ".*"
80
81 ###################
82 # Not_found clues #
83 ###################
84 # Strings that will imply that the query number is not appearing
85 self.notFoundText = {}
86 #self.notFoundText["phonefy"] = []
87 self.notFoundText["usufy"] = ["Disculpa, ¡la página no se ha encontrado!"]
88 #self.notFoundText["searchfy"] = []
89
90 #########################
91 # Fields to be searched #
92 #########################
93 self.fieldsRegExp = {}
94
95 # Definition of regular expressions to be searched in phonefy mode
96 #self.fieldsRegExp["phonefy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
99
100 # Definition of regular expressions to be searched in usufy mode
101 self.fieldsRegExp["usufy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Pornhub(Platform):
33 """
34 A <Platform> object for Pornhub.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Pornhub"
41 self.tags = ["adult", "video", "contact"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.pornhub.com/users/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<h1><span>Error Page Not Found</span></h1>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Proboards(Platform):
33 """
34 A <Platform> object for Proboards.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Proboards"
41 self.tags = ["opinions", "development"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://petsnails.proboards.com/username/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["The member profile you are attempting to access cannot be found."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Px500(Platform):
33 """
34 A <Platform> object for 500px.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "500px"
41 self.tags = ["professional", "image"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://500px.com/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<title>500px / Not found</title>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Pz(Platform):
33 """
34 A <Platform> object for Pz.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Pz"
41 self.tags = ["opinions", "news"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.pz-news.de/forum/member.php?username=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["Dieser Benutzer hat sich nicht registriert und somit auch kein Profil, das man ansehen kann."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Qq(Platform):
33 """
34 A <Platform> object for QQ.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "QQ"
41 self.tags = ["social"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://bbs.map.qq.com/space-username-" + "<usufy>" + ".html"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<div id=\"messagetext\" class=\"alert_error\">"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Quartermoonsaloon(Platform):
33 """
34 A <Platform> object for Quartermoonsaloon.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Quartermoonsaloon"
41 self.tags = ["opinions", "activism"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://quartermoonsaloon.com/forum/member.php?username=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Rankia(Platform):
32 """
33 A <Platform> object for Rankia.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Rankia"
40 self.tags = ["contact", "professional"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.rankia.com/usuarios/"+ "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>La página que estás buscando no existe (404)</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 __author__ = "i3visio <[email protected]>"
22 __version__ = "1.0"
23
24 import argparse
25 import json
26 import re
27 import sys
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.platforms import Platform
32
33 class Rapid7(Platform):
34 """
35 A <Platform> object for Rapid7.
36 """
37 def __init__(self):
38 """
39 Constructor...
40 """
41 self.platformName = "Rapid7"
42 self.tags = ["hacking", "development"]
43
44 ########################
45 # Defining valid modes #
46 ########################
47 self.isValidMode = {}
48 self.isValidMode["phonefy"] = False
49 self.isValidMode["usufy"] = True
50 self.isValidMode["searchfy"] = False
51
52 ######################################
53 # Search URL for the different modes #
54 ######################################
55 # Strings with the URL for each and every mode
56 self.url = {}
57 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
58 self.url["usufy"] = "https://community.rapid7.com/people/" + "<usufy>"
59 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
60
61 ######################################
62 # Whether the user needs credentials #
63 ######################################
64 self.needsCredentials = {}
65 #self.needsCredentials["phonefy"] = False
66 self.needsCredentials["usufy"] = False
67 #self.needsCredentials["searchfy"] = False
68
69 #################
70 # Valid queries #
71 #################
72 # Strings that will imply that the query number is not appearing
73 self.validQuery = {}
74 # The regular expression '.+' will match any query
75 #self.validQuery["phonefy"] = ".*"
76 self.validQuery["usufy"] = ".+"
77 #self.validQuery["searchfy"] = ".*"
78
79 ###################
80 # Not_found clues #
81 ###################
82 # Strings that will imply that the query number is not appearing
83 self.notFoundText = {}
84 #self.notFoundText["phonefy"] = []
85 self.notFoundText["usufy"] = ['<title>Error | Rapid7 Community and Blog</title>']
86 #self.notFoundText["searchfy"] = []
87
88 #########################
89 # Fields to be searched #
90 #########################
91 self.fieldsRegExp = {}
92
93 # Definition of regular expressions to be searched in phonefy mode
94 #self.fieldsRegExp["phonefy"] = {}
95 # Example of fields:
96 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
97
98 # Definition of regular expressions to be searched in usufy mode
99 self.fieldsRegExp["usufy"] = {}
100 # Example of fields:
101 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
102 # Definition of regular expressions to be searched in searchfy mode
103 #self.fieldsRegExp["searchfy"] = {}
104 # Example of fields:
105 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
106
107 ################
108 # Fields found #
109 ################
110 # This attribute will be feeded when running the program.
111 self.foundFields = {}
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 __author__ = "i3visio <[email protected]>"
22 __version__ = "1.1"
23
24 import argparse
25 import json
26 import re
27 import sys
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.platforms import Platform
32
33 import random
34
35 import logging
36
37 class Rapid_i(Platform):
38 """
39 A <Platform> object for Rapid-i.
40 """
41 def __init__(self):
42 """
43 Constructor...
44 """
45 self.platformName = "Rapid-i"
46 self.tags = ["trips"]
47
48 ########################
49 # Defining valid modes #
50 ########################
51 self.isValidMode = {}
52 self.isValidMode["phonefy"] = False
53 self.isValidMode["usufy"] = True
54 self.isValidMode["searchfy"] = False
55
56 ######################################
57 # Search URL for the different modes #
58 ######################################
59 # Strings with the URL for each and every mode
60 self.url = {}
61 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
62 self.url["usufy"] = "http://rapid-i.com/rapidforum/index.php?action=profile;user=" + "<usufy>"
63 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
64
65 ######################################
66 # Whether the user needs credentials #
67 ######################################
68 self.needsCredentials = {}
69 #self.needsCredentials["phonefy"] = False
70 self.needsCredentials["usufy"] = True
71 #self.needsCredentials["searchfy"] = False
72
73 # Array of credentials to be used
74 self.creds = []
75
76 #################
77 # Valid queries #
78 #################
79 # Strings that will imply that the query number is not appearing
80 self.validQuery = {}
81 # The regular expression '.+' will match any query.
82 #self.validQuery["phonefy"] = ".*"
83 self.validQuery["usufy"] = ".+"
84 #self.validQuery["searchfy"] = ".*"
85
86 ###################
87 # Not_found clues #
88 ###################
89 # Strings that will imply that the query number is not appearing
90 self.notFoundText = {}
91 #self.notFoundText["phonefy"] = []
92 self.notFoundText["usufy"] = ["The user whose profile you are trying to view does not exist."]
93 #self.notFoundText["searchfy"] = []
94
95 #########################
96 # Fields to be searched #
97 #########################
98 self.fieldsRegExp = {}
99
100 # Definition of regular expressions to be searched in phonefy mode
101 #self.fieldsRegExp["phonefy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
104
105 # Definition of regular expressions to be searched in usufy mode
106 self.fieldsRegExp["usufy"] = {}
107 # Example of fields:
108 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
109 # Definition of regular expressions to be searched in searchfy mode
110 #self.fieldsRegExp["searchfy"] = {}
111 # Example of fields:
112 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
113
114 ################
115 # Fields found #
116 ################
117 # This attribute will be feeded when running the program.
118 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ratemypoo(Platform):
32 """
33 A <Platform> object for Ratemypoo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ratemypoo"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.ratemypoo.com/pictures/" + "<usufy>" + "/"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>FILE NOT FOUND</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Realcarders(Platform):
35 """
36 A <Platform> object for Realcarders.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Realcarders"
43 self.tags = ["carding"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://realcarders.us/member.php?username=" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Rebelmouse(Platform):
32 """
33 A <Platform> object for Rebelmouse.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Rebelmouse"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.rebelmouse.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<strong>404 Error</strong>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Reddit(Platform):
35 """
36 A <Platform> object for Reddit.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Reddit"
43 self.tags = ["forum"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://en.reddit.com/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>reddit.com: page not found</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Redtube(Platform):
32 """
33 A <Platform> object for Redtube.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Redtube"
40 self.tags = ["video", "adult"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.redtube.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = [">Error Page Not Found</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Researchgate(Platform):
32 """
33 A <Platform> object for Researchgate.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Researchgate"
40 self.tags = ["science"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.researchgate.net/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = True
65 #self.needsCredentials["searchfy"] = False
66
67 # Array of credentials to be used
68 self.creds = []
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h4> Browse researchers alphabetically by name </h4>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
114
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Reverbnation(Platform):
35 """
36 A <Platform> object for Reverbnation.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Reverbnation"
43 self.tags = ["music"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.reverbnation.com/" + "<usufy>" + "/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2>Sorry, we couldn't find that page</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Ripenear(Platform):
35 """
36 A <Platform> object for Ripenear.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Ripenear"
43 self.tags = ["nature"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.ripenear.me/users/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Page not found | RipeNear.Me</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = "<h1>([^<]+)</h1>"
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Rojadirecta(Platform):
32 """
33 A <Platform> object for Rojadirecta.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Rojadirecta"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.rojadirecta.es/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ruby(Platform):
32 """
33 A <Platform> object for Ruby.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ruby"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.ruby-forum.com/user/show/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["User not found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Yaiza Rubio and Félix Brezo <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Sarahah(Platform):
35 """
36 A <Platform> object for Sarahah.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "sarahah"
43 self.tags = ["social", "teenagers"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://<usufy>.sarahah.com"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['<h2>User Not Found</h2>']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": 'Location: "', "end": '"'}
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Scribd(Platform):
32 """
33 A <Platform> object for Scribd.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Scribd"
40 self.tags = ["file-sharing"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://es.scribd.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Oops, page not found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class SeatWish(Platform):
35 """
36 A <Platform> object for SeatWish.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "SeatWish"
43 self.tags = ["e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://seatwish.com/us/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Not Found (#404)</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Sencha(Platform):
32 """
33 A <Platform> object for Sencha.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Sencha"
40 self.tags = ["forum", "development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.sencha.com/forum/member.php?username="+ "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Sencha Forum</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Sidereel(Platform):
32 """
33 A <Platform> object for Sidereel.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Sidereel"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.sidereel.com/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Page Not Found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Singletrackworld(Platform):
35 """
36 A <Platform> object for Singletrackworld.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Singletrackworld"
43 self.tags = ["sports"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://singletrackworld.com/members/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["The page you were looking for was not found."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import logging
25 import re
26 import sys
27 import urllib2
28
29 import osrframework.utils.browser as browser
30 import osrframework.utils.general as general
31 import osrframework.thirdparties.skype.checkInSkype as skype
32 from osrframework.utils.platforms import Platform
33
34 import Skype4Py
35
36 class Skype(Platform):
37 """
38 A <Platform> object for Skype.
39 """
40 def __init__(self):
41 """
42 Constructor...
43 """
44 self.platformName = "Skype"
45 self.tags = ["conversation"]
46
47 ########################
48 # Defining valid modes #
49 ########################
50 self.isValidMode = {}
51 self.isValidMode["phonefy"] = False
52 self.isValidMode["usufy"] = True
53 self.isValidMode["searchfy"] = True
54
55 ######################################
56 # Search URL for the different modes #
57 ######################################
58 # Strings with the URL for each and every mode
59 self.url = {}
60 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
61 self.url["usufy"] = ""
62 self.url["searchfy"] = ""
63
64 ######################################
65 # Whether the user needs credentials #
66 ######################################
67 self.needsCredentials = {}
68 #self.needsCredentials["phonefy"] = False
69 self.needsCredentials["usufy"] = False
70 self.needsCredentials["searchfy"] = False
71
72 #################
73 # Valid queries #
74 #################
75 # Strings that will imply that the query number is not appearing
76 self.validQuery = {}
77 # The regular expression '.+' will match any query.
78 #self.validQuery["phonefy"] = ".*"
79 self.validQuery["usufy"] = ".+"
80 self.validQuery["searchfy"] = ".+"
81
82 ###################
83 # Not_found clues #
84 ###################
85 # Strings that will imply that the query number is not appearing
86 self.notFoundText = {}
87 #self.notFoundText["phonefy"] = []
88 self.notFoundText["usufy"] = [] # N/A in Skype
89 self.notFoundText["searchfy"] = [] # N/A in Skype
90
91 #########################
92 # Fields to be searched #
93 #########################
94 self.fieldsRegExp = {}
95
96 # Definition of regular expressions to be searched in phonefy mode
97 #self.fieldsRegExp["phonefy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
100
101 # Definition of regular expressions to be searched in usufy mode
102 self.fieldsRegExp["usufy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
105 # Definition of regular expressions to be searched in searchfy mode
106 self.fieldsRegExp["searchfy"] = {}
107 # Example of fields:
108 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
109
110 ################
111 # Fields found #
112 ################
113 # This attribute will be feeded when running the program.
114 self.foundFields = {}
115
116
117 def processData(self, uri=None, data=None, mode=None):
118 '''
119 Method that process the data in a Skype User.
120
121 :return: A i3visio-like object.
122 '''
123 info = []
124
125 # splitting info
126 pairs = data.split('; ')
127
128 for p in pairs:
129 parts = p.split(':')
130
131 aux = {}
132 aux["type"] = parts[0]
133 aux["value"] = parts[1]
134 aux["attributes"] = {}
135
136 info.append(aux)
137 return json.dumps(info)
138
139 def getInfo(self, query=None, process = False, mode="usufy"):
140 '''
141 Method that checks the presence of a given query and recovers the first list of complains.
142
143 :param query: Phone number to verify.
144 :param proces: Calling the processing function.
145 :param mode: Mode to be executed.
146
147 :return: Python structure for the html processed.
148 '''
149 # Defining variables for this process
150 results = []
151 data = ""
152 if not self.modeIsValid(mode=mode):
153 # TO-DO: InvalidModeException
154 return json.dumps(results)
155
156 try:
157 logger = logging.getLogger("osrframework.wrappers")
158 # Verifying if the nick is a correct nick
159 if self._isValidQuery(query, mode):
160 logger.debug("Starting Skype client...")
161
162 logger.warning("A Skype client must be set up... Note that the program will need a valid session of Skype having been started. If you were performing too many searches, the server may block or ban your account depending on the ToS. Please run this program under your own responsibility.")
163 # Instantiate Skype object, all further actions are done
164 # using this object.
165
166 # Dealing with UTF8
167 import codecs
168 import sys
169
170 UTF8Writer = codecs.getwriter('utf8')
171 sys.stdout = UTF8Writer(sys.stdout)
172
173 # Search for users and display their Skype name, full name
174 # and country.
175 #print "In skype.py, before sending the query: '" + query + "'"
176 data = skype.checkInSkype(query)
177 #print "In skype.py, printing the 'data' variable:\n" + json.dumps(data, indent=2)
178 except Exception as e:
179 print(general.warning("[!] In skype.py, exception caught when checking information in Skype!\n"))
180 # No information was found, then we return a null entity
181 return json.dumps(results)
182
183 # Verifying if the platform exists
184 if mode == "usufy":
185 for user in data:
186 if user["value"] == "Skype - " + query.lower():
187 results.append(user)
188 elif mode == "searchfy":
189 results = data
190
191 #print "In skype.py, printing the 'results' variable:\n" + json.dumps(results, indent=2)
192 return json.dumps(results)
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Slashdot(Platform):
32 """
33 A <Platform> object for Slashdot.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Slashdot"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://slashdot.org/~" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["- Slashdot User\t\t", "The user you requested does not exist, no matter how much you wish this might be the case."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Slideshare(Platform):
32 """
33 A <Platform> object for Slideshare.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Slideshare"
40 self.tags = ["social", "microblogging"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.slideshare.net/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["is still available"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Smartcitizen(Platform):
32 """
33 A <Platform> object for Smartcitizen.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Smartcitizen"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.smartcitizen.me/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>Page Not Found</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.1"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Smugmug(Platform):
35 """
36 A <Platform> object for Smugmug.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Smugmug"
43 self.tags = ["photos"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://" + "<usufy>" + ".smugmug.com/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = "[^\.]+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Page Not Found</h1></a>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Soundcloud(Platform):
32 """
33 A <Platform> object for Soundcloud.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Soundcloud"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://soundcloud.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>SoundCloud - Hear the world’s sounds</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Soup(Platform):
35 """
36 A <Platform> object for Soup.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Soup"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://" + "<usufy>" + ".soup.io"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2>Happy happy joy joy! A new user!</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Sourceforge(Platform):
32 """
33 A <Platform> object for Sourceforge.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Sourceforge"
40 self.tags = ["development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://sourceforge.net/u/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["We're sorry but we weren't able to process this request."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Spaniards(Platform):
32 """
33 A <Platform> object for Spaniards.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Spaniards"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.spaniards.es/usuarios/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Page not found | Spaniards.es, la Comunidad de Españoles en el Mundo</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Spoj(Platform):
32 """
33 A <Platform> object for Spoj.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Spoj"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] ="http://www.spoj.com/users/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = [">History of submissions</a>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112 def somethingFound(self,data,mode="phonefy"):
113 '''
114 Verifying if something was found. Note that this method needed to be rewritten as in Spoj we need to look for a text which APPEARS instead of looking for a text that does NOT appear.
115
116 :param data: Data where the self.notFoundText will be searched.
117 :param mode: Mode to be executed.
118
119 :return: Returns True if exists.
120 '''
121 #try:
122 for text in self.notFoundText[mode]:
123 if text in data:
124 # This is the change with regards to the standard behaviour!
125 return True
126 return False
127 #except:
128 # pass
129 # # TO-DO: Throw notFoundText not found for this mode.
130
131
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Spotify(Platform):
32 """
33 A <Platform> object for Spotify.
34 """
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Spotify"
40 self.tags = ["social", "music"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://open.spotify.com/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = True
65 #self.needsCredentials["searchfy"] = False
66
67 # Array of credentials to be used
68 self.creds = []
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Página no encontrada"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
114
115 def _doesTheUserExist(self, html):
116 '''
117 Method that performs the verification of the existence or not of a given profile. This method has been rewritten as the standard notFoundText approach is not possible and we have to look for text that appears on VALID profiles.
118 '''
119 # this platform requires a special treatment, as we have been able to identify only characterized text that appears when a user exists
120 userExistsText = ["<h3>Top Tracks</h3>"]
121 # the traditional function is rewritten...
122 for t in userExistsText:
123 if t in html:
124 return html
125 return None
126
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Spreaker(Platform):
35 """
36 A <Platform> object for Spreaker.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Spreaker"
43 self.tags = ["podcast", "audio"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.spreaker.com/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Página no encontrada</title>", "<title>Page not found</title>", "<title>Pagina non trovata</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Squidoo(Platform):
32 """
33 A <Platform> object for Squidoo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Squidoo"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.squidoo.com/lensmasters/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = [">Squidoo : Burp!</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Steamcommunity(Platform):
32 """
33 A <Platform> object for Steamcommunity.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Steamcommunity"
40 self.tags = ["social", "news"]
41
42 # Base URL
43 self.baseURL = "https://steamcommunity.com"
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://steamcommunity.com/id/" + "<usufy>"
60 #self.url["searchfy"] = "http://steamcommunity.com/search/?text=" + "<searchfy>" + "&x=0&y=0#filter=users&text=" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = [":: Error</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": "<bci>", "end": "</bci>"}#\n\t\t\t\t\t\t\t\t\t\t\t"}#\t<span class=\"namehistory"}#{"start": "<span class=\"actual_persona_name\">", "end": "r</span>"}#\n\t\t\t\t\t\t\t\t\t\t\t"}#\t<span class=\"namehistory"}
103 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<img class=\"profile_flag\" src=\"http://steamcommunity-a.akamaihd.net/public/images/countryflags/be.gif\">\t\t\t\t\t\t\t\t\t\t\t\t\t", "end": "\t\t\t\t\t</div>\t\t\t\t\t\t\t\t\t\t</div>"}
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 #self.searchfyAliasRegexp = '<a class="searchPersonaName" href="([^\"]+)\"'
107 # Example of fields:
108 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
109
110 ################
111 # Fields found #
112 ################
113 # This attribute will be feeded when running the program.
114 self.foundFields = {}
115
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 __author__ = "i3visio <[email protected]>"
22 __version__ = "1.0"
23
24 import argparse
25 import json
26 import re
27 import sys
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.platforms import Platform
32
33 class Steemit(Platform):
34 """A <Platform> object for Steemit.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Steemit"
41 self.tags = ["cryptocurrencies", "blog"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "https://steemit.com/@" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ['User Not Found - Steemit</title>']
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Steinberg(Platform):
32 """
33 A <Platform> object for Steinberg.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Steinberg"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.steinberg.net/forums/memberlist.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No members found for this search criterion."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Streakgaming(Platform):
32 """
33 A <Platform> object for Streakgaming.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Streakgaming"
40 self.tags = ["social", "news", "gaming"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.streakgaming.com/forum/members/" + "<usufy>" + ".html"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Taringa(Platform):
33 """
34 A <Platform> object for Taringa.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Taringa"
41 self.tags = ["social"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "https://www.taringa.net/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = [ '<img src="https://o1.t26.net//img/404graph.png" />' ]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Teamtreehouse(Platform):
32 """
33 A <Platform> object for Teamtreehouse.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Teamtreehouse"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://teamtreehouse.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Sorry, we can&#39;t find the page you are looking for</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30 class Techcrunch(Platform):
31 """
32 A <Platform> object for Techcrunch.
33 """
34 def __init__(self):
35 """
36 Constructor...
37 """
38 self.platformName = "Techcrunch"
39 self.tags = ["professional", "development"]
40
41 ########################
42 # Defining valid modes #
43 ########################
44 self.isValidMode = {}
45 self.isValidMode["phonefy"] = False
46 self.isValidMode["usufy"] = True
47 self.isValidMode["searchfy"] = False
48
49 ######################################
50 # Search URL for the different modes #
51 ######################################
52 # Strings with the URL for each and every mode
53 self.url = {}
54 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
55 self.url["usufy"] = "http://techcrunch.com/author/" + "<usufy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 #self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 #self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 #self.validQuery["phonefy"] = ".*"
73 self.validQuery["usufy"] = ".+"
74 #self.validQuery["searchfy"] = ".*"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the query number is not appearing
80 self.notFoundText = {}
81 #self.notFoundText["phonefy"] = []
82 self.notFoundText["usufy"] = ["<title>TechCrunch - The latest technology news and information on startups</title>"]
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89
90 # Definition of regular expressions to be searched in phonefy mode
91 #self.fieldsRegExp["phonefy"] = {}
92 # Example of fields:
93 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
94
95 # Definition of regular expressions to be searched in usufy mode
96 self.fieldsRegExp["usufy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
99 # Definition of regular expressions to be searched in searchfy mode
100 #self.fieldsRegExp["searchfy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
103
104 ################
105 # Fields found #
106 ################
107 # This attribute will be feeded when running the program.
108 self.foundFields = {}
109
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Technorati(Platform):
35 """
36 A <Platform> object for Technorati.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Technorati"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://technorati.com/author/" + "<usufy>" + "/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>404 Not found</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Thehoodup(Platform):
32 '''
33 A <Platform> object for Thehoodup.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Thehoodup"
40 self.tags = ["forum", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://thehoodup.com/board/memberlist.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = True
65 #self.needsCredentials["searchfy"] = False
66
67 # Array of credentials to be used
68 self.creds = []
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["No members found for this search criterion."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30 class Thesims(Platform):
31 """
32 A <Platform> object for Thesims.
33 """
34 def __init__(self):
35 """
36 Constructor...
37 """
38 self.platformName = "Thesims"
39 self.tags = ["gaming"]
40
41 ########################
42 # Defining valid modes #
43 ########################
44 self.isValidMode = {}
45 self.isValidMode["phonefy"] = False
46 self.isValidMode["usufy"] = True
47 self.isValidMode["searchfy"] = False
48
49 ######################################
50 # Search URL for the different modes #
51 ######################################
52 # Strings with the URL for each and every mode
53 self.url = {}
54 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
55 self.url["usufy"] = "http://mypage.thesims3.com/mypage/" + "<usufy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 #self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 #self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 #self.validQuery["phonefy"] = ".*"
73 self.validQuery["usufy"] = ".+"
74 #self.validQuery["searchfy"] = ".*"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the query number is not appearing
80 self.notFoundText = {}
81 #self.notFoundText["phonefy"] = []
82 self.notFoundText["usufy"] = ["<title>&nbsp;-&nbsp;Community&nbsp;-&nbsp;The Sims 3</title>"]
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89
90 # Definition of regular expressions to be searched in phonefy mode
91 #self.fieldsRegExp["phonefy"] = {}
92 # Example of fields:
93 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
94
95 # Definition of regular expressions to be searched in usufy mode
96 self.fieldsRegExp["usufy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
99 # Definition of regular expressions to be searched in searchfy mode
100 #self.fieldsRegExp["searchfy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
103
104 ################
105 # Fields found #
106 ################
107 # This attribute will be feeded when running the program.
108 self.foundFields = {}
109
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30 class Thestudentroom(Platform):
31 """
32 A <Platform> object for Thestudentroom.
33 """
34 def __init__(self):
35 """
36 Constructor...
37 """
38 self.platformName = "Thestudentroom"
39 self.tags = ["social", "news"]
40
41 ########################
42 # Defining valid modes #
43 ########################
44 self.isValidMode = {}
45 self.isValidMode["phonefy"] = False
46 self.isValidMode["usufy"] = True
47 self.isValidMode["searchfy"] = False
48
49 ######################################
50 # Search URL for the different modes #
51 ######################################
52 # Strings with the URL for each and every mode
53 self.url = {}
54 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
55 self.url["usufy"] = "http://www.thestudentroom.co.uk/member.php?username=" + "<usufy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 #self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 #self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 #self.validQuery["phonefy"] = ".*"
73 self.validQuery["usufy"] = ".+"
74 #self.validQuery["searchfy"] = ".*"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the query number is not appearing
80 self.notFoundText = {}
81 #self.notFoundText["phonefy"] = []
82 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89
90 # Definition of regular expressions to be searched in phonefy mode
91 #self.fieldsRegExp["phonefy"] = {}
92 # Example of fields:
93 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
94
95 # Definition of regular expressions to be searched in usufy mode
96 self.fieldsRegExp["usufy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
99 # Definition of regular expressions to be searched in searchfy mode
100 #self.fieldsRegExp["searchfy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
103
104 ################
105 # Fields found #
106 ################
107 # This attribute will be feeded when running the program.
108 self.foundFields = {}
109
110
0 # !/usr/bin/python
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU Affero General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU Affero General Public License for more details.
16 #
17 # You should have received a copy of the GNU Affero General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31
32 class Theverge(Platform):
33 """
34 A <Platform> object for Theverge.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Theverge"
41 self.tags = ["news", "tech"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.theverge.com/users/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = [ '<title>404 Not found</title>' ]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Tipme(Platform):
32 """
33 A <Platform> object for Tipme.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Tipme"
40 self.tags = ["cryptocurrencies", "payments"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.changetip.com/tipme/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Uh oh / ChangeTip</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30 class Tradimo(Platform):
31 """
32 A <Platform> object for Tradimo.
33 """
34 def __init__(self):
35 """
36 Constructor...
37 """
38 self.platformName = "Tradimo"
39 self.tags = ["e-commerce", "adult"]
40
41 ########################
42 # Defining valid modes #
43 ########################
44 self.isValidMode = {}
45 self.isValidMode["phonefy"] = False
46 self.isValidMode["usufy"] = True
47 self.isValidMode["searchfy"] = False
48
49 ######################################
50 # Search URL for the different modes #
51 ######################################
52 # Strings with the URL for each and every mode
53 self.url = {}
54 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
55 self.url["usufy"] = "http://en.tradimo.com/profile/" + "<usufy>"
56 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
57
58 ######################################
59 # Whether the user needs credentials #
60 ######################################
61 self.needsCredentials = {}
62 #self.needsCredentials["phonefy"] = False
63 self.needsCredentials["usufy"] = False
64 #self.needsCredentials["searchfy"] = False
65
66 #################
67 # Valid queries #
68 #################
69 # Strings that will imply that the query number is not appearing
70 self.validQuery = {}
71 # The regular expression '.+' will match any query.
72 #self.validQuery["phonefy"] = ".*"
73 self.validQuery["usufy"] = ".+"
74 #self.validQuery["searchfy"] = ".*"
75
76 ###################
77 # Not_found clues #
78 ###################
79 # Strings that will imply that the query number is not appearing
80 self.notFoundText = {}
81 #self.notFoundText["phonefy"] = []
82 self.notFoundText["usufy"] = ["<h1>We are sorry, the page you requested cannot be found</h1>"]
83 #self.notFoundText["searchfy"] = []
84
85 #########################
86 # Fields to be searched #
87 #########################
88 self.fieldsRegExp = {}
89
90 # Definition of regular expressions to be searched in phonefy mode
91 #self.fieldsRegExp["phonefy"] = {}
92 # Example of fields:
93 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
94
95 # Definition of regular expressions to be searched in usufy mode
96 self.fieldsRegExp["usufy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
99 # Definition of regular expressions to be searched in searchfy mode
100 #self.fieldsRegExp["searchfy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
103
104 ################
105 # Fields found #
106 ################
107 # This attribute will be feeded when running the program.
108 self.foundFields = {}
109
110
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Trakt(Platform):
35 """
36 A <Platform> object for Trakt.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Trakt"
43 self.tags = ["video"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://trakt.tv/people/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>The page you were looking for doesn't exist (404) - Trakt.tv</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class TranslateHola(Platform):
35 """
36 A <Platform> object for Typepad.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Translate_Hola"
43 self.tags = ["translation"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://translate.hola.org/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["The page you are looking for was not found"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # -*- coding: utf-8 -*-
1 #
2 ##################################################################################
3 #
4 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
5 #
6 # This program is part of OSRFramework. You can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program. If not, see <http://www.gnu.org/licenses/>.
18 #
19 ##################################################################################
20
21 __author__ = "i3visio <[email protected]>"
22 __version__ = "1.0"
23
24 import argparse
25 import json
26 import re
27 import sys
28 import urllib2
29
30 import osrframework.utils.browser as browser
31 from osrframework.utils.platforms import Platform
32
33
34 class Trip(Platform):
35 """
36 A <Platform> object for Trip.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Trip"
43 self.tags = ["trips"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.trip.com/user/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = "[^\.]+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title>Brittney Mauck Travel Tips &amp; Activities - Trip.com</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Tripadvisor(Platform):
32 """
33 A <Platform> object for Tripadvisor.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Tripadvisor"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.tripadvisor.es/members/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No se ha encontrado la página."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 # CHANGE: the name of the object
32 class Tripit(Platform):
33 """
34 A <Platform> object for Demo using Tripit.
35 """
36 def __init__(self):
37 """
38 Constructor...
39 """
40 self.platformName = "Tripit"
41 self.tags = ["social", "trips"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "https://www.tripit.com/people/" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = True
66 #self.needsCredentials["searchfy"] = False
67
68 # Array of credentials to be used
69 self.creds = []
70
71 #################
72 # Valid queries #
73 #################
74 # Strings that will imply that the query number is not appearing
75 self.validQuery = {}
76 # The regular expression '.+' will match any query.
77 #self.validQuery["phonefy"] = ".*"
78 self.validQuery["usufy"] = "[^ ]+"
79 #self.validQuery["searchfy"] = ".*"
80
81 ###################
82 # Not_found clues #
83 ###################
84 # Strings that will imply that the query number is not appearing
85 self.notFoundText = {}
86 #self.notFoundText["phonefy"] = []
87 self.notFoundText["usufy"] = ["Page Not Found"]
88 #self.notFoundText["searchfy"] = []
89
90 #########################
91 # Fields to be searched #
92 #########################
93 self.fieldsRegExp = {}
94
95 # Definition of regular expressions to be searched in phonefy mode
96 #self.fieldsRegExp["phonefy"] = {}
97 # Example of fields:
98 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
99
100 # Definition of regular expressions to be searched in usufy mode
101 self.fieldsRegExp["usufy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
116
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Trulia(Platform):
32 """
33 A <Platform> object for Trulia.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Trulia"
40 self.tags = ["contact", "professional", "social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://activerain.trulia.com/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Welcome to the ActiveRain Real Estate Community!"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Tumblr(Platform):
32 """
33 A <Platform> object for Tumblr.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Tumblr"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy>" + ".tumblr.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^\.]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Untitled</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Tune(Platform):
32 """
33 A <Platform> object for Tune.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Tune"
40 self.tags = ["social", "video"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://tune.pk/user/" + "<usufy>" + "/about/"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h1>User does not exist!</h1>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 self.fieldsRegExp["usufy"]["i3visio.location.country"] = {"start": "<img src='https://tune.pk/images/icons/country/..\.png' title=\"", "end": "\" /> <span>"}
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Tuporno(Platform):
32 """
33 A <Platform> object for Tuporno.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Tuporno"
40 self.tags = ["adult"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://tuporno.tv/usuario/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Tuporno.tv - Videos Porno"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Twicsy(Platform):
32 """
33 A <Platform> object for Twicsy.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Twicsy"
40 self.tags = ["social", "photos"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://twicsy.com/u/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["No pics found!"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Twitch(Platform):
32 '''
33 A <Platform> object for Twitch.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Twitch"
40 self.tags = ["social", "video"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.twitch.tv/" + "<usufy>" + "/profile"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Twitch</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30 # Importing the API Wrapper
31 from osrframework.api.twitter_api import TwitterAPIWrapper as TwitterAPIWrapper
32
33 class Twitter(Platform):
34 """
35 A <Platform> object for Twitter.
36 """
37 def __init__(self):
38 '''
39 Constructor...
40 '''
41 self.platformName = "Twitter"
42 self.tags = ["contact", "microblogging", "social"]
43
44 # Base URL
45 self.baseURL = "http://twitter.com/"
46
47 # Trying to find an API... This line should be added in every platform for which we have defined an API.
48 # DO NOT FORGET TO IMPORT THE APIWRAPPER, i. e.:
49 # from osrframework.api import TwitterAPIWrapper as TwitterAPIWrapper
50 try:
51 self.wrapperAPI = TwitterAPIWrapper()
52 except Exception, e:
53 self.wrapperAPI = None
54
55
56 ########################
57 # Defining valid modes #
58 ########################
59 self.isValidMode = {}
60 self.isValidMode["phonefy"] = False
61 self.isValidMode["usufy"] = True
62 self.isValidMode["searchfy"] = True
63
64 ######################################
65 # Search URL for the different modes #
66 ######################################
67 # Strings with the URL for each and every mode
68 self.url = {}
69 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
70 self.url["usufy"] = "http://twitter.com/" + "<usufy>"
71 self.url["searchfy"] = "https://twitter.com/search?f=users&vertical=default&q=\"" + "<searchfy>" + "\""
72
73 ######################################
74 # Whether the user needs credentials #
75 ######################################
76 self.needsCredentials = {}
77 #self.needsCredentials["phonefy"] = False
78 self.needsCredentials["usufy"] = False
79 self.needsCredentials["searchfy"] = False
80
81 #################
82 # Valid queries #
83 #################
84 # Strings that will imply that the query number is not appearing
85 self.validQuery = {}
86 # The regular expression '.+' will match any query.
87 #self.validQuery["phonefy"] = ".*"
88 self.validQuery["usufy"] = "[a-zA-Z0-9_]+"
89 self.validQuery["searchfy"] = ".+"
90
91 ###################
92 # Not_found clues #
93 ###################
94 # Strings that will imply that the query number is not appearing
95 self.notFoundText = {}
96 #self.notFoundText["phonefy"] = []
97 self.notFoundText["usufy"] = ["<form class=\"search-404\""]
98 self.notFoundText["searchfy"] = []
99
100 #########################
101 # Fields to be searched #
102 #########################
103 self.fieldsRegExp = {}
104
105 # Definition of regular expressions to be searched in phonefy mode
106 #self.fieldsRegExp["phonefy"] = {}
107 # Example of fields:
108 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
109
110 # Definition of regular expressions to be searched in usufy mode
111 self.fieldsRegExp["usufy"] = {}
112 # Examples (do NOT forget to escape the quoting marks inside any string: \"):
113 self.fieldsRegExp["usufy"]["@protected"] = {"start": "data-protected=\"", "end": "\">\n <span class=\"UserActions"}
114 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": "class=\"ProfileHeaderCard-nameLink u-textInheritColor js-nav\n\">", "end": "</a>\n </h1>"}
115 #self.fieldsRegExp["usufy"]["ProfileHeaderCard-bio"] = {"start": "<p class=\"ProfileHeaderCard-bio u-dir\"\n \n dir=\"ltr\">", "end": "</p>"}
116 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<span class=\"ProfileHeaderCard-locationText u-dir\" dir=\"ltr\">\n ", "end": "\n </span>\n </div>\n\n <div class=\"ProfileHeaderCard-url"}
117 self.fieldsRegExp["usufy"]["@created_at"] = {"start": "<span class=\"ProfileHeaderCard-joinDateText js-tooltip u-dir\" dir=\"ltr\" title=\"", "end": "\">Se uni"}
118 self.fieldsRegExp["usufy"]["i3visio.uri.homepage"] = {"start": "<span class=\"ProfileHeaderCard-urlText u-dir\" dir=\"ltr\"><a class=\"u-textUserColor\" target=\"_blank\" rel=\"me nofollow\" href=\"[^\"]*\" title=\"", "end": "\">"}
119 #self.fieldsRegExp["usufy"]["PhotoRail-headingText"] = {"start": "class=\"js-nav\">\n \n ", "end": " </a>"}
120
121 # Definition of regular expressions to be searched in searchfy mode
122 self.fieldsRegExp["searchfy"] = {}
123 self.searchfyAliasRegexp = "data-screen-name=\"([^\"]+)\""
124 # Example of fields:
125 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
126
127 ################
128 # Fields found #
129 ################
130 # This attribute will be feeded when running the program.
131 self.foundFields = {}
132
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Twoplustwo(Platform):
32 """
33 A <Platform> object for Twoplustwo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Twoplustwo"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forumserver.twoplustwo.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Typepad(Platform):
35 """
36 A <Platform> object for Typepad.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Typepad"
43 self.tags = ["education"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://profile.typepad.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["doesn't exist or it could have been mistyped.</p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Fran Gomez @ffranz <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Unioncarder(Platform):
35 """
36 A <Platform> object for Unioncarder.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Unioncarder"
43 self.tags = ["carding"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://unioncarder.com/members/?username=" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["El miembro específicado no pudo ser encontrado. Por favor ingrese el nombre completo del miembro."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Ustream(Platform):
32 """
33 A <Platform> object for Ustream.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Ustream"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.ustream.tv/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Ustream</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class V7n(Platform):
35 """
36 A <Platform> object for V7n.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "V7n"
43 self.tags = ["development"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.v7n.com/forums/members/" + "<usufy>" + ".html"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Venmo(Platform):
35 """
36 A <Platform> object for Venmo.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Venmo"
43 self.tags = ["payments", "e-commerce"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://venmo.com/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = [ "<title>Venmo | Page Not Found</title>" ]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Vexforum(Platform):
32 """
33 A <Platform> object for Vexforum.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Vexforum"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.vexforum.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Viddler(Platform):
35 """
36 A <Platform> object for Viddler.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Viddler"
43 self.tags = ["video"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.viddler.com/channel/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<h2>Nothing to see here</h2>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Videohelp(Platform):
32 """
33 A <Platform> object for Videohelp.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Videohelp"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forum.videohelp.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["This user has not registered and therefore does not have a profile to view."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Vimeo(Platform):
32 """
33 A <Platform> object for Vimeo.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Vimeo"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://vimeo.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>VimeUhOh</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Virustotal(Platform):
32 """
33 A <Platform> object for Virustotal.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Virustotal"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.virustotal.com/en/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Page not found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Vk(Platform):
32 """
33 A <Platform> object for Vk.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Vk"
40 self.tags = ["social"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://vk.com/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["404 Not Found"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "i3visio"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Warriorforum(Platform):
35 """
36 A <Platform> object for Warriorforum.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Warriorforum"
43 self.tags = ["gaming"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.warriorforum.com/members/" + "<usufy>" + ".html"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = "[^\.\-]+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ['<title>Oops | Warrior']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 self.fieldsRegExp["usufy"]["i3visio.fullname"] = "<h2>([^<]+)</h2>"
103 self.fieldsRegExp["usufy"]["i3visio.location"] = '<dt class="shade">Location</dt> <dd>([^<]+)</dd>'
104 self.fieldsRegExp["usufy"]["i3visio.alias_twitter"] = '<dt class="shade">Twitter</dt> <dd>([^<]+)</dd>'
105 self.fieldsRegExp["usufy"]["i3visio.alias_facebook"] = '<dt class="shade">FaceBook</dt> <dd>([^<]+)</dd>'
106 self.fieldsRegExp["usufy"]["i3visio.alias_myspace"] = '<dt class="shade">MySpace</dt> <dd>([^<]+)</dd>'
107 self.fieldsRegExp["usufy"]["i3visio.alias_youtube"] = '<dt class="shade">Youtube\.com</dt> <dd>([^<]+)</dd>'
108 # Definition of regular expressions to be searched in searchfy mode
109 #self.fieldsRegExp["searchfy"] = {}
110 # Example of fields:
111 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
112
113 ################
114 # Fields found #
115 ################
116 # This attribute will be feeded when running the program.
117 self.foundFields = {}
118
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Webtv(Platform):
32 """
33 A <Platform> object for Webtv.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Webtv"
40 self.tags = ["video"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://web.tv/user/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ['- web.tv</title>']
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "Felix Brezo, Yaiza Rubio <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Wikia(Platform):
35 """
36 A <Platform> object for Wikia.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Wikia"
43 self.tags = ["gaming"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://community.wikia.com/wiki/User:" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = [' (page does not exist)">']
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
113
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaAr(Platform):
32 """
33 A <Platform> object for WikipediaAr.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (ar)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://ar.wikipedia.org/wiki/user:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ['mw-userpage-userdoesnotexist error']
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaCa(Platform):
32 """
33 A <Platform> object for WikipediaCa.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (ca)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://ca.wikipedia.org/wiki/Usuari:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["no està registrat."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaDe(Platform):
32 """
33 A <Platform> object for WikipediaDe.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (de)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://de.wikipedia.org/wiki/Benutzer:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["ist nicht vorhanden."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaEn(Platform):
32 """
33 A <Platform> object for WikipediaEn.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (en)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://en.wikipedia.org/wiki/user:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["is not registered.", "user page</a> with this exact name.</b> In general, this page should be created and edited by"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaEs(Platform):
32 """
33 A <Platform> object for WikipediaEs.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (es)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://es.wikipedia.org/wiki/Usuario:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["Wikipedia aún no tiene una página"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaEu(Platform):
32 """
33 A <Platform> object for WikipediaEu.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (eu)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://eu.wikipedia.org/wiki/Lankide:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["Lankidea orrialdea Wikipedia honetan ez badago oraindik:"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
111
112
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaFr(Platform):
32 """
33 A <Platform> object for WikipediaFr.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (fr)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://fr.wikipedia.org/wiki/Utilisateur:" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["dans les autres pages de l'espace Utilisateur."]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class WikipediaPt(Platform):
32 """
33 A <Platform> object for WikipediaPt.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wikipedia (pt)"
40 self.parameterName = "wikipedia"
41 self.tags = ["education", "wiki"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://pt.wikipedia.org/wiki/Usuário(a):" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["com este nome exato.</b> Em geral, esta página deveria ser criada e editada por"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 # Definition of regular expressions to be searched in searchfy mode
102 #self.fieldsRegExp["searchfy"] = {}
103 # Example of fields:
104 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
105
106 ################
107 # Fields found #
108 ################
109 # This attribute will be feeded when running the program.
110 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Winamp(Platform):
32 """
33 A <Platform> object for Winamp.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Winamp"
40 self.tags = ["audio", "music"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://forums.winamp.com/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<!-- main error message -->"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Wishlistr(Platform):
32 """
33 A <Platform> object for Wishlistr.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wishlistr"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.wishlistr.com/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Wishlistr - The Page Could Not Be Found</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Witty(Platform):
35 """
36 A <Platform> object for Witty.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Witty"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "http://www.wittyprofiles.com/author/" + "<usufy>"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<p><strong>It looks like you are looking for something that isn't here.</strong></p>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Wykop(Platform):
32 """
33 A <Platform> object for Wykop.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Wykop"
40 self.tags = ["social", "opinions"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://www.wykop.pl/ludzie/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Wykop.pl - newsy, aktualności, gry, wiadomości, muzyka, ciekawostki, filmiki</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
111
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Xanga(Platform):
32 '''
33 A <Platform> object for Xanga.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Xanga"
40 self.tags = ["social", "news"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "http://" + "<usufy" + ".xanga.com"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<title>Xanga 2.0 is Here!</title>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 self.fieldsRegExp["usufy"]["@last_activity"] = {"start": "<div class=\"group\"><h3 class=\"groupname\"><span>", "end": "</span>"}
101 self.fieldsRegExp["usufy"]["@last_post_title"] = {"start": "Recent Posts</h2><div class=\"modulecontent\">", "end": "</a>"}
102 self.fieldsRegExp["usufy"]["@last_comment_title"] = {"start": "Recent Posts</h2><div class=\"modulecontent\">", "end": "</a>"}
103
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Xing(Platform):
32 '''
33 A <Platform> object for Xing.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Xing"
40 self.tags = ["contact", "professional"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.xing.com/profile/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["Oh nein ... diese Seite haben wir leider nicht gefunden."]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 self.fieldsRegExp["usufy"]["i3visio.fullname"] = {"start": "<h2>Contactos de ", "end": "</h2>"}
101 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "workLocation\">", "end": "</span>"}
102 self.fieldsRegExp["usufy"]["@makes_offer"] = {"start": "\"makesOffer\" itemscope itemtype=\"http://schema.org/Offer\">", "end": "</div>"}
103 self.fieldsRegExp["usufy"]["@seeks"] = {"start": "\"seeks\" itemscope itemtype=\"http://schema.org/Demands\">", "end": "</div>"}
104 self.fieldsRegExp["usufy"]["@job_title"] = {"start": "<h3 itemprop=\"jobTitle\">", "end": "</h3>"}
105 self.fieldsRegExp["usufy"]["@language"] = {"start": "<ul id=\"language-skills\" itemscope itemtype=\"http://schema.org/Language\">", "end": "</ul>"}
106 self.fieldsRegExp["usufy"]["@interests"] = {"start": "<div id=\"interests\".*>", "end": "</div>"}
107 self.fieldsRegExp["usufy"]["@education"] = {"start": "<li itemscope itemtype=\"http://schema.org/EducationalOrganization\">", "end": "</li>"}
108
109 # Definition of regular expressions to be searched in searchfy mode
110 #self.fieldsRegExp["searchfy"] = {}
111 # Example of fields:
112 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
113
114 ################
115 # Fields found #
116 ################
117 # This attribute will be feeded when running the program.
118 self.foundFields = {}
119
120
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Xtube(Platform):
32 '''
33 A <Platform> object for Xtube.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Xtube"
40 # Add the tags for the platform
41 self.tags = ["video", "adult", "contact"]
42
43 ########################
44 # Defining valid modes #
45 ########################
46 self.isValidMode = {}
47 self.isValidMode["phonefy"] = False
48 self.isValidMode["usufy"] = True
49 self.isValidMode["searchfy"] = False
50
51 ######################################
52 # Search URL for the different modes #
53 ######################################
54 # Strings with the URL for each and every mode
55 self.url = {}
56 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
57 self.url["usufy"] = "http://www.xtube.com/community/profile.php?user=" + "<usufy>"
58 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
59
60 ######################################
61 # Whether the user needs credentials #
62 ######################################
63 self.needsCredentials = {}
64 #self.needsCredentials["phonefy"] = False
65 self.needsCredentials["usufy"] = False
66 #self.needsCredentials["searchfy"] = False
67
68 #################
69 # Valid queries #
70 #################
71 # Strings that will imply that the query number is not appearing
72 self.validQuery = {}
73 # The regular expression '.+' will match any query.
74 #self.validQuery["phonefy"] = ".*"
75 self.validQuery["usufy"] = ".+"
76 #self.validQuery["searchfy"] = ".*"
77
78 ###################
79 # Not_found clues #
80 ###################
81 # Strings that will imply that the query number is not appearing
82 self.notFoundText = {}
83 #self.notFoundText["phonefy"] = []
84 self.notFoundText["usufy"] = ["<strong>Error page not found</strong>"]
85 #self.notFoundText["searchfy"] = []
86
87 #########################
88 # Fields to be searched #
89 #########################
90 self.fieldsRegExp = {}
91
92 # Definition of regular expressions to be searched in phonefy mode
93 #self.fieldsRegExp["phonefy"] = {}
94 # Example of fields:
95 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
96
97 # Definition of regular expressions to be searched in usufy mode
98 self.fieldsRegExp["usufy"] = {}
99 # Example of fields:
100 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
101 gap = "\n <hr color=\"#cccccc\">\n "
102 self.fieldsRegExp["usufy"]["@horoscope"] = {"start": "<h3>Horoscope</h3>" + gap +"<p>", "end": "</p>"}
103 self.fieldsRegExp["usufy"]["@tobacco_consumption"] = {"start": "<h3>Tobacco Consumption</h3>" + gap +"<p>", "end": "</p>"}
104 self.fieldsRegExp["usufy"]["@alcohol_consumption"] = {"start": "<h3>Alcohol Consumption</h3>" + gap +"<p>", "end": "</p>"}
105 self.fieldsRegExp["usufy"]["@ideal_partner"] = {"start": "<h3>Ideal partner</h3>" + gap +"<p>", "end": "</p>\n <div"}
106 self.fieldsRegExp["usufy"]["@looking_for"] = {"start": "<h3>Looking for</h3>" + gap +"<p>", "end": "</p>"}
107 self.fieldsRegExp["usufy"]["@age of partner from"] = {"start": "<h3>Age of partner from</h3>" + gap +"<p>", "end": "</p>"}
108 self.fieldsRegExp["usufy"]["@age of partner to"] = {"start": "<h3>Age of partner to</h3>" + gap +"<p>", "end": "</p>"}
109 self.fieldsRegExp["usufy"]["@appearance"] = {"start": "<h3>Appearance</h3>" + gap +"<p>", "end": "</p>"}
110 self.fieldsRegExp["usufy"]["@body_type"] = {"start": "<h3>Body Type</h3>" + gap +"<p>", "end": "</p>"}
111 self.fieldsRegExp["usufy"]["@height"] = {"start": "<h3>Height</h3>" + gap +"<p>", "end": "</p>"}
112 self.fieldsRegExp["usufy"]["@eyecolor"] = {"start": "<h3>Eyecolor</h3>" + gap +"<p>", "end": "</p>"}
113 self.fieldsRegExp["usufy"]["@hair_color"] = {"start": "<h3>Hair Color</h3>" + gap +"<p>", "end": "</p>"}
114 self.fieldsRegExp["usufy"]["@hair_length"] = {"start": "<h3>Hair Length</h3>" + gap +"<p>", "end": "</p>"}
115 self.fieldsRegExp["usufy"]["@facial_hair"] = {"start": "<h3>Facial Hair</h3>" + gap +"<p>", "end": "</p>"}
116 self.fieldsRegExp["usufy"]["@body_hair"] = {"start": "<h3>Body Hair</h3>" + gap +"<p>", "end": "</p>"}
117 self.fieldsRegExp["usufy"]["@body_decorations"] = {"start": "<h3>Body Decorations</h3>" + gap +"<p>", "end": "</p>"}
118 self.fieldsRegExp["usufy"]["@glasses_or_Contacts"] = {"start": "<h3>Glasses or Contacts</h3>" + gap +"<p>", "end": "</p>"}
119 self.fieldsRegExp["usufy"]["@allergies"] = {"start": "<h3>Allergies</h3>" + gap +"<p>", "end": "</p>"}
120 self.fieldsRegExp["usufy"]["@career/Job"] = {"start": "<h3>Career/Job</h3>" + gap +"<p>", "end": "</p>"}
121 self.fieldsRegExp["usufy"]["@work"] = {"start": "<h3>Work</h3>" + gap +"<p>", "end": "</p>"}
122 self.fieldsRegExp["usufy"]["@living_arrangement"] = {"start": "<h3>Living Arrangement</h3>" + gap +"<p>", "end": "</p>"}
123 self.fieldsRegExp["usufy"]["@Sexual_orientation"] = {"start": "<h3>Sexual Orientation</h3>" + gap +"<p>", "end": "</p>"}
124 self.fieldsRegExp["usufy"]["@sex_how_often"] = {"start": "<h3>Sex, How often?</h3>" + gap +"<p>", "end": "</p>"}
125 self.fieldsRegExp["usufy"]["@practice_safe_sex"] = {"start": "<h3>Practice Safe Sex</h3>" + gap +"<p>", "end": "</p>"}
126 self.fieldsRegExp["usufy"]["@making_home_videos/pics"] = {"start": "<h3>Making home videos/pics</h3>" + gap +"<p>", "end": "</p>"}
127 self.fieldsRegExp["usufy"]["@porn_movies_how_often?"] = {"start": "<h3>Porn Movies, How often?</h3>" + gap +"<p>", "end": "</p>"}
128
129 self.fieldsRegExp["usufy"]["@sexual_orientation"] = {"start": "Sexual orientation:", "end": "</div>"}
130 self.fieldsRegExp["usufy"]["@member_for"] = {"start": "<div class=\"font11 first\">Member for ", "end": "</div>"}
131 self.fieldsRegExp["usufy"]["@comments"] = {"start": "<div id=\"commentBar\">", "end": "Comments</div>"}
132 self.fieldsRegExp["usufy"]["@number_of_friends"] = {"start": "<strong>john's Friends ", "end": "</strong>"}
133 self.fieldsRegExp["usufy"]["@subscribers"] = {"start": "Subscribers:</div><div class=\"color_blue\" style=\"float: left; width: 30px;\">", "end": "</div>"}
134 self.fieldsRegExp["usufy"]["@viewed_videos"] = {"start": "Viewed Videos:</div><div class=\"color_blue\" style=\"float: left; width: 45px;\">", "end": "</div>"}
135
136 self.fieldsRegExp["usufy"]["i3visio.location"] = {"start": "<div class=\"small_infos\">.*<div class=\"font11 first\">", "end": "</div>"}
137 self.fieldsRegExp["usufy"]["@ratings"] = {"start": "Ratings:</div><div class=\"color_blue\" style=\"float: left; width: 30px;\">", "end": "</div>"}
138
139 self.fieldsRegExp["usufy"]["@viewed_photos"] = {"start": "Viewed Photos:</div><div class=\"color_blue\" style=\"float: left; width: 50px;\">", "end": "</div>"}
140
141 # Definition of regular expressions to be searched in searchfy mode
142 #self.fieldsRegExp["searchfy"] = {}
143 # Example of fields:
144 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
145
146 ################
147 # Fields found #
148 ################
149 # This attribute will be feeded when running the program.
150 self.foundFields = {}
151
152
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016-2017 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 __author__ = "John Doe <[email protected]>"
23 __version__ = "1.0"
24
25 import argparse
26 import json
27 import re
28 import sys
29 import urllib2
30
31 import osrframework.utils.browser as browser
32 from osrframework.utils.platforms import Platform
33
34 class Younow(Platform):
35 """
36 A <Platform> object for Younow.
37 """
38 def __init__(self):
39 """
40 Constructor...
41 """
42 self.platformName = "Younow"
43 self.tags = ["social"]
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = False
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.younow.com/" + "<usufy>" + "/"
60 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 #self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = ".+"
78 #self.validQuery["searchfy"] = ".*"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["<title ng-bind=\"pageTitle || 'YouNow - Broadcast Live'\">YouNow - Broadcast Live</title>"]
87 #self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 # Definition of regular expressions to be searched in searchfy mode
104 #self.fieldsRegExp["searchfy"] = {}
105 # Example of fields:
106 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
107
108 ################
109 # Fields found #
110 ################
111 # This attribute will be feeded when running the program.
112 self.foundFields = {}
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Youtube(Platform):
32 '''
33 A <Platform> object for Youtube.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Youtube"
40 self.tags = ["social", "video"]
41
42 # Base URL
43 self.baseURL = "http://youtube.com/"
44
45 ########################
46 # Defining valid modes #
47 ########################
48 self.isValidMode = {}
49 self.isValidMode["phonefy"] = False
50 self.isValidMode["usufy"] = True
51 self.isValidMode["searchfy"] = True
52
53 ######################################
54 # Search URL for the different modes #
55 ######################################
56 # Strings with the URL for each and every mode
57 self.url = {}
58 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
59 self.url["usufy"] = "https://www.youtube.com/user/" + "<usufy>" + "/about"
60 self.url["searchfy"] = "https://www.youtube.com/results?filters=channel&lclk=channel&search_query=" + "<searchfy>"
61
62 ######################################
63 # Whether the user needs credentials #
64 ######################################
65 self.needsCredentials = {}
66 #self.needsCredentials["phonefy"] = False
67 self.needsCredentials["usufy"] = False
68 self.needsCredentials["searchfy"] = False
69
70 #################
71 # Valid queries #
72 #################
73 # Strings that will imply that the query number is not appearing
74 self.validQuery = {}
75 # The regular expression '.+' will match any query.
76 #self.validQuery["phonefy"] = ".*"
77 self.validQuery["usufy"] = "[^@, ]+"
78 self.validQuery["searchfy"] = ".+"
79
80 ###################
81 # Not_found clues #
82 ###################
83 # Strings that will imply that the query number is not appearing
84 self.notFoundText = {}
85 #self.notFoundText["phonefy"] = []
86 self.notFoundText["usufy"] = ["Este canal no existe.", "channel-empty-message banner-message"]
87 self.notFoundText["searchfy"] = []
88
89 #########################
90 # Fields to be searched #
91 #########################
92 self.fieldsRegExp = {}
93
94 # Definition of regular expressions to be searched in phonefy mode
95 #self.fieldsRegExp["phonefy"] = {}
96 # Example of fields:
97 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
98
99 # Definition of regular expressions to be searched in usufy mode
100 self.fieldsRegExp["usufy"] = {}
101 # Example of fields:
102 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
103 self.fieldsRegExp["usufy"]["subscribers"] = {"start": "<span class=\"yt-subscription-button-subscriber-count-branded-horizontal subscribed\" title=\"", "end": "\">"}
104 self.fieldsRegExp["usufy"]["@total_views"] = {"start": "</li>.*<li class=\"about-stat \">.*<b>", "end": "</b>"}
105 self.fieldsRegExp["usufy"]["i3visio.date"] = {"start": "<li class=\"about-stat joined-date\">", "end": "</li>"}
106 self.fieldsRegExp["usufy"]["i3visio.profile.facebook"] = {"start": "alt=\"https://www.facebook.com/", "end": "\""}
107 self.fieldsRegExp["usufy"]["i3visio.profile.twitter"] = {"start": "alt=\"http://www.twitter.com/#!/", "end": "\""}
108 self.fieldsRegExp["usufy"]["i3visio.profile.instagram"] = {"start": "alt=\"http://instagram.com/", "end": "\""}
109 self.fieldsRegExp["usufy"]["i3visio.alias"] = '<meta itemprop="name" content="([^\"]+)\"'
110
111 # Description
112 self.fieldsRegExp["usufy"]["i3visio.text"] = {"start": "<div class=\"about-description branded-page-box-padding\" >", "end": "</div>"}
113
114
115 # Definition of regular expressions to be searched in searchfy mode
116 self.fieldsRegExp["searchfy"] = {}
117 self.searchfyAliasRegexp = '<div class="yt-lockup-byline"><a href="([^\"]+)" class="yt-uix-sessionlink g-hovercard spf-link "'
118 # Example of fields:
119 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
120
121 ################
122 # Fields found #
123 ################
124 # This attribute will be feeded when running the program.
125 self.foundFields = {}
126
127 def createURL(self, word, mode="phonefy"):
128 '''
129 Method to create the URL replacing the word in the appropriate URL.
130
131 :param word: Word to be searched.
132 :param mode: Mode to be executed.
133
134 :return: The URL to be queried.
135 '''
136 # Youtube has two different types of profiles: channels and users
137 if "/user/" in word:
138 alias = word[6:]
139 else:
140 alias = word
141 try:
142 if mode == "base":
143 if word[0] == "/":
144 return self.baseURL+word[1:], alias
145 else:
146 return self.baseURL+word, alias
147 else:
148 try:
149 return self.url[mode].replace("<"+mode+">", word.replace(' ', '+')), alias
150 except:
151 pass
152 except:
153 pass
154 # TO-DO: BaseURLNotFoundExceptionThrow base URL not found for the mode.
155
156
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Zabbix(Platform):
32 """
33 A <Platform> object for Zabbix.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Zabbix"
40 self.tags = ["opinions", "development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.zabbix.com/forum/member.php?username=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@, ]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ['title>ZABBIX Forums</title']
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 self.fieldsRegExp["usufy"]["@total_posts"] = {"start": "<dt>Posts: </dt> ", "end": "</lid>"}
101 self.fieldsRegExp["usufy"]["i3visio.date"] = {"start": "Join Date:</span> ", "end": "</li>"}
102 self.fieldsRegExp["usufy"]["@last_active"] = {"start": "<li><span class=\"shade\">Last Activity:</span> ", "end": "</span"}
103
104 # Definition of regular expressions to be searched in searchfy mode
105 #self.fieldsRegExp["searchfy"] = {}
106 # Example of fields:
107 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
108
109 ################
110 # Fields found #
111 ################
112 # This attribute will be feeded when running the program.
113 self.foundFields = {}
114
115
116
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Zentyal(Platform):
32 '''
33 A <Platform> object for Zentyal.
34 '''
35 def __init__(self):
36 '''
37 Constructor...
38 '''
39 self.platformName = "Zentyal"
40 self.tags = ["opinions", "professional", "development"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://forum.zentyal.org/index.php?action=profile;user=" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query.
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = "[^@, ]+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ['The user whose profile you are trying to view does not exist.']
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 self.fieldsRegExp["usufy"]["@position"] = {"start": "<span class=\"position\">", "end": "</span></h4>"}
99 self.fieldsRegExp["usufy"]["@total_posts"] = {"start": "<dt>Posts: </dt>", "end": "</dd>"}
100 self.fieldsRegExp["usufy"]["@karma"] = {"start": "<dt>Karma: </dt>", "end": "</dd>"}
101 self.fieldsRegExp["usufy"]["@age"] = {"start": "<dt>Age:</dt>", "end": "</dd>"}
102 self.fieldsRegExp["usufy"]["i3visio.date"] = {"start": "<dt>Date Registered: </dt>", "end": "</dd>"}
103 self.fieldsRegExp["usufy"]["@local_time"] = {"start": "<dt>Local Time:</dt>", "end": "</dd>"}
104 self.fieldsRegExp["usufy"]["@last_active"] = {"start": "<dt>Last Active: </dt>", "end": "</dd>"}
105 # Example of fields:
106 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
107
108 # Definition of regular expressions to be searched in searchfy mode
109 #self.fieldsRegExp["searchfy"] = {}
110 # Example of fields:
111 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
112
113 ################
114 # Fields found #
115 ################
116 # This attribute will be feeded when running the program.
117 self.foundFields = {}
118
119
0 # !/usr/bin/python
1 # -*- coding: cp1252 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This program is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import argparse
23 import json
24 import re
25 import sys
26 import urllib2
27
28 import osrframework.utils.browser as browser
29 from osrframework.utils.platforms import Platform
30
31 class Zotero(Platform):
32 """
33 A <Platform> object for Zotero.
34 """
35 def __init__(self):
36 """
37 Constructor...
38 """
39 self.platformName = "Zotero"
40 self.tags = ["education"]
41
42 ########################
43 # Defining valid modes #
44 ########################
45 self.isValidMode = {}
46 self.isValidMode["phonefy"] = False
47 self.isValidMode["usufy"] = True
48 self.isValidMode["searchfy"] = False
49
50 ######################################
51 # Search URL for the different modes #
52 ######################################
53 # Strings with the URL for each and every mode
54 self.url = {}
55 #self.url["phonefy"] = "http://anyurl.com//phone/" + "<phonefy>"
56 self.url["usufy"] = "https://www.zotero.org/" + "<usufy>"
57 #self.url["searchfy"] = "http://anyurl.com/search/" + "<searchfy>"
58
59 ######################################
60 # Whether the user needs credentials #
61 ######################################
62 self.needsCredentials = {}
63 #self.needsCredentials["phonefy"] = False
64 self.needsCredentials["usufy"] = False
65 #self.needsCredentials["searchfy"] = False
66
67 #################
68 # Valid queries #
69 #################
70 # Strings that will imply that the query number is not appearing
71 self.validQuery = {}
72 # The regular expression '.+' will match any query
73 #self.validQuery["phonefy"] = ".*"
74 self.validQuery["usufy"] = ".+"
75 #self.validQuery["searchfy"] = ".*"
76
77 ###################
78 # Not_found clues #
79 ###################
80 # Strings that will imply that the query number is not appearing
81 self.notFoundText = {}
82 #self.notFoundText["phonefy"] = []
83 self.notFoundText["usufy"] = ["<h2>Page Not Found</h2>"]
84 #self.notFoundText["searchfy"] = []
85
86 #########################
87 # Fields to be searched #
88 #########################
89 self.fieldsRegExp = {}
90
91 # Definition of regular expressions to be searched in phonefy mode
92 #self.fieldsRegExp["phonefy"] = {}
93 # Example of fields:
94 #self.fieldsRegExp["phonefy"]["i3visio.location"] = ""
95
96 # Definition of regular expressions to be searched in usufy mode
97 self.fieldsRegExp["usufy"] = {}
98 # Example of fields:
99 #self.fieldsRegExp["usufy"]["i3visio.location"] = ""
100 # Definition of regular expressions to be searched in searchfy mode
101 #self.fieldsRegExp["searchfy"] = {}
102 # Example of fields:
103 #self.fieldsRegExp["searchfy"]["i3visio.location"] = ""
104
105 ################
106 # Fields found #
107 ################
108 # This attribute will be feeded when running the program.
109 self.foundFields = {}
110
0 Metadata-Version: 1.1
1 Name: osrframework
2 Version: 0.17.2
3 Summary: OSRFramework - A set of GPLv3+ OSINT tools developed by i3visio analysts for online research.
4 Home-page: http://github.com/i3visio/osrframework
5 Author: Felix Brezo and Yaiza Rubio
6 Author-email: [email protected]
7 License: COPYING
8 Description: OSRFramework
9 ============
10
11 OSRFramework: Open Sources Research Framework
12
13 Copyright (C) 2014-2017 F. Brezo and Y. Rubio, i3visio
14
15 [![Version in PyPI](https://img.shields.io/pypi/v/osrframework.svg)]()
16 [![License](https://img.shields.io/badge/license-GNU%20General%20Public%20License%20Version%203%20or%20Later-blue.svg)]()
17
18 1 - Description
19 ---------------
20
21 OSRFramework is a GNU AGPLv3+ set of libraries developed by i3visio to perform
22 Open Source Intelligence tasks. They include references to a bunch of different
23 applications related to username checking, DNS lookups, information leaks
24 research, deep web search, regular expressions extraction and many others.
25 At the same time, by means of ad-hoc Maltego transforms, OSRFramework provides
26 a way of making these queries graphically as well as several interfaces to
27 interact with like OSRFConsole or a Web interface.
28
29 2 - License: GNU AGPLv3+
30 ------------------------
31
32 This is free software, and you are welcome to redistribute it under certain
33 conditions.
34
35 This program is free software: you can redistribute it and/or modify
36 it under the terms of the GNU Affero General Public License as published by
37 the Free Software Foundation, either version 3 of the License, or
38 (at your option) any later version.
39
40 This program is distributed in the hope that it will be useful,
41 but WITHOUT ANY WARRANTY; without even the implied warranty of
42 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
43 GNU Affero General Public License for more details.
44
45 You should have received a copy of the GNU Affero General Public License
46 along with this program. If not, see <http://www.gnu.org/licenses/>.
47
48
49 For more details on this issue, check the [COPYING](COPYING) file.
50
51 3 - Installation
52 ----------------
53
54 Fast way to do it on any system for a user with administration privileges:
55 ```
56 pip install osrframework
57 ```
58 You can upgrade to the latest release of the framework with:
59 ```
60 pip install osrframework --upgrade
61 ```
62 This will manage all the dependencies for you and install the latest version of
63 the framework.
64
65 If you needed further information on how to install OSRFramework on certain
66 systems, note that you may need to add `export PATH=$PATH:$HOME/.local/bin` to
67 your `~/.bashrc_profile`). This has been confirmed in some distributions,
68 including MacOS. In any case, we recommend you yo have a look at the
69 [INSTALL.md](doc/INSTALL.md) file where we provide additional details for these
70 cases.
71
72 4 - Basic usage
73 ---------------
74
75 If everything went correctly (we hope so!), it's time for trying usufy.py,
76 mailfy.py and so on. But we are they? They are installed in your path meaning
77 that you can open a terminal anywhere and typing the name of the program (seems
78 to be an improvement from previous installations...). Examples:
79 ```
80 usufy.py -n i3visio febrezo yrubiosec -p twitter facebook
81 searchfy.py -q "i3visio"
82 mailfy.py -n i3visio
83 osrfconsole.py
84 ```
85
86 Type -h or --help to get more information about which are the parameters of each
87 application.
88
89 You can find the configuration files in a folder created in your user home to
90 define the default behaviour of the applications:
91 ```
92 # Configuration files for Linux and MacOS
93 ~/.config/OSRFramework/
94 # Configuration files for Windows
95 C:\Users\<User>\OSRFramework\
96 ```
97
98 OSRFramework will look for the configuration settings stored there. You can add
99 new credentials there and if something goes wrong, you can always restore the
100 files stored in the `defaults` subfolder.
101
102 5 - HACKING
103 -----------
104
105 If you want to extend the functionalities of OSRFramework and you do not know
106 where to start from, check the [HACKING.md](doc/HACKING.md) file.
107
108 6 - AUTHORS
109 -----------
110
111 More details about the authors in the [AUTHORS.md](AUTHORS.md) file.
112
113 Keywords: python osint harvesting profiling maltego username socialmedia forums
114 Platform: UNKNOWN
115 Classifier: Development Status :: 4 - Beta
116 Classifier: Topic :: Software Development :: Libraries
117 Classifier: License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)
118 Classifier: Programming Language :: Python :: 2 :: Only
119 Classifier: Programming Language :: Python :: 2.7
120 Classifier: Intended Audience :: Developers
121 Classifier: Intended Audience :: Information Technology
122 Classifier: Intended Audience :: Science/Research
123 Classifier: Intended Audience :: Telecommunications Industry
124 Classifier: Natural Language :: English
125 Classifier: Topic :: Communications
126 Classifier: Topic :: Internet :: WWW/HTTP :: Indexing/Search
127 Classifier: Topic :: Scientific/Engineering :: Information Analysis
128 Classifier: Topic :: Scientific/Engineering :: Visualization
129 Classifier: Topic :: Text Processing :: Markup :: HTML
0 AUTHORS.md
1 MANIFEST.in
2 README.md
3 setup.py
4 config/accounts.cfg
5 config/api_keys.cfg
6 config/browser.cfg
7 config/general.cfg
8 config/plugins/pattern.py.sample
9 config/plugins/wrapper.py.sample
10 doc/ADVANCED_CONFIGURATION.md
11 doc/ALIAS_GENERATOR.md
12 doc/API.md
13 doc/CHANGES.md
14 doc/ENTIFY.md
15 doc/HACKING.md
16 doc/INSTALL.md
17 doc/MAILFY.md
18 doc/MALTEGO_CONFIGURATION.md
19 doc/OSRFCONSOLE.md
20 doc/OSRFRAMEWORK_SERVER.md
21 doc/OTHER_QUESTIONS.md
22 doc/PHONEFY.md
23 doc/SEARCHFY.md
24 doc/USAGE_WITH_DOCKER.md
25 doc/USUFY.md
26 osrframework/__init__.py
27 osrframework/alias_generator.py
28 osrframework/domainfy.py
29 osrframework/entify.py
30 osrframework/enumeration.py
31 osrframework/mailfy.py
32 osrframework/osrfconsole.py
33 osrframework/osrframework_server.py
34 osrframework/phonefy.py
35 osrframework/searchfy.py
36 osrframework/usufy.py
37 osrframework.egg-info/PKG-INFO
38 osrframework.egg-info/SOURCES.txt
39 osrframework.egg-info/dependency_links.txt
40 osrframework.egg-info/requires.txt
41 osrframework.egg-info/top_level.txt
42 osrframework/api/__init__.py
43 osrframework/api/twitter_api.py
44 osrframework/domains/__init__.py
45 osrframework/domains/brand_tld.py
46 osrframework/domains/cctld.py
47 osrframework/domains/generic_tld.py
48 osrframework/domains/geographic_tld.py
49 osrframework/domains/gtld.py
50 osrframework/domains/other_subdomains.py
51 osrframework/patterns/__init__.py
52 osrframework/patterns/bitcoinaddress.py
53 osrframework/patterns/dni.py
54 osrframework/patterns/dogecoinaddress.py
55 osrframework/patterns/email.py
56 osrframework/patterns/ipv4.py
57 osrframework/patterns/litecoinaddress.py
58 osrframework/patterns/md5.py
59 osrframework/patterns/namecoinaddress.py
60 osrframework/patterns/peercoinaddress.py
61 osrframework/patterns/sha1.py
62 osrframework/patterns/sha256.py
63 osrframework/patterns/uri.py
64 osrframework/searchengines/__init__.py
65 osrframework/searchengines/google.py
66 osrframework/static/README.md
67 osrframework/static/composer.json
68 osrframework/static/favicon.ico
69 osrframework/static/license.txt
70 osrframework/static/css/explorify.css
71 osrframework/static/css/font-awesome.min.css
72 osrframework/static/css/jquery.fancybox-1.3.4.css
73 osrframework/static/css/keshif-style.css
74 osrframework/static/css/keshif.css
75 osrframework/static/css/kickstart-buttons.css
76 osrframework/static/css/kickstart-forms.css
77 osrframework/static/css/kickstart-grid.css
78 osrframework/static/css/kickstart-menus.css
79 osrframework/static/css/kickstart-slideshow.css
80 osrframework/static/css/kickstart-style.css
81 osrframework/static/css/kickstart.css
82 osrframework/static/css/prettify.css
83 osrframework/static/css/style.css
84 osrframework/static/css/tiptip.css
85 osrframework/static/css/fonts/font-awesome-4.2.0/css/font-awesome.css
86 osrframework/static/css/fonts/font-awesome-4.2.0/css/font-awesome.min.css
87 osrframework/static/css/fonts/font-awesome-4.2.0/fonts/FontAwesome.otf
88 osrframework/static/css/fonts/font-awesome-4.2.0/fonts/fontawesome-webfont.eot
89 osrframework/static/css/fonts/font-awesome-4.2.0/fonts/fontawesome-webfont.svg
90 osrframework/static/css/fonts/font-awesome-4.2.0/fonts/fontawesome-webfont.ttf
91 osrframework/static/css/fonts/font-awesome-4.2.0/fonts/fontawesome-webfont.woff
92 osrframework/static/css/fonts/font-awesome-4.2.0/less/bordered-pulled.less
93 osrframework/static/css/fonts/font-awesome-4.2.0/less/core.less
94 osrframework/static/css/fonts/font-awesome-4.2.0/less/fixed-width.less
95 osrframework/static/css/fonts/font-awesome-4.2.0/less/font-awesome.less
96 osrframework/static/css/fonts/font-awesome-4.2.0/less/icons.less
97 osrframework/static/css/fonts/font-awesome-4.2.0/less/larger.less
98 osrframework/static/css/fonts/font-awesome-4.2.0/less/list.less
99 osrframework/static/css/fonts/font-awesome-4.2.0/less/mixins.less
100 osrframework/static/css/fonts/font-awesome-4.2.0/less/path.less
101 osrframework/static/css/fonts/font-awesome-4.2.0/less/rotated-flipped.less
102 osrframework/static/css/fonts/font-awesome-4.2.0/less/spinning.less
103 osrframework/static/css/fonts/font-awesome-4.2.0/less/stacked.less
104 osrframework/static/css/fonts/font-awesome-4.2.0/less/variables.less
105 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_bordered-pulled.scss
106 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_core.scss
107 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_fixed-width.scss
108 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_icons.scss
109 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_larger.scss
110 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_list.scss
111 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_mixins.scss
112 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_path.scss
113 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_rotated-flipped.scss
114 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_spinning.scss
115 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_stacked.scss
116 osrframework/static/css/fonts/font-awesome-4.2.0/scss/_variables.scss
117 osrframework/static/css/fonts/font-awesome-4.2.0/scss/font-awesome.scss
118 osrframework/static/css/img/breadcrumbs-bg.gif
119 osrframework/static/css/img/bx_loader.gif
120 osrframework/static/css/img/fancybox/blank.gif
121 osrframework/static/css/img/fancybox/jquery.easing-1.3.pack.js
122 osrframework/static/css/img/fancybox/jquery.fancybox-1.3.4.js
123 osrframework/static/css/img/fancybox/jquery.fancybox-1.3.4.pack.js
124 osrframework/static/css/img/fancybox/jquery.mousewheel-3.0.4.pack.js
125 osrframework/static/img/globe.png
126 osrframework/static/img/loading.gif
127 osrframework/static/img/mail.png
128 osrframework/static/img/osrframework-full.png
129 osrframework/static/img/osrframework-normal.png
130 osrframework/static/img/osrframework-tiny.png
131 osrframework/static/img/other.png
132 osrframework/static/img/phone.png
133 osrframework/static/img/thanks.gif
134 osrframework/static/img/user.png
135 osrframework/static/js/d3.3.5.5.min.js
136 osrframework/static/js/demo.js
137 osrframework/static/js/jquery.min.js
138 osrframework/static/js/jsapi.js
139 osrframework/static/js/keshif.js
140 osrframework/static/js/kickstart.js
141 osrframework/static/js/papaparse.min.js
142 osrframework/static/licenses/COPYING_HTML_Kickstart
143 osrframework/static/licenses/COPYING_Keshif
144 osrframework/templates/_banner.html
145 osrframework/templates/_footer.html
146 osrframework/templates/_keshif-headers.html
147 osrframework/templates/_menu-launcher.html
148 osrframework/templates/_menu-research.html
149 osrframework/templates/_menu-top.html
150 osrframework/templates/_options-export.html
151 osrframework/templates/_options-other.html
152 osrframework/templates/_options-platforms.html
153 osrframework/templates/_research-terminal.html
154 osrframework/templates/_shared-headers.html
155 osrframework/templates/error.html
156 osrframework/templates/explore.html
157 osrframework/templates/home.html
158 osrframework/templates/research-domainfy.html
159 osrframework/templates/research-mailfy.html
160 osrframework/templates/research-phonefy.html
161 osrframework/templates/research-searchfy.html
162 osrframework/templates/research-usufy.html
163 osrframework/templates/research.html
164 osrframework/thirdparties/__init__.py
165 osrframework/thirdparties/checkIfEmailWasHacked.py
166 osrframework/thirdparties/checkIfHashIsCracked.py
167 osrframework/thirdparties/checkInSkype.py
168 osrframework/thirdparties/checkIpDetails.py
169 osrframework/thirdparties/checkIpFromAlias.py
170 osrframework/thirdparties/checkPhoneDetails.py
171 osrframework/thirdparties/getBitcoinAddressDetails.py
172 osrframework/thirdparties/blockchain_info/__init__.py
173 osrframework/thirdparties/blockchain_info/getBitcoinAddressDetails.py
174 osrframework/thirdparties/haveibeenpwned_com/__init__.py
175 osrframework/thirdparties/haveibeenpwned_com/hibp.py
176 osrframework/thirdparties/infobel_com/__init__.py
177 osrframework/thirdparties/infobel_com/checkPhoneDetails.py
178 osrframework/thirdparties/infobel_com/processing.py
179 osrframework/thirdparties/ip_api_com/__init__.py
180 osrframework/thirdparties/ip_api_com/checkIpDetails.py
181 osrframework/thirdparties/md5crack_com/__init__.py
182 osrframework/thirdparties/md5crack_com/checkIfHashIsCracked.py
183 osrframework/thirdparties/pipl_com/__init__.py
184 osrframework/thirdparties/pipl_com/checkInfo.py
185 osrframework/thirdparties/pipl_com/lib/__init__.py
186 osrframework/thirdparties/pipl_com/lib/containers.py
187 osrframework/thirdparties/pipl_com/lib/error.py
188 osrframework/thirdparties/pipl_com/lib/fields.py
189 osrframework/thirdparties/pipl_com/lib/search.py
190 osrframework/thirdparties/pipl_com/lib/source.py
191 osrframework/thirdparties/pipl_com/lib/thumbnail.py
192 osrframework/thirdparties/pipl_com/lib/utils.py
193 osrframework/thirdparties/resolvethem_com/__init__.py
194 osrframework/thirdparties/resolvethem_com/processing.py
195 osrframework/thirdparties/skype/__init__.py
196 osrframework/thirdparties/skype/checkInSkype.py
197 osrframework/transforms/__init__.py
198 osrframework/transforms/aliasToFamousPlatforms.py
199 osrframework/transforms/aliasToKnownDomains.py
200 osrframework/transforms/aliasToKnownEmails.py
201 osrframework/transforms/aliasToSkypeAccounts.py
202 osrframework/transforms/aliasToSkypeIP.py
203 osrframework/transforms/bitcoinAddressToBlockchainDetails.py
204 osrframework/transforms/coordinatesToGoogleMapsBrowser.py
205 osrframework/transforms/coordinatesToTwitterBrowser.py
206 osrframework/transforms/domainToGoogleSearchUriWithEmails.py
207 osrframework/transforms/domainToTld.py
208 osrframework/transforms/emailToAlias.py
209 osrframework/transforms/emailToBreachedAccounts.py
210 osrframework/transforms/emailToDomain.py
211 osrframework/transforms/emailToSkypeAccounts.py
212 osrframework/transforms/expandPropertiesFromI3visioEntity.py
213 osrframework/transforms/hashToMD5crackDotCom.py
214 osrframework/transforms/ipToIp_ApiInformation.py
215 osrframework/transforms/phoneToMoreInfo.py
216 osrframework/transforms/phoneToPerson.py
217 osrframework/transforms/textToEntities.py
218 osrframework/transforms/textToGoogleSearchUri.py
219 osrframework/transforms/textToPlatformSearch.py
220 osrframework/transforms/textToProfiles.py
221 osrframework/transforms/uriToBrowser.py
222 osrframework/transforms/uriToDomain.py
223 osrframework/transforms/uriToEntities.py
224 osrframework/transforms/uriToGoogleCacheUri.py
225 osrframework/transforms/uriToPort.py
226 osrframework/transforms/uriToProtocol.py
227 osrframework/transforms/lib/TUTORIAL-MALTEGO.txt
228 osrframework/transforms/lib/__init__.py
229 osrframework/transforms/lib/configure_maltego.py
230 osrframework/transforms/lib/constants.py
231 osrframework/transforms/lib/maltego.py
232 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.alias.entity
233 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.bitcoin.address.entity
234 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.breach.entity
235 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.dni.entity
236 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.dogecoin.address.entity
237 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.domain.entity
238 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.email.entity
239 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.file.entity
240 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.fullname.entity
241 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.hash.entity
242 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.ipv4.entity
243 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.litecoin.address.entity
244 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.address.entity
245 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.city.entity
246 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.country.entity
247 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.entity
248 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.geo.entity
249 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.postalcode.entity
250 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.location.province.entity
251 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.md5.entity
252 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.name.entity
253 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.namecoin.address.entity
254 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.object.entity
255 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.peercoin.address.entity
256 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.person.entity
257 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.phone.entity
258 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.phone.home.entity
259 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.phone.mobile.entity
260 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.phone.office.entity
261 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.platform.entity
262 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.port.entity
263 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.profile.entity
264 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.protocol.entity
265 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.result.entity
266 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.sha1.entity
267 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.sha256.entity
268 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.surname1.entity
269 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.surname2.entity
270 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.tag.entity
271 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.text.entity
272 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.tld.entity
273 osrframework/transforms/lib/osrframework-maltego-settings/Entities/i3visio.uri.entity
274 osrframework/transforms/lib/osrframework-maltego-settings/EntityCategories/i3visio.category
275 osrframework/transforms/lib/osrframework-maltego-settings/EntityCategories/i3visio.currencies.category
276 osrframework/transforms/lib/osrframework-maltego-settings/EntityCategories/i3visio.hash.category
277 osrframework/transforms/lib/osrframework-maltego-settings/EntityCategories/i3visio.location.category
278 osrframework/transforms/lib/osrframework-maltego-settings/EntityCategories/i3visio.person.entity
279 osrframework/transforms/lib/osrframework-maltego-settings/EntityCategories/i3visio.web.category
280 osrframework/transforms/lib/osrframework-maltego-settings/Servers/Local.tas
281 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToAllKnownDomains.transform
282 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToAllKnownDomains.transformsettings
283 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToAllProfiles.transform
284 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToAllProfiles.transformsettings
285 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToFamousPlatforms.transform
286 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToFamousPlatforms.transformsettings
287 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToGlobalKnownDomains.transform
288 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToGlobalKnownDomains.transformsettings
289 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToKnownEmails.transform
290 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToKnownEmails.transformsettings
291 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToSelectedPlatforms.transform
292 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToSelectedPlatforms.transformsettings
293 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToSkypeAccounts.transform
294 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.aliasToSkypeAccounts.transformsettings
295 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.bitcoinAddressToBlockchainDetails.transform
296 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.bitcoinAddressToBlockchainDetails.transformsettings
297 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.coordinatesToGoogleMapsBrowser.transform
298 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.coordinatesToGoogleMapsBrowser.transformsettings
299 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.coordinatesToTwitterBrowser.transform
300 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.coordinatesToTwitterBrowser.transformsettings
301 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.domainToGoogleSearchUriWithEmails.transform
302 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.domainToGoogleSearchUriWithEmails.transformsettings
303 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.domainToIp_ApiInformation.transform
304 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.domainToIp_ApiInformation.transformsettings
305 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.domainToTld.transform
306 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.domainToTld.transformsettings
307 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToAlias.transform
308 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToAlias.transformsettings
309 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToBreachedAccounts.transform
310 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToBreachedAccounts.transformsettings
311 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToDomain.transform
312 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToDomain.transformsettings
313 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToSkypeAccounts.transform
314 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.emailToSkypeAccounts.transformsettings
315 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.expandPropertiesFromI3visioEntity.transform
316 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.expandPropertiesFromI3visioEntity.transformsettings
317 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.hashToMD5crackDotCom.transform
318 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.hashToMD5crackDotCom.transformsettings
319 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.ipToIp_ApiInformation.transform
320 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.ipToIp_ApiInformation.transformsettings
321 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.phoneToMoreInfoListspam.transform
322 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.phoneToMoreInfoListspam.transformsettings
323 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToAllEntities.transform
324 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToAllEntities.transformsettings
325 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToBitcoinAddressEntities.transform
326 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToBitcoinAddressEntities.transformsettings
327 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToDeepWebSearch.transform
328 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToDeepWebSearch.transformsettings
329 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToDniEntities.transform
330 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToDniEntities.transformsettings
331 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToDogecoinAddressEntities.transform
332 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToDogecoinAddressEntities.transformsettings
333 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToEmailEntities.transform
334 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToEmailEntities.transformsettings
335 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToFacebookProfiles.transform
336 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToFacebookProfiles.transformsettings
337 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToGoogleSearchUri.transform
338 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToGoogleSearchUri.transformsettings
339 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToIPv4Entities.transform
340 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToIPv4Entities.transformsettings
341 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToLitecoinAddressEntities.transform
342 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToLitecoinAddressEntities.transformsettings
343 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToMD5Entities.transform
344 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToMD5Entities.transformsettings
345 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToNamecoinAddressEntities.transform
346 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToNamecoinAddressEntities.transformsettings
347 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToPeercoinAddressEntities.transform
348 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToPeercoinAddressEntities.transformsettings
349 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToPhoneDetails.transform
350 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToPhoneDetails.transformsettings
351 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToPlatformSearch.transform
352 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToPlatformSearch.transformsettings
353 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToProfiles.transform
354 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToProfiles.transformsettings
355 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToSHA1Entities.transform
356 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToSHA1Entities.transformsettings
357 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToSHA256Entities.transform
358 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToSHA256Entities.transformsettings
359 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToSkypeProfiles.transform
360 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToSkypeProfiles.transformsettings
361 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToTwitterProfiles.transform
362 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToTwitterProfiles.transformsettings
363 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToUriEntities.transform
364 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.textToUriEntities.transformsettings
365 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToAllEntities.transform
366 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToAllEntities.transformsettings
367 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToBitcoinAddressEntities.transform
368 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToBitcoinAddressEntities.transformsettings
369 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToBrowser.transform
370 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToBrowser.transformsettings
371 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToDniEntities.transform
372 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToDniEntities.transformsettings
373 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToDogecoinAddressEntities.transform
374 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToDogecoinAddressEntities.transformsettings
375 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToDomain.transform
376 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToDomain.transformsettings
377 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToEmailEntities.transform
378 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToEmailEntities.transformsettings
379 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToGoogleCacheUri.transform
380 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToGoogleCacheUri.transformsettings
381 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToIPv4Entities.transform
382 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToIPv4Entities.transformsettings
383 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToLitecoinAddressEntities.transform
384 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToLitecoinAddressEntities.transformsettings
385 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToMD5Entities.transform
386 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToMD5Entities.transformsettings
387 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToNamecoinAddressEntities.transform
388 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToNamecoinAddressEntities.transformsettings
389 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToPeercoinAddressEntities.transform
390 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToPeercoinAddressEntities.transformsettings
391 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToPort.transform
392 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToPort.transformsettings
393 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToProtocol.transform
394 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToProtocol.transformsettings
395 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToSHA1Entities.transform
396 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToSHA1Entities.transformsettings
397 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToSHA256Entities.transform
398 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToSHA256Entities.transformsettings
399 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToUriEntities.transform
400 osrframework/transforms/lib/osrframework-maltego-settings/TransformRepositories/Local/i3visio.uriToUriEntities.transformsettings
401 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.cryptocurrencies.set
402 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.domainfy.set
403 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.entify.set
404 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.network.set
405 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.phonespam.set
406 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.searchengines.set
407 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.searchfy.set
408 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.set
409 osrframework/transforms/lib/osrframework-maltego-settings/TransformSets/i3visio.usufy.set
410 osrframework/utils/__init__.py
411 osrframework/utils/banner.py
412 osrframework/utils/benchmark.py
413 osrframework/utils/browser.py
414 osrframework/utils/config_api_keys.py
415 osrframework/utils/config_credentials.py
416 osrframework/utils/configuration.py
417 osrframework/utils/credentials.py
418 osrframework/utils/errors.py
419 osrframework/utils/general.py
420 osrframework/utils/global_api.py
421 osrframework/utils/logger.py
422 osrframework/utils/platform_selection.py
423 osrframework/utils/platforms.py
424 osrframework/utils/regexp.py
425 osrframework/utils/regexp_selection.py
426 osrframework/utils/updates.py
427 osrframework/wrappers/__init__.py
428 osrframework/wrappers/abou.py
429 osrframework/wrappers/about.py
430 osrframework/wrappers/affilorama.py
431 osrframework/wrappers/ahmia.py
432 osrframework/wrappers/anarchy101.py
433 osrframework/wrappers/angel.py
434 osrframework/wrappers/archive.py
435 osrframework/wrappers/arduino.py
436 osrframework/wrappers/ariva.py
437 osrframework/wrappers/armorgames.py
438 osrframework/wrappers/askfm.py
439 osrframework/wrappers/audiob.py
440 osrframework/wrappers/audioboo.py
441 osrframework/wrappers/authorstream.py
442 osrframework/wrappers/autospies.py
443 osrframework/wrappers/badoo.py
444 osrframework/wrappers/bandcamp.py
445 osrframework/wrappers/bebee.py
446 osrframework/wrappers/behance.py
447 osrframework/wrappers/bennugd.py
448 osrframework/wrappers/betblog.py
449 osrframework/wrappers/bitbucket.py
450 osrframework/wrappers/bitcointa.py
451 osrframework/wrappers/bitcointalk.py
452 osrframework/wrappers/bitly.py
453 osrframework/wrappers/bitrated.py
454 osrframework/wrappers/blackplanet.py
455 osrframework/wrappers/blip.py
456 osrframework/wrappers/blogmarks.py
457 osrframework/wrappers/blogspot.py
458 osrframework/wrappers/bookofmatches.py
459 osrframework/wrappers/boonex.py
460 osrframework/wrappers/bordom.py
461 osrframework/wrappers/boxedup.py
462 osrframework/wrappers/breakcom.py
463 osrframework/wrappers/bubok.py
464 osrframework/wrappers/bucketlistly.py
465 osrframework/wrappers/buddypic.py
466 osrframework/wrappers/burbuja.py
467 osrframework/wrappers/burdastyle.py
468 osrframework/wrappers/buzznet.py
469 osrframework/wrappers/cafemom.py
470 osrframework/wrappers/canva.py
471 osrframework/wrappers/carbonmade.py
472 osrframework/wrappers/cardinghispano.py
473 osrframework/wrappers/cardingmx.py
474 osrframework/wrappers/cardomain.py
475 osrframework/wrappers/care2.py
476 osrframework/wrappers/cartodb.py
477 osrframework/wrappers/cash.py
478 osrframework/wrappers/castroller.py
479 osrframework/wrappers/causes.py
480 osrframework/wrappers/ccm.py
481 osrframework/wrappers/ccsinfo.py
482 osrframework/wrappers/chess.py
483 osrframework/wrappers/cockos.py
484 osrframework/wrappers/codecademy.py
485 osrframework/wrappers/codementor.py
486 osrframework/wrappers/coderwall.py
487 osrframework/wrappers/coinbase.py
488 osrframework/wrappers/colourlovers.py
489 osrframework/wrappers/connectingsingles.py
490 osrframework/wrappers/contently.py
491 osrframework/wrappers/couchsurfing.py
492 osrframework/wrappers/crokes.py
493 osrframework/wrappers/crowdin.py
494 osrframework/wrappers/cryptofresh.py
495 osrframework/wrappers/dailymotion.py
496 osrframework/wrappers/datpiff.py
497 osrframework/wrappers/deviantart.py
498 osrframework/wrappers/digitalspy.py
499 osrframework/wrappers/disqus.py
500 osrframework/wrappers/doodle.py
501 osrframework/wrappers/douban.py
502 osrframework/wrappers/dreamstime.py
503 osrframework/wrappers/dribbble.py
504 osrframework/wrappers/drugbuyersforum.py
505 osrframework/wrappers/drupal.py
506 osrframework/wrappers/dzone.py
507 osrframework/wrappers/ebay.py
508 osrframework/wrappers/echatta.py
509 osrframework/wrappers/ehow.py
510 osrframework/wrappers/eightbitme.py
511 osrframework/wrappers/ello.py
512 osrframework/wrappers/elmundo.py
513 osrframework/wrappers/emoneyspace.py
514 osrframework/wrappers/enfemenino.py
515 osrframework/wrappers/ethereum.py
516 osrframework/wrappers/etsy.py
517 osrframework/wrappers/eyeem.py
518 osrframework/wrappers/f6s.py
519 osrframework/wrappers/facebook.py
520 osrframework/wrappers/facesaerch.py
521 osrframework/wrappers/fanpop.py
522 osrframework/wrappers/fark.py
523 osrframework/wrappers/favstar.py
524 osrframework/wrappers/fiverr.py
525 osrframework/wrappers/flickr.py
526 osrframework/wrappers/flixster.py
527 osrframework/wrappers/foodspotting.py
528 osrframework/wrappers/forobtc.py
529 osrframework/wrappers/forocoches.py
530 osrframework/wrappers/foroptc.py
531 osrframework/wrappers/foros24h.py
532 osrframework/wrappers/forosperu.py
533 osrframework/wrappers/forospyware.py
534 osrframework/wrappers/fotolog.py
535 osrframework/wrappers/foursquare.py
536 osrframework/wrappers/freelancer.py
537 osrframework/wrappers/freerepublic.py
538 osrframework/wrappers/gamesheep.py
539 osrframework/wrappers/gametracker.py
540 osrframework/wrappers/gapyear.py
541 osrframework/wrappers/gather.py
542 osrframework/wrappers/geeksphone.py
543 osrframework/wrappers/genspot.py
544 osrframework/wrappers/getlocalization.py
545 osrframework/wrappers/getsatisfaction.py
546 osrframework/wrappers/github.py
547 osrframework/wrappers/goblinrefuge.py
548 osrframework/wrappers/goodreads.py
549 osrframework/wrappers/googleplus.py
550 osrframework/wrappers/gravatar.py
551 osrframework/wrappers/gsmspain.py
552 osrframework/wrappers/hi5.py
553 osrframework/wrappers/houzz.py
554 osrframework/wrappers/htcmania.py
555 osrframework/wrappers/hubpages.py
556 osrframework/wrappers/ibosocial.py
557 osrframework/wrappers/identica.py
558 osrframework/wrappers/ifunny.py
559 osrframework/wrappers/imgur.py
560 osrframework/wrappers/infotelefonica.py
561 osrframework/wrappers/inkonsky.py
562 osrframework/wrappers/instagram.py
563 osrframework/wrappers/instructables.py
564 osrframework/wrappers/intfiction.py
565 osrframework/wrappers/islamicawakening.py
566 osrframework/wrappers/issuu.py
567 osrframework/wrappers/ivoox.py
568 osrframework/wrappers/jamiiforums.py
569 osrframework/wrappers/kali.py
570 osrframework/wrappers/kanogames.py
571 osrframework/wrappers/karmacracy.py
572 osrframework/wrappers/keybase.py
573 osrframework/wrappers/kickstarter.py
574 osrframework/wrappers/kimatel.py
575 osrframework/wrappers/kinja.py
576 osrframework/wrappers/kiwi.py
577 osrframework/wrappers/klout.py
578 osrframework/wrappers/kongregate.py
579 osrframework/wrappers/kupika.py
580 osrframework/wrappers/lastfm.py
581 osrframework/wrappers/leakforums.py
582 osrframework/wrappers/linkedin.py
583 osrframework/wrappers/listaspam.py
584 osrframework/wrappers/livejournal.py
585 osrframework/wrappers/looki.py
586 osrframework/wrappers/losviajeros.py
587 osrframework/wrappers/marca.py
588 osrframework/wrappers/matchdoctor.py
589 osrframework/wrappers/mcneel.py
590 osrframework/wrappers/mediavida.py
591 osrframework/wrappers/medium.py
592 osrframework/wrappers/meneame.py
593 osrframework/wrappers/mercadolibre.py
594 osrframework/wrappers/metacafe.py
595 osrframework/wrappers/meteor.py
596 osrframework/wrappers/mig.py
597 osrframework/wrappers/migente.py
598 osrframework/wrappers/miiverse.py
599 osrframework/wrappers/minecraft.py
600 osrframework/wrappers/moneymaker.py
601 osrframework/wrappers/mozilla.py
602 osrframework/wrappers/musicasacra.py
603 osrframework/wrappers/myeloma.py
604 osrframework/wrappers/myfitnesspal.py
605 osrframework/wrappers/myspace.py
606 osrframework/wrappers/nairaland.py
607 osrframework/wrappers/netlog.py
608 osrframework/wrappers/netvibes.py
609 osrframework/wrappers/newgrounds.py
610 osrframework/wrappers/notablug.py
611 osrframework/wrappers/occupywallst.py
612 osrframework/wrappers/odnoklassniki.py
613 osrframework/wrappers/okcupid.py
614 osrframework/wrappers/onename.py
615 osrframework/wrappers/openbugbounty.py
616 osrframework/wrappers/openframeworks.py
617 osrframework/wrappers/openstreetmap.py
618 osrframework/wrappers/papaly.py
619 osrframework/wrappers/pastebin.py
620 osrframework/wrappers/patreon.py
621 osrframework/wrappers/pearltrees.py
622 osrframework/wrappers/peerbackers.py
623 osrframework/wrappers/periscope.py
624 osrframework/wrappers/pgpmit.py
625 osrframework/wrappers/phishtank.py
626 osrframework/wrappers/photobucket.py
627 osrframework/wrappers/pixinsight.py
628 osrframework/wrappers/pixls.py
629 osrframework/wrappers/pjrc.py
630 osrframework/wrappers/pokerred.py
631 osrframework/wrappers/pokerstrategy.py
632 osrframework/wrappers/pornhub.py
633 osrframework/wrappers/proboards.py
634 osrframework/wrappers/px500.py
635 osrframework/wrappers/pz.py
636 osrframework/wrappers/qq.py
637 osrframework/wrappers/quartermoonsaloon.py
638 osrframework/wrappers/rankia.py
639 osrframework/wrappers/rapid7.py
640 osrframework/wrappers/rapid_i.py
641 osrframework/wrappers/ratemypoo.py
642 osrframework/wrappers/realcarders.py
643 osrframework/wrappers/rebelmouse.py
644 osrframework/wrappers/reddit.py
645 osrframework/wrappers/redtube.py
646 osrframework/wrappers/researchgate.py
647 osrframework/wrappers/reverbnation.py
648 osrframework/wrappers/ripenear.py
649 osrframework/wrappers/rojadirecta.py
650 osrframework/wrappers/ruby.py
651 osrframework/wrappers/sarahah.py
652 osrframework/wrappers/scribd.py
653 osrframework/wrappers/seatwish.py
654 osrframework/wrappers/sencha.py
655 osrframework/wrappers/sidereel.py
656 osrframework/wrappers/singletrackworld.py
657 osrframework/wrappers/skype.py
658 osrframework/wrappers/slashdot.py
659 osrframework/wrappers/slideshare.py
660 osrframework/wrappers/smartcitizen.py
661 osrframework/wrappers/smugmug.py
662 osrframework/wrappers/soundcloud.py
663 osrframework/wrappers/soup.py
664 osrframework/wrappers/sourceforge.py
665 osrframework/wrappers/spaniards.py
666 osrframework/wrappers/spoj.py
667 osrframework/wrappers/spotify.py
668 osrframework/wrappers/spreaker.py
669 osrframework/wrappers/squidoo.py
670 osrframework/wrappers/steamcommunity.py
671 osrframework/wrappers/steemit.py
672 osrframework/wrappers/steinberg.py
673 osrframework/wrappers/streakgaming.py
674 osrframework/wrappers/taringa.py
675 osrframework/wrappers/teamtreehouse.py
676 osrframework/wrappers/techcrunch.py
677 osrframework/wrappers/technorati.py
678 osrframework/wrappers/thehoodup.py
679 osrframework/wrappers/thesims.py
680 osrframework/wrappers/thestudentroom.py
681 osrframework/wrappers/theverge.py
682 osrframework/wrappers/tipme.py
683 osrframework/wrappers/tradimo.py
684 osrframework/wrappers/trakt.py
685 osrframework/wrappers/translate_hola.py
686 osrframework/wrappers/trip.py
687 osrframework/wrappers/tripadvisor.py
688 osrframework/wrappers/tripit.py
689 osrframework/wrappers/trulia.py
690 osrframework/wrappers/tumblr.py
691 osrframework/wrappers/tune.py
692 osrframework/wrappers/tuporno.py
693 osrframework/wrappers/twicsy.py
694 osrframework/wrappers/twitch.py
695 osrframework/wrappers/twitter.py
696 osrframework/wrappers/twoplustwo.py
697 osrframework/wrappers/typepad.py
698 osrframework/wrappers/unioncarder.py
699 osrframework/wrappers/ustream.py
700 osrframework/wrappers/v7n.py
701 osrframework/wrappers/venmo.py
702 osrframework/wrappers/vexforum.py
703 osrframework/wrappers/viddler.py
704 osrframework/wrappers/videohelp.py
705 osrframework/wrappers/vimeo.py
706 osrframework/wrappers/virustotal.py
707 osrframework/wrappers/vk.py
708 osrframework/wrappers/warriorforum.py
709 osrframework/wrappers/webtv.py
710 osrframework/wrappers/wikia.py
711 osrframework/wrappers/wikipediaar.py
712 osrframework/wrappers/wikipediaca.py
713 osrframework/wrappers/wikipediade.py
714 osrframework/wrappers/wikipediaen.py
715 osrframework/wrappers/wikipediaes.py
716 osrframework/wrappers/wikipediaeu.py
717 osrframework/wrappers/wikipediafr.py
718 osrframework/wrappers/wikipediapt.py
719 osrframework/wrappers/winamp.py
720 osrframework/wrappers/wishlistr.py
721 osrframework/wrappers/witty.py
722 osrframework/wrappers/wykop.py
723 osrframework/wrappers/xanga.py
724 osrframework/wrappers/xing.py
725 osrframework/wrappers/xtube.py
726 osrframework/wrappers/younow.py
727 osrframework/wrappers/youtube.py
728 osrframework/wrappers/zabbix.py
729 osrframework/wrappers/zentyal.py
730 osrframework/wrappers/zotero.py
0 setuptools
1 mechanize
2 Skype4Py
3 requests
4 python-emailahoy
5 BeautifulSoup
6 pyexcel==0.2.1
7 pyexcel_ods==0.1.1
8 pyexcel_xls==0.1.0
9 pyexcel_xlsx==0.1.0
10 pyexcel_io==0.1.0
11 pyexcel_text==0.2.0
12 tweepy
13 networkx
14 decorator
15 validate_email
16 pydns
17 tabulate
18 oauthlib>=1.0.0
19 importlib
20 python-whois
21 flask
22 pyyaml
23 colorama
0 [egg_info]
1 tag_build =
2 tag_date = 0
3
0 # !/usr/bin/python2
1 # -*- coding: utf-8 -*-
2 #
3 ##################################################################################
4 #
5 # Copyright 2016 Félix Brezo and Yaiza Rubio (i3visio, [email protected])
6 #
7 # This file is part of OSRFramework. You can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation, either version 3 of the License, or
10 # (at your option) any later version.
11 #
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
16 #
17 # You should have received a copy of the GNU General Public License
18 # along with this program. If not, see <http://www.gnu.org/licenses/>.
19 #
20 ##################################################################################
21
22 import os
23 import sys
24 from setuptools import setup
25
26 # Checking if obsolete versions are installed in the machine
27 import shutil
28 import site
29
30 IS_VIRTUAL_ENV = False
31
32 # Get packagesPaths depending on whether the user launched it with sudo or not
33 if sys.platform == 'win32':
34 # This will throw two folders, but we need the first one only. Typically:
35 # ['c:\\Users\\<a_user>\\AppData\\Roaming\\Python\\Python27\\site-packages']
36 packagesPaths = site.getusersitepackages()[0]
37 print "[*] The installation is going to be run as superuser."
38 else:
39 # We need this verification because Windows does not have a wrapper ofr os.geteuid()
40 if not os.geteuid() == 0:
41 try:
42 packagesPaths = site.getusersitepackages()
43 # TODO: Check whether the packagesPaths is in the PATH, if not, add it
44 print "[*] The installation has not been launched as superuser."
45 user_bin_path = site.USER_BASE + "/bin"
46 print "[*] We will verify is the '" + user_bin_path + "' folder is in the path so as to make the utils available anywhere in the system."
47 bin_path = os.popen("echo $PATH").read()
48 if user_bin_path in bin_path:
49 print "[*] Great. '" + user_bin_path + "' is in the path. No further actions needed."
50 else:
51 print "[*] We are manually adding the '" + user_bin_path + "' folder to the ~/.bashrc file."
52 # Building the commands to be added to .bashrc
53 new_lines = """
54 # Added by OSRFramework
55 # ---------------------
56 # Check this issue in Github for additional information about why these lines where added: <https://github.com/i3visio/osrframework/issues/187>
57
58 export PY_USER_BIN= """ + user_bin_path + """
59 export PATH=$PATH:$PY_USER_BIN
60 """
61
62 command = "echo '''" + new_lines + "''' >> ~/.bashrc"
63 print "[*] As we want to be transparent, the command that is being run is the following:\n" + command
64 a = os.popen(command).read()
65 except:
66 IS_VIRTUAL_ENV = True
67 else:
68 # This will throw two folders, but we need the first one only:
69 # ['/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages']
70 packagesPaths = site.getsitepackages()[0]
71 print "[*] The installation is going to be run as superuser."
72
73 if not IS_VIRTUAL_ENV:
74 osrframeworkSystemPath = os.path.join(packagesPaths, "osrframework")
75
76 print "[*] The chosen installation path is: " + osrframeworkSystemPath
77
78 # Removing old installations first...
79 if os.path.isdir(osrframeworkSystemPath):
80 print "[!] Found an old installation at: " + osrframeworkSystemPath
81 try:
82 shutil.rmtree(osrframeworkSystemPath)
83 print "[*] Successfully removed the old installation. Installation will resume now to upgrade it..."
84 except Exception as e:
85 print str(e)
86 print "[E] The installed version of OSRFramework cannot be removed. Try to remove it manually in your python installation under 'local/lib/python2.7/dist-packages/'."
87 print sys.exit()
88 else:
89 print "[*] No OSRFramework installation found in the system."
90 else:
91 print "[*] OSRFramework seems to be installed using `virtualenv`."
92
93 HERE = os.path.abspath(os.path.dirname(__file__))
94
95 # Importing the temporal scripts for the setup and taking the new version number
96 import osrframework
97 NEW_VERSION = osrframework.__version__
98
99 import osrframework.utils.configuration as configuration
100
101 # Depending on the place in which the project is going to be upgraded
102 try:
103 raise Exception('Trying to load the markdown manually!')
104 from pypandoc import convert
105 read_md = lambda f: convert(f, 'rst')
106 except ImportError:
107 print("[!] pypandoc module not found, could not convert Markdown to RST")
108 read_md = lambda f: open(f, 'r').read()
109 except Exception:
110 read_md = lambda f: open(f, 'r').read()
111
112 # Reading the .md file
113 try:
114 long_description = read_md(os.path.join(HERE,"README.md"))
115 except:
116 long_description = ""
117
118 # Creating the application paths
119 paths = configuration.getConfigPath()
120
121 print "[*] Launching the installation of the osrframework module..."
122 # Launching the setup
123 setup(
124 name="osrframework",
125 version=NEW_VERSION,
126 description="OSRFramework - A set of GPLv3+ OSINT tools developed by i3visio analysts for online research.",
127 author="Felix Brezo and Yaiza Rubio",
128 author_email="[email protected]",
129 url="http://github.com/i3visio/osrframework",
130 license="COPYING",
131 keywords = "python osint harvesting profiling maltego username socialmedia forums",
132 scripts= [
133 "osrframework/alias_generator.py",
134 "osrframework/domainfy.py",
135 "osrframework/entify.py",
136 "osrframework/mailfy.py",
137 "osrframework/phonefy.py",
138 "osrframework/searchfy.py",
139 "osrframework/usufy.py",
140 "osrframework/osrfconsole.py",
141 "osrframework/osrframework_server.py",
142 ],
143 classifiers=[
144 'Development Status :: 4 - Beta',
145 'Topic :: Software Development :: Libraries',
146 'License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)',
147 'Programming Language :: Python :: 2 :: Only',
148 'Programming Language :: Python :: 2.7',
149 'Intended Audience :: Developers',
150 'Intended Audience :: Information Technology',
151 'Intended Audience :: Science/Research',
152 'Intended Audience :: Telecommunications Industry',
153 'Natural Language :: English',
154 'Topic :: Communications',
155 'Topic :: Internet :: WWW/HTTP :: Indexing/Search',
156 'Topic :: Scientific/Engineering :: Information Analysis',
157 'Topic :: Scientific/Engineering :: Visualization',
158 'Topic :: Text Processing :: Markup :: HTML'
159 ],
160 packages=[
161 "osrframework",
162 "osrframework.api",
163 "osrframework.thirdparties",
164 "osrframework.thirdparties.blockchain_info",
165 "osrframework.thirdparties.haveibeenpwned_com",
166 "osrframework.thirdparties.infobel_com",
167 "osrframework.thirdparties.ip_api_com",
168 "osrframework.thirdparties.md5crack_com",
169 "osrframework.thirdparties.pipl_com",
170 "osrframework.thirdparties.pipl_com.lib",
171 "osrframework.thirdparties.resolvethem_com",
172 "osrframework.thirdparties.skype",
173 "osrframework.utils",
174 "osrframework.transforms",
175 "osrframework.transforms.lib",
176 "osrframework.patterns",
177 "osrframework.wrappers",
178 "osrframework.searchengines",
179 "osrframework.domains",
180 ],
181 long_description=long_description,
182 install_requires=[
183 "setuptools",
184 "mechanize",
185 "Skype4Py",
186 "requests",
187 "python-emailahoy",
188 "BeautifulSoup",
189 "pyexcel==0.2.1",
190 "pyexcel_ods==0.1.1",
191 "pyexcel_xls==0.1.0",
192 "pyexcel_xlsx==0.1.0",
193 "pyexcel_io==0.1.0",
194 "pyexcel_text==0.2.0",
195 "tweepy",
196 "networkx",
197 "decorator",
198 "validate_email",
199 "pydns",
200 "tabulate",
201 "oauthlib>=1.0.0",
202 # Added to dinamically import wrappers:
203 "importlib",
204 #"inspect",
205 #"pkgutil",
206 # Adding dependencies to avoid the InsecurePlatformWarning when calling Twitter API dealing with SSL: <http://stackoverflow.com/a/29202163>. Other options would require the user to upgrade to Python 2.7.9.
207 #"pyopenssl",
208 #"ndg-httpsclient",
209 #"pyasn1"
210 "python-whois",
211 "flask",
212 "pyyaml",
213 "colorama"
214 ],
215 )
216
217 ############################
218 ### Creating other files ###
219 ############################
220 print "[*] Changing permissions of the user folders..."
221 try:
222 configuration.changePermissionsRecursively(paths["appPath"], int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))
223 except:
224 # Something happened with the permissions... We omit this.
225 pass
226
227 print "[*] Copying relevant files..."
228 files_to_copy= {
229 paths["appPath"] : [
230 os.path.join("config", "browser.cfg"),
231 os.path.join("config", "general.cfg"),
232 ],
233 paths["appPathDefaults"] : [
234 os.path.join("config", "accounts.cfg"),
235 os.path.join("config", "api_keys.cfg"),
236 os.path.join("config", "browser.cfg"),
237 os.path.join("config", "general.cfg"),
238 ],
239 paths["appPathTransforms"] : [
240 os.path.join("osrframework", "alias_generator.py"),
241 os.path.join("osrframework", "entify.py"),
242 os.path.join("osrframework", "phonefy.py"),
243 os.path.join("osrframework", "searchfy.py"),
244 os.path.join("osrframework", "mailfy.py"),
245 os.path.join("osrframework", "usufy.py"),
246 os.path.join("osrframework", "domainfy.py"),
247 os.path.join("osrframework", "transforms", "aliasToKnownDomains.py"),
248 os.path.join("osrframework", "transforms", "aliasToKnownEmails.py"),
249 os.path.join("osrframework", "transforms", "aliasToSkypeAccounts.py"),
250 os.path.join("osrframework", "transforms", "aliasToSkypeIP.py"),
251 os.path.join("osrframework", "transforms", "bitcoinAddressToBlockchainDetails.py"),
252 os.path.join("osrframework", "transforms", "coordinatesToGoogleMapsBrowser.py"),
253 os.path.join("osrframework", "transforms", "coordinatesToTwitterBrowser.py"),
254 os.path.join("osrframework", "transforms", "domainToGoogleSearchUriWithEmails.py"),
255 os.path.join("osrframework", "transforms", "domainToTld.py"),
256 os.path.join("osrframework", "transforms", "emailToAlias.py"),
257 os.path.join("osrframework", "transforms", "emailToBreachedAccounts.py"),
258 os.path.join("osrframework", "transforms", "emailToDomain.py"),
259 os.path.join("osrframework", "transforms", "emailToSkypeAccounts.py"),
260 os.path.join("osrframework", "transforms", "expandPropertiesFromI3visioEntity.py"),
261 os.path.join("osrframework", "transforms", "hashToMD5crackDotCom.py"),
262 os.path.join("osrframework", "transforms", "ipToIp_ApiInformation.py"),
263 os.path.join("osrframework", "transforms", "phoneToMoreInfo.py"),
264 os.path.join("osrframework", "transforms", "phoneToPerson.py"),
265 os.path.join("osrframework", "transforms", "textToEntities.py"),
266 os.path.join("osrframework", "transforms", "textToGoogleSearchUri.py"),
267 os.path.join("osrframework", "transforms", "textToPlatformSearch.py"),
268 os.path.join("osrframework", "transforms", "textToProfiles.py"),
269 os.path.join("osrframework", "transforms", "uriToBrowser.py"),
270 os.path.join("osrframework", "transforms", "uriToDomain.py"),
271 os.path.join("osrframework", "transforms", "uriToEntities.py"),
272 os.path.join("osrframework", "transforms", "uriToGoogleCacheUri.py"),
273 os.path.join("osrframework", "transforms", "uriToPort.py"),
274 os.path.join("osrframework", "transforms", "uriToProtocol.py"),
275 ],
276 paths["appPathWrappers"] : [
277 os.path.join("config", "plugins", "wrapper.py.sample"),
278 ],
279 paths["appPathPatterns"] : [
280 os.path.join("config", "plugins", "pattern.py.sample"),
281 ],
282 paths["appPathServer"] : [
283 os.path.join("osrframework", "static"),
284 os.path.join("osrframework", "templates"),
285 ]
286 }
287
288 # Iterating through all destinations to write the info
289 for destiny in files_to_copy.keys():
290 # Grabbing each source file to be moved
291 for sourceFile in files_to_copy[destiny]:
292 fileToMove = os.path.join(HERE,sourceFile)
293
294 # Choosing the command depending on the SO
295 if sys.platform == 'win32':
296 if os.path.isdir(fileToMove):
297 cmd = "echo d | xcopy \"" + fileToMove + "\" \"" + destiny + "\" /s /e"
298 else:
299 cmd = "copy \"" + fileToMove + "\" \"" + destiny + "\""
300 elif sys.platform == 'linux2' or sys.platform == 'darwin':
301 if not os.geteuid() == 0:
302 cmd = "cp -r -- \"" + fileToMove + "\" \"" + destiny + "\""
303 else:
304 cmd = "sudo cp -r -- \"" + fileToMove + "\" \"" + destiny + "\""
305 #print cmd
306 output = os.popen(cmd).read()
307
308 print
309 print "[*] Last part: trying to configure Maltego Transforms..."
310 # Creating the configuration file
311 try:
312 import osrframework.transforms.lib.configure_maltego as maltego
313 maltego.configureMaltego(transformsConfigFolder=paths["appPathTransforms"], base=os.path.join(HERE,"osrframework/transforms/lib/osrframework-maltego-settings"), debug=False, backupPath=paths["appPathDefaults"])
314 except Exception, e:
315 print "[!] The Maltego configuration file to use i3visio transforms could not be created and thus, cannot be used. Check the following error:"
316 print str(e)
317 print