Merge pull request #11 from AliasIO/master

Sync no.11
main
Daniel Zdziebko 7 years ago committed by GitHub
commit c5087eb1b3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -3,6 +3,9 @@ sudo: required
services: services:
- docker - docker
before_install: npm install -g npm@latest
install: npm ci
after_success: after_success:
- sha256sum build/* > build/SHA256SUMS - sha256sum build/* > build/SHA256SUMS
- cat build/SHA256SUMS - cat build/SHA256SUMS

@ -16,7 +16,7 @@ var
for (app in json.apps) { for (app in json.apps) {
(function(app) { (function(app) {
var var
iconPath = json.apps[app].icon || 'default.svg'; iconPath = json.apps[app].icon || 'default.svg',
path = basePath + iconPath, path = basePath + iconPath,
ext = iconPath.substr(iconPath.length - 4); ext = iconPath.substr(iconPath.length - 4);

@ -0,0 +1,16 @@
<!--
If you need technical help please read https://www.wappalyzer.com/docs before opening an issue.
It also explains well how to add a new application detection.
-->
**Do you want to request a *feature*, a *new application detection* or report a *bug*?**
**Is your issue about WebExtension driver (Chrome & Firefox), the website, the NPM driver or the bookmarklet ?**
**What is the current behavior ?**
**If the current behavior is a bug, please provide the steps to reproduce and if possible a demo of the problem.**
**What is the expected behavior ?**
**Which versions of Wappalyzer, and which browser / OS are affected by this issue ? Did this work in previous versions ?**

284
package-lock.json generated

@ -0,0 +1,284 @@
{
"requires": true,
"lockfileVersion": 1,
"dependencies": {
"assertion-error": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
"integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
"dev": true
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"requires": {
"balanced-match": "1.0.0",
"concat-map": "0.0.1"
}
},
"browser-stdout": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
"integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
"dev": true
},
"chai": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz",
"integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=",
"dev": true,
"requires": {
"assertion-error": "1.1.0",
"check-error": "1.0.2",
"deep-eql": "3.0.1",
"get-func-name": "2.0.0",
"pathval": "1.1.0",
"type-detect": "4.0.8"
}
},
"check-error": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
"integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
"dev": true
},
"commander": {
"version": "2.11.0",
"resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
"integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
"dev": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true
},
"debug": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
"dev": true,
"requires": {
"ms": "2.0.0"
}
},
"deep-eql": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
"integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
"dev": true,
"requires": {
"type-detect": "4.0.8"
}
},
"diff": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"file-type": {
"version": "7.4.0",
"resolved": "https://registry.npmjs.org/file-type/-/file-type-7.4.0.tgz",
"integrity": "sha1-KnyU9ioAMBULt9m2xwz6HT51nIY="
},
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
"get-func-name": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
"integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
"dev": true
},
"glob": {
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
"dev": true,
"requires": {
"fs.realpath": "1.0.0",
"inflight": "1.0.6",
"inherits": "2.0.3",
"minimatch": "3.0.4",
"once": "1.4.0",
"path-is-absolute": "1.0.1"
}
},
"growl": {
"version": "1.10.3",
"resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
"integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
"dev": true
},
"has-flag": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
"integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
"dev": true
},
"he": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
"integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
"dev": true
},
"html-comment-regex": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz",
"integrity": "sha1-ZouTd26q5V696POtRkswekljYl4="
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"requires": {
"once": "1.4.0",
"wrappy": "1.0.2"
}
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true
},
"is-svg": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz",
"integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=",
"requires": {
"html-comment-regex": "1.1.1"
}
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"requires": {
"brace-expansion": "1.1.11"
}
},
"minimist": {
"version": "0.0.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
"integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
"dev": true
},
"mkdirp": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
"integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
"dev": true,
"requires": {
"minimist": "0.0.8"
}
},
"mocha": {
"version": "5.1.0",
"resolved": "https://registry.npmjs.org/mocha/-/mocha-5.1.0.tgz",
"integrity": "sha512-d6RWgYPILd+AoWVOxiD0UwUqRicnE1inTxMr40CXOgqYve1MvnKntoLAtLIcxjEeVjEoYYTe5QAq3mUc6/ySjQ==",
"dev": true,
"requires": {
"browser-stdout": "1.3.1",
"commander": "2.11.0",
"debug": "3.1.0",
"diff": "3.5.0",
"escape-string-regexp": "1.0.5",
"glob": "7.1.2",
"growl": "1.10.3",
"he": "1.1.1",
"minimatch": "3.0.4",
"mkdirp": "0.5.1",
"supports-color": "4.4.0"
}
},
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
"dev": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"requires": {
"wrappy": "1.0.2"
}
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true
},
"pathval": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
"integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
"dev": true
},
"pify": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY="
},
"read-chunk": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/read-chunk/-/read-chunk-2.1.0.tgz",
"integrity": "sha1-agTAkoAF7Z1C4aasVgDhnLx/9lU=",
"requires": {
"pify": "3.0.0",
"safe-buffer": "5.1.1"
}
},
"safe-buffer": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
},
"supports-color": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
"integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
"dev": true,
"requires": {
"has-flag": "2.0.0"
}
},
"type-detect": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
"integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
"dev": true
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true
}
}
}

@ -3,6 +3,12 @@
"file-type": "7.4.*", "file-type": "7.4.*",
"is-svg": "2.1.*", "is-svg": "2.1.*",
"read-chunk": "2.1.*" "read-chunk": "2.1.*"
},
"devDependencies": {
"chai": "^4.1.2",
"mocha": "^5.0.1"
},
"scripts": {
"test": "mocha -R spec ./test"
} }
} }

@ -0,0 +1,11 @@
--- src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:36:04.097829977 +1000
+++ src/drivers/npm/node_modules/zombie/lib/document.js 2018-04-20 14:34:25.699317000 +1000
@@ -281,7 +281,7 @@
// The current window, postMessage and window.close need this
browser._windowInScope = window;
var result = undefined;
- if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename });else if (code) result = code.call(window);
+ if (typeof code === 'string' || code instanceof String) result = VM.runInContext(code, window, { filename: filename, timeout: 1000 });else if (code) result = code.call(window);
browser.emit('evaluated', code, result, filename);
return result;
} catch (error) {

1
run

@ -11,6 +11,7 @@ fi
cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev" cmd="docker run --rm -v "$(pwd):/opt/wappalyzer" -it wappalyzer/dev"
$cmd sh -c "yarn install; cd src/drivers/webextension; yarn install" $cmd sh -c "yarn install; cd src/drivers/webextension; yarn install"
$cmd sh -c "cat patches/*.patch | patch -p0"
$cmd ./bin/run links $cmd ./bin/run links
$cmd ./bin/run $@ $cmd ./bin/run $@

File diff suppressed because it is too large Load Diff

@ -22,20 +22,20 @@
function getPageContent() { function getPageContent() {
wappalyzer.log('func: getPageContent', 'driver'); wappalyzer.log('func: getPageContent', 'driver');
var env = [];
for ( let i in window ) {
env.push(i);
}
var scripts = Array.prototype.slice var scripts = Array.prototype.slice
.apply(document.scripts) .apply(document.scripts)
.filter(s => s.src) .filter(s => s.src)
.map(s => s.src); .map(s => s.src);
var html = new XMLSerializer().serializeToString(document).split('\n');
html = html
.slice(0, 1000).concat(html.slice(html.length - 1000))
.map(line => line.substring(0, 1000))
.join('\n');
wappalyzer.analyze(url, { wappalyzer.analyze(url, {
html: document.documentElement.innerHTML, html: html,
env: env,
scripts: scripts scripts: scripts
}); });
} }

@ -27,14 +27,16 @@ node index.js [url] [options]
### Options ### Options
``` ```
--chunk-size=num Process links in chunks. --chunk-size=num Process links in chunks.
--debug=0|1 Output debug messages. --debug=0|1 Output debug messages.
--delay=ms Wait for ms milliseconds between requests. --delay=ms Wait for ms milliseconds between requests.
--max-depth=num Don't analyse pages more than num levels deep. --max-depth=num Don't analyse pages more than num levels deep.
--max-urls=num Exit when num URLs have been analysed. --max-urls=num Exit when num URLs have been analysed.
--max-wait=ms Wait no more than ms milliseconds for page resources to load. --max-wait=ms Wait no more than ms milliseconds for page resources to load.
--recursive=0|1 Follow links on pages (crawler). --recursive=0|1 Follow links on pages (crawler).
--user-agent=str Set the user agent string. --user-agent=str Set the user agent string.
--html-max-cols=num Limit the number of HTML characters per line processed.
--html-max-rows=num Limit the number of HTML lines processed.
``` ```
@ -49,6 +51,8 @@ const options = {
maxWait: 5000, maxWait: 5000,
recursive: true, recursive: true,
userAgent: 'Wappalyzer', userAgent: 'Wappalyzer',
htmlMaxCols: 2000,
htmlMaxRows: 2000,
}; };
const wappalyzer = new Wappalyzer('https://www.wappalyzer.com', options); const wappalyzer = new Wappalyzer('https://www.wappalyzer.com', options);

@ -21,6 +21,8 @@ class Driver {
maxWait: 5000, maxWait: 5000,
recursive: false, recursive: false,
userAgent: 'Mozilla/5.0 (compatible; Wappalyzer)', userAgent: 'Mozilla/5.0 (compatible; Wappalyzer)',
htmlMaxCols: 2000,
htmlMaxRows: 2000,
}, options || {}); }, options || {});
this.options.debug = Boolean(this.options.debug); this.options.debug = Boolean(this.options.debug);
@ -28,6 +30,8 @@ class Driver {
this.options.maxDepth = parseInt(this.options.maxDepth, 10); this.options.maxDepth = parseInt(this.options.maxDepth, 10);
this.options.maxUrls = parseInt(this.options.maxUrls, 10); this.options.maxUrls = parseInt(this.options.maxUrls, 10);
this.options.maxWait = parseInt(this.options.maxWait, 10); this.options.maxWait = parseInt(this.options.maxWait, 10);
this.options.htmlMaxCols = parseInt(this.options.htmlMaxCols, 10);
this.options.htmlMaxRows = parseInt(this.options.htmlMaxRows, 10);
this.options.recursive = Boolean(this.options.recursive); this.options.recursive = Boolean(this.options.recursive);
this.origPageUrl = url.parse(pageUrl); this.origPageUrl = url.parse(pageUrl);
@ -44,6 +48,8 @@ class Driver {
this.wappalyzer.driver.log = (message, source, type) => this.log(message, source, type); this.wappalyzer.driver.log = (message, source, type) => this.log(message, source, type);
this.wappalyzer.driver.displayApps = (detected, meta, context) => this.displayApps(detected, meta, context); this.wappalyzer.driver.displayApps = (detected, meta, context) => this.displayApps(detected, meta, context);
process.on('uncaughtException', e => this.wappalyzer.log('Uncaught exception: ' + e.message, 'driver', 'error'));
} }
analyze() { analyze() {
@ -108,6 +114,7 @@ class Driver {
visit(pageUrl, timerScope, resolve) { visit(pageUrl, timerScope, resolve) {
const browser = new Browser({ const browser = new Browser({
silent: true, silent: true,
strictSSL: false,
userAgent: this.options.userAgent, userAgent: this.options.userAgent,
waitDuration: this.options.maxWait, waitDuration: this.options.maxWait,
}); });
@ -125,21 +132,30 @@ class Driver {
const html = this.getHtml(browser); const html = this.getHtml(browser);
const scripts = this.getScripts(browser); const scripts = this.getScripts(browser);
const js = this.getJs(browser); const js = this.getJs(browser);
const cookies = this.getCookies(browser);
this.wappalyzer.analyze(pageUrl, { this.wappalyzer.analyze(pageUrl, {
headers, headers,
html, html,
scripts, scripts,
js js,
}); cookies,
})
.then(() => {
const links = Array.prototype.reduce.call(
browser.document.getElementsByTagName('a'), (results, link) => {
if ( link.protocol.match(/https?:/) || link.hostname === this.origPageUrl.hostname || extensions.test(link.pathname) ) {
link.hash = '';
const links = Array.from(browser.document.getElementsByTagName('a')) results.push(url.parse(link.href));
.filter(link => link.protocol === 'http:' || link.protocol === 'https:') }
.filter(link => link.hostname === this.origPageUrl.hostname)
.filter(link => extensions.test(link.pathname))
.map(link => { link.hash = ''; return url.parse(link.href) });
return resolve(links); return results;
}, []
);
return resolve(links);
});
}); });
} }
@ -204,11 +220,11 @@ class Driver {
let html = ''; let html = '';
try { try {
html = browser.html(); html = browser.html()
.split('\n')
if ( html.length > 50000 ) { .slice(0, this.options.htmlMaxRows / 2).concat(html.slice(html.length - this.options.htmlMaxRows / 2))
html = html.substring(0, 25000) + html.substring(html.length - 25000, html.length); .map(line => line.substring(0, this.options.htmlMaxCols))
} .join('\n');
} catch ( error ) { } catch ( error ) {
this.wappalyzer.log(error.message, 'browser', 'error'); this.wappalyzer.log(error.message, 'browser', 'error');
} }
@ -258,7 +274,22 @@ class Driver {
return js; return js;
} }
crawl(pageUrl, index, depth = 1) { getCookies(browser) {
const cookies = [];
if ( browser.cookies ) {
browser.cookies.forEach(cookie => cookies.push({
name: cookie.key,
value: cookie.value,
domain: cookie.domain,
path: cookie.path,
}));
}
return cookies;
}
crawl(pageUrl, index = 1, depth = 1) {
pageUrl.canonical = pageUrl.protocol + '//' + pageUrl.host + pageUrl.pathname; pageUrl.canonical = pageUrl.protocol + '//' + pageUrl.host + pageUrl.pathname;
return new Promise(resolve => { return new Promise(resolve => {

@ -1,6 +1,6 @@
{ {
"name": "wappalyzer", "name": "wappalyzer",
"version": "5.3.1", "version": "5.4.13",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
@ -28,7 +28,7 @@
"integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
"requires": { "requires": {
"co": "4.6.0", "co": "4.6.0",
"fast-deep-equal": "1.0.0", "fast-deep-equal": "1.1.0",
"fast-json-stable-stringify": "2.0.0", "fast-json-stable-stringify": "2.0.0",
"json-schema-traverse": "0.3.1" "json-schema-traverse": "0.3.1"
} }
@ -54,9 +54,9 @@
"integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
}, },
"aws4": { "aws4": {
"version": "1.6.0", "version": "1.7.0",
"resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
"integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w=="
}, },
"babel-runtime": { "babel-runtime": {
"version": "5.8.29", "version": "5.8.29",
@ -85,7 +85,7 @@
"resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
"integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
"requires": { "requires": {
"hoek": "4.2.0" "hoek": "4.2.1"
} }
}, },
"caseless": { "caseless": {
@ -99,9 +99,9 @@
"integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ="
}, },
"combined-stream": { "combined-stream": {
"version": "1.0.5", "version": "1.0.6",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
"integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
"requires": { "requires": {
"delayed-stream": "1.0.0" "delayed-stream": "1.0.0"
} }
@ -129,7 +129,7 @@
"resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
"integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
"requires": { "requires": {
"hoek": "4.2.0" "hoek": "4.2.1"
} }
} }
} }
@ -161,6 +161,13 @@
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"requires": { "requires": {
"ms": "2.0.0" "ms": "2.0.0"
},
"dependencies": {
"ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
}
} }
}, },
"deep-is": { "deep-is": {
@ -183,15 +190,15 @@
} }
}, },
"escodegen": { "escodegen": {
"version": "1.9.0", "version": "1.9.1",
"resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
"integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
"requires": { "requires": {
"esprima": "3.1.3", "esprima": "3.1.3",
"estraverse": "4.2.0", "estraverse": "4.2.0",
"esutils": "2.0.2", "esutils": "2.0.2",
"optionator": "0.8.2", "optionator": "0.8.2",
"source-map": "0.5.7" "source-map": "0.6.1"
} }
}, },
"esprima": { "esprima": {
@ -228,9 +235,9 @@
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
}, },
"fast-deep-equal": { "fast-deep-equal": {
"version": "1.0.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
"integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ="
}, },
"fast-json-stable-stringify": { "fast-json-stable-stringify": {
"version": "2.0.0", "version": "2.0.0",
@ -248,13 +255,13 @@
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
}, },
"form-data": { "form-data": {
"version": "2.3.1", "version": "2.3.2",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
"integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
"requires": { "requires": {
"asynckit": "0.4.0", "asynckit": "0.4.0",
"combined-stream": "1.0.5", "combined-stream": "1.0.6",
"mime-types": "2.1.17" "mime-types": "2.1.18"
} }
}, },
"getpass": { "getpass": {
@ -286,14 +293,14 @@
"requires": { "requires": {
"boom": "4.3.1", "boom": "4.3.1",
"cryptiles": "3.1.2", "cryptiles": "3.1.2",
"hoek": "4.2.0", "hoek": "4.2.1",
"sntp": "2.1.0" "sntp": "2.1.0"
} }
}, },
"hoek": { "hoek": {
"version": "4.2.0", "version": "4.2.1",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
"integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA=="
}, },
"http-signature": { "http-signature": {
"version": "1.2.0", "version": "1.2.0",
@ -302,13 +309,16 @@
"requires": { "requires": {
"assert-plus": "1.0.0", "assert-plus": "1.0.0",
"jsprim": "1.4.1", "jsprim": "1.4.1",
"sshpk": "1.13.1" "sshpk": "1.14.1"
} }
}, },
"iconv-lite": { "iconv-lite": {
"version": "0.4.19", "version": "0.4.21",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz",
"integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==",
"requires": {
"safer-buffer": "2.1.2"
}
}, },
"is-typedarray": { "is-typedarray": {
"version": "1.0.0", "version": "1.0.0",
@ -336,13 +346,13 @@
"acorn-globals": "1.0.9", "acorn-globals": "1.0.9",
"cssom": "0.3.2", "cssom": "0.3.2",
"cssstyle": "0.2.37", "cssstyle": "0.2.37",
"escodegen": "1.9.0", "escodegen": "1.9.1",
"nwmatcher": "1.4.3", "nwmatcher": "1.4.4",
"parse5": "1.5.1", "parse5": "1.5.1",
"request": "2.83.0", "request": "2.85.0",
"sax": "1.2.4", "sax": "1.2.4",
"symbol-tree": "3.2.2", "symbol-tree": "3.2.2",
"tough-cookie": "2.3.3", "tough-cookie": "2.3.4",
"webidl-conversions": "2.0.1", "webidl-conversions": "2.0.1",
"whatwg-url-compat": "0.6.5", "whatwg-url-compat": "0.6.5",
"xml-name-validator": "2.0.1" "xml-name-validator": "2.0.1"
@ -394,27 +404,27 @@
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
}, },
"mime-db": { "mime-db": {
"version": "1.30.0", "version": "1.33.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
"integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ=="
}, },
"mime-types": { "mime-types": {
"version": "2.1.17", "version": "2.1.18",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
"integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
"requires": { "requires": {
"mime-db": "1.30.0" "mime-db": "1.33.0"
} }
}, },
"ms": { "ms": {
"version": "2.0.0", "version": "0.7.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8="
}, },
"nwmatcher": { "nwmatcher": {
"version": "1.4.3", "version": "1.4.4",
"resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
"integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==" "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ=="
}, },
"oauth-sign": { "oauth-sign": {
"version": "0.8.2", "version": "0.8.2",
@ -478,32 +488,32 @@
"integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=" "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw="
}, },
"request": { "request": {
"version": "2.83.0", "version": "2.85.0",
"resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
"integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
"requires": { "requires": {
"aws-sign2": "0.7.0", "aws-sign2": "0.7.0",
"aws4": "1.6.0", "aws4": "1.7.0",
"caseless": "0.12.0", "caseless": "0.12.0",
"combined-stream": "1.0.5", "combined-stream": "1.0.6",
"extend": "3.0.1", "extend": "3.0.1",
"forever-agent": "0.6.1", "forever-agent": "0.6.1",
"form-data": "2.3.1", "form-data": "2.3.2",
"har-validator": "5.0.3", "har-validator": "5.0.3",
"hawk": "6.0.2", "hawk": "6.0.2",
"http-signature": "1.2.0", "http-signature": "1.2.0",
"is-typedarray": "1.0.0", "is-typedarray": "1.0.0",
"isstream": "0.1.2", "isstream": "0.1.2",
"json-stringify-safe": "5.0.1", "json-stringify-safe": "5.0.1",
"mime-types": "2.1.17", "mime-types": "2.1.18",
"oauth-sign": "0.8.2", "oauth-sign": "0.8.2",
"performance-now": "2.1.0", "performance-now": "2.1.0",
"qs": "6.5.1", "qs": "6.5.1",
"safe-buffer": "5.1.1", "safe-buffer": "5.1.1",
"stringstream": "0.0.5", "stringstream": "0.0.5",
"tough-cookie": "2.3.3", "tough-cookie": "2.3.4",
"tunnel-agent": "0.6.0", "tunnel-agent": "0.6.0",
"uuid": "3.1.0" "uuid": "3.2.1"
} }
}, },
"requires-port": { "requires-port": {
@ -516,6 +526,11 @@
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
"integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
}, },
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sax": { "sax": {
"version": "1.2.4", "version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
@ -526,19 +541,19 @@
"resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
"integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
"requires": { "requires": {
"hoek": "4.2.0" "hoek": "4.2.1"
} }
}, },
"source-map": { "source-map": {
"version": "0.5.7", "version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
"optional": true "optional": true
}, },
"sshpk": { "sshpk": {
"version": "1.13.1", "version": "1.14.1",
"resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
"integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
"requires": { "requires": {
"asn1": "0.2.3", "asn1": "0.2.3",
"assert-plus": "1.0.0", "assert-plus": "1.0.0",
@ -561,9 +576,9 @@
"integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=" "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY="
}, },
"tough-cookie": { "tough-cookie": {
"version": "2.3.3", "version": "2.3.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
"integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
"requires": { "requires": {
"punycode": "1.4.1" "punycode": "1.4.1"
} }
@ -595,6 +610,11 @@
"prelude-ls": "1.1.2" "prelude-ls": "1.1.2"
} }
}, },
"ultron": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
},
"url-parse": { "url-parse": {
"version": "1.0.5", "version": "1.0.5",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz",
@ -605,9 +625,9 @@
} }
}, },
"uuid": { "uuid": {
"version": "3.1.0", "version": "3.2.1",
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
"integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
}, },
"verror": { "verror": {
"version": "1.10.0", "version": "1.10.0",
@ -637,49 +657,37 @@
"resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
"integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
}, },
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
}
},
"xml-name-validator": { "xml-name-validator": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
"integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=" "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU="
}, },
"zombie": { "zombie": {
"version": "5.0.7", "version": "5.0.8",
"resolved": "https://registry.npmjs.org/zombie/-/zombie-5.0.7.tgz", "resolved": "https://registry.npmjs.org/zombie/-/zombie-5.0.8.tgz",
"integrity": "sha512-zrYFTD5iWxI3EJohmZ8F2sNafo44F/132wLj5WHLSHmytds60s+JiXLomflQ8sbNuWCZJAuszvf6+eUiVsUqPQ==", "integrity": "sha512-b634oIFJ2SFHnWEdntljrBeEroF1piyTiPmZPqsZwwy2KC5MLazq97eHPw1Qz77VPujQTEnbhOUvMssjpak2WQ==",
"requires": { "requires": {
"babel-runtime": "5.8.29", "babel-runtime": "5.8.29",
"bluebird": "3.5.1", "bluebird": "3.5.1",
"debug": "2.6.9", "debug": "2.6.9",
"eventsource": "0.1.6", "eventsource": "0.1.6",
"iconv-lite": "0.4.19", "iconv-lite": "0.4.21",
"jsdom": "7.2.2", "jsdom": "7.2.2",
"lodash": "3.10.1", "lodash": "3.10.1",
"mime": "1.6.0", "mime": "1.6.0",
"ms": "0.7.3", "ms": "0.7.3",
"request": "2.83.0", "request": "2.85.0",
"tough-cookie": "2.3.3", "tough-cookie": "2.3.4",
"ws": "1.1.5" "ws": "1.1.5"
},
"dependencies": {
"ms": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz",
"integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8="
},
"ultron": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz",
"integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po="
},
"ws": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ws/-/ws-1.1.5.tgz",
"integrity": "sha512-o3KqipXNUdS7wpQzBHSe180lBGO60SoK0yVo3CYJgb2MkobuWuBX6dhkYP5ORCLd55y+SaflMOV5fqAB53ux4w==",
"requires": {
"options": "0.0.6",
"ultron": "1.0.2"
}
}
} }
} }
} }

@ -2,7 +2,7 @@
"name": "wappalyzer", "name": "wappalyzer",
"description": "Uncovers the technologies used on websites", "description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer", "homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "5.4.5", "version": "5.4.15",
"author": "Elbert Alias", "author": "Elbert Alias",
"license": "GPL-3.0", "license": "GPL-3.0",
"repository": { "repository": {
@ -17,7 +17,7 @@
"wappalyzer.js" "wappalyzer.js"
], ],
"dependencies": { "dependencies": {
"request": "^2.83.0", "request": "^2.85.0",
"zombie": "^5.0.7" "zombie": "^5.0.8"
} }
} }

@ -10,7 +10,7 @@
"optionTracking": { "message": "Anonyme Statistiken an wappalyzer.com übermitteln" }, "optionTracking": { "message": "Anonyme Statistiken an wappalyzer.com übermitteln" },
"nothingToDo": { "message": "Nichts zu tun." }, "nothingToDo": { "message": "Nichts zu tun." },
"noAppsDetected": { "message": "Keine Applikation entdeckt." }, "noAppsDetected": { "message": "Keine Applikation entdeckt." },
"categoryPin": { "message": "Always show icon" }, "categoryPin": { "message": "Immer Icon anzeigen" },
"categoryName1": { "message": "CMS" }, "categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Nachrichten Board" }, "categoryName2": { "message": "Nachrichten Board" },
"categoryName3": { "message": "Datenbankverwaltung" }, "categoryName3": { "message": "Datenbankverwaltung" },
@ -65,5 +65,7 @@
"categoryName52": { "message": "Live-Chat" }, "categoryName52": { "message": "Live-Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" }, "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Buchhaltung" } "categoryName55": { "message": "Buchhaltung" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Statischer Seitengenerator" }
} }

@ -60,5 +60,8 @@
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" }, "categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" }, "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -65,5 +65,7 @@
"categoryName52": { "message": "Live Chat" }, "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" }, "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" } "categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,5 +64,8 @@
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }, "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -1,68 +1,71 @@
{ {
"github": { "message": "Forker Wappalyzer sur GitHub!" }, "github": { "message": "Forker Wappalyzer sur GitHub!" },
"noAppsDetected": { "message": "Pas d'applications détectées." }, "noAppsDetected": { "message": "Pas d'applications détectées." },
"nothingToDo": { "message": "Rien à faire ici." }, "nothingToDo": { "message": "Rien à faire ici." },
"optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" }, "optionTracking": { "message": "Envoyer anonymement des rapports sur les applications détectées à wappalyzer.com pour la recherche" },
"optionUpgradeMessage": { "message": "M'afficher les mises à jour" }, "optionUpgradeMessage": { "message": "M'afficher les mises à jour" },
"optionDynamicIcon": { "message": "Utiliser l'icône de l'application au lieu du logo Wappalyzer" }, "optionDynamicIcon": { "message": "Utiliser l'icône de l'application au lieu du logo Wappalyzer" },
"options": { "message": "Options" }, "options": { "message": "Options" },
"optionsSave": { "message": "Sauvegarder les options" }, "optionsSave": { "message": "Sauvegarder les options" },
"optionsSaved": { "message": "Sauvegardé" }, "optionsSaved": { "message": "Sauvegardé" },
"twitter": { "message": "Suivre Wappalyzer sur Twitter" }, "twitter": { "message": "Suivre Wappalyzer sur Twitter" },
"website": { "message": "Aller sur wappalyzer.com" }, "website": { "message": "Aller sur wappalyzer.com" },
"categoryPin": { "message": "Always show icon" }, "categoryPin": { "message": " Toujours afficher l'icône" },
"categoryName1": { "message": "CMS" }, "categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" }, "categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestionnaire de base de données" }, "categoryName3": { "message": "Gestionnaire de base de données" },
"categoryName4": { "message": "Outil de documentation" }, "categoryName4": { "message": "Outil de documentation" },
"categoryName5": { "message": "Widget" }, "categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Boutique en ligne" }, "categoryName6": { "message": "Boutique en ligne" },
"categoryName7": { "message": "Galerie photo" }, "categoryName7": { "message": "Galerie photo" },
"categoryName8": { "message": "Wiki" }, "categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Gestionnaires de serveur" }, "categoryName9": { "message": "Gestionnaires de serveur" },
"categoryName10": { "message": "Outil de statistiques" }, "categoryName10": { "message": "Outil de statistiques" },
"categoryName11": { "message": "Blog" }, "categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" }, "categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Outil de suivi de problèmes" }, "categoryName13": { "message": "Outil de suivi de problèmes" },
"categoryName14": { "message": "Lecteur de vidéos" }, "categoryName14": { "message": "Lecteur de vidéos" },
"categoryName15": { "message": "Système de commentaires" }, "categoryName15": { "message": "Système de commentaires" },
"categoryName16": { "message": "Captcha" }, "categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script de police" }, "categoryName17": { "message": "Script de police" },
"categoryName18": { "message": "Framework web" }, "categoryName18": { "message": "Framework web" },
"categoryName19": { "message": "Divers" }, "categoryName19": { "message": "Divers" },
"categoryName20": { "message": "Editeur" }, "categoryName20": { "message": "Éditeur" },
"categoryName21": { "message": "LMS" }, "categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Serveur web" }, "categoryName22": { "message": "Serveur web" },
"categoryName23": { "message": "Outil de cache" }, "categoryName23": { "message": "Outil de cache" },
"categoryName24": { "message": "Editeur WYSIWYG" }, "categoryName24": { "message": "Éditeur WYSIWYG" },
"categoryName25": { "message": "Graphismes JavaScript" }, "categoryName25": { "message": "Graphismes JavaScript" },
"categoryName26": { "message": "Framework pour mobiles" }, "categoryName26": { "message": "Framework pour mobiles" },
"categoryName27": { "message": "Langage de programmation" }, "categoryName27": { "message": "Langage de programmation" },
"categoryName28": { "message": "Système d'exploitation" }, "categoryName28": { "message": "Système d'exploitation" },
"categoryName29": { "message": "Moteur de recherche" }, "categoryName29": { "message": "Moteur de recherche" },
"categoryName30": { "message": "Web Mail" }, "categoryName30": { "message": "Webmail" },
"categoryName31": { "message": "CDN" }, "categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Logiciel de marketing" }, "categoryName32": { "message": "Logiciel de marketing" },
"categoryName33": { "message": "Extension de serveur web" }, "categoryName33": { "message": "Extension de serveur web" },
"categoryName34": { "message": "Base de données" }, "categoryName34": { "message": "Base de données" },
"categoryName35": { "message": "Carte" }, "categoryName35": { "message": "Carte" },
"categoryName36": { "message": "Régie publicitaire" }, "categoryName36": { "message": "Régie publicitaire" },
"categoryName37": { "message": "Périphérique réseau" }, "categoryName37": { "message": "Périphérique réseau" },
"categoryName38": { "message": "Serveur multimédia" }, "categoryName38": { "message": "Serveur multimédia" },
"categoryName39": { "message": "Webcam" }, "categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Imprimante" }, "categoryName40": { "message": "Imprimante" },
"categoryName41": { "message": "Service de paiement" }, "categoryName41": { "message": "Service de paiement" },
"categoryName42": { "message": "Tag Manager" }, "categoryName42": { "message": "Gestionnaire de balises" },
"categoryName43": { "message": "Paywall" }, "categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Système CI" }, "categoryName44": { "message": "Système CI" },
"categoryName45": { "message": "Système SCADA" }, "categoryName45": { "message": "Système SCADA" },
"categoryName46": { "message": "Accès à distance" }, "categoryName46": { "message": "Accès à distance" },
"categoryName47": { "message": "Outil de développement" }, "categoryName47": { "message": "Outil de développement" },
"categoryName48": { "message": "Stockage réseau" }, "categoryName48": { "message": "Stockage réseau" },
"categoryName49": { "message": "Lecteur RSS" }, "categoryName49": { "message": "Lecteur de flux RSS" },
"categoryName50": { "message": "Système de gestion de documents" }, "categoryName51": { "message": "Créateur de Landing Page" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName50": { "message": "Système de gestion de documents" },
"categoryName52": { "message": "Chat en direct" }, "categoryName52": { "message": "Chat en direct" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Comptabilité" },
"categoryName56": { "message": "Crypto-mineur" },
"categoryName57": { "message": "Générateur de site statique" }
} }

@ -60,5 +60,8 @@
"categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" }, "categoryName51": { "message": "Σύστημα Κατασκευής Σελίδων Υποδοχής" },
"categoryName52": { "message": "Live Chat" }, "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,5 +64,8 @@
"categoryName51": { "message": "Pembuat Laman Landas" }, "categoryName51": { "message": "Pembuat Laman Landas" },
"categoryName52": { "message": "Chat Langsung" }, "categoryName52": { "message": "Chat Langsung" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,6 +64,9 @@
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Live Chat" }, "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -65,5 +65,7 @@
"categoryName52": { "message": "Czat na żywo" }, "categoryName52": { "message": "Czat na żywo" },
"categoryName53": { "message": "Zarządzanie relacjami z klientami" }, "categoryName53": { "message": "Zarządzanie relacjami z klientami" },
"categoryName54": { "message": "SEO" }, "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Księgowość" } "categoryName55": { "message": "Księgowość" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -1,68 +1,71 @@
{ {
"github": { "message": "Fork Wappalyzer no GitHub!" }, "github": { "message": "Fork Wappalyzer no GitHub!" },
"noAppsDetected": { "message": "Não foi detetada nenhuma apliação." }, "noAppsDetected": { "message": "Não foi detetada nenhuma apliação." },
"nothingToDo": { "message": "Nada a fazer aqui." }, "nothingToDo": { "message": "Nada a fazer aqui." },
"optionTracking": { "message": "Enviar anonimamente relatorios sobre as apliações detetadas ao wappalyzer.com para investigação" }, "optionTracking": { "message": "Enviar anonimamente relatorios sobre as apliações detetadas ao wappalyzer.com para investigação" },
"optionUpgradeMessage": { "message": "Atualizações automaticas" }, "optionUpgradeMessage": { "message": "Atualizações automaticas" },
"optionDynamicIcon": { "message": "Utilizar o icone da aplicação em vez do logotido do Wappalyzer" }, "optionDynamicIcon": { "message": "Utilizar o icone da aplicação em vez do logotido do Wappalyzer" },
"options": { "message": "Definições" }, "options": { "message": "Definições" },
"optionsSave": { "message": "Guardar as opções" }, "optionsSave": { "message": "Guardar as opções" },
"optionsSaved": { "message": "Guardado" }, "optionsSaved": { "message": "Guardado" },
"twitter": { "message": "Seguir o Wappalyzer no Twitter" }, "twitter": { "message": "Seguir o Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" }, "website": { "message": "Ir para wappalyzer.com" },
"categoryPin": { "message": "Always show icon" }, "categoryPin": { "message": "Always show icon" },
"categoryName1": { "message": "Sistema de gerenciamento de conteudo(CMS)" }, "categoryName1": { "message": "Sistema de gerenciamento de conteudo(CMS)" },
"categoryName2": { "message": "Forum" }, "categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestor de base de dados" }, "categoryName3": { "message": "Gestor de base de dados" },
"categoryName4": { "message": "Ferramenta de documentação" }, "categoryName4": { "message": "Ferramenta de documentação" },
"categoryName5": { "message": "Widget" }, "categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Loja online" }, "categoryName6": { "message": "Loja online" },
"categoryName7": { "message": "Galeria de fotografias" }, "categoryName7": { "message": "Galeria de fotografias" },
"categoryName8": { "message": "Wiki" }, "categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Gestor de servidores" }, "categoryName9": { "message": "Gestor de servidores" },
"categoryName10": { "message": "Ferramenta de estatisticas" }, "categoryName10": { "message": "Ferramenta de estatisticas" },
"categoryName11": { "message": "Blog" }, "categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" }, "categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Ferramenta de seguimento de problemas" }, "categoryName13": { "message": "Ferramenta de seguimento de problemas" },
"categoryName14": { "message": "Leitor de videos" }, "categoryName14": { "message": "Leitor de videos" },
"categoryName15": { "message": "Sistemas de comentários" }, "categoryName15": { "message": "Sistemas de comentários" },
"categoryName16": { "message": "Captcha" }, "categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script de policia" }, "categoryName17": { "message": "Script de fonte" },
"categoryName18": { "message": "Framework WEB" }, "categoryName18": { "message": "Framework WEB" },
"categoryName19": { "message": "Diversos" }, "categoryName19": { "message": "Diversos" },
"categoryName20": { "message": "Editor" }, "categoryName20": { "message": "Editor" },
"categoryName21": { "message": "Sistema de gestão de Aprendizagem(LMS)" }, "categoryName21": { "message": "Sistema de gestão de Aprendizagem(LMS)" },
"categoryName22": { "message": "Servidor WEB" }, "categoryName22": { "message": "Servidor WEB" },
"categoryName23": { "message": "Ferramenta de cache" }, "categoryName23": { "message": "Ferramenta de cache" },
"categoryName24": { "message": "Editor WYSIWYG" }, "categoryName24": { "message": "Editor WYSIWYG" },
"categoryName25": { "message": "Grafismo JavaScript" }, "categoryName25": { "message": "Grafismo JavaScript" },
"categoryName26": { "message": "Framework para dispositivos mobile" }, "categoryName26": { "message": "Framework para dispositivos mobile" },
"categoryName27": { "message": "Linguagem de programação" }, "categoryName27": { "message": "Linguagem de programação" },
"categoryName28": { "message": "Sistema Operativo" }, "categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motor de pesquisa" }, "categoryName29": { "message": "Motor de pesquisa" },
"categoryName30": { "message": "WebMail" }, "categoryName30": { "message": "WebMail" },
"categoryName31": { "message": "Rede de distribuição de conteudo(CDN)" }, "categoryName31": { "message": "Rede de distribuição de conteudo(CDN)" },
"categoryName32": { "message": "Sistema de vendas" }, "categoryName32": { "message": "Sistema de vendas" },
"categoryName33": { "message": "Extensão do servidor WEB" }, "categoryName33": { "message": "Extensão do servidor WEB" },
"categoryName34": { "message": "Base de dados" }, "categoryName34": { "message": "Base de dados" },
"categoryName35": { "message": "Mapa" }, "categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Rede de publicidade" }, "categoryName36": { "message": "Rede de publicidade" },
"categoryName37": { "message": "Dispositivo de rede" }, "categoryName37": { "message": "Dispositivo de rede" },
"categoryName38": { "message": "Servidor multimédia" }, "categoryName38": { "message": "Servidor multimédia" },
"categoryName39": { "message": "Webcam" }, "categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Impressora" }, "categoryName40": { "message": "Impressora" },
"categoryName41": { "message": "Serviço de pagamento" }, "categoryName41": { "message": "Serviço de pagamento" },
"categoryName42": { "message": "Gestor de Tags" }, "categoryName42": { "message": "Gestor de Tags" },
"categoryName43": { "message": "Sistema de assinaturas paga(Paywall)" }, "categoryName43": { "message": "Sistema de assinaturas paga(Paywall)" },
"categoryName44": { "message": "Sistema CI" }, "categoryName44": { "message": "Sistema CI" },
"categoryName45": { "message": "Sistema SCADA" }, "categoryName45": { "message": "Sistema SCADA" },
"categoryName46": { "message": "Acesso à distancia" }, "categoryName46": { "message": "Acesso à distancia" },
"categoryName47": { "message": "Ferramenta de desenvolvimento" }, "categoryName47": { "message": "Ferramenta de desenvolvimento" },
"categoryName48": { "message": "Rede de armazenamento" }, "categoryName48": { "message": "Rede de armazenamento" },
"categoryName49": { "message": "Leitor RSS" }, "categoryName49": { "message": "Leitor RSS" },
"categoryName50": { "message": "Sistema de gestão de documentos" }, "categoryName50": { "message": "Sistema de gestão de documentos" },
"categoryName51": { "message": "Landing Page Builder" }, "categoryName51": { "message": "Landing Page Builder" },
"categoryName52": { "message": "Chat em direto" }, "categoryName52": { "message": "Chat em direto" },
"categoryName53": { "message": "Sistemas de relação com o cliente(CRM)" }, "categoryName53": { "message": "Sistemas de relação com o cliente(CRM)" },
"categoryName54": { "message": "Otimização para motores de pesquisa(SEO)" } "categoryName54": { "message": "Otimização para motores de pesquisa(SEO)" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -61,5 +61,7 @@
"categoryName52": { "message": "Chat Live" }, "categoryName52": { "message": "Chat Live" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" }, "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Contabilitate" } "categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,5 +64,8 @@
"twitter" : { "message" : "Следите за новостями в Твиттере" }, "twitter" : { "message" : "Следите за новостями в Твиттере" },
"website" : { "message" : "Перейти на Wappalyzer.com" }, "website" : { "message" : "Перейти на Wappalyzer.com" },
"categoryPin": { "message": "Always show icon" }, "categoryPin": { "message": "Always show icon" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Бухгалтерский учёт" },
"categoryName56": { "message": "Криптомайнер" },
"categoryName57": { "message": "Генератор статических сайтов" }
} }

@ -1,68 +1,71 @@
{ {
"github": { "message": "Forknite Wappalyzer na GitHube!" }, "github": { "message": "Forknite Wappalyzer na GitHube!" },
"twitter": { "message": "Sledujte Wappalyzer na Twitteri" }, "twitter": { "message": "Sledujte Wappalyzer na Twitteri" },
"website": { "message": "Prejdite na adresu wappalyzer.com" }, "website": { "message": "Prejdite na adresu wappalyzer.com" },
"options": { "message": "Možnosti" }, "options": { "message": "Možnosti" },
"optionsSave": { "message": "Uložiť možnosti" }, "optionsSave": { "message": "Uložiť možnosti" },
"optionsSaved": { "message": "Uložené" }, "optionsSaved": { "message": "Uložené" },
"optionUpgradeMessage": { "message": "Povedzte mi o upgradoch" }, "optionUpgradeMessage": { "message": "Povedzte mi o upgradoch" },
"optionDynamicIcon": { "message": "Použiť ikonu aplikácie namiesto loga Wappalyzer" }, "optionDynamicIcon": { "message": "Použiť ikonu aplikácie namiesto loga Wappalyzer" },
"optionTracking": { "message": "Anonymne posielať správy o zistených aplikáciách na wappalyzer.com pre výskum" }, "optionTracking": { "message": "Anonymne posielať správy o zistených aplikáciách na wappalyzer.com pre výskum" },
"nothingToDo": { "message": "Nie je tu čo robiť." }, "nothingToDo": { "message": "Nie je tu čo robiť." },
"noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." }, "noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." },
"categoryPin": { "message": "Always show icon" }, "categoryPin": { "message": "Always show icon" },
"categoryName1": { "message": "CMS" }, "categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Message Board" }, "categoryName2": { "message": "Message Board" },
"categoryName3": { "message": "Správca databáz" }, "categoryName3": { "message": "Správca databáz" },
"categoryName4": { "message": "Dokumentačný nástroj" }, "categoryName4": { "message": "Dokumentačný nástroj" },
"categoryName5": { "message": "Widget" }, "categoryName5": { "message": "Widget" },
"categoryName6": { "message": "E-commerce" }, "categoryName6": { "message": "E-commerce" },
"categoryName7": { "message": "Fotogalérie" }, "categoryName7": { "message": "Fotogalérie" },
"categoryName8": { "message": "Wiki" }, "categoryName8": { "message": "Wiki" },
"categoryName9": { "message": "Hosting panely" }, "categoryName9": { "message": "Hosting panely" },
"categoryName10": { "message": "Analytika" }, "categoryName10": { "message": "Analytika" },
"categoryName11": { "message": "Blog" }, "categoryName11": { "message": "Blog" },
"categoryName12": { "message": "JavaScript Framework" }, "categoryName12": { "message": "JavaScript Framework" },
"categoryName13": { "message": "Issue Tracker" }, "categoryName13": { "message": "Issue Tracker" },
"categoryName14": { "message": "Video prehrávač" }, "categoryName14": { "message": "Video prehrávač" },
"categoryName15": { "message": "Systém komentárov" }, "categoryName15": { "message": "Systém komentárov" },
"categoryName16": { "message": "Captcha" }, "categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Font Script" }, "categoryName17": { "message": "Font Script" },
"categoryName18": { "message": "Web Framework" }, "categoryName18": { "message": "Web Framework" },
"categoryName19": { "message": "Rôzne" }, "categoryName19": { "message": "Rôzne" },
"categoryName20": { "message": "Editor" }, "categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" }, "categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Webový server" }, "categoryName22": { "message": "Webový server" },
"categoryName23": { "message": "Cache nástroj" }, "categoryName23": { "message": "Cache nástroj" },
"categoryName24": { "message": "Rich Text editor" }, "categoryName24": { "message": "Rich Text editor" },
"categoryName25": { "message": "JavaScript Grafika" }, "categoryName25": { "message": "JavaScript Grafika" },
"categoryName26": { "message": "Mobile Framework" }, "categoryName26": { "message": "Mobile Framework" },
"categoryName27": { "message": "Programovací jazyk" }, "categoryName27": { "message": "Programovací jazyk" },
"categoryName28": { "message": "Operačný systém" }, "categoryName28": { "message": "Operačný systém" },
"categoryName29": { "message": "Vyhľadávač" }, "categoryName29": { "message": "Vyhľadávač" },
"categoryName30": { "message": "Webmail" }, "categoryName30": { "message": "Webmail" },
"categoryName31": { "message": "CDN" }, "categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Marketingová automatizácia" }, "categoryName32": { "message": "Marketingová automatizácia" },
"categoryName33": { "message": "Rozšírenie webového servera" }, "categoryName33": { "message": "Rozšírenie webového servera" },
"categoryName34": { "message": "Databáza" }, "categoryName34": { "message": "Databáza" },
"categoryName35": { "message": "Mapa" }, "categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Reklamná sieť" }, "categoryName36": { "message": "Reklamná sieť" },
"categoryName37": { "message": "Sieťová služba" }, "categoryName37": { "message": "Sieťová služba" },
"categoryName38": { "message": "Media Server" }, "categoryName38": { "message": "Media Server" },
"categoryName39": { "message": "Webkamera" }, "categoryName39": { "message": "Webkamera" },
"categoryName40": { "message": "Tlačiareň" }, "categoryName40": { "message": "Tlačiareň" },
"categoryName41": { "message": "Platobný procesor" }, "categoryName41": { "message": "Platobný procesor" },
"categoryName42": { "message": "Správca tagov" }, "categoryName42": { "message": "Správca tagov" },
"categoryName43": { "message": "Platobná brána" }, "categoryName43": { "message": "Platobná brána" },
"categoryName44": { "message": "Build/CI systém" }, "categoryName44": { "message": "Build/CI systém" },
"categoryName45": { "message": "SCADA systém" }, "categoryName45": { "message": "SCADA systém" },
"categoryName46": { "message": "Vzdialený prístup" }, "categoryName46": { "message": "Vzdialený prístup" },
"categoryName47": { "message": "Vývojový nástroj" }, "categoryName47": { "message": "Vývojový nástroj" },
"categoryName48": { "message": "Sieťové úložisko" }, "categoryName48": { "message": "Sieťové úložisko" },
"categoryName49": { "message": "Čítačky feedu" }, "categoryName49": { "message": "Čítačky feedu" },
"categoryName50": { "message": "Systémy správy dokumentov" }, "categoryName50": { "message": "Systémy správy dokumentov" },
"categoryName51": { "message": "Nástroj na tvorbu vstupnej stránky" }, "categoryName51": { "message": "Nástroj na tvorbu vstupnej stránky" },
"categoryName52": { "message": "Živý chat" }, "categoryName52": { "message": "Živý chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -65,5 +65,7 @@
"categoryName52": { "message": "Canlı Sohbet" }, "categoryName52": { "message": "Canlı Sohbet" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" }, "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Muhasebe" } "categoryName55": { "message": "Muhasebe" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,5 +64,8 @@
"categoryName51": { "message": "Генератор лендінгів" }, "categoryName51": { "message": "Генератор лендінгів" },
"categoryName52": { "message": "Чат реального часу" }, "categoryName52": { "message": "Чат реального часу" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,5 +64,8 @@
"categoryName51": { "message": "Sahifa generatorlari" }, "categoryName51": { "message": "Sahifa generatorlari" },
"categoryName52": { "message": "Live Chat" }, "categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" }, "categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -1,69 +1,71 @@
{ {
"github": { "message": "查看 GitHub 上的 Wappalyzer" }, "github": { "message": "查看 GitHub 上的 Wappalyzer" },
"twitter": { "message": "关注 Twitter 上的 Wappalyzer" }, "twitter": { "message": "关注 Twitter 上的 Wappalyzer" },
"website": { "message": "访问 wappalyzer.com" }, "website": { "message": "访问 wappalyzer.com" },
"options": { "message": "选项" }, "options": { "message": "选项" },
"optionsSave": { "message": "保存选项" }, "optionsSave": { "message": "保存选项" },
"optionsSaved": { "message": "已保存" }, "optionsSaved": { "message": "已保存" },
"optionUpgradeMessage": { "message": "通知我更新详情" }, "optionUpgradeMessage": { "message": "通知我更新详情" },
"optionDynamicIcon": { "message": "使用应用程序而非 Wappalyzer 的标志" }, "optionDynamicIcon": { "message": "使用应用程序而非 Wappalyzer 的标志" },
"optionTracking": { "message": "发送匿名的应用报告到 wappalyzer.com 供研究使用" }, "optionTracking": { "message": "发送匿名的应用报告到 wappalyzer.com 供研究使用" },
"nothingToDo": { "message": "这儿啥也没有。" }, "nothingToDo": { "message": "这儿啥也没有。" },
"noAppsDetected": { "message": "未检测到任何应用。" }, "noAppsDetected": { "message": "未检测到任何应用。" },
"categoryPin": { "message": "Always show icon" }, "categoryPin": { "message": "Always show icon" },
"categoryName1": { "message": "内容管理系统CMS" }, "categoryName1": { "message": "内容管理系统CMS" },
"categoryName2": { "message": "消息板" }, "categoryName2": { "message": "消息板" },
"categoryName3": { "message": "数据库管理器" }, "categoryName3": { "message": "数据库管理器" },
"categoryName4": { "message": "文档工具" }, "categoryName4": { "message": "文档工具" },
"categoryName5": { "message": "插件" }, "categoryName5": { "message": "插件" },
"categoryName6": { "message": "电子商务" }, "categoryName6": { "message": "电子商务" },
"categoryName7": { "message": "照片相册" }, "categoryName7": { "message": "照片相册" },
"categoryName8": { "message": "维基" }, "categoryName8": { "message": "维基" },
"categoryName9": { "message": "主机面板" }, "categoryName9": { "message": "主机面板" },
"categoryName10": { "message": "分析" }, "categoryName10": { "message": "分析" },
"categoryName11": { "message": "博客" }, "categoryName11": { "message": "博客" },
"categoryName12": { "message": "JavaScript 框架" }, "categoryName12": { "message": "JavaScript 框架" },
"categoryName13": { "message": "问题跟踪器" }, "categoryName13": { "message": "问题跟踪器" },
"categoryName14": { "message": "视频播放器" }, "categoryName14": { "message": "视频播放器" },
"categoryName15": { "message": "评论系统" }, "categoryName15": { "message": "评论系统" },
"categoryName16": { "message": "验证码" }, "categoryName16": { "message": "验证码" },
"categoryName17": { "message": "字体脚本" }, "categoryName17": { "message": "字体脚本" },
"categoryName18": { "message": "Web 框架" }, "categoryName18": { "message": "Web 框架" },
"categoryName19": { "message": "杂项" }, "categoryName19": { "message": "杂项" },
"categoryName20": { "message": "编辑器" }, "categoryName20": { "message": "编辑器" },
"categoryName21": { "message": "学习管理系统LMS" }, "categoryName21": { "message": "学习管理系统LMS" },
"categoryName22": { "message": "Web 服务器" }, "categoryName22": { "message": "Web 服务器" },
"categoryName23": { "message": "缓存工具" }, "categoryName23": { "message": "缓存工具" },
"categoryName24": { "message": "富文本编辑器" }, "categoryName24": { "message": "富文本编辑器" },
"categoryName25": { "message": "JavaScript 图形库" }, "categoryName25": { "message": "JavaScript 图形库" },
"categoryName26": { "message": "移动框架" }, "categoryName26": { "message": "移动框架" },
"categoryName27": { "message": "编程语言" }, "categoryName27": { "message": "编程语言" },
"categoryName28": { "message": "操作系统" }, "categoryName28": { "message": "操作系统" },
"categoryName29": { "message": "搜索引擎" }, "categoryName29": { "message": "搜索引擎" },
"categoryName30": { "message": "网页邮箱" }, "categoryName30": { "message": "网页邮箱" },
"categoryName31": { "message": "内容分发网络CDN" }, "categoryName31": { "message": "内容分发网络CDN" },
"categoryName32": { "message": "营销自动化" }, "categoryName32": { "message": "营销自动化" },
"categoryName33": { "message": "Web 服务器扩展" }, "categoryName33": { "message": "Web 服务器扩展" },
"categoryName34": { "message": "数据库" }, "categoryName34": { "message": "数据库" },
"categoryName35": { "message": "地图" }, "categoryName35": { "message": "地图" },
"categoryName36": { "message": "广告网络" }, "categoryName36": { "message": "广告网络" },
"categoryName37": { "message": "网络服务" }, "categoryName37": { "message": "网络服务" },
"categoryName38": { "message": "媒体服务器" }, "categoryName38": { "message": "媒体服务器" },
"categoryName39": { "message": "网络摄像头" }, "categoryName39": { "message": "网络摄像头" },
"categoryName40": { "message": "打印机" }, "categoryName40": { "message": "打印机" },
"categoryName41": { "message": "支付处理器" }, "categoryName41": { "message": "支付处理器" },
"categoryName42": { "message": "标签管理器" }, "categoryName42": { "message": "标签管理器" },
"categoryName43": { "message": "付费壁障Paywall" }, "categoryName43": { "message": "付费壁障Paywall" },
"categoryName44": { "message": "构建/持续集成系统" }, "categoryName44": { "message": "构建/持续集成系统" },
"categoryName45": { "message": "数据采集与监控系统" }, "categoryName45": { "message": "数据采集与监控系统" },
"categoryName46": { "message": "远程访问" }, "categoryName46": { "message": "远程访问" },
"categoryName47": { "message": "开发工具" }, "categoryName47": { "message": "开发工具" },
"categoryName48": { "message": "网络存储" }, "categoryName48": { "message": "网络存储" },
"categoryName49": { "message": "信息流Feed阅读器" }, "categoryName49": { "message": "信息流Feed阅读器" },
"categoryName50": { "message": "文档管理系统" }, "categoryName50": { "message": "文档管理系统" },
"categoryName51": { "message": "着陆页构建器" }, "categoryName51": { "message": "着陆页构建器" },
"categoryName52": { "message": "在线聊天" }, "categoryName52": { "message": "在线聊天" },
"categoryName53": { "message": "客户关系管理CRM" }, "categoryName53": { "message": "客户关系管理CRM" },
"categoryName54": { "message": "搜索引擎优化SEO" }, "categoryName54": { "message": "搜索引擎优化SEO" },
"categoryName55": { "message": "财务" } "categoryName55": { "message": "财务" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -64,5 +64,8 @@
"categoryName51": { "message": "著陸頁產生器" }, "categoryName51": { "message": "著陸頁產生器" },
"categoryName52": { "message": "線上聊天" }, "categoryName52": { "message": "線上聊天" },
"categoryName53": { "message": "客戶關係管理系統CRM" }, "categoryName53": { "message": "客戶關係管理系統CRM" },
"categoryName54": { "message": "SEO" } "categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Accounting" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" }
} }

@ -148,7 +148,7 @@ body {
.empty { .empty {
display: flex; display: flex;
height: 16rem; height: 14.5rem;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
} }

@ -3,45 +3,44 @@
if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) { if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) {
try { try {
var html = new XMLSerializer().serializeToString(document); sendMessage('init', {});
if ( html.length > 500000 ) { // HTML
html = html.substring(0, 250000) + html.substring(html.length - 250000, html.length); var html = new XMLSerializer().serializeToString(document).split('\n');
}
html = html
.slice(0, 1000).concat(html.slice(html.length - 1000))
.map(line => line.substring(0, 1000))
.join('\n');
// Scripts
const scripts = Array.prototype.slice const scripts = Array.prototype.slice
.apply(document.scripts) .apply(document.scripts)
.filter(script => script.src) .filter(script => script.src)
.map(script => script.src); .map(script => script.src)
.filter(script => script.indexOf('data:text/javascript;') !== 0);
browser.runtime.sendMessage({ sendMessage('analyze', { html, scripts });
id: 'analyze',
subject: { html, scripts },
source: 'content.js'
});
// JavaScript variables
const script = document.createElement('script'); const script = document.createElement('script');
script.onload = () => { script.onload = () => {
addEventListener('message', event => { const onMessage = event => {
if ( event.data.id !== 'js' ) { if ( event.data.id !== 'js' ) {
return; return;
} }
browser.runtime.sendMessage({ removeEventListener('message', onMessage);
id: 'analyze',
subject: { sendMessage('analyze', { js: event.data.js });
js: event.data.js
}, script.remove();
source: 'content.js' };
});
}, true); addEventListener('message', onMessage);
( chrome || browser ).runtime.sendMessage({ sendMessage('get_js_patterns', {}, response => {
id: 'init_js',
subject: {},
source: 'content.js'
}, response => {
if ( response ) { if ( response ) {
postMessage({ postMessage({
id: 'patterns', id: 'patterns',
@ -51,19 +50,22 @@ if ( typeof browser !== 'undefined' && typeof document.body !== 'undefined' ) {
}); });
}; };
script.setAttribute('id', 'wappalyzer');
script.setAttribute('src', browser.extension.getURL('js/inject.js')); script.setAttribute('src', browser.extension.getURL('js/inject.js'));
document.body.appendChild(script); document.body.appendChild(script);
} catch (e) { } catch (e) {
log(e); sendMessage('log', e);
} }
} }
function log(message) { function sendMessage(id, subject, callback) {
browser.runtime.sendMessage({ ( chrome || browser ).runtime.sendMessage({
id: 'log', id,
message, subject,
source: 'content.js' source: 'content.js'
}); }, callback || ( () => {} ));
} }
// https://stackoverflow.com/a/44774834
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
undefined;

@ -8,9 +8,9 @@
const wappalyzer = new Wappalyzer(); const wappalyzer = new Wappalyzer();
var tabCache = {}; var tabCache = {};
var headersCache = {};
var categoryOrder = []; var categoryOrder = [];
var options = {}; var options = {};
var robotsTxtQueue = {};
browser.tabs.onRemoved.addListener(tabId => { browser.tabs.onRemoved.addListener(tabId => {
tabCache[tabId] = null; tabCache[tabId] = null;
@ -19,7 +19,7 @@ browser.tabs.onRemoved.addListener(tabId => {
/** /**
* Get a value from localStorage * Get a value from localStorage
*/ */
function getOption(name, defaultValue) { function getOption(name, defaultValue = null) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
const callback = item => { const callback = item => {
options[name] = item.hasOwnProperty(name) ? item[name] : defaultValue; options[name] = item.hasOwnProperty(name) ? item[name] : defaultValue;
@ -117,48 +117,43 @@ getOption('version')
getOption('dynamicIcon', true); getOption('dynamicIcon', true);
getOption('pinnedCategory'); getOption('pinnedCategory');
// Run content script // Run content script on all tabs
var callback = tabs => { browser.tabs.query({ url: [ 'http://*/*', 'https://*/*' ] })
tabs.forEach(tab => { .then(tabs => {
if ( tab.url.match(/^https?:\/\//) ) { tabs.forEach(tab => {
browser.tabs.executeScript(tab.id, { browser.tabs.executeScript(tab.id, {
file: 'js/content.js' file: '../js/content.js'
}); });
} })
}) })
};
browser.tabs.query({})
.then(callback)
.catch(error => wappalyzer.log(error, 'driver', 'error')); .catch(error => wappalyzer.log(error, 'driver', 'error'));
// Capture response headers // Capture response headers
browser.webRequest.onCompleted.addListener(request => { browser.webRequest.onCompleted.addListener(request => {
var responseHeaders = {}; const headers = {};
if ( request.responseHeaders ) { if ( request.responseHeaders ) {
var url = wappalyzer.parseUrl(request.url); const url = wappalyzer.parseUrl(request.url);
request.responseHeaders.forEach(function(header) { browser.tabs.query({ url: [ url.href ] })
if ( !responseHeaders[header.name.toLowerCase()] ) { .then(tabs => {
responseHeaders[header.name.toLowerCase()] = [] const tab = tabs[0] || null;
}
responseHeaders[header.name.toLowerCase()].push(header.value || '' + header.binaryValue);
});
if ( headersCache.length > 50 ) { if ( tab ) {
headersCache = {}; request.responseHeaders.forEach(header => {
} const name = header.name.toLowerCase();
if ( /text\/html/.test(responseHeaders['content-type'][0]) ) { headers[name] = headers[name] || [];
if ( headersCache[url.canonical] === undefined ) {
headersCache[url.canonical] = {};
}
Object.keys(responseHeaders).forEach(header => { headers[name].push(( header.value || header.binaryValue || '' ).toString());
headersCache[url.canonical][header] = responseHeaders[header].slice(); });
});
} if ( headers['content-type'] && /\/x?html/.test(headers['content-type'][0]) ) {
wappalyzer.analyze(url, { headers }, { tab });
}
}
})
.catch(error => wappalyzer.log(error, 'driver', 'error'));
} }
}, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]); }, { urls: [ 'http://*/*', 'https://*/*' ], types: [ 'main_frame' ] }, [ 'responseHeaders' ]);
@ -166,26 +161,24 @@ browser.webRequest.onCompleted.addListener(request => {
( chrome || browser ).runtime.onMessage.addListener((message, sender, sendResponse) => { ( chrome || browser ).runtime.onMessage.addListener((message, sender, sendResponse) => {
if ( typeof message.id != 'undefined' ) { if ( typeof message.id != 'undefined' ) {
if ( message.id !== 'log' ) { if ( message.id !== 'log' ) {
wappalyzer.log('Message received' + ( message.source ? ' from ' + message.source : '' ) + ': ' + message.id, 'driver'); wappalyzer.log('Message' + ( message.source ? ' from ' + message.source : '' ) + ': ' + message.id, 'driver');
} }
var url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : '');
var response; var response;
switch ( message.id ) { switch ( message.id ) {
case 'log': case 'log':
wappalyzer.log(message.message, message.source); wappalyzer.log(message.subject, message.source);
break; break;
case 'analyze': case 'init':
var url = wappalyzer.parseUrl(sender.tab.url); browser.cookies.getAll({ domain: '.' + url.hostname })
.then(cookies => wappalyzer.analyze(url, { cookies }, { tab: sender.tab }));
if ( headersCache[url.canonical] !== undefined ) {
message.subject.headers = headersCache[url.canonical];
}
wappalyzer.analyze(url, message.subject, { break;
tab: sender.tab case 'analyze':
}); wappalyzer.analyze(url, message.subject, { tab: sender.tab });
break; break;
case 'ad_log': case 'ad_log':
@ -205,7 +198,7 @@ browser.webRequest.onCompleted.addListener(request => {
setOption(message.key, message.value); setOption(message.key, message.value);
break; break;
case 'init_js': case 'get_js_patterns':
response = { response = {
patterns: wappalyzer.jsPatterns patterns: wappalyzer.jsPatterns
}; };
@ -216,6 +209,8 @@ browser.webRequest.onCompleted.addListener(request => {
sendResponse(response); sendResponse(response);
} }
return true;
}); });
wappalyzer.driver.document = document; wappalyzer.driver.document = document;
@ -233,51 +228,55 @@ wappalyzer.driver.log = (message, source, type) => {
wappalyzer.driver.displayApps = (detected, meta, context) => { wappalyzer.driver.displayApps = (detected, meta, context) => {
var tab = context.tab; var tab = context.tab;
tabCache[tab.id] = tabCache[tab.id] || { detected: [] }; if ( tab === undefined ) {
return;
}
tabCache[tab.id].detected = detected; tabCache[tab.id] = tabCache[tab.id] || {
detected: []
};
if ( Object.keys(detected).length ) { tabCache[tab.id].detected = detected;
var appName, found = false;
// Find the main application to display var appName, found = false;
[ options.pinnedCategory ].concat(categoryOrder).forEach(match => {
Object.keys(detected).forEach(appName => {
var app = detected[appName];
app.props.cats.forEach(category => { // Find the main application to display
if ( category === match && !found ) { [ options.pinnedCategory ].concat(categoryOrder).forEach(match => {
var icon = app.props.icon || 'default.svg'; Object.keys(detected).forEach(appName => {
var app = detected[appName];
if ( !options.dynamicIcon ) { app.props.cats.forEach(category => {
icon = 'default.svg'; if ( category === match && !found ) {
} var icon = app.props.icon || 'default.svg';
if ( /\.svg$/i.test(icon) ) { if ( !options.dynamicIcon ) {
icon = 'converted/' + icon.replace(/\.svg$/, '.png'); icon = 'default.svg';
} }
try { if ( /\.svg$/i.test(icon) ) {
browser.pageAction.setIcon({ icon = 'converted/' + icon.replace(/\.svg$/, '.png');
tabId: tab.id, }
path: '../images/icons/' + icon
});
} catch(e) {
// Firefox for Android does not support setIcon see https://bugzilla.mozilla.org/show_bug.cgi?id=1331746
}
found = true; try {
browser.pageAction.setIcon({
tabId: tab.id,
path: '../images/icons/' + icon
});
} catch(e) {
// Firefox for Android does not support setIcon see https://bugzilla.mozilla.org/show_bug.cgi?id=1331746
} }
});
found = true;
}
}); });
}); });
});
if ( typeof chrome !== 'undefined' ) { if ( typeof chrome !== 'undefined' ) {
// Browser polyfill doesn't seem to work here // Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id); chrome.pageAction.show(tab.id);
} else { } else {
browser.pageAction.show(tab.id); browser.pageAction.show(tab.id);
}
} }
}; };
@ -285,7 +284,11 @@ wappalyzer.driver.displayApps = (detected, meta, context) => {
* Fetch and cache robots.txt for host * Fetch and cache robots.txt for host
*/ */
wappalyzer.driver.getRobotsTxt = (host, secure = false) => { wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
return new Promise((resolve, reject) => { if ( robotsTxtQueue.hasOwnProperty(host) ) {
return robotsTxtQueue[host];
}
robotsTxtQueue[host] = new Promise((resolve, reject) => {
getOption('tracking', true) getOption('tracking', true)
.then(tracking => { .then(tracking => {
if ( !tracking ) { if ( !tracking ) {
@ -297,34 +300,31 @@ wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
robotsTxtCache = robotsTxtCache || {}; robotsTxtCache = robotsTxtCache || {};
if ( host in robotsTxtCache ) { if ( host in robotsTxtCache ) {
resolve(robotsTxtCache[host]); return resolve(robotsTxtCache[host]);
} else {
const url = 'http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt';
fetch('http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt')
.then(response => {
if ( !response.ok ) {
if ( response.status === 404 ) {
return '';
} else {
throw 'GET ' + response.url + ' was not ok';
}
}
return response.text();
})
.then(robotsTxt => {
robotsTxtCache[host] = wappalyzer.parseRobotsTxt(robotsTxt);
setOption('robotsTxtCache', robotsTxtCache);
resolve(robotsTxtCache[host]);
})
.catch(reject);
} }
const timeout = setTimeout(() => resolve([]), 3000);
fetch('http' + ( secure ? 's' : '' ) + '://' + host + '/robots.txt', { redirect: 'follow' })
.then(response => {
clearTimeout(timeout);
return response.ok ? response.text() : '';
})
.then(robotsTxt => {
robotsTxtCache[host] = wappalyzer.parseRobotsTxt(robotsTxt);
setOption('robotsTxtCache', robotsTxtCache);
resolve(robotsTxtCache[host]);
})
.catch(err => resolve([]));
}); });
}); });
}); })
.finally(() => delete robotsTxtQueue[host]);
return robotsTxtQueue[host];
}; };
/** /**

@ -890,7 +890,7 @@ var exports = {};
var _pageTags; var _pageTags;
var INIT_MS_BW_SEARCHES = 2000; var INIT_MS_BW_SEARCHES = 2000;
var PAGE_TAG_RE = new RegExp('gpt|oascentral'); var PAGE_TAG_RE = new RegExp('gpt|oascentral');
var POST_MSG_ID = '1511804838-25881-9878-26947-14879'; var POST_MSG_ID = '1519242200-10756-12873-1462-13403';
var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)'); var AD_SERVER_RE = new RegExp('^(google_ads_iframe|oas_frame|atwAdFrame)');
function getPageTags(doc) { function getPageTags(doc) {

@ -1,10 +1,14 @@
(function() { (() => {
try { try {
addEventListener('message', (event => { addEventListener('message', onMessage);
function onMessage(event) {
if ( event.data.id !== 'patterns' ) { if ( event.data.id !== 'patterns' ) {
return; return;
} }
removeEventListener('message', onMessage);
const patterns = event.data.patterns || {}; const patterns = event.data.patterns || {};
const js = {}; const js = {};
@ -20,7 +24,7 @@
for ( let index in patterns[appName][chain] ) { for ( let index in patterns[appName][chain] ) {
const value = detectJs(chain); const value = detectJs(chain);
if ( value ) { if ( value && patterns[appName][chain].hasOwnProperty(index) ) {
js[appName][chain][index] = value; js[appName][chain][index] = value;
} }
} }
@ -30,13 +34,9 @@
} }
postMessage({ id: 'js', js }, '*'); postMessage({ id: 'js', js }, '*');
}), false); }
} catch(e) {
// Fail quietly
}
function detectJs(chain) { function detectJs(chain) {
try {
const properties = chain.split('.'); const properties = chain.split('.');
var value = properties.length ? window : null; var value = properties.length ? window : null;
@ -44,7 +44,7 @@
for ( let i = 0; i < properties.length; i ++ ) { for ( let i = 0; i < properties.length; i ++ ) {
var property = properties[i]; var property = properties[i];
if ( value.hasOwnProperty(property) ) { if ( value && value.hasOwnProperty(property) ) {
value = value[property]; value = value[property];
} else { } else {
value = null; value = null;
@ -54,8 +54,8 @@
} }
return typeof value === 'string' || typeof value === 'number' ? value : !!value; return typeof value === 'string' || typeof value === 'number' ? value : !!value;
} catch(e) {
// Fail quietly
} }
} catch(e) {
// Fail quietly
} }
}()); })();

@ -4,7 +4,7 @@
"author": "Elbert Alias", "author": "Elbert Alias",
"homepage_url": "https://www.wappalyzer.com", "homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies", "description": "Identify web technologies",
"version": "5.4.5", "version": "5.4.15",
"default_locale": "en", "default_locale": "en",
"manifest_version": 2, "manifest_version": 2,
"icons": { "icons": {
@ -62,6 +62,7 @@
"open_in_tab": false "open_in_tab": false
}, },
"permissions": [ "permissions": [
"cookies",
"storage", "storage",
"tabs", "tabs",
"webRequest", "webRequest",
@ -71,5 +72,3 @@
], ],
"content_security_policy": "script-src 'self'; object-src 'self'" "content_security_policy": "script-src 'self'; object-src 'self'"
} }

@ -0,0 +1,5 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 240 240">
<path fill="#00A5E9" d="M120 28.8l-89.4 32 13.7 118 75.7 42 75.7-42 13.7-118"/>
<path fill="#018BD1" d="M120 28.8V221l75.7-42 13.7-118"/>
<path fill="#FFF" d="M120 50L64 175.3h21l11.2-28h47.4l11.2 28h20.8L120 50zm16.3 80h-32.6L120 90.7l16.3 39.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 326 B

@ -1,74 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <svg xmlns="http://www.w3.org/2000/svg" width="355.809" height="355.809" viewBox="0 0 355.809 355.809"><path d="M177.367 0L9.964 58.913 36.416 278.24l141.129 77.568 141.856-78.619 26.444-219.32L177.367 0z" fill="#b3b3b3"/><path d="M329.149 70.545L176.976 18.654v318.622L304.504 266.7l24.645-196.154z" fill="#af2b2d"/><path d="M28.749 71.482l22.667 196.153 125.559 69.641V18.647L28.749 71.482z" fill="#df2e31"/><path d="M212.249 177.131l-34.995-73.08-30.808 73.08h65.803zm13.342 30.729h-92.764l-20.752 51.907-38.603.714L176.977 30.224 284.09 260.48h-35.779l-22.72-52.621z" fill="#f2f2f2"/><path d="M176.976 30.224l.276 73.827 34.96 73.136h-35.157l-.079 30.625 48.613.048 22.721 52.63 36.936.685-108.27-230.951z" fill="#b3b3b3"/></svg>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg2"
version="1.1"
inkscape:version="0.48.4 r9939"
width="335.88126"
height="355.80875"
xml:space="preserve"
sodipodi:docname="AngularJS-Shield.svg"
inkscape:export-filename="/usr/local/google/home/stephenfluin/AngularJS-Shield.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
id="defs6" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1393"
inkscape:window-height="697"
id="namedview4"
showgrid="false"
inkscape:zoom="0.25757162"
inkscape:cx="171.15375"
inkscape:cy="177.21499"
inkscape:window-x="2290"
inkscape:window-y="312"
inkscape:window-maximized="0"
inkscape:current-layer="g10"
fit-margin-top="0"
fit-margin-left="0"
fit-margin-right="0"
fit-margin-bottom="0" /><g
id="g10"
inkscape:groupmode="layer"
inkscape:label="ink_ext_XXXXXX"
transform="matrix(1.25,0,0,-1.25,-188.84625,636.71875)"><g
id="g12"
transform="scale(0.1,0.1)"><path
d="M 2850,5093.75 1510.77,4622.45 1722.39,2867.82 2851.42,2247.28 3986.27,2876.23 4197.82,4630.79 2850,5093.75 z"
style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path14"
inkscape:connector-curvature="0" /><path
d="m 4064.25,4529.39 -1217.38,415.13 0,-2548.98 1020.22,564.62 197.16,1569.23 z"
style="fill:#af2b2d;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path16"
inkscape:connector-curvature="0" /><path
d="m 1661.05,4521.89 181.34,-1569.22 1004.47,-557.13 0,2549.03 -1185.81,-422.68 z"
style="fill:#df2e31;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path18"
inkscape:connector-curvature="0" /><path
d="m 3129.05,3676.7 -279.96,584.64 -246.46,-584.64 526.42,0 z m 106.74,-245.83 -742.11,0 -166.02,-415.26 -308.82,-5.71 828.04,1842.06 856.9,-1842.06 -286.23,0 -181.76,420.97 z"
style="fill:#f2f2f2;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path20"
inkscape:connector-curvature="0" /><path
d="m 2846.87,4851.96 2.21,-590.62 279.67,-585.09 -281.25,0 -0.63,-245 388.9,-0.38 181.77,-421.04 295.49,-5.48 -866.16,1847.61 z"
style="fill:#b3b3b3;fill-opacity:1;fill-rule:nonzero;stroke:none"
id="path22"
inkscape:connector-curvature="0" /></g></g></svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 733 B

@ -0,0 +1,86 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 1423.3867 867.05603"
height="867.05603"
width="1423.3867"
xml:space="preserve"
id="svg2"
version="1.1"><metadata
id="metadata8"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs6"><clipPath
id="clipPath18"
clipPathUnits="userSpaceOnUse"><path
id="path16"
d="M 0,650.292 H 1067.54 V 0 H 0 Z" /></clipPath></defs><g
transform="matrix(1.3333333,0,0,-1.3333333,0,867.056)"
id="g10"><g
id="g12"><g
clip-path="url(#clipPath18)"
id="g14"><g
transform="translate(321.5199,376.8768)"
id="g20"><path
id="path22"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 c -19.417,43.75 -56.917,76.25 -111.875,95.208 3.293,105.443 119.212,164.151 230.523,104.237 5.182,8.536 10.12,17.324 15.673,25.704 24.62,37.152 70.92,55.856 111.8,45.381 46.247,-11.851 84.023,-49.071 84.584,-94.011 l 0.013,-425.419 c -22.768,0 -53.205,-0.038 -78.47,0.007 -135.065,0.24 -270.144,-0.609 -405.191,1.127 -97.922,1.259 -170.073,77.053 -168.553,173.063 1.09,68.862 45.743,129.853 112.195,153.245 66.395,23.372 145.569,-0.596 189.707,-53.182" /></g><g
transform="translate(679.7488,549.7274)"
id="g24"><path
id="path26"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 c 107.306,0 214.612,-0.1 321.918,0.111 15.531,0.031 29.755,-2.911 42.227,-12.489 21.864,-16.791 28.329,-45.437 20.376,-67.146 -9.026,-24.64 -29.931,-40.704 -56.956,-40.852 -56.475,-0.309 -112.953,-0.107 -169.43,-0.11 C 105.424,-120.489 52.712,-120.487 0,-120.487 Z" /></g><g
transform="translate(679.7488,399.1187)"
id="g28"><path
id="path30"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 c 107.306,0 214.612,-0.1 321.918,0.111 15.531,0.031 29.755,-2.911 42.227,-12.489 21.864,-16.791 28.329,-45.437 20.376,-67.146 -9.026,-24.64 -29.931,-40.704 -56.956,-40.852 -56.475,-0.31 -112.953,-0.107 -169.43,-0.11 C 105.424,-120.489 52.712,-120.487 0,-120.487 Z" /></g><g
transform="translate(679.7488,248.5099)"
id="g32"><path
id="path34"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 c 107.306,0 214.612,-0.1 321.918,0.111 15.531,0.031 29.755,-2.911 42.227,-12.489 21.864,-16.791 28.329,-45.436 20.376,-67.146 -9.026,-24.64 -29.931,-40.704 -56.956,-40.852 -56.475,-0.309 -112.953,-0.107 -169.43,-0.11 C 105.424,-120.489 52.712,-120.487 0,-120.487 Z" /></g><g
transform="translate(379.3446,14.7246)"
id="g36"><path
id="path38"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 c 1.562,-0.828 4.112,-1.239 7.653,-1.239 h 18.43 c 7.496,0 11.245,2.685 11.245,8.059 v 13.175 c 0,5.166 -3.177,8.061 -9.527,8.681 H 6.091 C -0.366,27.951 -3.592,25.057 -3.592,19.995 V 6.82 C -3.592,3.512 -2.396,1.24 0,0 m -17.077,7.131 v 9.765 c 0,7.335 1.606,13.225 4.82,17.669 3.625,5.062 8.963,7.595 16.011,7.595 h 33.574 v 5.503 c 0,1.468 -0.518,2.751 -1.555,3.851 -1.036,1.099 -2.228,1.651 -3.574,1.651 H -17.077 V 66.65 h 48.205 c 10.642,0 17.101,-5.013 19.375,-15.035 0.206,-1.654 0.31,-2.893 0.31,-3.719 V 6.045 c 0,-3.72 -0.983,-7.183 -2.945,-10.385 -4.34,-6.924 -9.973,-10.385 -16.895,-10.385 H 3.848 c -4.03,0 -7.958,1.395 -11.78,4.185 -3.824,2.79 -6.459,6.097 -7.905,9.921 -0.828,2.271 -1.24,4.855 -1.24,7.75" /></g><g
transform="translate(440.096,20.6152)"
id="g40"><path
id="path42"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 v 40.3 c 0,6.716 2.51,11.882 7.537,15.5 4.655,3.305 11.028,4.96 19.117,4.96 H 63.601 V 47.274 H 26.51 c -7.014,0 -10.518,-2.901 -10.518,-8.704 V 3.129 c 0,-2.8 1.014,-5.21 3.045,-7.23 2.027,-2.019 4.704,-3.029 8.027,-3.029 H 63.785 V -20.615 H 27.021 c -5.393,0 -10.05,0.929 -13.97,2.79 C 4.348,-13.693 0,-7.75 0,0" /></g><g
transform="translate(527.9857,42.0049)"
id="g44"><path
id="path46"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 c 0,-2.274 1.085,-4.548 3.255,-6.82 l 33.79,-35.185 H 55.743 L 15.243,0.165 54.067,39.37 H 34.875 L 3.255,7.44 C 1.085,5.271 0,2.79 0,0 m -14.26,66.495 h 13.64 v -108.5 h -13.64 z" /></g><g
transform="translate(593.7211)"
id="g48"><path
id="path50"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="M 0,0 V 108.5 H 13.485 V 81.375 H 27.59 V 67.89 H 13.485 V 0 Z" /></g><g
transform="translate(654.8765,13.4854)"
id="g52"><path
id="path54"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 h 22.022 c 6.351,0 9.526,3.47 9.526,10.414 V 44.61 c 0,6.53 -3.175,9.794 -9.526,9.794 L 0,54.404 c -6.559,0 -9.837,-3.264 -9.837,-9.794 V 10.881 C -9.837,3.625 -6.559,0 0,0 m -23.322,6.51 v 42.314 c 0,11.16 6.045,17.462 18.135,18.91 0.412,0 1.032,0.051 1.86,0.156 h 26.66 c 0.722,0 1.807,-0.105 3.255,-0.31 12.296,-1.759 18.444,-8.01 18.444,-18.756 V 6.51 c 0,-7.441 -3.719,-13.28 -11.159,-17.515 -2.894,-1.654 -6.408,-2.48 -10.54,-2.48 h -25.42 c -10.335,0 -17.103,4.906 -20.306,14.724 -1.137,3.307 -1.448,5.063 -0.929,5.271" /></g><g
transform="translate(709.9087)"
id="g56"><path
id="path58"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 v 59.83 c 0,1.342 0.102,2.892 0.31,4.65 0.62,5.372 2.143,9.273 4.573,11.703 2.427,2.426 6.328,4.053 11.702,4.882 1.342,0.206 2.531,0.31 3.565,0.31 h 7.595 V 67.89 h -6.738 c -5.016,0 -7.522,-2.746 -7.522,-8.235 L 13.485,0 Z" /></g><g
transform="translate(747.6742,0.4951)"
id="g60"><path
id="path62"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 v 13.485 h 47.101 c 4.456,0.724 6.684,3.619 6.684,8.68 v 4.34 H 19.74 C 14.146,26.505 9.457,28.416 5.675,32.24 1.892,36.062 0,40.765 0,46.345 V 80.88 H 13.485 V 50.064 c 0,-6.717 3.228,-10.074 9.685,-10.074 h 21.242 c 6.249,0 9.373,2.892 9.373,8.68 V 80.88 H 67.27 V 22.939 C 67.27,15.914 65.512,10.385 62,6.354 58.176,2.119 52.802,0 45.88,0 Z" /></g><g
transform="translate(307.8782,13.4588)"
id="g64"><path
id="path66"
style="fill:#0054a6;fill-opacity:1;fill-rule:nonzero;stroke:none"
d="m 0,0 h 23.853 c 0.728,0 1.196,0.051 1.404,0.155 3.22,0.723 5.195,3.256 5.925,7.602 0,0.102 0.05,0.258 0.154,0.467 V 45.3 c 0,6.001 -3.014,9 -9.042,9 H -1.559 c -4.885,0 -7.327,-2.896 -7.327,-8.687 V 9.775 c 0,-2.69 0.832,-4.992 2.495,-6.905 C -4.728,0.955 -2.599,0 0,0 M -22.345,9.437 V 94.831 H -8.886 V 67.759 H 22.61 c 12.514,0 19.754,-5.569 21.719,-16.707 0.309,-1.755 0.466,-2.993 0.466,-3.714 V 7.735 c 0,-9.181 -4.075,-15.574 -12.221,-19.183 -2.992,-1.341 -5.673,-2.011 -8.045,-2.011 H -2.079 c -5.777,0 -10.623,2.422 -14.542,7.271 -3.817,4.537 -5.724,9.746 -5.724,15.625" /></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 706 B

After

Width:  |  Height:  |  Size: 763 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 114 112" style="enable-background:new 0 0 114 112;" xml:space="preserve">
<style type="text/css">
.st0{fill:#00C4B3;}
.st1{fill:#22D3C5;}
.st2{fill:#0075C9;}
.st3{fill:#00A8E1;}
</style>
<path class="st0" d="M30.1,30.6L23,23.5v51.2l0.1,2.4c0,1.1,0.2,2.4,0.6,3.7l56.2,19.8l14-6.2l0,0L30.1,30.6z"/>
<path class="st1" d="M23.7,80.8L23.7,80.8L23.7,80.8L23.7,80.8z M93.9,94.4l-14,6.2L23.8,80.8c1.1,4.1,3.4,8.7,6,11.3l18.3,18.2
l40.8,0.1L93.9,94.4L93.9,94.4z"/>
<path class="st2" d="M23.2,23.5l-21.8,33c-1.8,1.9-0.9,5.9,2,8.9L16,78.1l7.9,2.8c-0.3-1.3-0.6-2.6-0.6-3.7l-0.1-2.4L23.2,23.5
L23.2,23.5z"/>
<path class="st2" d="M80.3,24.1c-1.3-0.3-2.6-0.5-3.7-0.6l-2.5-0.1H23l70.9,70.9l0,0l6.2-14L80.3,24.1z"/>
<path class="st3" d="M80.2,24.1C80.3,24.1,80.3,24.1,80.2,24.1L80.2,24.1C80.3,24.1,80.3,24.1,80.2,24.1z M91.6,30.1
c-2.6-2.6-7.1-5-11.3-6l19.8,56.2l-6.2,14l0,0l15.2-4.9V47.7L91.6,30.1z"/>
<path class="st0" d="M77.5,16.3L64.8,3.7c-2.9-2.9-6.9-3.8-8.9-2l-33,21.8H74l2.5,0.1c1.1,0,2.4,0.2,3.7,0.6L77.5,16.3z"/>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 270 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 755 826" enable-background="new 0 0 755 826" xml:space="preserve">
<path fill="#00598E" d="M539.2,167.8c-39.8-24.8-77.2-34.5-114.8-59.2c-23.2-15.8-55.5-53.2-82.5-85.5c-5.2,51.8-21,72.8-39,87.8
c-38.2,30-62.2,39-95.2,57C179.9,182.1,29.2,272.1,29.2,465.6s162.8,336,343.5,336s337.5-131.2,337.5-330S563.2,182.8,539.2,167.8z"
/>
<path fill="#FFFFFF" d="M478.2,633.5c12,0,24.8,0.8,33.8,6.8s14.2,19.5,17.2,27s0,12-6,15c-5.2,3-6,1.5-11.2-8.2s-9.8-19.5-36-19.5
s-34.5,9-47.2,19.5s-17.2,14.2-21.8,8.2s-3-12,5.2-19.5s21.8-19.5,34.5-24.8S466.2,633.5,478.2,633.5L478.2,633.5z"/>
<path fill="#FFFFFF" d="M353.8,719c15,12,37.5,21.8,85.5,21.8S521,727.2,536,716c6.8-5.2,9.8-0.8,10.5,2.2s2.2,7.5-3,12.8
c-3.8,3.8-38.2,27.8-78.8,31.5s-95.2,6-128.2-24c-5.2-5.2-3.8-12.8,0-15.8s6.8-5.2,11.2-5.2S351.5,717.5,353.8,719L353.8,719z"/>
<path fill="#0073BA" d="M170,662c57-0.8,67.5-10.5,117.8-33c271.5-121.5,321.8-232.5,331.5-258s24-66.8,9-112.5
c-2.9-8.8-5-15.9-6.5-21.6c-36.1-40.3-71.9-62.4-82.7-69.1c-39-24.8-77.3-34.5-114.8-59.2c-23.2-15-55.5-53.2-82.5-85.5
c-5.2,51.8-20.2,73.5-39,87.8c-38.2,30-62.2,39-95.2,57C179.8,182.8,29,272,29,465.5c0,61.8,16.6,118.4,45.1,166.8l7.4-0.3
C97.2,646.2,122,662.8,170,662z"/>
<path fill="#004975" d="M539,167.8c-39-24.8-77.2-34.5-114.8-59.2c-23.2-15-55.5-53.2-82.5-85.5c-5.2,51.8-20.2,73.5-39,87.8
c-38.2,30-62.2,39-95.2,57C179.8,182.8,29,272,29,465.5c0,61.8,16.6,118.4,45.1,166.8c60.7,103.2,175.4,169.2,298.4,169.2
c180.8,0,337.5-131.2,337.5-330c0-109.1-44.3-185.5-88.3-234.6C585.6,196.5,549.8,174.5,539,167.8z M630.2,255.5
c49.2,61.6,74.2,134.2,74.2,216c0,47.4-9,92.2-26.8,133.2c-16.9,38.8-41.2,73.2-72.3,102.3c-61.5,57.4-144.1,89-232.7,89
c-43.8,0-86.8-8.4-127.8-24.9c-40.3-16.2-76.5-39.4-107.8-69C70.9,639.7,34.6,555.7,34.6,465.5c0-80.3,26.1-151.7,77.5-212.2
c39.3-46.2,81.7-71.8,98-80.6c8-4.3,15.4-8.2,22.6-11.9c22.6-11.6,44-22.6,73.4-45.6c15.7-11.9,32.4-30.8,39.5-78.7
c24.8,29.5,53.5,62.6,75.5,76.8c19.5,12.9,39.5,21.9,58.8,30.6c18.3,8.2,37.2,16.8,55.9,28.7c0,0,0.7,0.4,0.7,0.4
C591.4,207.1,620.6,243.6,630.2,255.5z"/>
<path fill="#93C5E4" d="M345.5,38c10.5,30.8,9,46.5,9,53.2s-3.8,24.8-15.8,33.8c-5.2,3.8-6.8,6.8-6.8,7.5c0,3,6.8,5.2,6.8,12
c0,8.2-3.8,24.8-43.5,64.5s-96.8,75-141,96.8S89,326,83,315.5s2.2-33.8,30-64.5s115.5-75,115.5-75L338,99.5l6-29.2"/>
<path fill="#FFFFFF" d="M345.5,37.2c-6.8,49.5-21.8,64.5-42,80.2c-33.8,25.5-66.8,41.2-74.2,45c-19.5,9.8-90,48.8-126.8,105
c-11.2,17.2,0,24,2.2,25.5s27.8,4.5,82.5-28.5S266,212,296.8,179.8c16.5-17.2,18.8-27,18.8-31.5c0-5.2-3.8-7.5-9.8-9
c-3-0.8-3.8-2.2,0-4.5S325.2,125,329,122s21.8-15,22.5-34.5S350.8,54.5,345.5,37.2L345.5,37.2z"/>
<path fill="#FFFFFF" d="M176.8,582.5c0.8-58.5,55.5-113.2,124.5-114c87.8-0.8,148.5,87,192.8,86.2c37.5-0.8,109.5-74.2,144.8-74.2
c37.5,0,48,39,48,62.2s-7.5,65.2-25.5,91.5s-29.2,36-50.2,34.5c-27-2.2-81-86.2-115.5-87.8c-43.5-1.5-138,90.8-212.2,90.8
c-45,0-58.5-6.8-73.5-16.5C187.2,639.5,176,615.5,176.8,582.5L176.8,582.5z"/>
<path fill="none" d="M628.2,258.5c15,45.8,0.8,87-9,112.5s-60,136.5-331.5,258c-50.2,22.5-60.8,32.2-117.8,33
c-48,0.8-72.8-15.8-88.5-30l-7.4,0.3c60.7,103.2,175.4,169.2,298.4,169.2c180.8,0,337.5-131.2,337.5-330
c0-109.1-44.3-185.5-88.3-234.6C623.2,242.6,625.4,249.7,628.2,258.5z"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 262 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 453 B

@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="64" height="64" viewBox="0 0 64 64"><path fill="#3DA8CC" d="M28.012 27.998H.004v8h28.008v-8zm3.988-20H.004v8h32.01l-.014-8zm20.02 0H40.016L51.309 30.31 40.016 47.998H.004L0 56.002h48.879L64 30.311 52.02 7.998z"/></svg>

Before

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 678 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 645 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

@ -1 +0,0 @@
<svg viewBox="0 0 70 70" xmlns="http://www.w3.org/2000/svg"><title>penguin 2</title><path d="M52.65 61.364h2.767a2.81 2.81 0 0 1 2.803 2.803 2.81 2.81 0 0 1-2.803 2.803h-.024c0 .04.024.073.024.113 0 1.613-1.3 2.917-2.917 2.917-7.578 0-13.04-.543-16.234-1.61-.476-.157-.89-.33-1.266-.51-.373.18-.79.353-1.266.51C30.534 69.457 25.072 70 17.5 70a2.916 2.916 0 0 1-2.917-2.917c0-.04.02-.073.024-.113h-.024a2.806 2.806 0 0 1-2.803-2.803 2.806 2.806 0 0 1 2.803-2.803h2.768c-3.97-3.42-6.582-8.25-8-14.166-.88.545-5.54 3.138-9.34.393-.214-2.78 5.526-7.04 8.34-14.52 0 .01.003.017.003.026.74-2.856 2.518-7.62 2.69-9.025C11.04 7.488 24.206 0 35 0c10.795 0 23.96 7.487 23.96 24.068.175 1.406 1.95 6.172 2.692 9.03.006-.008.006-.017.006-.03 2.815 7.48 8.552 11.735 8.336 14.523-3.806 2.75-8.46.15-9.342-.39-1.41 5.918-4.028 10.748-8.003 14.167z" fill="#303048"/><path d="M51.19 29.517S56.365 10.1 41.75 10.1c-3.116 0-5.528 3.46-6.744 3.46-1.216 0-3.11-3.46-6.746-3.46-14.62 0-9.445 19.417-9.445 19.417s-2.698 3.433-2.698 10.59c0 14.893 10.38 18.926 18.89 18.926 8.507 0 18.887-4.033 18.887-18.926 0-7.157-2.704-10.59-2.704-10.59z" fill="#FFF"/><path d="M32.083 23.333a2.918 2.918 0 0 0-5.833 0 2.918 2.918 0 0 0 5.833 0zm11.667 0c0 1.61-1.3 2.917-2.917 2.917a2.916 2.916 0 0 1 0-5.833 2.914 2.914 0 0 1 2.917 2.916z" fill="#303048"/><path d="M29.588 28.853c1.692 4.42 5.717 5.452 5.717 5.452s4.025-1.032 5.718-5.452c-3.282-.95-5.718-2.724-5.718-2.724s-2.433 1.77-5.717 2.72z" fill="#F15A40"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 480 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 575 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="94" width="94" version="1.1" y="0px" x="0px" viewBox="0 0 93.999999 94"><defs><clipPath id="clipPath5011" clipPathUnits="userSpaceOnUse"><path d="m39.867-0.011719a47.764 47.764 0 0 0 -47.764 47.764 47.764 47.764 0 0 0 47.764 47.764 47.764 47.764 0 0 0 47.764 -47.764 47.764 47.764 0 0 0 -47.764 -47.764zm0 34.812a12.952 12.952 0 0 1 12.951 12.952 12.952 12.952 0 0 1 -12.951 12.953 12.952 12.952 0 0 1 -12.951 -12.953 12.952 12.952 0 0 1 12.951 -12.951z" fill="#000000"/></clipPath></defs><g transform="translate(7.203 -0.823)" clip-path="url(#clipPath5011)"><path fill="#76c349" d="m72.623 54.124a33.37 33.37 0 0 1 -18.887 23.98l-13.869-30.351z"/><path d="m57.718 81.944a38.57 38.57 0 0 1 -45.9 -7.716 38.57 38.57 0 0 1 -5.055 -46.269 38.57 38.57 0 0 1 43.15 -17.445l-10.046 37.239z" fill="#0078d3"/><path d="m39.867 5.8728a41.88 41.88 0 0 1 33.442 16.669 41.88 41.88 0 0 1 6.8202 36.738l-40.262-11.527z" fill="#d6e142"/><path fill="#12bdef" d="m39.867 1.0923a46.66 46.66 0 0 1 44.897 33.952l-44.897 12.709z"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 513 B

@ -0,0 +1,65 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
<g>
<g>
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="1.7738" y1="31.2729" x2="40.1662" y2="31.2729">
<stop offset="0" style="stop-color:#905CFB"/>
<stop offset="6.772543e-002" style="stop-color:#776CF9"/>
<stop offset="0.1729" style="stop-color:#5681F7"/>
<stop offset="0.2865" style="stop-color:#3B92F5"/>
<stop offset="0.4097" style="stop-color:#269FF4"/>
<stop offset="0.5474" style="stop-color:#17A9F3"/>
<stop offset="0.7111" style="stop-color:#0FAEF2"/>
<stop offset="0.9677" style="stop-color:#0CB0F2"/>
</linearGradient>
<path style="fill:url(#SVGID_1_);" d="M39.7,47.9l-6.1-34c-0.4-2.4-1.2-4.8-2.7-7.1c-2-3.2-5.2-5.4-8.8-6.3
C7.9-2.9-2.6,11.3,3.6,23.9c0,0,0,0,0,0l14.8,31.7c0.4,1,1,2,1.7,2.9c1.2,1.6,2.8,2.8,4.7,3.4C34.4,64.9,42.1,56.4,39.7,47.9z"/>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="5.3113" y1="9.6691" x2="69.2278" y2="43.8664">
<stop offset="0" style="stop-color:#905CFB"/>
<stop offset="6.772543e-002" style="stop-color:#776CF9"/>
<stop offset="0.1729" style="stop-color:#5681F7"/>
<stop offset="0.2865" style="stop-color:#3B92F5"/>
<stop offset="0.4097" style="stop-color:#269FF4"/>
<stop offset="0.5474" style="stop-color:#17A9F3"/>
<stop offset="0.7111" style="stop-color:#0FAEF2"/>
<stop offset="0.9677" style="stop-color:#0CB0F2"/>
</linearGradient>
<path style="fill:url(#SVGID_2_);" d="M67.4,26.5c-1.4-2.2-3.4-3.9-5.7-4.9L25.5,1.7l0,0c-1-0.5-2.1-1-3.3-1.3
C6.7-3.2-4.4,13.8,5.5,27c1.5,2,3.6,3.6,6,4.5L48,47.9c0.8,0.5,1.6,0.8,2.5,1.1C64.5,53.4,75.1,38.6,67.4,26.5z"/>
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="-19.2836" y1="70.8198" x2="55.9833" y2="33.1863">
<stop offset="0" style="stop-color:#3BEA62"/>
<stop offset="0.117" style="stop-color:#31DE80"/>
<stop offset="0.3025" style="stop-color:#24CEA8"/>
<stop offset="0.4844" style="stop-color:#1AC1C9"/>
<stop offset="0.6592" style="stop-color:#12B7DF"/>
<stop offset="0.8238" style="stop-color:#0EB2ED"/>
<stop offset="0.9677" style="stop-color:#0CB0F2"/>
</linearGradient>
<path style="fill:url(#SVGID_3_);" d="M67.4,26.5c-1.8-2.8-4.6-4.8-7.9-5.6c-3.5-0.8-6.8-0.5-9.6,0.7L11.4,36.1
c0,0-0.2,0.1-0.6,0.4C0.9,40.4-4,53.3,4,64c1.8,2.4,4.3,4.2,7.1,5c5.3,1.6,10.1,1,14-1.1c0,0,0.1,0,0.1,0l37.6-20.1
c0,0,0,0,0.1-0.1C69.5,43.9,72.6,34.6,67.4,26.5z"/>
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="38.9439" y1="5.8503" x2="5.4232" y2="77.5093">
<stop offset="0" style="stop-color:#3BEA62"/>
<stop offset="9.397750e-002" style="stop-color:#2FDB87"/>
<stop offset="0.196" style="stop-color:#24CEA8"/>
<stop offset="0.3063" style="stop-color:#1BC3C3"/>
<stop offset="0.4259" style="stop-color:#14BAD8"/>
<stop offset="0.5596" style="stop-color:#10B5E7"/>
<stop offset="0.7185" style="stop-color:#0DB1EF"/>
<stop offset="0.9677" style="stop-color:#0CB0F2"/>
</linearGradient>
<path style="fill:url(#SVGID_4_);" d="M50.3,12.8c1.2-2.7,1.1-6-0.9-9c-1.1-1.8-2.9-3-4.9-3.5c-4.5-1.1-8.3,1-10.1,4.2L3.5,42
c0,0,0,0,0,0.1C-0.9,47.9-1.6,56.5,4,64c1.8,2.4,4.3,4.2,7.1,5c10.5,3.3,19.3-2.5,22.1-10.8L50.3,12.8z"/>
</g>
<g>
<rect x="13.4" y="13.4" style="fill:#000000;" width="43.2" height="43.2"/>
<rect x="17.5" y="48.5" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
<polygon style="fill:#FFFFFF;" points="22.9,22.7 17.5,22.7 17.5,19.1 32.3,19.1 32.3,22.7 26.8,22.7 26.8,37 22.9,37 "/>
<path style="fill:#FFFFFF;" d="M32.5,28.1L32.5,28.1c0-5.1,3.8-9.3,9.3-9.3c3.4,0,5.4,1.1,7.1,2.8l-2.5,2.9c-1.4-1.3-2.8-2-4.6-2
c-3,0-5.2,2.5-5.2,5.6V28c0,3.1,2.1,5.6,5.2,5.6c2,0,3.3-0.8,4.7-2.1l2.5,2.5c-1.8,2-3.9,3.2-7.3,3.2
C36.4,37.3,32.5,33.2,32.5,28.1"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="235.45" height="225.24" viewBox="0 0 235.45 225.24001"><defs><clipPath><path d="M0 250h250V0H0z"/></clipPath><clipPath id="a"><path d="M0 250h250V0H0z"/></clipPath></defs><g><g><g clip-path="url(#a)" transform="matrix(1.25 0 0 -1.25 -38.922 268.364)"><g><path fill="#00b4f0" d="M135.2 150.52c.05.5.1.94.1 1.47 0 5.22 1.24 10.6 13.98 10.6h42.6c19.23 0 27.62 9.08 27.62 27.25v15.46c0 5.2-4.1 9.4-9.3 9.4-5.17 0-9.32-4.2-9.32-9.4l-.03-5.36c0-5.85-3.74-9.96-12.5-9.96h-41.8c-19 0-20.46-14.1-21.08-21.58h-.42c-.63 7.47-2.1 21.58-21.1 21.58H62.18c-8.78 0-12.8 4.26-12.8 10.1v5.23c0 5.2-3.9 9.4-9.1 9.4-5.17 0-9.14-4.2-9.14-9.4v-15.45c0-18.17 8.27-27.26 27.5-27.26h42.6c12.74 0 14-5.38 14-10.6 0-.54.03-1.02.1-1.5.3-5.24 4.62-9.37 9.92-9.37s9.63 4.16 9.93 9.4"/></g><g><path fill="#00b4f0" d="M124.78 34.5c4.5 0 8.36 2.68 10.1 6.52.1.15.18.3.27.46l38.8 71.76c1.1 1.9 1.65 4.02 1.65 6.17 0 6.87-5.58 12.46-12.44 12.46-5.52 0-9.26-2.7-11.8-8.5L124.8 73.83l-26.55 49.5c-2.56 5.84-6.3 8.54-11.83 8.54-6.86 0-12.44-5.6-12.44-12.45 0-2.14.57-4.27 1.64-6.15l38.8-71.76c.07-.12.13-.22.18-.32 1.72-3.93 5.63-6.68 10.2-6.68"/></g></g></g></g></svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 833 B

After

Width:  |  Height:  |  Size: 669 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 634 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.2" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px" viewBox="0 0 600 600" xml:space="preserve">
<g>
<path fill="#F26722" d="M595,299.9C595,137,462.9,5,300,5C137.1,5,5,137.1,5,300c0,162.9,132.1,295,295,295h0.1
c162.9,0,294.9-132.1,295-294.9V299.9z M112.8,419.8H80.3v-211h32.6V419.8z M469.5,239h-54.7v180.8h-32.6V239h-53.2l-0.3,180.8
h-32.3L172,271.1v148.7h-32.9V209.1H172l124.6,153.7V208.8h32.6v0h140.4V239z M487.2,419.8v-211h32.6v211H487.2z"/>
<rect x="80.3" y="208.8" fill="#FFFFFF" width="32.6" height="211"/>
<polygon fill="#FFFFFF" points="329.1,239 382.3,239 382.3,419.8 414.9,419.8 414.9,239 469.5,239 469.5,208.8 329.1,208.8 "/>
<rect x="487.2" y="208.8" fill="#FFFFFF" width="32.6" height="211"/>
<polygon fill="#FFFFFF" points="329.1,208.8 296.6,208.8 296.6,362.8 172,209.1 139.1,209.1 139.1,419.8 172,419.8 172,271.1
296.6,419.8 328.8,419.8 329.1,239 329.1,208.8 "/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="200px" height="200px" viewBox="0 0 200 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 46.1 (44463) - http://www.bohemiancoding.com/sketch -->
<title>docusaurus</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="docusaurus">
<rect id="Rectangle" fill="#FFFFFF" x="99" y="52" width="84" height="34"></rect>
<g id="Group-2" transform="translate(3.000000, 17.000000)">
<path d="M20,146 C12.602,146 6.157,141.973 2.697,136 C0.992,138.944 0,142.353 0,146 C0,157.046 8.954,166 20,166 L40,166 L40,146 L20,146 Z" id="Fill-1" fill="#3ECC5F"></path>
<path d="M109.9805,40.376 L180.0005,36 L180.0005,26 C180.0005,14.954 171.0455,6 160.0005,6 L70.0005,6 L67.5005,1.67 C66.3885,-0.255 63.6115,-0.255 62.5005,1.67 L60.0005,6 L57.5005,1.67 C56.3885,-0.255 53.6115,-0.255 52.5005,1.67 L50.0005,6 L47.5005,1.67 C46.3885,-0.255 43.6115,-0.255 42.5005,1.67 L40.0005,6 C39.9785,6 39.9575,6.003 39.9355,6.003 L35.7935,1.862 C34.2225,0.291 31.5405,1.009 30.9645,3.156 L29.5965,8.26 L24.4035,6.868 C22.2565,6.293 20.2925,8.257 20.8685,10.404 L22.2595,15.597 L17.1565,16.964 C15.0095,17.54 14.2905,20.223 15.8615,21.794 L20.0025,25.936 C20.0025,25.957 20.0005,25.978 20.0005,26 L15.6695,28.5 C13.7455,29.611 13.7455,32.389 15.6695,33.5 L20.0005,36 L15.6695,38.5 C13.7455,39.611 13.7455,42.389 15.6695,43.5 L20.0005,46 L15.6695,48.5 C13.7455,49.611 13.7455,52.389 15.6695,53.5 L20.0005,56 L15.6695,58.5 C13.7455,59.611 13.7455,62.389 15.6695,63.5 L20.0005,66 L15.6695,68.5 C13.7455,69.611 13.7455,72.389 15.6695,73.5 L20.0005,76 L15.6695,78.5 C13.7455,79.611 13.7455,82.389 15.6695,83.5 L20.0005,86 L15.6695,88.5 C13.7455,89.611 13.7455,92.389 15.6695,93.5 L20.0005,96 L15.6695,98.5 C13.7455,99.611 13.7455,102.389 15.6695,103.5 L20.0005,106 L15.6695,108.5 C13.7455,109.611 13.7455,112.389 15.6695,113.5 L20.0005,116 L15.6695,118.5 C13.7455,119.611 13.7455,122.389 15.6695,123.5 L20.0005,126 L15.6695,128.5 C13.7455,129.611 13.7455,132.389 15.6695,133.5 L20.0005,136 L15.6695,138.5 C13.7455,139.611 13.7455,142.389 15.6695,143.5 L20.0005,146 C20.0005,157.046 28.9545,166 40.0005,166 L160.0005,166 C171.0455,166 180.0005,157.046 180.0005,146 L180.0005,66 L109.9805,61.624 C104.3705,61.273 100.0005,56.621 100.0005,51 C100.0005,45.379 104.3705,40.727 109.9805,40.376" id="Fill-3" fill="#3ECC5F"></path>
<polygon id="Fill-5" fill="#3ECC5F" points="140 166 170 166 170 126 140 126"></polygon>
<path d="M190,141 C189.781,141 189.572,141.037 189.361,141.064 C189.323,140.914 189.287,140.763 189.245,140.613 C191.051,139.859 192.32,138.079 192.32,136 C192.32,133.238 190.082,131 187.32,131 C186.182,131 185.145,131.396 184.304,132.036 C184.193,131.923 184.082,131.811 183.969,131.7 C184.596,130.864 184.98,129.838 184.98,128.713 C184.98,125.951 182.742,123.713 179.98,123.713 C177.915,123.713 176.143,124.966 175.381,126.754 C175.233,126.712 175.084,126.677 174.936,126.639 C174.963,126.428 175,126.219 175,126 C175,123.238 172.762,121 170,121 C167.238,121 165,123.238 165,126 C165,126.219 165.037,126.428 165.064,126.639 C164.916,126.677 164.767,126.712 164.619,126.754 C163.857,124.966 162.085,123.713 160.02,123.713 C157.258,123.713 155.02,125.951 155.02,128.713 C155.02,129.838 155.404,130.864 156.031,131.7 C152.314,135.332 150,140.393 150,146 C150,157.046 158.954,166 170,166 C179.339,166 187.16,159.59 189.361,150.936 C189.572,150.963 189.781,151 190,151 C192.762,151 195,148.762 195,146 C195,143.238 192.762,141 190,141" id="Fill-7" fill="#44D860"></path>
<polygon id="Fill-8" fill="#3ECC5F" points="150 106 180 106 180 86 150 86"></polygon>
<path d="M190,98.5 C191.381,98.5 192.5,97.381 192.5,96 C192.5,94.619 191.381,93.5 190,93.5 C189.891,93.5 189.786,93.519 189.681,93.532 C189.661,93.457 189.644,93.382 189.623,93.307 C190.525,92.93 191.16,92.039 191.16,91 C191.16,89.619 190.041,88.5 188.66,88.5 C188.091,88.5 187.572,88.697 187.152,89.018 C187.097,88.961 187.041,88.905 186.984,88.85 C187.298,88.433 187.49,87.919 187.49,87.356 C187.49,85.976 186.371,84.856 184.99,84.856 C183.957,84.856 183.071,85.483 182.69,86.377 C181.833,86.138 180.934,86 180,86 C174.478,86 170,90.478 170,96 C170,101.522 174.478,106 180,106 C180.934,106 181.833,105.862 182.69,105.623 C183.071,106.517 183.957,107.144 184.99,107.144 C186.371,107.144 187.49,106.024 187.49,104.644 C187.49,104.081 187.298,103.567 186.984,103.15 C187.041,103.095 187.097,103.039 187.152,102.982 C187.572,103.303 188.091,103.5 188.66,103.5 C190.041,103.5 191.16,102.381 191.16,101 C191.16,99.961 190.525,99.07 189.623,98.693 C189.644,98.619 189.661,98.543 189.681,98.468 C189.786,98.481 189.891,98.5 190,98.5" id="Fill-9" fill="#44D860"></path>
<path d="M60,38.5 C58.619,38.5 57.5,37.381 57.5,36 C57.5,31.864 54.136,28.5 50,28.5 C45.864,28.5 42.5,31.864 42.5,36 C42.5,37.381 41.381,38.5 40,38.5 C38.619,38.5 37.5,37.381 37.5,36 C37.5,29.107 43.107,23.5 50,23.5 C56.893,23.5 62.5,29.107 62.5,36 C62.5,37.381 61.381,38.5 60,38.5" id="Fill-10" fill="#000000"></path>
<path d="M100,166 L160,166 C171.046,166 180,157.046 180,146 L180,76 L120,76 C108.954,76 100,84.954 100,96 L100,166 Z" id="Fill-11" fill="#FFFF50"></path>
<path d="M165.0195,107 L114.9805,107 C114.4275,107 113.9805,106.553 113.9805,106 C113.9805,105.447 114.4275,105 114.9805,105 L165.0195,105 C165.5725,105 166.0195,105.447 166.0195,106 C166.0195,106.553 165.5725,107 165.0195,107" id="Fill-12" fill="#000000"></path>
<path d="M165.0195,127 L114.9805,127 C114.4275,127 113.9805,126.553 113.9805,126 C113.9805,125.447 114.4275,125 114.9805,125 L165.0195,125 C165.5725,125 166.0195,125.447 166.0195,126 C166.0195,126.553 165.5725,127 165.0195,127" id="Fill-13" fill="#000000"></path>
<path d="M165.0195,147 L114.9805,147 C114.4275,147 113.9805,146.553 113.9805,146 C113.9805,145.447 114.4275,145 114.9805,145 L165.0195,145 C165.5725,145 166.0195,145.447 166.0195,146 C166.0195,146.553 165.5725,147 165.0195,147" id="Fill-14" fill="#000000"></path>
<path d="M165.0195,97.1855 L114.9805,97.1855 C114.4275,97.1855 113.9805,96.7375 113.9805,96.1855 C113.9805,95.6325 114.4275,95.1855 114.9805,95.1855 L165.0195,95.1855 C165.5725,95.1855 166.0195,95.6325 166.0195,96.1855 C166.0195,96.7375 165.5725,97.1855 165.0195,97.1855" id="Fill-15" fill="#000000"></path>
<path d="M165.0195,117 L114.9805,117 C114.4275,117 113.9805,116.553 113.9805,116 C113.9805,115.447 114.4275,115 114.9805,115 L165.0195,115 C165.5725,115 166.0195,115.447 166.0195,116 C166.0195,116.553 165.5725,117 165.0195,117" id="Fill-16" fill="#000000"></path>
<path d="M165.0195,137 L114.9805,137 C114.4275,137 113.9805,136.553 113.9805,136 C113.9805,135.447 114.4275,135 114.9805,135 L165.0195,135 C165.5725,135 166.0195,135.447 166.0195,136 C166.0195,136.553 165.5725,137 165.0195,137" id="Fill-17" fill="#000000"></path>
<path d="M180,44.6113 C179.988,44.6113 179.978,44.6053 179.966,44.6063 C176.876,44.7113 175.414,47.8023 174.124,50.5293 C172.778,53.3783 171.737,55.2323 170.031,55.1763 C168.142,55.1083 167.062,52.9743 165.918,50.7153 C164.604,48.1223 163.104,45.1803 159.955,45.2903 C156.909,45.3943 155.442,48.0843 154.148,50.4573 C152.771,52.9853 151.834,54.5223 150.027,54.4513 C148.1,54.3813 147.076,52.6463 145.891,50.6383 C144.57,48.4023 143.043,45.8883 139.955,45.9743 C136.961,46.0773 135.49,48.3593 134.192,50.3743 C132.819,52.5043 131.857,53.8023 130.027,53.7253 C128.054,53.6543 127.035,52.2153 125.856,50.5483 C124.532,48.6753 123.04,46.5553 119.961,46.6583 C117.033,46.7583 115.562,48.6273 114.265,50.2763 C113.033,51.8403 112.071,53.0783 110.036,53.0003 C109.484,52.9783 109.021,53.4113 109.001,53.9643 C108.98,54.5153 109.412,54.9793 109.964,55.0003 C112.981,55.1013 114.509,53.1993 115.836,51.5133 C117.013,50.0173 118.029,48.7263 120.029,48.6583 C121.955,48.5763 122.858,49.7733 124.224,51.7033 C125.521,53.5373 126.993,55.6173 129.955,55.7243 C133.058,55.8283 134.551,53.5093 135.873,51.4573 C137.055,49.6233 138.075,48.0403 140.023,47.9733 C141.816,47.9063 142.792,49.3233 144.168,51.6543 C145.465,53.8513 146.934,56.3403 149.955,56.4503 C153.08,56.5583 154.589,53.8293 155.904,51.4153 C157.043,49.3273 158.118,47.3543 160.023,47.2893 C161.816,47.2473 162.751,48.8843 164.134,51.6193 C165.426,54.1723 166.891,57.0643 169.959,57.1753 C170.016,57.1773 170.072,57.1783 170.128,57.1783 C173.192,57.1783 174.646,54.1033 175.933,51.3843 C177.072,48.9743 178.15,46.7033 180,46.6113 L180,44.6113 Z" id="Fill-24" fill="#000000"></path>
<polygon id="Fill-18" fill="#3ECC5F" points="80 166 120 166 120 126 80 126"></polygon>
<path d="M140,141 C139.781,141 139.572,141.037 139.361,141.064 C139.323,140.914 139.287,140.763 139.245,140.613 C141.051,139.859 142.32,138.079 142.32,136 C142.32,133.238 140.082,131 137.32,131 C136.182,131 135.145,131.396 134.304,132.036 C134.193,131.923 134.082,131.811 133.969,131.7 C134.596,130.864 134.98,129.838 134.98,128.713 C134.98,125.951 132.742,123.713 129.98,123.713 C127.915,123.713 126.143,124.966 125.381,126.754 C125.233,126.712 125.084,126.677 124.936,126.639 C124.963,126.428 125,126.219 125,126 C125,123.238 122.762,121 120,121 C117.238,121 115,123.238 115,126 C115,126.219 115.037,126.428 115.064,126.639 C114.916,126.677 114.767,126.712 114.619,126.754 C113.857,124.966 112.085,123.713 110.02,123.713 C107.258,123.713 105.02,125.951 105.02,128.713 C105.02,129.838 105.404,130.864 106.031,131.7 C102.314,135.332 100,140.393 100,146 C100,157.046 108.954,166 120,166 C129.339,166 137.16,159.59 139.361,150.936 C139.572,150.963 139.781,151 140,151 C142.762,151 145,148.762 145,146 C145,143.238 142.762,141 140,141" id="Fill-19" fill="#44D860"></path>
<polygon id="Fill-20" fill="#3ECC5F" points="80 106 120 106 120 86 80 86"></polygon>
<path d="M130,98.5 C131.381,98.5 132.5,97.381 132.5,96 C132.5,94.619 131.381,93.5 130,93.5 C129.891,93.5 129.786,93.519 129.681,93.532 C129.661,93.457 129.644,93.382 129.623,93.307 C130.525,92.93 131.16,92.039 131.16,91 C131.16,89.619 130.041,88.5 128.66,88.5 C128.091,88.5 127.572,88.697 127.152,89.018 C127.097,88.961 127.041,88.905 126.984,88.85 C127.298,88.433 127.49,87.919 127.49,87.356 C127.49,85.976 126.371,84.856 124.99,84.856 C123.957,84.856 123.071,85.483 122.69,86.377 C121.833,86.138 120.934,86 120,86 C114.478,86 110,90.478 110,96 C110,101.522 114.478,106 120,106 C120.934,106 121.833,105.862 122.69,105.623 C123.071,106.517 123.957,107.144 124.99,107.144 C126.371,107.144 127.49,106.024 127.49,104.644 C127.49,104.081 127.298,103.567 126.984,103.15 C127.041,103.095 127.097,103.039 127.152,102.982 C127.572,103.303 128.091,103.5 128.66,103.5 C130.041,103.5 131.16,102.381 131.16,101 C131.16,99.961 130.525,99.07 129.623,98.693 C129.644,98.619 129.661,98.543 129.681,98.468 C129.786,98.481 129.891,98.5 130,98.5" id="Fill-21" fill="#44D860"></path>
<path d="M140,24.75 C139.84,24.75 139.67,24.73 139.51,24.7 C139.35,24.67 139.189,24.62 139.04,24.56 C138.89,24.5 138.75,24.42 138.609,24.33 C138.479,24.24 138.35,24.13 138.229,24.02 C138.12,23.9 138.01,23.78 137.92,23.64 C137.83,23.5 137.75,23.36 137.689,23.21 C137.63,23.06 137.58,22.9 137.55,22.74 C137.52,22.58 137.5,22.41 137.5,22.25 C137.5,22.09 137.52,21.92 137.55,21.76 C137.58,21.6 137.63,21.45 137.689,21.29 C137.75,21.14 137.83,21 137.92,20.86 C138.01,20.73 138.12,20.6 138.229,20.48 C138.35,20.37 138.479,20.26 138.609,20.17 C138.75,20.08 138.89,20 139.04,19.94 C139.189,19.88 139.35,19.83 139.51,19.8 C139.83,19.73 140.16,19.73 140.49,19.8 C140.649,19.83 140.81,19.88 140.96,19.94 C141.109,20 141.25,20.08 141.39,20.17 C141.52,20.26 141.649,20.37 141.77,20.48 C141.88,20.6 141.99,20.73 142.08,20.86 C142.17,21 142.25,21.14 142.31,21.29 C142.37,21.45 142.42,21.6 142.45,21.76 C142.479,21.92 142.5,22.09 142.5,22.25 C142.5,22.91 142.229,23.56 141.77,24.02 C141.649,24.13 141.52,24.24 141.39,24.33 C141.25,24.42 141.109,24.5 140.96,24.56 C140.81,24.62 140.649,24.67 140.49,24.7 C140.33,24.73 140.16,24.75 140,24.75" id="Fill-22" fill="#000000"></path>
<path d="M160,23.5 C159.34,23.5 158.7,23.23 158.229,22.77 C158.12,22.65 158.01,22.52 157.92,22.39 C157.83,22.25 157.75,22.11 157.689,21.96 C157.63,21.81 157.58,21.65 157.55,21.49 C157.52,21.33 157.5,21.16 157.5,21 C157.5,20.34 157.77,19.7 158.229,19.23 C158.35,19.12 158.479,19.01 158.609,18.92 C158.75,18.83 158.89,18.75 159.04,18.69 C159.189,18.63 159.35,18.58 159.51,18.55 C159.83,18.48 160.17,18.48 160.49,18.55 C160.649,18.58 160.81,18.63 160.96,18.69 C161.109,18.75 161.25,18.83 161.39,18.92 C161.52,19.01 161.649,19.12 161.77,19.23 C162.229,19.7 162.5,20.34 162.5,21 C162.5,21.16 162.479,21.33 162.45,21.49 C162.42,21.65 162.37,21.81 162.31,21.96 C162.24,22.11 162.17,22.25 162.08,22.39 C161.99,22.52 161.88,22.65 161.77,22.77 C161.649,22.88 161.52,22.99 161.39,23.08 C161.25,23.17 161.109,23.25 160.96,23.31 C160.81,23.37 160.649,23.42 160.49,23.45 C160.33,23.48 160.16,23.5 160,23.5" id="Fill-23" fill="#000000"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

@ -0,0 +1,160 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="512"
height="512"
viewBox="0 0 135.46667 135.46667"
version="1.1"
id="svg8"
sodipodi:docname="logo.svg"
inkscape:version="0.92.1 r15371"
inkscape:export-filename=""
inkscape:export-xdpi="48.000004"
inkscape:export-ydpi="48.000004">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="0.70710678"
inkscape:cx="418.13805"
inkscape:cy="177.57445"
inkscape:document-units="mm"
inkscape:current-layer="layer2"
showgrid="false"
units="px"
width="256px"
showguides="false"
inkscape:window-width="1920"
inkscape:window-height="1137"
inkscape:window-x="1912"
inkscape:window-y="-8"
inkscape:window-maximized="1"
inkscape:pagecheckerboard="false"
inkscape:measure-start="283.373,243.952"
inkscape:measure-end="290.267,236.527">
<sodipodi:guide
position="0,0"
orientation="0,512"
id="guide3699"
inkscape:locked="false" />
<sodipodi:guide
position="135.46667,0"
orientation="-512,0"
id="guide3701"
inkscape:locked="false" />
<sodipodi:guide
position="135.46667,135.46667"
orientation="0,-512"
id="guide3703"
inkscape:locked="false" />
<sodipodi:guide
position="0,135.46667"
orientation="512,0"
id="guide3705"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-161.53334)"
style="display:inline">
<path
style="fill:#609926;fill-opacity:1;stroke:#428f29;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 27.709937,195.15095 c -9.546573,-0.0272 -22.3392732,6.79805 -21.6317552,23.90397 1.105534,26.72889 25.4565952,29.20839 35.1916502,29.42301 1.068023,5.01357 12.521798,22.30563 21.001818,23.21667 h 37.15277 c 22.27763,-1.66785 38.9607,-75.75671 26.59321,-76.03825 -46.781583,2.47691 -49.995146,2.13838 -88.599758,0 -2.495053,-0.0266 -5.972321,-0.49474 -9.707935,-0.5054 z m 2.491319,9.45886 c 1.351378,13.69267 3.555849,21.70359 8.018216,33.94345 -11.382872,-1.50473 -21.069822,-5.22443 -22.851515,-19.10984 -0.950962,-7.4112 2.390428,-15.16769 14.833299,-14.83361 z"
id="path3722"
inkscape:connector-curvature="0"
sodipodi:nodetypes="sscccccsccsc" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Layer 2"
style="display:inline">
<rect
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.24757317;stroke-opacity:1"
id="rect4599"
width="34.762054"
height="34.762054"
x="87.508659"
y="18.291576"
transform="rotate(25.914715)"
ry="5.4825778" />
<path
style="display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.26644793px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 79.804947,57.359056 3.241146,1.609954 V 35.255731 h -3.262698 z"
id="path4525"
inkscape:connector-curvature="0"
sodipodi:nodetypes="ccccc" />
</g>
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Layer 3"
style="display:inline">
<g
style="display:inline"
id="g4539">
<circle
transform="rotate(-19.796137)"
r="3.4745038"
cy="90.077766"
cx="49.064713"
id="path4606"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1" />
<circle
transform="rotate(-19.796137)"
r="3.4745038"
cy="102.1049"
cx="36.810425"
id="path4606-3"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1" />
<circle
transform="rotate(-19.796137)"
r="3.4745038"
cy="111.43928"
cx="46.484283"
id="path4606-1"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.26458332;stroke-opacity:1" />
<rect
transform="rotate(26.024158)"
y="18.061695"
x="97.333458"
height="27.261492"
width="2.6726954"
id="rect4629-8"
style="fill:#609926;fill-opacity:1;stroke:none;stroke-width:0.27444693;stroke-opacity:1" />
<path
sodipodi:nodetypes="cc"
inkscape:connector-curvature="0"
id="path4514"
d="m 76.558096,68.116343 c 12.97589,6.395378 13.012989,4.101862 4.890858,20.907244"
style="fill:none;stroke:#609926;stroke-width:2.68000007;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.6 KiB

@ -0,0 +1,8 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 110 112"><defs><style>.cls-1{fill:#3d3d3f;}.cls-2{fill:#ee7509;fill-rule:evenodd;}</style></defs><title>logo</title>
<g id="Calque_2" data-name="Calque 2"><g id="Calque_1-2" data-name="Calque 1">
<!-- 454.9 112.24 -->
<path class="cls-1" d="M45.05,10.86H45a7.34,7.34,0,0,0-7.69,7.6,7.59,7.59,0,0,0,7.77,7.87h0c5.09,0,7.75-4,7.75-7.93A7.35,7.35,0,0,0,45.05,10.86Zm0,15.22h0Z"/>
<path class="cls-2" d="M55.18,0C41.06-.22,11.49,4.56,0,40c.39.3,1.61,1,1.94,1.26C17,7.74,43.63,5.89,53.61,6.67c64.8,5.09,59.91,100.14-7.47,97.92l.16,0C1.65,104-.52,38,31.42,34.23c1.21-.13,3.08-.3,3.55,1.75.09.39-11.16,38.78-10.82,41.41.21,3.74,2.45,8.7,10.49,7.19.72-1.77,13.94-50.72,13.91-50.75a12.7,12.7,0,0,0-9.73-5C11.1,27.15,3.14,54.72,3.88,67.51c.05,12.56,8.74,40.86,44.76,44.67,44.55,1.79,61.75-33,61.55-57.87C110,28.37,86.77.51,55.18,0Z"/><path class="cls-2" d="M52.08,33.76C50.61,37.56,36.79,89,36,92.75a13.91,13.91,0,0,0-.47,3.79,7.74,7.74,0,0,0,2.12,4.91,8,8,0,0,0,6.69,1.95,8.86,8.86,0,0,0,2-.39c.5-2.25,4.5-18.09,5.93-22.28a14.68,14.68,0,0,0,8.09,2.39c25.45-.74,42-50.9,20-52.48-11.78-.94-17,10.23-19,11.18-.63-.74,3.41-9.66,3.55-11.37A40.87,40.87,0,0,0,52.08,33.76ZM72,38.34C83.88,37,68.74,84.4,55.71,78.72c-4.23-1.09-2-7.63,2.29-21.71C61.6,45.3,65.92,38.81,72,38.34Z"/>
</g></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

@ -0,0 +1,32 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Layer_1" x="0px" y="0px" width="300px" height="439.589px" viewBox="100 100 400 400" xml:space="preserve">
<g>
<g id="Marked_Letters">
<path fill="#010101" d="M185.044,358.869h-9.961l-1.143-25.986l-14.092,25.986h-6.24l-6.709-26.807l-8.818,26.807h-10.225 l13.389-40.605h10.928l6.416,25.781l13.916-25.781h10.635L185.044,358.869z"/>
<path fill="#010101" d="M226.617,358.869h-10.811l-1.084-8.994H202.33l-4.102,8.994h-10.605l20.566-40.605h10.986L226.617,358.869 z M214.019,344.162l-1.934-15.527l-7.061,15.527H214.019z"/>
<path fill="#010101" d="M267.712,358.869h-11.338l-4.043-8.467c-1.191-2.559-2.227-4.478-3.105-5.757s-1.651-2.07-2.314-2.373 c-0.664-0.303-1.553-0.454-2.666-0.454h-1.553l-2.578,17.051h-10.283l5.889-40.605h15.85c5.761,0,9.672,1.27,11.733,3.809 c2.061,2.539,3.091,5.283,3.091,8.232c0,3.105-0.854,5.522-2.563,7.251c-1.709,1.729-4.097,2.798-7.163,3.208 c1.562,0.898,2.769,1.953,3.618,3.164s1.86,3.096,3.032,5.654L267.712,358.869z M255.525,330.012c0-1.562-0.571-2.925-1.714-4.087 s-3.453-1.743-6.929-1.743h-1.611l-1.699,11.719h4.102c2.89,0,4.922-0.61,6.094-1.831S255.525,331.496,255.525,330.012z"/>
<path fill="#010101" d="M313.705,318.264l-17.578,18.223l14.912,22.383h-11.807l-14.59-21.65l-3.282,21.65h-10.342l6.064-40.605 h10.401l-2.578,17.256l16.611-17.256H313.705z"/>
<path fill="#010101" d="M346.426,318.264L345.4,325.5h-16.436l-1.26,8.818h14.268l-1.025,7.266h-14.385l-1.377,10.02h19.98 l-1.025,7.266h-30.439l5.889-40.605H346.426z"/>
<path fill="#010101" d="M389.953,338.156c0,4.512-0.86,8.301-2.578,11.367c-1.719,3.066-4.273,5.391-7.662,6.973 s-7.583,2.373-12.582,2.373H348.41l5.83-40.605h14.941c3.534,0,6.625,0.527,9.271,1.582s4.82,2.51,6.52,4.365 s2.953,3.97,3.764,6.343S389.953,335.461,389.953,338.156z M379.377,338.303c0-2.031-0.387-4.004-1.158-5.918 s-2.192-3.54-4.262-4.878c-2.07-1.338-4.941-2.007-8.613-2.007h-1.67l-3.779,26.104h5.449c2.597,0,4.828-0.391,6.693-1.172 s3.33-1.821,4.395-3.12s1.821-2.71,2.271-4.233C379.152,341.555,379.377,339.963,379.377,338.303z"/>
</g>
<g>
<path fill="#010101" d="M406.922,307.149l-3.703,26.35c-0.609,4.324-2.72,6.486-6.33,6.486c-0.773,0-1.553-0.07-2.338-0.211 l-0.756-3.023c0.879,0.188,1.67,0.281,2.373,0.281c1.219,0,2.118-0.302,2.698-0.905s0.964-1.55,1.151-2.839l3.674-26.139H406.922z "/>
<path fill="#010101" d="M423.027,307.8l-0.475,3.357c-1.312-0.867-2.748-1.301-4.307-1.301c-1.312,0-2.361,0.34-3.146,1.02 s-1.178,1.576-1.178,2.689c0,0.551,0.188,1.131,0.562,1.74s1.471,1.644,3.287,3.103s3.015,2.739,3.595,3.841 s0.87,2.203,0.87,3.305c0,1.758-0.662,3.275-1.986,4.553s-3.088,1.916-5.291,1.916c-1.957,0-3.938-0.586-5.941-1.758l0.51-3.604 c2.238,1.559,4.16,2.338,5.766,2.338c0.867,0,1.69-0.284,2.47-0.852c0.779-0.568,1.169-1.339,1.169-2.312 c0-0.62-0.197-1.265-0.59-1.933c-0.394-0.667-1.502-1.745-3.324-3.232c-1.824-1.486-3.014-2.778-3.568-3.874 c-0.555-1.097-0.832-2.185-0.832-3.263c0-1.899,0.785-3.491,2.355-4.775c1.57-1.283,3.422-1.926,5.555-1.926 C420.016,306.833,421.516,307.155,423.027,307.8z"/>
</g>
<g>
<g>
<path fill="#010101" d="M357,200v-92c0-8.284-6.716-15-15-15H172c-8.284,0-15,6.716-15,15v92H357z"/>
<path fill="#010101" d="M157,205v73c0,8.284,6.716,15,15,15h170c8.284,0,15-6.716,15-15v-73H157z"/>
</g>
<g>
<path fill="#FFFFFF" d="M208.737,180.15v-33.125l16.987,21.234l16.987-21.234v33.125h16.987v-57.756h-16.987l-16.987,21.234 l-16.987-21.234H191.75v57.756H208.737z"/>
<path fill="#FFFFFF" d="M322.55,151.272h-16.987v-28.878h-16.986v28.878h-16.987L297.069,181L322.55,151.272z"/>
</g>
<g>
<path fill="#FFFFFF" d="M217,241.154c0,2.124-1.722,3.846-3.845,3.846h-5.31c-2.124,0-3.845-1.722-3.845-3.846v-0.309 c0-2.124,1.722-3.846,3.845-3.846h5.31c2.124,0,3.845,1.722,3.845,3.846V241.154z"/>
<path fill="#FFFFFF" d="M207.859,256.5c0,1.933-1.1,3.5-2.457,3.5h-12.046c-1.357,0-2.457-1.567-2.457-3.5l0,0 c0-1.933,1.1-3.5,2.457-3.5h12.046C206.759,253,207.859,254.567,207.859,256.5L207.859,256.5z"/>
<path fill="#FFFFFF" d="M328.044,238.021c-1.058-3.094-2.692-5.85-4.907-8.269c-2.215-2.418-5.049-4.314-8.498-5.689 c-3.45-1.375-7.479-2.063-12.086-2.063h-19.477l-7.6,52.932h24.403c6.518,0,11.984-1.032,16.402-3.094 c4.416-2.062,7.746-5.092,9.986-9.09c2.24-3.996,3.361-8.936,3.361-14.817C329.629,244.418,329.1,241.115,328.044,238.021z M314.964,254.347c-0.586,1.986-1.573,3.826-2.96,5.519c-1.389,1.694-3.297,3.049-5.729,4.067s-5.34,1.528-8.727,1.528h-7.103 l4.927-34.027h2.176c4.787,0,8.529,0.872,11.229,2.616c2.698,1.744,4.55,3.863,5.557,6.358c1.005,2.494,1.508,5.066,1.508,7.713 C315.842,250.286,315.549,252.361,314.964,254.347z"/>
<path fill="#FFFFFF" d="M246.148,241.043l1.373-9.61h21.424l1.336-9.434h-10.601h-24.38h-1.256c-2.125,0-3.846,1.877-3.846,4 s1.721,4,3.846,4h0.096h3.793c1.928,0,3.491,1.563,3.491,3.491c0,1.928-1.563,3.491-3.491,3.491h-4.806L233.126,237h-8.983 c-1.299,0-2.353,1.786-2.353,3.988c0,2.203,1.053,3.989,2.353,3.989h7.826L231.966,245h3.189c2.124,0,3.845,1.722,3.845,3.846 v0.309c0,2.124-1.722,3.846-3.845,3.846h-4.349h-0.96H216.2c-1.933,0-3.5,1.567-3.5,3.5s1.567,3.5,3.5,3.5h8.645h4.945h0.364 c2.124,0,3.845,1.722,3.845,3.846v0.309c0,2.124-1.722,3.846-3.845,3.846h-1.524h-3.785h-1.8c-2.125,0-3.846,1.377-3.846,3.5 s1.721,3.5,3.846,3.5h25.636c0.273,0,0.538-0.024,0.795-0.068h17.828l1.336-9.471h-26.045l1.795-13.062h18.751l1.336-9.471 h-18.598l0.029-0.205C246.055,242.213,246.144,241.647,246.148,241.043z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 271 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 17.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="32px" height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="20.9386" y1="1.0265" x2="11.7312" y2="31.1426">
<stop offset="0" style="stop-color:#D61395"/>
<stop offset="0.2656" style="stop-color:#BB1089"/>
<stop offset="0.8337" style="stop-color:#760769"/>
<stop offset="0.9987" style="stop-color:#61045F"/>
</linearGradient>
<circle display="none" fill="url(#SVGID_1_)" cx="16.335" cy="16.085" r="15.742"/>
<rect fill="#FFFFFF" width="32" height="32"/>
<g>
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="21.3895" y1="2.3882" x2="8.5565" y2="28.6998">
<stop offset="0" style="stop-color:#D61395"/>
<stop offset="0.2656" style="stop-color:#BB1089"/>
<stop offset="0.8337" style="stop-color:#760769"/>
<stop offset="0.9987" style="stop-color:#61045F"/>
</linearGradient>
<path fill="url(#SVGID_2_)" d="M15.21,16.909c-0.414-0.414-0.414-1.085,0-1.499c0.414-0.414,1.085-0.414,1.499,0
c3.125,3.125,8.026,3.415,11.481,0.871c0.174-0.833,0.268-1.695,0.268-2.579c0-1.103-0.143-2.173-0.41-3.192
c-0.316,0.713-1.029,1.212-1.859,1.212c-1.123,0-2.033-0.91-2.033-2.033s0.91-2.033,2.033-2.033c0.289,0,0.563,0.061,0.812,0.169
c-2.111-3.988-6.3-6.706-11.126-6.706c-6.95,0-12.583,5.634-12.583,12.583c0,6.311,4.646,11.536,10.704,12.443l-1.168,2.624
c-0.647,2.232,0.714,3.06,2.542,1.546l8.895-7.176L24.2,23.133c1.217-1.075,2.221-2.383,2.95-3.852
C23.179,20.921,18.432,20.131,15.21,16.909z M18.318,7.654c1.123,0,2.033,0.91,2.033,2.033s-0.91,2.033-2.033,2.033
c-1.123,0-2.033-0.91-2.033-2.033S17.195,7.654,18.318,7.654z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -19,7 +19,6 @@ class Wappalyzer {
this.categories = {}; this.categories = {};
this.driver = {}; this.driver = {};
this.jsPatterns = {}; this.jsPatterns = {};
this.detected = {}; this.detected = {};
this.hostnameCache = {}; this.hostnameCache = {};
this.adCache = []; this.adCache = [];
@ -38,21 +37,33 @@ class Wappalyzer {
this.driver.log(message, source || '', type || 'debug'); this.driver.log(message, source || '', type || 'debug');
} }
asyncForEach(iterable, iterator) {
return Promise.all(( iterable || [] ).map(item => new Promise(resolve => setTimeout(() => resolve(iterator(item)), 1))));
}
analyze(url, data, context) { analyze(url, data, context) {
var apps = {}; const startTime = new Date();
if ( typeof data.html !== 'string' ) { const promises = [];
data.html = '';
} var apps = {};
if ( this.detected[url.canonical] === undefined ) { if ( this.detected[url.canonical] === undefined ) {
this.detected[url.canonical] = {}; this.detected[url.canonical] = {};
} }
// Additional information // Additional information
const matches = data.html.match(/<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i); var language = null;
if ( data.html ) {
if ( typeof data.html !== 'string' ) {
data.html = '';
}
const language = matches && matches.length ? matches[1] : null; const matches = data.html.match(/<html[^>]*[: ]lang="([a-z]{2}((-|_)[A-Z]{2})?)"/i);
language = matches && matches.length ? matches[1] : null;
}
Object.keys(this.apps).forEach(appName => { Object.keys(this.apps).forEach(appName => {
apps[appName] = this.detected[url.canonical] && this.detected[url.canonical][appName] ? this.detected[url.canonical][appName] : new Application(appName, this.apps[appName]); apps[appName] = this.detected[url.canonical] && this.detected[url.canonical][appName] ? this.detected[url.canonical][appName] : new Application(appName, this.apps[appName]);
@ -62,52 +73,57 @@ class Wappalyzer {
this.analyzeUrl(app, url); this.analyzeUrl(app, url);
if ( data.html ) { if ( data.html ) {
this.analyzeHtml(app, data.html); promises.push(this.analyzeHtml(app, data.html));
this.analyzeMeta(app, data.html); promises.push(this.analyzeMeta(app, data.html));
} }
if ( data.scripts ) { if ( data.scripts ) {
this.analyzeScripts(app, data.scripts); promises.push(this.analyzeScripts(app, data.scripts));
} }
if ( data.headers ) { if ( data.cookies ) {
this.analyzeHeaders(app, data.headers); promises.push(this.analyzeCookies(app, data.cookies));
}
if ( data.env ) {
this.analyzeEnv(app, data.env);
} }
if ( data.robotsTxt ) { if ( data.headers ) {
this.analyzeRobotsTxt(app, data.robotsTxt); promises.push(this.analyzeHeaders(app, data.headers));
} }
}) });
if ( data.js ) { if ( data.js ) {
Object.keys(data.js).forEach(appName => { Object.keys(data.js).forEach(appName => {
this.analyzeJs(apps[appName], data.js[appName]); promises.push(this.analyzeJs(apps[appName], data.js[appName]));
}); });
} }
Object.keys(apps).forEach(appName => { return new Promise(resolve => {
var app = apps[appName]; Promise.all(promises)
.then(() => {
Object.keys(apps).forEach(appName => {
var app = apps[appName];
if ( !app.detected || !app.getConfidence() ) { if ( !app.detected || !app.getConfidence() ) {
delete apps[app.name]; delete apps[app.name];
} }
}); });
this.resolveExcludes(apps); this.resolveExcludes(apps);
this.resolveImplies(apps, url.canonical); this.resolveImplies(apps, url.canonical);
this.cacheDetectedApps(apps, url.canonical); this.cacheDetectedApps(apps, url.canonical);
this.trackDetectedApps(apps, url, language); this.trackDetectedApps(apps, url, language);
if ( Object.keys(apps).length ) { this.log('Processing ' + Object.keys(data).join(', ') + ' took ' + (( new Date() - startTime ) / 1000).toFixed(2) + 's (' + url.hostname + ')', 'core');
this.log(Object.keys(apps).length + ' apps detected: ' + Object.keys(apps).join(', ') + ' on ' + url.canonical, 'core');
} if ( Object.keys(apps).length ) {
this.log('Identified ' + Object.keys(apps).join(', ') + ' (' + url.hostname + ')', 'core');
}
this.driver.displayApps(this.detected[url.canonical], { language }, context);
this.driver.displayApps(this.detected[url.canonical], { language }, context); resolve();
});
});
} }
/** /**
@ -130,12 +146,12 @@ class Wappalyzer {
this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:') this.driver.getRobotsTxt(parsed.host, parsed.protocol === 'https:')
.then(robotsTxt => { .then(robotsTxt => {
if (robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0)) { if ( robotsTxt.some(disallowedPath => parsed.pathname.indexOf(disallowedPath) === 0) ) {
return reject(); return reject();
} else {
return resolve();
} }
});
return resolve();
}, () => resolve());
}); });
}; };
@ -393,13 +409,15 @@ class Wappalyzer {
analyzeUrl(app, url) { analyzeUrl(app, url) {
var patterns = this.parsePatterns(app.props.url); var patterns = this.parsePatterns(app.props.url);
if ( patterns.length ) { if ( !patterns.length ) {
patterns.forEach(pattern => { return Promise.resolve();
if ( pattern.regex.test(url.canonical) ) {
this.addDetected(app, pattern, 'url', url.canonical);
}
});
} }
return this.asyncForEach(patterns, pattern => {
if ( pattern.regex.test(url.canonical) ) {
this.addDetected(app, pattern, 'url', url.canonical);
}
});
} }
/** /**
@ -408,13 +426,15 @@ class Wappalyzer {
analyzeHtml(app, html) { analyzeHtml(app, html) {
var patterns = this.parsePatterns(app.props.html); var patterns = this.parsePatterns(app.props.html);
if ( patterns.length ) { if ( !patterns.length ) {
patterns.forEach(pattern => { return Promise.resolve();
if ( pattern.regex.test(html) ) {
this.addDetected(app, pattern, 'html', html);
}
});
} }
return this.asyncForEach(patterns, pattern => {
if ( pattern.regex.test(html) ) {
this.addDetected(app, pattern, 'html', html);
}
});
} }
/** /**
@ -423,115 +443,114 @@ class Wappalyzer {
analyzeScripts(app, scripts) { analyzeScripts(app, scripts) {
var patterns = this.parsePatterns(app.props.script); var patterns = this.parsePatterns(app.props.script);
if ( patterns.length ) { if ( !patterns.length ) {
patterns.forEach(pattern => { return Promise.resolve();
var match; }
scripts.forEach(uri => { return this.asyncForEach(patterns, pattern => {
if ( pattern.regex.test(uri) ) { var match;
this.addDetected(app, pattern, 'script', uri);
} scripts.forEach(uri => {
}); if ( pattern.regex.test(uri) ) {
this.addDetected(app, pattern, 'script', uri);
}
}); });
} });
} }
/** /**
* Analyze meta tag * Analyze meta tag
*/ */
analyzeMeta(app, html) { analyzeMeta(app, html) {
var regex = /<meta[^>]+>/ig; const regex = /<meta[^>]+>/ig;
var patterns = this.parsePatterns(app.props.meta); const patterns = this.parsePatterns(app.props.meta);
var content = ''; const promises = [];
var matches = []; var matches = [];
while ( patterns && ( matches = regex.exec(html) ) ) { while ( patterns && ( matches = regex.exec(html) ) ) {
for ( var meta in patterns ) { for ( var meta in patterns ) {
const r = new RegExp('(?:name|property)=["\']' + meta + '["\']', 'i'); const r = new RegExp('(?:name|property)=["\']' + meta + '["\']', 'i');
if ( new RegExp('(?:name|property)=["\']' + meta + '["\']', 'i').test(matches[0]) ) { if ( r.test(matches[0]) ) {
content = matches[0].match(/content=("|')([^"']+)("|')/i); let content = matches[0].match(/content=("|')([^"']+)("|')/i);
patterns[meta].forEach(pattern => { promises.push(this.asyncForEach(patterns[meta], pattern => {
if ( content && content.length === 4 && pattern.regex.test(content[2]) ) { if ( content && content.length === 4 && pattern.regex.test(content[2]) ) {
this.addDetected(app, pattern, 'meta', content[2], meta); this.addDetected(app, pattern, 'meta', content[2], meta);
} }
}); }));
} }
} }
} }
return promises ? Promise.all(promises) : Promise.resolve();
} }
/** /**
* analyze response headers * Analyze response headers
*/ */
analyzeHeaders(app, headers) { analyzeHeaders(app, headers) {
var patterns = this.parsePatterns(app.props.headers); const patterns = this.parsePatterns(app.props.headers);
const promises = [];
if ( headers ) {
Object.keys(patterns).forEach(headerName => { Object.keys(patterns).forEach(headerName => {
patterns[headerName].forEach(pattern => { promises.push(this.asyncForEach(patterns[headerName], pattern => {
headerName = headerName.toLowerCase(); headerName = headerName.toLowerCase();
if ( headerName in headers ) { if ( headerName in headers ) {
headers[headerName].forEach(headerValue => { headers[headerName].forEach(headerValue => {
if ( pattern.regex.test(headerValue) ) { if ( pattern.regex.test(headerValue) ) {
this.addDetected(app, pattern, 'headers', headerValue, headerName); this.addDetected(app, pattern, 'headers', headerValue, headerName);
} }
}); });
} }
}); }));
}); });
}
return promises ? Promise.all(promises) : Promise.resolve();
} }
/** /**
* Analyze environment variables * Analyze cookies
*/ */
analyzeEnv(app, envs) { analyzeCookies(app, cookies) {
var patterns = this.parsePatterns(app.props.env); const patterns = this.parsePatterns(app.props.cookies);
const promises = [];
if ( patterns.length ) {
patterns.forEach(pattern => { Object.keys(patterns).forEach(cookieName => {
Object.keys(envs).forEach(env => { cookieName = cookieName.toLowerCase();
if ( pattern.regex.test(envs[env]) ) {
this.addDetected(app, pattern, 'env', envs[env]); promises.push(this.asyncForEach(patterns[cookieName], pattern => {
} const cookie = cookies.find(cookie => cookie.name.toLowerCase() === cookieName);
})
}); if ( cookie && pattern.regex.test(cookie.value) ) {
} this.addDetected(app, pattern, 'cookies', cookie.value, cookieName);
}
}));
});
return promises ? Promise.all(promises) : Promise.resolve();
} }
/** /**
* Analyze JavaScript variables * Analyze JavaScript variables
*/ */
analyzeJs(app, results) { analyzeJs(app, results) {
const promises = [];
Object.keys(results).forEach(string => { Object.keys(results).forEach(string => {
Object.keys(results[string]).forEach(index => { promises.push(this.asyncForEach(Object.keys(results[string]), index => {
const pattern = this.jsPatterns[app.name][string][index]; const pattern = this.jsPatterns[app.name][string][index];
const value = results[string][index]; const value = results[string][index];
if ( pattern.regex.test(value) ) { if ( pattern && pattern.regex.test(value) ) {
this.addDetected(app, pattern, 'js', value); this.addDetected(app, pattern, 'js', value);
} }
}); }));
}); });
}
/**
* Analyze robots.txt
*/
analyzeRobotsTxt(app, robotsTxt) {
var patterns = this.parsePatterns(app.props.robotsTxt);
if ( patterns.length ) { return promises ? Promise.all(promises) : Promise.resolve();
patterns.forEach(pattern => {
if ( pattern.regex.test(robotsTxt) ) {
this.addDetected(app, pattern, 'robotsTxt', robotsTxt);
}
});
}
} }
/** /**
@ -559,7 +578,7 @@ class Wappalyzer {
} }
// Replace back references // Replace back references
version = version.replace(new RegExp('\\\\' + i, 'g'), match || ''); version = version.trim().replace(new RegExp('\\\\' + i, 'g'), match || '');
}); });
if ( version && versions.indexOf(version) === -1 ) { if ( version && versions.indexOf(version) === -1 ) {

@ -0,0 +1,144 @@
/* eslint-env mocha */
'use strict';
const assert = require('chai').assert;
const Wappalyzer = require('../src/wappalyzer');
describe('should analyze website elements properly', function () {
it('should analyze html', async () => {
const html = `
<!DOCTYPE HTML>
<html>
<head>
<title>Page title | Html detection </title>
<meta charset="utf-8" />
</head>
<body>
<h1>Technologies Test Page | Html detection</h1>
<!-- Google Tag Manager -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-KAAOEOE"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager -->
</body>
</html>
`;
const wappalyzer = new Wappalyzer();
wappalyzer.apps = {
"Google Tag Manager": {
"html": [
"googletagmanager\\.com/ns\\.html[^>]+></iframe>",
"<!-- (?:End )?Google Tag Manager -->"
]
}
};
var applications = null;
wappalyzer.driver = {
log () {},
displayApps (detectedMap) {
applications = detectedMap;
}
};
await wappalyzer.analyze({ canonical: 'example.com' }, { html });
assert.equal(applications['Google Tag Manager'].name, 'Google Tag Manager');
});
it('should analyze scripts', async () => {
const scripts = [
'http://www.google-analytics.com/analytics.js',
'http://example.com/assets/js/jquery.min.js'
];
const wappalyzer = new Wappalyzer();
wappalyzer.apps = {
"Google Analytics": {
"cats": [
10
],
"script": "google-analytics\\.com\\/(?:ga|urchin|(analytics))\\.js\\;version:\\1?UA:"
},
"jQuery": {
"script": [
"jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
"/([\\d.]+)/jquery(?:\\.min)?\\.js\\;version:\\1",
"jquery.*\\.js(?:\\?ver(?:sion)?=([\\d.]+))?\\;version:\\1"
]
}
};
var applications = null;
wappalyzer.driver = {
log () {},
displayApps (detectedMap) {
applications = detectedMap;
}
};
await wappalyzer.analyze({ canonical: 'example.com' }, { scripts });
assert.equal(applications['Google Analytics'].name, 'Google Analytics');
assert.equal(applications['jQuery'].name, 'jQuery');
});
it('should analyze headers', async () => {
const headers = {
'date': [ 'Thu, 01 Feb 2018 11:34:18 GMT' ],
'connection': [ 'keep-alive' ],
'x-powered-by': [ 'Express'],
'etag': [ 'W/125-1jQLmiya7mfec43xR3Eb3pjdu64s' ],
'content-length': [ '293' ],
'content-type': [ 'text/html; charset=utf-8' ]
};
const wappalyzer = new Wappalyzer();
wappalyzer.apps = {
"Express": {
"headers": {
"X-Powered-By": "^Express$"
}
}
};
var applications = null;
wappalyzer.driver = {
log () {},
displayApps (detectedMap) {
applications = detectedMap;
}
};
await wappalyzer.analyze({ canonical: 'example.com' }, { headers });
assert.equal(applications['Express'].name, 'Express');
});
it('should analyze js globals', async () => {
const js = {
'Moment.js': { 'moment': { '0': true } },
'Google Font API': { 'WebFonts': { '0': true } }
};
const wappalyzer = new Wappalyzer();
wappalyzer.apps = {
"Moment.js": {
"js": {
"moment": "",
"moment.version": "(.*)\\;version:\\1"
}
},
"Google Font API": {
"js": {
"WebFonts": ""
}
}
};
var applications = null;
wappalyzer.driver = {
log () {},
displayApps (detectedMap) {
applications = detectedMap;
}
};
wappalyzer.parseJsPatterns();
await wappalyzer.analyze({ canonical: 'example.com' }, { js });
assert.equal(applications['Google Font API'].name, 'Google Font API');
assert.equal(applications['Moment.js'].name, 'Moment.js');
});
});

@ -2,20 +2,173 @@
# yarn lockfile v1 # yarn lockfile v1
assertion-error@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b"
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
dependencies:
balanced-match "^1.0.0"
concat-map "0.0.1"
browser-stdout@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f"
chai@^4.1.2:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c"
dependencies:
assertion-error "^1.0.1"
check-error "^1.0.1"
deep-eql "^3.0.0"
get-func-name "^2.0.0"
pathval "^1.0.0"
type-detect "^4.0.0"
check-error@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
commander@2.11.0:
version "2.11.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563"
concat-map@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
debug@3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
dependencies:
ms "2.0.0"
deep-eql@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df"
dependencies:
type-detect "^4.0.0"
diff@3.3.1:
version "3.3.1"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75"
escape-string-regexp@1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
file-type@7.4.*: file-type@7.4.*:
version "7.4.0" version "7.4.0"
resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.4.0.tgz#2a7c94f62a0030150bb7d9b6c70cfa1d3e759c86" resolved "https://registry.yarnpkg.com/file-type/-/file-type-7.4.0.tgz#2a7c94f62a0030150bb7d9b6c70cfa1d3e759c86"
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
get-func-name@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
glob@7.1.2:
version "7.1.2"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
dependencies:
fs.realpath "^1.0.0"
inflight "^1.0.4"
inherits "2"
minimatch "^3.0.4"
once "^1.3.0"
path-is-absolute "^1.0.0"
growl@1.10.3:
version "1.10.3"
resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f"
has-flag@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51"
he@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
html-comment-regex@^1.1.0: html-comment-regex@^1.1.0:
version "1.1.1" version "1.1.1"
resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e" resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.1.tgz#668b93776eaae55ebde8f3ad464b307a4963625e"
inflight@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
dependencies:
once "^1.3.0"
wrappy "1"
inherits@2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
is-svg@2.1.*: is-svg@2.1.*:
version "2.1.0" version "2.1.0"
resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9"
dependencies: dependencies:
html-comment-regex "^1.1.0" html-comment-regex "^1.1.0"
minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
dependencies:
brace-expansion "^1.1.7"
minimist@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
mkdirp@0.5.1:
version "0.5.1"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
dependencies:
minimist "0.0.8"
mocha@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.0.1.tgz#759b62c836b0732382a62b6b1fb245ec1bc943ac"
dependencies:
browser-stdout "1.3.0"
commander "2.11.0"
debug "3.1.0"
diff "3.3.1"
escape-string-regexp "1.0.5"
glob "7.1.2"
growl "1.10.3"
he "1.1.1"
mkdirp "0.5.1"
supports-color "4.4.0"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
once@^1.3.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
dependencies:
wrappy "1"
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
pathval@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0"
pify@^3.0.0: pify@^3.0.0:
version "3.0.0" version "3.0.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
@ -30,3 +183,17 @@ read-chunk@2.1.*:
safe-buffer@^5.1.1: safe-buffer@^5.1.1:
version "5.1.1" version "5.1.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853"
supports-color@4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e"
dependencies:
has-flag "^2.0.0"
type-detect@^4.0.0:
version "4.0.8"
resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"