Merge branch 'master' of github.com:AliasIO/Wappalyzer

main
Mostafa Soufi 6 years ago
commit 57a4e7f55f

2
.gitignore vendored

@ -15,3 +15,5 @@ Desktop.ini
._*
tags
tags.*
.idea
/nbproject/private/

@ -1,6 +1,6 @@
FROM alpine
MAINTAINER Elbert Alias <elbert@alias.io>
LABEL maintainer="elbert@alias.io"
ENV WAPPALYZER_DIR=/opt/wappalyzer

File diff suppressed because it is too large Load Diff

@ -14,38 +14,43 @@ technologies used on websites. It detects
## Installation
```shell
$ npm i wappalyzer
$ npm i -g wappalyzer # Globally
$ npm i wappalyzer --save # As a dependency
```
## Run from the command line
```
node index.js [url] [options]
wappalyzer [url] [options]
```
### Options
```
--password Password to be used for basic HTTP authentication
--proxy Proxy URL, e.g. 'http://user:pass@proxy:8080'
--username Username to be used for basic HTTP authentication
--chunk-size=num Process links in chunks.
--debug=0|1 Output debug messages.
--delay=ms Wait for ms milliseconds between requests.
--html-max-cols=num Limit the number of HTML characters per line processed.
--html-max-rows=num Limit the number of HTML lines processed.
--max-depth=num Don't analyse pages more than num levels deep.
--max-urls=num Exit when num URLs have been analysed.
--max-wait=ms Wait no more than ms milliseconds for page resources to load.
--recursive=0|1 Follow links on pages (crawler).
--user-agent=str Set the user agent string.
--password Password to be used for basic HTTP authentication
--proxy Proxy URL, e.g. 'http://user:pass@proxy:8080'
--username Username to be used for basic HTTP authentication
--chunk-size=num Process links in chunks.
--debug=0|1 Output debug messages.
--delay=ms Wait for ms milliseconds between requests.
--html-max-cols=num Limit the number of HTML characters per line processed.
--html-max-rows=num Limit the number of HTML lines processed.
--max-depth=num Don't analyse pages more than num levels deep.
--max-urls=num Exit when num URLs have been analysed.
--max-wait=ms Wait no more than ms milliseconds for page resources to load.
--recursive=0|1 Follow links on pages (crawler).
--user-agent=str Set the user agent string.
```
## Run from a script
```javascript
const Wappalyzer = require('wappalyzer');
const url = 'https://www.wappalyzer.com';
const options = {
debug: false,
delay: 500,
@ -58,16 +63,29 @@ const options = {
htmlMaxRows: 2000,
};
const wappalyzer = new Wappalyzer('https://www.wappalyzer.com', options);
const wappalyzer = new Wappalyzer(url, options);
// Optional: set the browser to use
// wappalyzer.browser = Wappalyzer.browsers.zombie;
// Optional: capture log output
// wappalyzer.on('log', params => {
// const { message, source, type } = params;
// });
// Optional: do something on page visit
// wappalyzer.on('visit', params => {
// const { browser, pageUrl } = params;
// });
wappalyzer.analyze()
.then(json => {
process.stdout.write(JSON.stringify(json, null, 2) + '\n')
process.stdout.write(`${JSON.stringify(json, null, 2)}\n`);
process.exit(0);
})
.catch(error => {
process.stderr.write(error + '\n')
process.stderr.write(`${error}\n`);
process.exit(1);
});

@ -0,0 +1,20 @@
class Browser {
constructor(options) {
this.options = options;
this.window = null;
this.document = null;
this.statusCode = null;
this.contentType = null;
this.headers = null;
this.statusCode = null;
this.contentType = null;
this.html = null;
this.js = null;
this.links = null;
this.scripts = null;
this.cookies = null;
}
}
module.exports = Browser;

@ -0,0 +1,121 @@
const Zombie = require('zombie');
const Browser = require('../browser');
class ZombieBrowser extends Browser {
constructor(options) {
super(options);
this.browser = new Zombie({
proxy: options.proxy,
silent: true,
strictSSL: false,
userAgent: options.userAgent,
waitDuration: options.maxWait,
});
this.browser.on('authenticate', (auth) => {
auth.username = this.options.username;
auth.password = this.options.password;
});
}
visit(url) {
return new Promise((resolve) => {
this.browser.visit(url, () => {
const resource = this.browser.resources.length
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
this.window = this.browser.window;
this.document = this.browser.document;
this.headers = this.getHeaders();
this.statusCode = resource ? resource.response.status : 0;
this.contentType = this.headers['content-type'] ? this.headers['content-type'].shift() : null;
this.html = this.getHtml();
this.js = this.getJs();
this.links = this.getLinks();
this.scripts = this.getScripts();
this.cookies = this.getCookies();
resolve();
});
});
}
getHeaders() {
const headers = {};
const resource = this.browser.resources.length
? this.browser.resources.filter(_resource => _resource.response).shift() : null;
if (resource) {
// eslint-disable-next-line no-underscore-dangle
resource.response.headers._headers.forEach((header) => {
if (!headers[header[0]]) {
headers[header[0]] = [];
}
headers[header[0]].push(header[1]);
});
}
return headers;
}
getHtml() {
let html = '';
if (this.browser.document && this.browser.document.documentElement) {
try {
html = this.browser.html();
} catch (error) {
this.log(error.message, 'error');
}
}
return html;
}
getScripts() {
let scripts = [];
if (this.browser.document && this.browser.document.scripts) {
scripts = Array.prototype.slice
.apply(this.browser.document.scripts)
.filter(script => script.src)
.map(script => script.src);
}
return scripts;
}
getJs() {
return this.browser.window;
}
getLinks() {
let links = [];
if (this.browser.document) {
links = Array.from(this.browser.document.getElementsByTagName('a'));
}
return links;
}
getCookies() {
const cookies = [];
if (this.browser.cookies) {
this.browser.cookies.forEach(cookie => cookies.push({
name: cookie.key,
value: cookie.value,
domain: cookie.domain,
path: cookie.path,
}));
}
return cookies;
}
}
module.exports = ZombieBrowser;

@ -0,0 +1,45 @@
#!/usr/bin/env node
const Wappalyzer = require('./driver');
const Browser = require('./browsers/zombie');
const args = process.argv.slice(2);
const url = args.shift() || '';
if (!url) {
process.stderr.write('No URL specified\n');
process.exit(1);
}
const options = {};
let arg;
do {
arg = args.shift();
const matches = /--([^=]+)=(.+)/.exec(arg);
if (matches) {
const key = matches[1].replace(/-\w/g, _matches => _matches[1].toUpperCase());
const value = matches[2];
options[key] = value;
}
} while (arg);
const wappalyzer = new Wappalyzer(Browser, url, options);
wappalyzer.analyze()
.then((json) => {
process.stdout.write(`${JSON.stringify(json)}\n`);
process.exit(0);
})
.catch((error) => {
process.stderr.write(`${error}\n`);
process.exit(1);
});

@ -1,9 +1,6 @@
const url = require('url');
const fs = require('fs');
const path = require('path');
const Browser = require('zombie');
const Wappalyzer = require('./wappalyzer');
const json = JSON.parse(fs.readFileSync(path.resolve(`${__dirname}/apps.json`)));
@ -20,56 +17,55 @@ function sleep(ms) {
return ms ? new Promise(resolve => setTimeout(resolve, ms)) : Promise.resolve();
}
function getHeaders(browser) {
const headers = {};
function processJs(window, patterns) {
const js = {};
const resource = browser.resources.length
? browser.resources.filter(_resource => _resource.response).shift() : null;
Object.keys(patterns).forEach((appName) => {
js[appName] = {};
if (resource) {
// eslint-disable-next-line no-underscore-dangle
resource.response.headers._headers.forEach((header) => {
if (!headers[header[0]]) {
headers[header[0]] = [];
}
Object.keys(patterns[appName]).forEach((chain) => {
js[appName][chain] = {};
headers[header[0]].push(header[1]);
});
}
patterns[appName][chain].forEach((pattern, index) => {
const properties = chain.split('.');
return headers;
}
let value = properties
.reduce((parent, property) => (parent && parent[property]
? parent[property] : null), window);
function getScripts(browser) {
if (!browser.document || !browser.document.scripts) {
return [];
}
value = typeof value === 'string' || typeof value === 'number' ? value : !!value;
const scripts = Array.prototype.slice
.apply(browser.document.scripts)
.filter(script => script.src)
.map(script => script.src);
if (value) {
js[appName][chain][index] = value;
}
});
});
});
return scripts;
return js;
}
function getCookies(browser) {
const cookies = [];
function processHtml(html, maxCols, maxRows) {
if (maxCols || maxRows) {
const chunks = [];
const rows = html.length / maxCols;
let i;
for (i = 0; i < rows; i += 1) {
if (i < maxRows / 2 || i > rows - maxRows / 2) {
chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
}
}
if (browser.cookies) {
browser.cookies.forEach(cookie => cookies.push({
name: cookie.key,
value: cookie.value,
domain: cookie.domain,
path: cookie.path,
}));
html = chunks.join('\n');
}
return cookies;
return html;
}
class Driver {
constructor(pageUrl, options) {
constructor(Browser, pageUrl, options) {
this.options = Object.assign({}, {
password: '',
proxy: null,
@ -99,6 +95,9 @@ class Driver {
this.analyzedPageUrls = {};
this.apps = [];
this.meta = {};
this.listeners = {};
this.Browser = Browser;
this.wappalyzer = new Wappalyzer();
@ -108,11 +107,26 @@ class Driver {
this.wappalyzer.parseJsPatterns();
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'));
}
on(event, callback) {
if (!this.listeners[event]) {
this.listeners[event] = [];
}
this.listeners[event].push(callback);
}
emit(event, params) {
if (this.listeners[event]) {
this.listeners[event].forEach(listener => listener(params));
}
}
analyze() {
this.time = {
start: new Date().getTime(),
@ -126,6 +140,8 @@ class Driver {
if (this.options.debug) {
console.log(`[wappalyzer ${type}]`, `[${source}]`, message);
}
this.emit('log', { message, source, type });
}
displayApps(detected, meta) {
@ -176,186 +192,101 @@ class Driver {
this.timer(`fetch; url: ${pageUrl.href}; depth: ${depth}; delay: ${this.options.delay * index}ms`, timerScope);
return new Promise((resolve, reject) => {
sleep(this.options.delay * index)
.then(() => this.visit(pageUrl, timerScope, resolve, reject));
});
}
return new Promise(async (resolve, reject) => {
await sleep(this.options.delay * index);
visit(pageUrl, timerScope, resolve, reject) {
const browser = new Browser({
proxy: this.options.proxy,
silent: true,
strictSSL: false,
userAgent: this.options.userAgent,
waitDuration: this.options.maxWait,
this.visit(pageUrl, timerScope, resolve, reject);
});
}
browser.on('authenticate', (auth) => {
auth.username = this.options.username;
auth.password = this.options.password;
});
async visit(pageUrl, timerScope, resolve, reject) {
const browser = new this.Browser(this.options);
this.timer(`browser.visit start; url: ${pageUrl.href}`, timerScope);
browser.log = (message, type) => this.wappalyzer.log(message, 'browser', type);
browser.visit(pageUrl.href, () => {
this.timer(`browser.visit end; url: ${pageUrl.href}`, timerScope);
this.timer(`visit start; url: ${pageUrl.href}`, timerScope);
try {
if (!this.checkResponse(browser, pageUrl)) {
resolve();
await browser.visit(pageUrl.href);
return;
}
} catch (error) {
reject(error);
this.timer(`visit end; url: ${pageUrl.href}`, timerScope);
return;
}
this.analyzedPageUrls[pageUrl.href].status = browser.statusCode;
const headers = getHeaders(browser);
const html = this.getHtml(browser);
const scripts = getScripts(browser);
const js = this.getJs(browser);
const cookies = getCookies(browser);
this.wappalyzer.analyze(pageUrl, {
headers,
html,
scripts,
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 = '';
results.push(url.parse(link.href));
}
return results;
}, [],
);
return resolve(links);
});
});
}
checkResponse(browser, pageUrl) {
// Validate response
const resource = browser.resources.length
? browser.resources.filter(_resource => _resource.response).shift() : null;
if (!browser.statusCode) {
return reject(new Error('NO_RESPONSE'));
}
if (!resource) {
throw new Error('NO_RESPONSE');
if (browser.statusCode !== 200) {
return reject(new Error('RESPONSE_NOT_OK'));
}
this.analyzedPageUrls[pageUrl.href].status = resource.response.status;
if (!browser.contentType || !/\btext\/html\b/.test(browser.contentType)) {
this.wappalyzer.log(`Skipping; url: ${pageUrl.href}; content type: ${browser.contentType}`, 'driver');
if (resource.response.status !== 200) {
throw new Error('RESPONSE_NOT_OK');
delete this.analyzedPageUrls[pageUrl.href];
}
const headers = getHeaders(browser);
// Validate content type
const contentType = headers['content-type'] ? headers['content-type'].shift() : null;
const { cookies, headers, scripts } = browser;
if (!contentType || !/\btext\/html\b/.test(contentType)) {
this.wappalyzer.log(`Skipping; url: ${pageUrl.href}; content type: ${contentType}`, 'driver');
const html = processHtml(browser.html, this.options.htmlMaxCols, this.options.htmlMaxRows);
const js = processJs(browser.js, this.wappalyzer.jsPatterns);
delete this.analyzedPageUrls[pageUrl.href];
await this.wappalyzer.analyze(pageUrl, {
cookies,
headers,
html,
js,
scripts,
});
return false;
}
const reducedLinks = Array.prototype.reduce.call(
browser.links, (results, link) => {
if (link.protocol.match(/https?:/) && link.hostname === this.origPageUrl.hostname && extensions.test(link.pathname)) {
link.hash = '';
// Validate document
if (!browser.document || !browser.document.documentElement) {
throw new Error('NO_HTML_DOCUMENT');
}
results.push(url.parse(link.href));
}
return true;
}
return results;
}, [],
);
getHtml(browser) {
let html = '';
try {
html = browser.html()
.split('\n')
.slice(0, this.options.htmlMaxRows / 2)
.concat(html.slice(html.length - this.options.htmlMaxRows / 2))
.map(line => line.substring(0, this.options.htmlMaxCols))
.join('\n');
} catch (error) {
this.wappalyzer.log(error.message, 'browser', 'error');
}
this.emit('visit', { browser, pageUrl });
return html;
return resolve(reducedLinks);
}
getJs(browser) {
const patterns = this.wappalyzer.jsPatterns;
const js = {};
crawl(pageUrl, index = 1, depth = 1) {
pageUrl.canonical = `${pageUrl.protocol}//${pageUrl.host}${pageUrl.pathname}`;
Object.keys(patterns).forEach((appName) => {
js[appName] = {};
return new Promise(async (resolve) => {
let links;
Object.keys(patterns[appName]).forEach((chain) => {
js[appName][chain] = {};
try {
links = await this.fetch(pageUrl, index, depth);
} catch (error) {
const type = error.message && errorTypes[error.message] ? error.message : 'UNKNOWN_ERROR';
const message = error.message && errorTypes[error.message] ? errorTypes[error.message] : 'Unknown error';
patterns[appName][chain].forEach((pattern, index) => {
const properties = chain.split('.');
this.analyzedPageUrls[pageUrl.href].error = {
type,
message,
};
let value = properties
.reduce((parent, property) => (parent && parent[property]
? parent[property] : null), browser.window);
this.wappalyzer.log(`${message}; url: ${pageUrl.href}`, 'driver', 'error');
}
value = typeof value === 'string' || typeof value === 'number' ? value : !!value;
if (links && this.options.recursive && depth < this.options.maxDepth) {
await this.chunk(links.slice(0, this.options.maxUrls), depth + 1);
}
if (value) {
js[appName][chain][index] = value;
}
});
return resolve({
urls: this.analyzedPageUrls,
applications: this.apps,
meta: this.meta,
});
});
return js;
}
crawl(pageUrl, index = 1, depth = 1) {
pageUrl.canonical = `${pageUrl.protocol}//${pageUrl.host}${pageUrl.pathname}`;
return new Promise((resolve) => {
this.fetch(pageUrl, index, depth)
.catch((error) => {
const type = error.message && errorTypes[error.message] ? error.message : 'UNKNOWN_ERROR';
const message = error.message && errorTypes[error.message] ? errorTypes[error.message] : 'Unknown error';
this.analyzedPageUrls[pageUrl.href].error = {
type,
message,
};
this.wappalyzer.log(`${message}; url: ${pageUrl.href}`, 'driver', 'error');
})
.then((links) => {
if (links && this.options.recursive && depth < this.options.maxDepth) {
return this.chunk(links.slice(0, this.options.maxUrls), depth + 1);
}
return Promise.resolve();
})
.then(() => {
resolve({
urls: this.analyzedPageUrls,
applications: this.apps,
meta: this.meta,
});
});
});
}
chunk(links, depth, chunk = 0) {
@ -365,10 +296,12 @@ class Driver {
const chunked = links.splice(0, this.options.chunkSize);
return new Promise((resolve) => {
Promise.all(chunked.map((link, index) => this.crawl(link, index, depth)))
.then(() => this.chunk(links, depth, chunk + 1))
.then(() => resolve());
return new Promise(async (resolve) => {
await Promise.all(chunked.map((link, index) => this.crawl(link, index, depth)));
await this.chunk(links, depth, chunk + 1);
resolve();
});
}
@ -384,3 +317,6 @@ class Driver {
}
module.exports = Driver;
module.exports.processJs = processJs;
module.exports.processHtml = processHtml;

@ -1,45 +1,16 @@
#!/usr/bin/env node
const Driver = require('./driver');
const ZombieBrowser = require('./browsers/zombie');
class Wappalyzer {
constructor(pageUrl, options) {
this.browser = ZombieBrowser;
const Wappalyzer = require('./driver');
const args = process.argv.slice(2);
const url = args.shift() || '';
if (!url) {
process.stderr.write('No URL specified\n');
process.exit(1);
}
const options = {};
let arg;
do {
arg = args.shift();
const matches = /--([^=]+)=(.+)/.exec(arg);
if (matches) {
const key = matches[1].replace(/-\w/g, _matches => _matches[1].toUpperCase());
const value = matches[2];
options[key] = value;
return new Driver(this.browser, pageUrl, options);
}
} while (arg);
const wappalyzer = new Wappalyzer(url, options);
wappalyzer.analyze()
.then((json) => {
process.stdout.write(`${JSON.stringify(json)}\n`);
}
process.exit(0);
})
.catch((error) => {
process.stderr.write(`${error}\n`);
Wappalyzer.browsers = {
zombie: ZombieBrowser,
};
process.exit(1);
});
module.exports = Wappalyzer;

@ -1,6 +1,6 @@
{
"name": "wappalyzer",
"version": "5.5.3",
"version": "5.8.1",
"lockfileVersion": 1,
"requires": true,
"dependencies": {

@ -2,22 +2,25 @@
"name": "wappalyzer",
"description": "Uncovers the technologies used on websites",
"homepage": "https://github.com/AliasIO/Wappalyzer",
"version": "5.5.4",
"version": "5.8.2",
"author": "Elbert Alias",
"license": "GPL-3.0",
"repository": {
"type": "git",
"url": "https://github.com/AliasIO/Wappalyzer"
},
"main": "driver.js",
"main": "index.js",
"files": [
"apps.json",
"index.js",
"browser.js",
"browsers/zombie.js",
"cli.js",
"driver.js",
"index.js",
"wappalyzer.js"
],
"bin": {
"wappalyzer": "./index.js"
"wappalyzer": "./cli.js"
},
"dependencies": {
"zombie": "^6.1.2"

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nichts zu tun." },
"noAppsDetected": { "message": "Keine Applikation entdeckt." },
"categoryPin": { "message": "Immer Icon anzeigen" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Nachrichten Board" },
"categoryName3": { "message": "Datenbankverwaltung" },
@ -68,6 +70,12 @@
"categoryName55": { "message": "Buchhaltung" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Statischer Seitengenerator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName58": { "message": "Benutzer-Einbindung" },
"categoryName59": { "message": "JavaScript Bibliotheken" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
"categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
@ -65,5 +67,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,9 @@
"nothingToDo": { "message": "Nothing to do here." },
"noAppsDetected": { "message": "No technologies detected." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"privacyPolicy": { "message": "Privacy policy" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Message Board" },
"categoryName3": { "message": "Database Manager" },
@ -69,5 +72,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nada que hacer aquí." },
"noAppsDetected": { "message": "Aplicaciones no detectadas." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "Gestor de Contenido" },
"categoryName2": { "message": "Foro" },
"categoryName3": { "message": "Gestor de Bases de Datos" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -10,7 +10,9 @@
"optionTracking": { "message": "ارسال فن آوری های شناسایی شده به صورت ناشناس به wappalyzer.com" },
"nothingToDo": { "message": "هیچ چیز برای انجام اینجا نیست." },
"noAppsDetected": { "message": "هیچ فن آوری شناسایی نشده است." },
"categoryPin": { "message": "همیشه نماد را نشان بده" },
"categoryPin": { "message": "همیشه نماد را نشان بده" },
"termsAccept": { "message": "قبول" },
"termsContent": { "message": "این افزونه اطلاعات وبسایتهای بازدید شده توسط شما را به صورت ناشناس ارسال میکند، مانند آدرس سایت و تکنولوژی های استفاده شده در آن سایت را ارسال می کند. اطلاعات بیشتر در <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. شما میتوانید این افزونه را غیر فعال کنید." },
"categoryName1": { "message": "سیستم مدیریت محتوا" },
"categoryName2": { "message": "انجمن پیام" },
"categoryName3": { "message": "مدیر پایگاه داده" },
@ -26,7 +28,7 @@
"categoryName13": { "message": "ردیاب مشکل" },
"categoryName14": { "message": "پخش کننده ویدیویی" },
"categoryName15": { "message": "سیستم نظرسنجی" },
"categoryName16": { "message": "Captcha" },
"categoryName16": { "message": "کپچا" },
"categoryName17": { "message": "اسکریپ فونت" },
"categoryName18": { "message": "چارچوب وب" },
"categoryName19": { "message": "متفرقه" },
@ -64,10 +66,16 @@
"categoryName51": { "message": "سازنده صفحات Landing" },
"categoryName52": { "message": "گفتگوی زنده" },
"categoryName53": { "message": "مدیریت ارتباط با مشتری" },
"categoryName54": { "message": "بهینه سازی موتور جستجو" },
"categoryName54": { "message": "بهینه سازی موتور جستجو" },
"categoryName55": { "message": "حسابداری" },
"categoryName56": { "message": "کریپتوماینر" },
"categoryName57": { "message": "تولید کننده سایت ایستا" },
"categoryName58": { "message": "آن بوردینگ کاربر" },
"categoryName59": { "message": "کتابخانه های جاوا اسکریپت" }
"categoryName59": { "message": "کتابخانه های جاوا اسکریپت" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"twitter": { "message": "Suivre Wappalyzer sur Twitter" },
"website": { "message": "Aller sur wappalyzer.com" },
"categoryPin": { "message": " Toujours afficher l'icône" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestionnaire de base de données" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Crypto-mineur" },
"categoryName57": { "message": "Générateur de site statique" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Καμία ενέργεια." },
"noAppsDetected": { "message": "Δεν ανιχνεύθηκαν εφαρμογές." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Διαδικτυακό Φόρουμ" },
"categoryName3": { "message": "Διαχειριστής Βάσης Δεδομένων" },
@ -65,5 +67,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Tak ada yang dilakukan disini." },
"noAppsDetected": { "message": "Tidak ada aplikasi yang terdeteksi." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "Sistem Pengelola Konten" },
"categoryName2": { "message": "Papan Pesan" },
"categoryName3": { "message": "Pengelola Basis Data" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Niente da fare qui." },
"noAppsDetected": { "message": "Nessuna applicazione rilevata." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Gestore di Database" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nic tu nie ma." },
"noAppsDetected": { "message": "Nie wykryto żadnych aplikacji." },
"categoryPin": { "message": "Zawsze pokazuj tą ikonę" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "System zarządzania treścią" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "Menedżer baz danych" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Koparka kryptowalut" },
"categoryName57": { "message": "Generator stron statycznych" },
"categoryName58": { "message": "Wdrażanie użytkownika" },
"categoryName59": { "message": "Biblioteki JavaScript" }
"categoryName59": { "message": "Biblioteki JavaScript" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -1,73 +1,82 @@
{
"github": { "message": "Fork Wappalyzer no GitHub!" },
"noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." },
"nothingToDo": { "message": "Nada a fazer aqui." },
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" },
"optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" },
"optionUpgradeMessage": { "message": "Fale-me sobre actualizações" },
"options": { "message": "Opções" },
"optionsSave": { "message": "Opções de Guardar" },
"optionsSaved": { "message": "Guardado" },
"twitter": { "message": "Seguir Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" },
"categoryPin": { "message": "Mostrar sempre ícone" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Fórum" },
"categoryName3": { "message": "Gestor de Base de Dados" },
"categoryName4": { "message": "Ferramenta de Documentação" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Comércio Eletrónico" },
"categoryName7": { "message": "Galeria de Fotos" },
"categoryName8": { "message": "Wikis" },
"categoryName9": { "message": "Painéis de Hospedagem" },
"categoryName10": { "message": "Analítica" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Rastreador de Problemas" },
"categoryName14": { "message": "Leitor Vídeo" },
"categoryName15": { "message": "Sistema de Comentários" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Script de Tipos de Letra" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Diversos" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Servidor Web" },
"categoryName23": { "message": "Ferramenta de Cache" },
"categoryName24": { "message": "Editor WYSIWYG" },
"categoryName25": { "message": "Gráficos JavaScript" },
"categoryName26": { "message": "Framework Mobile" },
"categoryName27": { "message": "Linguagem de Programação" },
"categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motor de Busca" },
"categoryName30": { "message": "Web Mail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automação de Marketing" },
"categoryName33": { "message": "Extensão de Servidor Web" },
"categoryName34": { "message": "Base de Dados" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Rede de Publicidade" },
"categoryName37": { "message": "Serviço de Rede" },
"categoryName38": { "message": "Servidor de Média" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Impressão" },
"categoryName41": { "message": "Processador de Pagamento" },
"categoryName42": { "message": "Gestor de Etiquetas" },
"categoryName43": { "message": "Sistema de Subscrição Paga" },
"categoryName44": { "message": "Sistema Build/CI" },
"categoryName45": { "message": "Sistema SCADA" },
"categoryName46": { "message": "Acesso Remoto" },
"categoryName47": { "message": "Ferramenta de Desenvolvimento" },
"categoryName48": { "message": "Rede de Armazenamento" },
"categoryName49": { "message": "Leitores de Feed" },
"categoryName50": { "message": "Sistema de Gestão de Documentos" },
"categoryName51": { "message": "Criador de Páginas de Destino" },
"categoryName52": { "message": "Chat ao Vivo" },
"categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Contabilidade" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Gerador de Site Estático" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"github": { "message": "Fork Wappalyzer no GitHub!" },
"noAppsDetected": { "message": "Não foi detectada nenhuma tecnologia." },
"nothingToDo": { "message": "Nada a fazer aqui." },
"optionDynamicIcon": { "message": "Utilizar o ícone da tecnologia em vez do logótipo do Wappalyzer" },
"optionTracking": { "message": "Envie anonimamente tecnologias identificadas para wappalyzer.com" },
"optionUpgradeMessage": { "message": "Fale-me sobre actualizações" },
"options": { "message": "Opções" },
"optionsSave": { "message": "Opções de Guardar" },
"optionsSaved": { "message": "Guardado" },
"twitter": { "message": "Seguir Wappalyzer no Twitter" },
"website": { "message": "Ir para wappalyzer.com" },
"categoryPin": { "message": "Mostrar sempre ícone" },
"termsAccept": { "message": "Aceitar" },
"termsContent": { "message": "Esta extensão envia informações anónimas sobre os sites que visitas, incluindo o nome de domínio e as tecnologias identificadas, para o <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. Isso pode ser desativado nas configurações." },
"privacyPolicy": { "message": "Políticas de Privacidade" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Fórum" },
"categoryName3": { "message": "Gestor de Base de Dados" },
"categoryName4": { "message": "Ferramenta de Documentação" },
"categoryName5": { "message": "Widget" },
"categoryName6": { "message": "Ecommerce" },
"categoryName7": { "message": "Galeria de Fotos" },
"categoryName8": { "message": "Wikis" },
"categoryName9": { "message": "Painéis de Hospedagem" },
"categoryName10": { "message": "Analítica" },
"categoryName11": { "message": "Blog" },
"categoryName12": { "message": "Framework JavaScript" },
"categoryName13": { "message": "Localizador de Problemas" },
"categoryName14": { "message": "Leitor Vídeo" },
"categoryName15": { "message": "Sistema de Comentários" },
"categoryName16": { "message": "Captcha" },
"categoryName17": { "message": "Tipos de Letra" },
"categoryName18": { "message": "Framework Web" },
"categoryName19": { "message": "Diversos" },
"categoryName20": { "message": "Editor" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Servidor Web" },
"categoryName23": { "message": "Ferramenta de Cache" },
"categoryName24": { "message": "Editor WYSIWYG" },
"categoryName25": { "message": "Gráficos JavaScript" },
"categoryName26": { "message": "Framework Mobile" },
"categoryName27": { "message": "Linguagem de Programação" },
"categoryName28": { "message": "Sistema Operativo" },
"categoryName29": { "message": "Motor de Busca" },
"categoryName30": { "message": "WebMail" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Automação de Marketing" },
"categoryName33": { "message": "Extensão de Servidor Web" },
"categoryName34": { "message": "Base de Dados" },
"categoryName35": { "message": "Mapa" },
"categoryName36": { "message": "Rede de Publicidade" },
"categoryName37": { "message": "Serviço de Rede" },
"categoryName38": { "message": "Servidor de Média" },
"categoryName39": { "message": "Webcam" },
"categoryName40": { "message": "Impressão" },
"categoryName41": { "message": "Processador de Pagamento" },
"categoryName42": { "message": "Gestor de Etiquetas" },
"categoryName43": { "message": "Sistema de Subscrição Paga" },
"categoryName44": { "message": "Sistema Build/CI" },
"categoryName45": { "message": "Sistema SCADA" },
"categoryName46": { "message": "Acesso Remoto" },
"categoryName47": { "message": "Ferramenta de Desenvolvimento" },
"categoryName48": { "message": "Rede de Armazenamento" },
"categoryName49": { "message": "Leitores de Feed" },
"categoryName50": { "message": "Sistema de Gestão de Documentos" },
"categoryName51": { "message": "Criador de Páginas de Destino" },
"categoryName52": { "message": "Chat ao Vivo" },
"categoryName53": { "message": "CRM" },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Contabilidade" },
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Gerador de Site Estático" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "Bibliotecas de JavaScript" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nada a fazer aqui." },
"noAppsDetected": { "message": "Nenhuma tecnologia identificada." },
"categoryPin": { "message": "Sempre mostrar ícone" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Fórum" },
"categoryName3": { "message": "Gestão de banco de dados" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Minerador de cryptomoedas" },
"categoryName57": { "message": "Gerador de sites estáticos" },
"categoryName58": { "message": "Integração com usuário" },
"categoryName59": { "message": "Biblioteca JavaScript" }
"categoryName59": { "message": "Biblioteca JavaScript" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nimic de făcut pe pagina curentă." },
"noAppsDetected": { "message": "Nici o aplicație detectată." },
"categoryPin": { "message": "Afișează icon tot timpul" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Forum de discuții" },
"categoryName3": { "message": "Manager baze de date" },
@ -65,5 +67,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -1,73 +1,81 @@
{
"categoryName1" : { "message" : "CMS" },
"categoryName2" : { "message" : "Форум" },
"categoryName3" : { "message" : "Менеджер БД" },
"categoryName4" : { "message" : "Документация" },
"categoryName5" : { "message" : "Виджет" },
"categoryName6" : { "message" : "Электронная коммерция" },
"categoryName7" : { "message" : "Фотогалерея" },
"categoryName8" : { "message" : "Вики" },
"categoryName9" : { "message" : "Панель управления хостингом" },
"categoryName10" : { "message" : "Аналитика" },
"categoryName11" : { "message" : "Блог" },
"categoryName12" : { "message" : "JS фреймворк" },
"categoryName13" : { "message" : "Баг трекер" },
"categoryName14" : { "message" : "Видео плеер" },
"categoryName15" : { "message" : "Система комментариев" },
"categoryName16" : { "message" : "Капча" },
"categoryName17" : { "message" : "Шрифт" },
"categoryName18" : { "message" : "Веб фреймворк" },
"categoryName19" : { "message" : "Прочее" },
"categoryName20" : { "message" : "HTML редактор" },
"categoryName21" : { "message" : "LMS" },
"categoryName22" : { "message" : "Веб сервер" },
"categoryName23" : { "message" : "Кеширование" },
"categoryName24" : { "message" : "WYSIWYG редактор" },
"categoryName25" : { "message" : "JS графика" },
"categoryName26" : { "message" : "Мобильный фреймворк" },
"categoryName27" : { "message" : "Язык программирования" },
"categoryName28" : { "message" : "Операционная система" },
"categoryName29" : { "message" : "Поисковый движок" },
"categoryName30" : { "message" : "Веб почта" },
"categoryName31" : { "message" : "CDN" },
"categoryName32" : { "message" : "Управление маркетингом" },
"categoryName33" : { "message" : "Расширение Веб сервера" },
"categoryName34" : { "message" : "База данных" },
"categoryName35" : { "message" : "Карта" },
"categoryName36" : { "message" : "Рекламная сеть" },
"categoryName37" : { "message" : "Сетевая служба" },
"categoryName38" : { "message" : "Медиа сервер" },
"categoryName39" : { "message" : "Вебкамера" },
"categoryName40" : { "message" : "Принтер" },
"categoryName41" : { "message" : "Платёжная система" },
"categoryName42" : { "message" : "Менеджер тэгов" },
"categoryName43" : { "message" : "Paywall" },
"categoryName44" : { "message" : "Система непрерывной интеграции" },
"categoryName45" : { "message" : "Система SCADA" },
"categoryName46" : { "message" : "Удаленное управление" },
"categoryName47" : { "message" : "Утилита для разработчиков" },
"categoryName48" : { "message" : "Сетевое хранилище" },
"categoryName49" : { "message" : "Граббер контента" },
"categoryName50" : { "message" : "Управление документами" },
"categoryName51" : { "message": "Генератор лендингов" },
"categoryName52" : { "message": "Live Chat" },
"categoryName53" : { "message": "CRM" },
"github" : { "message" : "Форкнуть на GitHub!" },
"noAppsDetected" : { "message" : "Нет данных о сайте" },
"nothingToDo" : { "message" : "Тут нечего искать" },
"optionTracking" : { "message" : "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" },
"optionDynamicIcon" : { "message": "Использовать значок приложения вместо логотипа Wappalyzer" },
"optionUpgradeMessage" : { "message" : "Оповещать меня об обновлениях" },
"options" : { "message" : "Настройки" },
"optionsSave" : { "message" : "Сохранить" },
"optionsSaved" : { "message" : "Успешно сохранено!" },
"twitter" : { "message" : "Следите за новостями в Твиттере" },
"website" : { "message" : "Перейти на Wappalyzer.com" },
"categoryPin": { "message": "Always show icon" },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Форум" },
"categoryName3": { "message": "Менеджер БД" },
"categoryName4": { "message": "Документация" },
"categoryName5": { "message": "Виджет" },
"categoryName6": { "message": "Электронная коммерция" },
"categoryName7": { "message": "Фотогалерея" },
"categoryName8": { "message": "Вики" },
"categoryName9": { "message": "Панель управления хостингом" },
"categoryName10": { "message": "Аналитика" },
"categoryName11": { "message": "Блог" },
"categoryName12": { "message": "JS фреймворк" },
"categoryName13": { "message": "Баг трекер" },
"categoryName14": { "message": "Видео плеер" },
"categoryName15": { "message": "Система комментариев" },
"categoryName16": { "message": "Капча" },
"categoryName17": { "message": "Шрифт" },
"categoryName18": { "message": "Веб фреймворк" },
"categoryName19": { "message": "Прочее" },
"categoryName20": { "message": "HTML редактор" },
"categoryName21": { "message": "LMS" },
"categoryName22": { "message": "Веб сервер" },
"categoryName23": { "message": "Кеширование" },
"categoryName24": { "message": "WYSIWYG редактор" },
"categoryName25": { "message": "JS графика" },
"categoryName26": { "message": "Мобильный фреймворк" },
"categoryName27": { "message": "Язык программирования" },
"categoryName28": { "message": "Операционная система" },
"categoryName29": { "message": "Поисковый движок" },
"categoryName30": { "message": "Веб почта" },
"categoryName31": { "message": "CDN" },
"categoryName32": { "message": "Управление маркетингом" },
"categoryName33": { "message": "Расширение Веб сервера" },
"categoryName34": { "message": "База данных" },
"categoryName35": { "message": "Карта" },
"categoryName36": { "message": "Рекламная сеть" },
"categoryName37": { "message": "Сетевая служба" },
"categoryName38": { "message": "Медиа сервер" },
"categoryName39": { "message": "Вебкамера" },
"categoryName40": { "message": "Принтер" },
"categoryName41": { "message": "Платёжная система" },
"categoryName42": { "message": "Менеджер тэгов" },
"categoryName43": { "message": "Paywall" },
"categoryName44": { "message": "Система непрерывной интеграции" },
"categoryName45": { "message": "Система SCADA" },
"categoryName46": { "message": "Удаленное управление" },
"categoryName47": { "message": "Утилита для разработчиков" },
"categoryName48": { "message": "Сетевое хранилище" },
"categoryName49": { "message": "Граббер контента" },
"categoryName50": { "message": "Управление документами" },
"categoryName51": { "message": "Генератор лендингов" },
"categoryName52": { "message": "Live Chat" },
"categoryName53": { "message": "CRM" },
"github": { "message": "Форкнуть на GitHub!" },
"noAppsDetected": { "message": "Нет данных о сайте" },
"nothingToDo": { "message": "Тут нечего искать" },
"optionTracking": { "message": "Анонимно отправлять статистику распознанных данных на сервер (для исследований)" },
"optionDynamicIcon": { "message": "Использовать значок приложения вместо логотипа Wappalyzer" },
"optionUpgradeMessage": { "message": "Оповещать меня об обновлениях" },
"options": { "message": "Настройки" },
"optionsSave": { "message": "Сохранить" },
"optionsSaved": { "message": "Успешно сохранено!" },
"twitter": { "message": "Следите за новостями в Твиттере" },
"website": { "message": "Перейти на Wappalyzer.com" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName54": { "message": "SEO" },
"categoryName55": { "message": "Бухгалтерский учёт" },
"categoryName56": { "message": "Криптомайнер" },
"categoryName57": { "message": "Генератор статических сайтов" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Nie je tu čo robiť." },
"noAppsDetected": { "message": "Žiadne aplikácie neboli zistené." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Message Board" },
"categoryName3": { "message": "Správca databáz" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Burada yapacak birşey yok." },
"noAppsDetected": { "message": "Uygulamalar tespit edilemedi." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Mesaj Tahtası" },
"categoryName3": { "message": "Veritabanı Yöneticisi" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Тут нічого робити." },
"noAppsDetected": { "message": "Нічого не знайдено." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS" },
"categoryName2": { "message": "Форум" },
"categoryName3": { "message": "Менеджер БД" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "Bu yerda tekshirib bolmaydi." },
"noAppsDetected": { "message": "Hech qanday dastur aniqlanmadi." },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "CMS (KBT)" },
"categoryName2": { "message": "Forum" },
"categoryName3": { "message": "MB boshqaruvi" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "Cryptominer" },
"categoryName57": { "message": "Static Site Generator" },
"categoryName58": { "message": "User Onboarding" },
"categoryName59": { "message": "JavaScript Libraries" }
"categoryName59": { "message": "JavaScript Libraries" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "这儿啥也没有。" },
"noAppsDetected": { "message": "未检测到任何应用。" },
"categoryPin": { "message": "Always show icon" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "内容管理系统CMS" },
"categoryName2": { "message": "消息板" },
"categoryName3": { "message": "数据库管理器" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "加密货币挖矿器" },
"categoryName57": { "message": "静态网站生成器" },
"categoryName58": { "message": "用户引导" },
"categoryName59": { "message": "JavaScript 库" }
"categoryName59": { "message": "JavaScript 库" },
"categoryName60": { "message": "Containers" },
"categoryName61": { "message": "SaaS" },
"categoryName62": { "message": "PaaS" },
"categoryName63": { "message": "IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -11,6 +11,8 @@
"nothingToDo": { "message": "這裡什麼也沒有。" },
"noAppsDetected": { "message": "未識別到技術。" },
"categoryPin": { "message": "永遠顯示圖示" },
"termsAccept": { "message": "Accept" },
"termsContent": { "message": "This extension sends anonymous information about websites you visit, including domain name and identified technologies, to <a href='https://www.wappalyzer.com'>wappalyzer.com</a>. This can be disabled in the settings." },
"categoryName1": { "message": "內容管理系統CMS" },
"categoryName2": { "message": "留言板/討論區" },
"categoryName3": { "message": "資料庫管理" },
@ -69,5 +71,11 @@
"categoryName56": { "message": "加密貨幣礦工" },
"categoryName57": { "message": "靜態網站產生器" },
"categoryName58": { "message": "使用者指引" },
"categoryName59": { "message": "JavaScript 函式庫" }
"categoryName59": { "message": "JavaScript 函式庫" },
"categoryName60": { "message": "容器" },
"categoryName61": { "message": "軟體即服務SaaS" },
"categoryName62": { "message": "平台即服務PaaS" },
"categoryName63": { "message": "基礎設施即服務IaaS" },
"categoryName64": { "message": "Reverse Proxy" },
"categoryName65": { "message": "Load Balancer" }
}

@ -155,3 +155,48 @@ body {
.empty__text {
}
.terms {
align-items: center;
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
width: 100%;
}
.terms__wrapper {
display: none;
height: 100%;
width: 100%;
}
.terms__wrapper--active {
display: block;
}
.terms__content {
font-size: .9rem;
line-height: 150%;
text-align: center;
margin-bottom: 1rem;
width: 80%;
}
.terms__accept {
background-color: #4608ad;
border: none;
border-radius: 3px;
color: white;
cursor: pointer;
font-size: .9rem;
padding: .8rem 3rem;
}
.terms__accept:hover {
background-color: #4107a1;
}
.terms__privacy {
margin-top: 1rem;
}

@ -17,6 +17,16 @@
</a>
</div>
<div class="container"></div>
<div class="container">
<div class="terms__wrapper">
<div class="terms">
<div class="terms__content" data-i18n="termsContent"></div>
<button class="terms__accept" data-i18n="termsAccept"></button>
<a class="terms__privacy" href="https://www.wappalyzer.com/privacy" data-i18n="privacyPolicy"></a>
</div>
</div>
</div>
</body>
</html>

@ -1,17 +1,34 @@
/** global: browser */
/** global: XMLSerializer */
/* global browser */
/* eslint-env browser */
const port = browser.runtime.connect({
name: 'content.js',
});
if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
try {
sendMessage('init', {});
port.postMessage({ id: 'init' });
// HTML
let html = new XMLSerializer().serializeToString(document).split('\n');
let html = new XMLSerializer().serializeToString(document);
const chunks = [];
const maxCols = 2000;
const maxRows = 3000;
const rows = html.length / maxCols;
let i;
html = html
.slice(0, 1000).concat(html.slice(html.length - 1000))
.map(line => line.substring(0, 1000))
.join('\n');
for (i = 0; i < rows; i += 1) {
if (i < maxRows / 2 || i > rows - maxRows / 2) {
chunks.push(html.slice(i * maxCols, (i + 1) * maxCols));
}
}
html = chunks.join('\n');
// Scripts
const scripts = Array.prototype.slice
@ -20,7 +37,7 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
.map(script => script.src)
.filter(script => script.indexOf('data:text/javascript;') !== 0);
sendMessage('analyze', { html, scripts });
port.postMessage({ id: 'analyze', subject: { html, scripts } });
// JavaScript variables
const script = document.createElement('script');
@ -31,41 +48,40 @@ if (typeof browser !== 'undefined' && typeof document.body !== 'undefined') {
return;
}
removeEventListener('message', onMessage);
window.removeEventListener('message', onMessage);
sendMessage('analyze', { js: event.data.js });
port.postMessage({ id: 'analyze', subject: { js: event.data.js } });
script.remove();
};
addEventListener('message', onMessage);
window.addEventListener('message', onMessage);
sendMessage('get_js_patterns', {}, (response) => {
if (response) {
postMessage({
id: 'patterns',
patterns: response.patterns,
}, '*');
}
});
port.postMessage({ id: 'get_js_patterns' });
};
script.setAttribute('src', browser.extension.getURL('js/inject.js'));
document.body.appendChild(script);
} catch (e) {
sendMessage('log', e);
} catch (error) {
port.postMessage({ id: 'log', subject: error });
}
}
function sendMessage(id, subject, callback) {
(chrome || browser).runtime.sendMessage({
id,
subject,
source: 'content.js',
}, callback || (() => {}));
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_js_patterns':
postMessage({
id: 'patterns',
patterns: message.response.patterns,
}, window.location.href);
break;
default:
// Do nothing
}
});
// https://stackoverflow.com/a/44774834
// https://developer.mozilla.org/en-US/Add-ons/WebExtensions/API/tabs/executeScript#Return_value
undefined;
undefined; // eslint-disable-line no-unused-expressions

@ -13,32 +13,50 @@
const wappalyzer = new Wappalyzer();
const tabCache = {};
let categoryOrder = [];
const options = {};
const robotsTxtQueue = {};
let categoryOrder = [];
browser.tabs.onRemoved.addListener((tabId) => {
tabCache[tabId] = null;
});
function userAgent() {
const url = chrome.extension.getURL('/');
if (url.match(/^chrome-/)) {
return 'chrome';
}
if (url.match(/^moz-/)) {
return 'firefox';
}
if (url.match(/^ms-browser-/)) {
return 'edge';
}
}
/**
* Get a value from localStorage
*/
function getOption(name, defaultValue = null) {
return new Promise((resolve, reject) => {
const callback = (item) => {
options[name] = item[name] ? item[name] : defaultValue;
return new Promise(async (resolve, reject) => {
let value = defaultValue;
resolve(options[name]);
};
try {
const option = await browser.storage.local.get(name);
browser.storage.local.get(name)
.then(callback)
.catch((error) => {
wappalyzer.log(error, 'driver', 'error');
if (option[name] !== undefined) {
value = option[name];
}
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
reject();
});
return reject(error.message);
}
return resolve(value);
});
}
@ -46,13 +64,17 @@ function getOption(name, defaultValue = null) {
* Set a value in localStorage
*/
function setOption(name, value) {
const option = {};
option[name] = value;
return new Promise(async (resolve, reject) => {
try {
await browser.storage.local.set({ [name]: value });
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
browser.storage.local.set(option);
return reject(error.message);
}
options[name] = value;
return resolve();
});
}
/**
@ -68,111 +90,66 @@ function openTab(args) {
/**
* Make a POST request
*/
function post(url, body) {
fetch(url, {
method: 'POST',
body: JSON.stringify(body),
})
.then(response => wappalyzer.log(`POST ${url}: ${response.status}`, 'driver'))
.catch(error => wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error'));
}
fetch('../apps.json')
.then(response => response.json())
.then((json) => {
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
wappalyzer.parseJsPatterns();
categoryOrder = Object.keys(wappalyzer.categories)
.map(categoryId => parseInt(categoryId, 10))
.sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority);
})
.catch(error => wappalyzer.log(`GET apps.json: ${error}`, 'driver', 'error'));
// Version check
const { version } = browser.runtime.getManifest();
getOption('version')
.then((previousVersion) => {
if (previousVersion === null) {
openTab({
url: `${wappalyzer.config.websiteURL}installed`,
});
} else if (version !== previousVersion) {
getOption('upgradeMessage', true)
.then((upgradeMessage) => {
if (upgradeMessage) {
openTab({
url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
background: true,
});
}
});
}
setOption('version', version);
});
getOption('dynamicIcon', true);
getOption('pinnedCategory');
getOption('hostnameCache', {})
.then((hostnameCache) => {
wappalyzer.hostnameCache = hostnameCache;
return hostnameCache;
});
// Run content script on all tabs
browser.tabs.query({ url: ['http://*/*', 'https://*/*'] })
.then((tabs) => {
tabs.forEach((tab) => {
browser.tabs.executeScript(tab.id, {
file: '../js/content.js',
});
async function post(url, body) {
try {
const response = await fetch(url, {
method: 'POST',
body: JSON.stringify(body),
});
})
.catch(error => wappalyzer.log(error, 'driver', 'error'));
wappalyzer.log(`POST ${url}: ${response.status}`, 'driver');
} catch (error) {
wappalyzer.log(`POST ${url}: ${error}`, 'driver', 'error');
}
}
// Capture response headers
browser.webRequest.onCompleted.addListener((request) => {
browser.webRequest.onCompleted.addListener(async (request) => {
const headers = {};
if (request.responseHeaders) {
const url = wappalyzer.parseUrl(request.url);
browser.tabs.query({ url: [url.href] })
.then((tabs) => {
const tab = tabs[0] || null;
let tab;
if (tab) {
request.responseHeaders.forEach((header) => {
const name = header.name.toLowerCase();
try {
[tab] = await browser.tabs.query({ url: [url.href] });
} catch (error) {
wappalyzer.log(error, 'driver', 'error');
}
headers[name] = headers[name] || [];
if (tab) {
request.responseHeaders.forEach((header) => {
const name = header.name.toLowerCase();
headers[name].push((header.value || header.binaryValue || '').toString());
});
headers[name] = headers[name] || [];
if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) {
wappalyzer.analyze(url, { headers }, { tab });
}
}
})
.catch(error => wappalyzer.log(error, 'driver', 'error'));
headers[name].push((header.value || header.binaryValue || '').toString());
});
if (headers['content-type'] && /\/x?html/.test(headers['content-type'][0])) {
wappalyzer.analyze(url, { headers }, { tab });
}
}
}
}, { urls: ['http://*/*', 'https://*/*'], types: ['main_frame'] }, ['responseHeaders']);
// Listen for messages
(chrome || browser).runtime.onMessage.addListener((message, sender, sendResponse) => {
if (typeof message.id !== 'undefined') {
browser.runtime.onConnect.addListener((port) => {
port.onMessage.addListener(async (message) => {
if (message.id === undefined) {
return;
}
if (message.id !== 'log') {
wappalyzer.log(`Message${message.source ? ` from ${message.source}` : ''}: ${message.id}`, 'driver');
wappalyzer.log(`Message from ${port.name}: ${message.id}`, 'driver');
}
const url = wappalyzer.parseUrl(sender.tab ? sender.tab.url : '');
const pinnedCategory = await getOption('pinnedCategory');
const url = wappalyzer.parseUrl(port.sender.tab ? port.sender.tab.url : '');
const cookies = await browser.cookies.getAll({ domain: `.${url.hostname}` });
let response;
switch (message.id) {
@ -181,14 +158,13 @@ browser.webRequest.onCompleted.addListener((request) => {
break;
case 'init':
browser.cookies.getAll({ domain: `.${url.hostname}` })
.then(cookies => wappalyzer.analyze(url, { cookies }, { tab: sender.tab }));
wappalyzer.analyze(url, { cookies }, { tab: port.sender.tab });
break;
case 'analyze':
wappalyzer.analyze(url, message.subject, { tab: sender.tab });
wappalyzer.analyze(url, message.subject, { tab: port.sender.tab });
setOption('hostnameCache', wappalyzer.hostnameCache);
await setOption('hostnameCache', wappalyzer.hostnameCache);
break;
case 'ad_log':
@ -200,12 +176,13 @@ browser.webRequest.onCompleted.addListener((request) => {
tabCache: tabCache[message.tab.id],
apps: wappalyzer.apps,
categories: wappalyzer.categories,
pinnedCategory: options.pinnedCategory,
pinnedCategory,
termsAccepted: userAgent() === 'chrome' || await getOption('termsAccepted', false),
};
break;
case 'set_option':
setOption(message.key, message.value);
await setOption(message.key, message.value);
break;
case 'get_js_patterns':
@ -215,12 +192,16 @@ browser.webRequest.onCompleted.addListener((request) => {
break;
default:
// Do nothing
}
sendResponse(response);
}
return true;
if (response) {
port.postMessage({
id: message.id,
response,
});
}
});
});
wappalyzer.driver.document = document;
@ -229,13 +210,15 @@ wappalyzer.driver.document = document;
* Log messages to console
*/
wappalyzer.driver.log = (message, source, type) => {
console.log(`[wappalyzer ${type}]`, `[${source}]`, message);
const log = ['warn', 'error'].indexOf(type) !== -1 ? type : 'log';
console[log](`[wappalyzer ${type}]`, `[${source}]`, message); // eslint-disable-line no-console
};
/**
* Display apps
*/
wappalyzer.driver.displayApps = (detected, meta, context) => {
wappalyzer.driver.displayApps = async (detected, meta, context) => {
const { tab } = context;
if (tab === undefined) {
@ -248,20 +231,19 @@ wappalyzer.driver.displayApps = (detected, meta, context) => {
tabCache[tab.id].detected = detected;
const pinnedCategory = await getOption('pinnedCategory');
const dynamicIcon = await getOption('dynamicIcon', true);
let found = false;
// Find the main application to display
[options.pinnedCategory].concat(categoryOrder).forEach((match) => {
[pinnedCategory].concat(categoryOrder).forEach((match) => {
Object.keys(detected).forEach((appName) => {
const app = detected[appName];
app.props.cats.forEach((category) => {
if (category === match && !found) {
let icon = app.props.icon || 'default.svg';
if (!options.dynamicIcon) {
icon = 'default.svg';
}
let icon = app.props.icon && dynamicIcon ? app.props.icon : 'default.svg';
if (/\.svg$/i.test(icon)) {
icon = `converted/${icon.replace(/\.svg$/, '.png')}`;
@ -282,61 +264,53 @@ wappalyzer.driver.displayApps = (detected, meta, context) => {
});
});
if (typeof chrome !== 'undefined') {
// Browser polyfill doesn't seem to work here
chrome.pageAction.show(tab.id);
} else {
browser.pageAction.show(tab.id);
}
browser.pageAction.show(tab.id);
};
/**
* Fetch and cache robots.txt for host
*/
wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
wappalyzer.driver.getRobotsTxt = async (host, secure = false) => {
if (robotsTxtQueue[host]) {
return robotsTxtQueue[host];
}
robotsTxtQueue[host] = new Promise((resolve) => {
getOption('tracking', true)
.then((tracking) => {
if (!tracking) {
resolve([]);
const tracking = await getOption('tracking', true);
const robotsTxtCache = await getOption('robotsTxtCache', {});
return;
}
robotsTxtQueue[host] = new Promise(async (resolve) => {
if (!tracking) {
return resolve([]);
}
if (host in robotsTxtCache) {
return resolve(robotsTxtCache[host]);
}
const timeout = setTimeout(() => resolve([]), 3000);
getOption('robotsTxtCache')
.then((robotsTxtCache) => {
robotsTxtCache = robotsTxtCache || {};
let response;
if (host in robotsTxtCache) {
resolve(robotsTxtCache[host]);
try {
response = await fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' });
} catch (error) {
wappalyzer.log(error, 'driver', 'error');
return;
}
return resolve([]);
}
const timeout = setTimeout(() => resolve([]), 3000);
clearTimeout(timeout);
fetch(`http${secure ? 's' : ''}://${host}/robots.txt`, { redirect: 'follow' })
.then((response) => {
clearTimeout(timeout);
const robotsTxt = response.ok ? await response.text() : '';
return response.ok ? response.text() : '';
})
.then((robotsTxt) => {
robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt);
robotsTxtCache[host] = Wappalyzer.parseRobotsTxt(robotsTxt);
setOption('robotsTxtCache', robotsTxtCache);
await setOption('robotsTxtCache', robotsTxtCache);
resolve(robotsTxtCache[host]);
})
.catch(() => resolve([]));
});
});
})
.finally(() => delete robotsTxtQueue[host]);
delete robotsTxtQueue[host];
return resolve(robotsTxtCache[host]);
});
return robotsTxtQueue[host];
};
@ -344,19 +318,77 @@ wappalyzer.driver.getRobotsTxt = (host, secure = false) => {
/**
* Anonymously track detected applications for research purposes
*/
wappalyzer.driver.ping = (hostnameCache = {}, adCache = []) => {
getOption('tracking', true)
.then((tracking) => {
if (tracking) {
if (Object.keys(hostnameCache).length) {
post('https://api.wappalyzer.com/ping/v1/', hostnameCache);
}
wappalyzer.driver.ping = async (hostnameCache = {}, adCache = []) => {
const tracking = await getOption('tracking', true);
const termsAccepted = userAgent() === 'chrome' || await getOption('termsAccepted', false);
if (adCache.length) {
post('https://ad.wappalyzer.com/log/wp/', adCache);
}
if (tracking && termsAccepted) {
if (Object.keys(hostnameCache).length) {
post('https://api.wappalyzer.com/ping/v1/', hostnameCache);
}
if (adCache.length) {
post('https://ad.wappalyzer.com/log/wp/', adCache);
}
await setOption('robotsTxtCache', {});
}
};
// Init
(async () => {
// Technologies
try {
const response = await fetch('../apps.json');
const json = await response.json();
wappalyzer.apps = json.apps;
wappalyzer.categories = json.categories;
} catch (error) {
wappalyzer.log(`GET apps.json: ${error.message}`, 'driver', 'error');
}
wappalyzer.parseJsPatterns();
setOption('robotsTxtCache', {});
categoryOrder = Object.keys(wappalyzer.categories)
.map(categoryId => parseInt(categoryId, 10))
.sort((a, b) => wappalyzer.categories[a].priority - wappalyzer.categories[b].priority);
// Version check
const { version } = browser.runtime.getManifest();
const previousVersion = await getOption('version');
const upgradeMessage = await getOption('upgradeMessage', true);
if (previousVersion === null) {
openTab({
url: `${wappalyzer.config.websiteURL}installed`,
});
} else if (version !== previousVersion && upgradeMessage) {
openTab({
url: `${wappalyzer.config.websiteURL}upgraded?v${version}`,
background: true,
});
}
await setOption('version', version);
// Hostname cache
wappalyzer.hostnameCache = await getOption('hostnameCache', {});
// Run content script on all tabs
try {
const tabs = await browser.tabs.query({ url: ['http://*/*', 'https://*/*'] });
tabs.forEach(async (tab) => {
try {
await browser.tabs.executeScript(tab.id, {
file: '../js/content.js',
});
} catch (error) {
//
}
});
};
} catch (error) {
wappalyzer.log(error, 'driver', 'error');
}
})();

@ -1,3 +1,5 @@
/* eslint-env browser */
(() => {
try {
const detectJs = (chain) => {
@ -51,7 +53,7 @@
}
}
postMessage({ id: 'js', js }, '*');
postMessage({ id: 'js', js }, window.location.href);
};
addEventListener('message', onMessage);

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

@ -1,24 +1,51 @@
/** global: browser */
/** global: Wappalyzer */
/* globals browser Wappalyzer */
/* eslint-env browser */
const wappalyzer = new Wappalyzer();
function getOption(name, defaultValue, callback) {
browser.storage.local.get(name)
.then((item) => {
callback(item.hasOwnProperty(name) ? item[name] : defaultValue);
});
/**
* Get a value from localStorage
*/
function getOption(name, defaultValue = null) {
return new Promise(async (resolve, reject) => {
let value = defaultValue;
try {
const option = await browser.storage.local.get(name);
if (option[name] !== undefined) {
value = option[name];
}
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
}
return resolve(value);
});
}
/**
* Set a value in localStorage
*/
function setOption(name, value) {
(chrome || browser).runtime.sendMessage({
id: 'set_option',
key: name,
value,
return new Promise(async (resolve, reject) => {
try {
await browser.storage.local.set({ [name]: value });
} catch (error) {
wappalyzer.log(error.message, 'driver', 'error');
return reject(error.message);
}
return resolve();
});
}
document.addEventListener('DOMContentLoaded', () => {
document.addEventListener('DOMContentLoaded', async () => {
const nodes = document.querySelectorAll('[data-i18n]');
Array.prototype.forEach.call(nodes, (node) => {
@ -26,44 +53,44 @@ document.addEventListener('DOMContentLoaded', () => {
});
document.querySelector('#github').addEventListener('click', () => {
open(wappalyzer.config.githubURL);
window.open(wappalyzer.config.githubURL);
});
document.querySelector('#twitter').addEventListener('click', () => {
open(wappalyzer.config.twitterURL);
window.open(wappalyzer.config.twitterURL);
});
document.querySelector('#wappalyzer').addEventListener('click', () => {
open(wappalyzer.config.websiteURL);
window.open(wappalyzer.config.websiteURL);
});
getOption('upgradeMessage', true, (value) => {
const el = document.querySelector('#option-upgrade-message');
let el;
let value;
el.checked = value;
// Upgrade message
value = await getOption('upgradeMessage', true);
el.addEventListener('change', () => {
setOption('upgradeMessage', el.checked);
});
});
el = document.querySelector('#option-upgrade-message');
getOption('dynamicIcon', true, (value) => {
const el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', e => setOption('upgradeMessage', e.target.checked));
el.addEventListener('change', () => {
setOption('dynamicIcon', el.checked);
});
});
// Dynamic icon
value = await getOption('dynamicIcon', true);
getOption('tracking', true, (value) => {
const el = document.querySelector('#option-tracking');
el = document.querySelector('#option-dynamic-icon');
el.checked = value;
el.checked = value;
el.addEventListener('change', () => {
setOption('tracking', el.checked);
});
});
el.addEventListener('change', e => setOption('dynamicIcon', e.target.checked));
// Tracking
value = await getOption('tracking', true);
el = document.querySelector('#option-tracking');
el.checked = value;
el.addEventListener('change', e => setOption('tracking', e.target.checked));
});

@ -1,32 +1,26 @@
/** global: chrome */
/* eslint-env browser */
/* global browser, jsonToDOM */
/** global: browser */
/** global: jsonToDOM */
let pinnedCategory = null;
let termsAccepted = false;
const func = (tabs) => {
(chrome || browser).runtime.sendMessage({
id: 'get_apps',
tab: tabs[0],
source: 'popup.js',
}, (response) => {
pinnedCategory = response.pinnedCategory;
const port = browser.runtime.connect({
name: 'popup.js',
});
replaceDomWhenReady(appsToDomTemplate(response));
});
};
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
}
browser.tabs.query({ active: true, currentWindow: true })
.then(func)
.catch(console.error);
function i18n() {
const nodes = document.querySelectorAll('[data-i18n]');
function replaceDomWhenReady(dom) {
if (/complete|interactive|loaded/.test(document.readyState)) {
replaceDom(dom);
} else {
document.addEventListener('DOMContentLoaded', () => {
replaceDom(dom);
});
}
Array.prototype.forEach.call(nodes, (node) => {
node.innerHTML = browser.i18n.getMessage(node.dataset.i18n);
});
}
function replaceDom(domTemplate) {
@ -38,11 +32,7 @@ function replaceDom(domTemplate) {
container.appendChild(jsonToDOM(domTemplate, document, {}));
const nodes = document.querySelectorAll('[data-i18n]');
Array.prototype.forEach.call(nodes, (node) => {
node.childNodes[0].nodeValue = browser.i18n.getMessage(node.dataset.i18n);
});
i18n();
Array.from(document.querySelectorAll('.detected__category-pin-wrapper')).forEach((pin) => {
pin.addEventListener('click', () => {
@ -64,7 +54,7 @@ function replaceDom(domTemplate) {
pinnedCategory = categoryId;
}
(chrome || browser).runtime.sendMessage({
port.postMessage({
id: 'set_option',
key: 'pinnedCategory',
value: pinnedCategory,
@ -73,6 +63,16 @@ function replaceDom(domTemplate) {
});
}
function replaceDomWhenReady(dom) {
if (/complete|interactive|loaded/.test(document.readyState)) {
replaceDom(dom);
} else {
document.addEventListener('DOMContentLoaded', () => {
replaceDom(dom);
});
}
}
function appsToDomTemplate(response) {
let template = [];
@ -92,8 +92,7 @@ function appsToDomTemplate(response) {
const apps = [];
for (const appName in categories[cat].apps) {
const confidence = response.tabCache.detected[appName].confidenceTotal;
const version = response.tabCache.detected[appName].version;
const { confidence, version } = response.tabCache.detected[appName];
apps.push(
[
@ -190,6 +189,58 @@ function appsToDomTemplate(response) {
return template;
}
function slugify(string) {
return string.toLowerCase().replace(/[^a-z0-9-]/g, '-').replace(/--+/g, '-').replace(/(?:^-|-$)/, '');
async function getApps() {
try {
const tabs = await browser.tabs.query({
active: true,
currentWindow: true,
});
port.postMessage({
id: 'get_apps',
tab: tabs[0],
});
} catch (error) {
console.error(error); // eslint-disable-line no-console
}
}
function displayApps(response) {
pinnedCategory = response.pinnedCategory; // eslint-disable-line prefer-destructuring
termsAccepted = response.termsAccepted; // eslint-disable-line prefer-destructuring
if (termsAccepted) {
replaceDomWhenReady(appsToDomTemplate(response));
} else {
i18n();
const wrapper = document.querySelector('.terms__wrapper');
document.querySelector('.terms__accept').addEventListener('click', () => {
port.postMessage({
id: 'set_option',
key: 'termsAccepted',
value: true,
});
wrapper.classList.remove('terms__wrapper--active');
getApps();
});
wrapper.classList.add('terms__wrapper--active');
}
}
port.onMessage.addListener((message) => {
switch (message.id) {
case 'get_apps':
displayApps(message.response);
break;
default:
// Do nothing
}
});
getApps();

@ -1,78 +1,84 @@
{
"name": "Wappalyzer",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies",
"version": "5.5.4",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "html/popup.html"
},
"background": {
"page": "html/background.html"
"name": "Wappalyzer",
"short_name": "Wappalyzer",
"author": "Elbert Alias",
"homepage_url": "https://www.wappalyzer.com",
"description": "Identify web technologies",
"version": "5.8.2",
"default_locale": "en",
"manifest_version": 2,
"icons": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"page_action": {
"default_icon": {
"16": "images/icon_16.png",
"19": "images/icon_19.png",
"32": "images/icon_32.png",
"38": "images/icon_38.png",
"128": "images/icon_128.png"
},
"default_title": "Wappalyzer",
"default_popup": "html/popup.html"
},
"background": {
"page": "html/background.html"
},
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"js": [
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
},
{
"matches": [
},
"content_scripts": [
{
"matches": [
"http://*/*",
"https://*/*"
],
"exclude_matches": [
"https://*.modirum.com/*",
"https://www.alphaecommerce.gr/*"
],
"js": [
"js/lib/iframe.js"
],
"run_at": "document_start",
"all_frames": true
}
],
"web_accessible_resources": [
"js/inject.js"
],
"options_page": "html/options.html",
"options_ui": {
"page": "html/options.html",
"open_in_tab": false
},
"permissions": [
"https://*/*"
],
"js": [
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/content.js"
],
"run_at": "document_idle"
},
{
"matches": [
"http://*/*",
"https://*/*"
],
"exclude_matches": [
"https://*.modirum.com/*",
"https://www.alphaecommerce.gr/*"
],
"js": [
"node_modules/webextension-polyfill/dist/browser-polyfill.js",
"js/lib/iframe.js"
],
"run_at": "document_start",
"all_frames": true
}
],
"web_accessible_resources": [
"js/inject.js"
],
"options_ui": {
"page": "html/options.html",
"open_in_tab": false
},
"permissions": [
"cookies",
"storage",
"tabs",
"webRequest",
"webNavigation",
"http://*/*",
"https://*/*"
],
"content_security_policy": "script-src 'self'; object-src 'self'"
"storage",
"tabs",
"webRequest",
"webNavigation",
"http://*/*",
"https://*/*"
],
"content_security_policy": "script-src 'self'; object-src 'self'",
"applications": {
"gecko": {
"id": "wappalyzer@crunchlabz.com",
"strict_min_version": "60.0"
}
}
}

@ -3,9 +3,9 @@
"lockfileVersion": 1,
"dependencies": {
"webextension-polyfill": {
"version": "0.2.1",
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.2.1.tgz",
"integrity": "sha1-zfyRJgMwOfFxNVMVfTW+/x1Nb0o="
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/webextension-polyfill/-/webextension-polyfill-0.4.0.tgz",
"integrity": "sha512-oreMp+EoAo1pzRMigx4jB5jInIpx6NTCySPSjGyLLee/dCIPiRqowCEfbFP8o20wz9SOtNwSsfkaJ9D/tRgpag=="
}
}
}

@ -1,5 +1,5 @@
{
"dependencies": {
"webextension-polyfill": "^0.2.1"
"webextension-polyfill": "^0.4.0"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 779 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 682 B

@ -0,0 +1 @@
<svg width="204px" height="204px" viewBox="0 0 204 204" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g><circle fill="#235FD3" cx="102" cy="102" r="102"></circle><g transform="translate(83.000000, 38.000000)" fill="#FFFFFF" fill-rule="nonzero"><path d="M88.5,51.3 L88.5,51.3 C90.8,51.3 92.6,49.5 92.6,47.2 L92.6,31.1 C92.6,28.8 90.8,27 88.5,27 L88.5,27 C86.2,27 84.4,28.8 84.4,31.1 L84.4,47.3 C84.4,49.5 86.2,51.3 88.5,51.3 Z"></path><path d="M67.5,51.3 L67.5,51.3 C69.8,51.3 71.6,49.5 71.6,47.2 L71.6,15.6 C71.6,13.3 69.8,11.5 67.5,11.5 L67.5,11.5 C65.2,11.5 63.4,13.3 63.4,15.6 L63.4,47.2 C63.4,49.5 65.2,51.3 67.5,51.3 Z"></path><path d="M46.5,51.3 L46.5,51.3 C48.8,51.3 50.6,49.5 50.6,47.2 L50.6,4.5 C50.6,2.2 48.8,0.4 46.5,0.4 L46.5,0.4 C44.2,0.4 42.4,2.2 42.4,4.5 L42.4,47.3 C42.4,49.5 44.3,51.3 46.5,51.3 Z"></path><path d="M25.5,51.3 L25.5,51.3 C27.8,51.3 29.6,49.5 29.6,47.2 L29.6,31.1 C29.6,28.8 27.8,27 25.5,27 L25.5,27 C23.2,27 21.4,28.8 21.4,31.1 L21.4,47.3 C21.4,49.5 23.3,51.3 25.5,51.3 Z"></path><path d="M4.5,51.3 L4.5,51.3 C6.8,51.3 8.6,49.5 8.6,47.2 L8.6,20.6 C8.6,18.3 6.8,16.5 4.5,16.5 L4.5,16.5 C2.2,16.5 0.4,18.3 0.4,20.6 L0.4,47.2 C0.4,49.5 2.3,51.3 4.5,51.3 Z"></path></g><g transform="translate(29.000000, 40.000000)" fill="#FFFFFF" fill-rule="nonzero"><path d="M2.6,39.7 C0.2,33.3 -0.6,26.2 0.6,19 C1.8,11.8 4.9,5.5 9.2,0.3 C11.7,6.7 12.5,13.7 11.3,21 C10.1,28.2 7,34.5 2.6,39.7 Z"></path><path d="M2.7,39.7 C5.5,33.5 9.9,27.9 15.8,23.6 C21.7,19.4 28.4,17.1 35.1,16.5 C32.4,22.8 28,28.4 22,32.6 C16.1,36.8 9.4,39.2 2.7,39.7 Z"></path></g><path d="M116.6,122.6 L122.1,119.8 L116.7,117.1 C117.7,115.5 119.4,114.4 121.5,114.4 C124.6,114.4 127.1,116.9 127.1,120 C127.1,123.1 124.6,125.6 121.5,125.6 C119.4,125.6 117.6,124.3 116.6,122.6 Z" fill="#FFFFFF" fill-rule="nonzero"></path><path d="M179.6,93.4 L195.5,93.4 C195.5,139.4 158.2,176.7 112.2,176.7 C109.5,176.7 106.9,176.6 104.3,176.3 C146.6,172.3 179.6,136.7 179.6,93.4 Z" fill="#FFFFFF" fill-rule="nonzero" opacity="0.32"></path><path d="M163.8,93.4 L179.7,93.4 C179.7,136.7 146.6,172.3 104.4,176.3 C101.7,176 99.1,175.7 96.5,175.2 C134.8,167.8 163.8,134 163.8,93.4 Z" fill="#FFFFFF" fill-rule="nonzero" opacity="0.56"></path><path d="M147.9,93.4 L163.8,93.4 C163.8,134 134.8,167.8 96.4,175.2 C93.7,174.7 91.1,174 88.5,173.3 C122.8,163 147.9,131.1 147.9,93.4 Z" fill="#FFFFFF" fill-rule="nonzero" opacity="0.8"></path><path d="M94.4,93.4 L65.9,93.4 C51.4,93.4 38.6,86 31.1,74.7 C29.8,80.7 29,87 29,93.4 L29,93.4 C29,114.9 37.1,134.5 50.5,149.2 L33.6,170.6 C43.2,174.5 53.7,176.6 64.7,176.6 C73,176.6 81,175.4 88.5,173.1 C122.9,162.9 148,131 148,93.3 L94.4,93.3 L94.4,93.4 Z M118.5,130 C112.8,130 108.2,125.4 108.2,119.7 C108.2,114 112.8,109.4 118.5,109.4 C124.2,109.4 128.8,114 128.8,119.7 C128.8,125.4 124.2,130 118.5,130 Z" fill="#FFFFFF" fill-rule="nonzero"></path></g></g></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 384 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 950 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 274 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 743 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 642 B

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Before

Width:  |  Height:  |  Size: 100 B

After

Width:  |  Height:  |  Size: 100 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

@ -0,0 +1 @@
<svg id="svg" version="1.1" width="400" height="400" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" ><g id="svgg"><path id="path0" d="M23.636 166.547 L 23.636 170.455 37.614 170.462 C 56.645 170.473,60.741 171.473,67.440 177.739 C 79.681 189.190,77.786 215.757,64.102 224.538 C 58.998 227.813,56.092 228.360,43.636 228.386 L 32.500 228.409 32.382 204.886 L 32.265 181.364 27.950 181.364 L 23.636 181.364 23.636 208.907 L 23.636 236.451 39.659 236.252 C 57.898 236.026,59.627 235.766,66.818 232.173 C 91.113 220.032,90.405 178.681,65.695 166.566 C 59.147 163.355,57.081 163.062,39.432 162.839 L 23.636 162.639 23.636 166.547 M119.761 176.932 C 101.953 220.460,96.313 234.362,96.075 235.310 C 95.813 236.356,95.842 236.364,100.068 236.364 L 104.326 236.364 116.800 204.432 C 128.195 175.265,132.727 163.452,132.727 162.924 C 132.727 162.816,131.117 162.727,129.150 162.727 L 125.572 162.727 119.761 176.932 M165.909 162.958 C 165.909 163.102,169.036 168.479,172.858 174.906 C 176.680 181.333,181.633 189.695,183.866 193.488 C 186.099 197.282,188.069 200.297,188.244 200.189 C 188.770 199.864,192.275 193.598,192.249 193.028 C 192.236 192.738,188.394 185.852,183.711 177.727 L 175.196 162.955 170.553 162.825 C 167.999 162.754,165.909 162.814,165.909 162.958 M212.045 177.552 C 207.295 185.691,201.213 196.169,198.528 200.835 L 193.647 209.318 193.642 222.841 L 193.636 236.364 197.955 236.364 L 202.273 236.364 202.273 222.896 L 202.273 209.429 216.355 186.078 L 230.437 162.727 225.559 162.740 L 220.682 162.752 212.045 177.552 M292.592 163.014 C 292.416 163.190,292.267 173.271,292.260 185.417 C 292.242 218.638,291.095 224.471,283.864 228.132 C 279.387 230.398,268.901 229.902,264.147 227.199 C 263.303 226.719,262.564 226.386,262.504 226.459 C 262.445 226.531,261.933 228.002,261.366 229.726 L 260.336 232.861 261.418 233.698 C 268.560 239.222,285.856 238.426,292.872 232.250 C 299.716 226.226,300.682 220.722,300.682 187.727 L 300.682 162.955 296.797 162.825 C 294.660 162.753,292.768 162.838,292.592 163.014 M339.871 163.663 C 328.552 166.445,322.955 173.121,322.955 183.840 C 322.955 195.205,327.009 198.524,347.500 203.931 C 364.158 208.327,368.715 212.471,366.331 221.055 C 363.402 231.603,340.332 232.131,326.800 221.960 C 325.287 220.822,323.986 219.967,323.909 220.059 C 323.833 220.152,322.895 221.740,321.826 223.590 L 319.882 226.952 320.964 227.808 C 340.724 243.430,373.115 238.752,376.054 219.850 C 378.081 206.808,371.838 201.037,349.663 195.454 C 334.781 191.707,331.847 189.576,331.833 182.500 C 331.807 169.658,351.643 165.701,366.296 175.626 C 367.633 176.531,368.786 177.273,368.858 177.273 C 369.023 177.273,372.727 171.048,372.727 170.769 C 372.727 170.272,366.627 166.650,363.790 165.464 C 357.059 162.649,347.060 161.896,339.871 163.663 M136.038 177.095 C 133.217 184.514,132.974 182.398,138.146 195.455 C 140.671 201.830,142.639 207.301,142.519 207.614 C 142.355 208.042,140.068 208.182,133.229 208.182 L 124.156 208.182 123.254 210.568 C 122.757 211.881,122.209 213.313,122.036 213.750 C 121.741 214.495,122.447 214.545,133.123 214.545 C 144.456 214.545,144.528 214.552,145.158 215.568 C 145.507 216.131,147.592 221.040,149.793 226.477 L 153.793 236.364 158.313 236.364 C 162.401 236.364,162.812 236.288,162.608 235.568 C 162.484 235.131,157.113 221.886,150.672 206.136 C 144.232 190.386,138.611 176.602,138.182 175.504 L 137.401 173.508 136.038 177.095 M237.273 230.909 L 237.273 236.364 240.909 236.364 L 244.545 236.364 244.545 230.909 L 244.545 225.455 240.909 225.455 L 237.273 225.455 237.273 230.909 " stroke="none" fill="#ff5f4c" fill-rule="evenodd"></path></g></svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

@ -0,0 +1,18 @@
<svg width="2491" height="1415" viewBox="0 0 2491 1415" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1435.43 446.797V451.68H1440.31H1658.73V675.068V679.951H1663.61H1776.51C1829.22 679.951 1883.37 670.568 1933.23 653.677L1933.23 653.677C1957.71 645.37 1985.28 633.792 2009.61 619.154L2014.29 616.338L2010.97 612.001C1980.15 571.768 1964.28 520.759 1959.61 470.186L1959.61 470.185C1953.22 401.14 1967.29 312.037 2013.21 258.936L2033.6 235.351L2057.9 254.889L2057.9 254.891C2127.76 311.016 2185.96 389.028 2196.19 477.408L2196.86 483.166L2202.42 481.53C2286.19 456.892 2384.32 462.819 2457.7 505.167L2460.14 500.938L2457.7 505.167L2484.34 520.541L2470.32 547.911C2408.38 668.793 2278.67 706.796 2150.35 700.075L2146.87 699.892L2145.57 703.132C1953.12 1182.47 1534.27 1409.57 1025.52 1409.57C763.051 1409.57 523.044 1311.52 386.405 1079.49L386.398 1079.47L384.24 1075.83L364.29 1035.23C318.142 933.144 302.775 821.231 313.192 709.281L315.932 679.951H502.441H507.324V675.068V451.68H725.732H730.615V446.797V228.379H1172.34H1177.23V223.496V5.07812H1435.43V446.797Z" fill="#364548" stroke="black" stroke-width="9.76562"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2163.77 531.25C2178.74 414.883 2091.66 323.486 2037.66 280.088C1975.42 352.041 1965.75 540.615 2063.39 620.01C2008.9 668.408 1894.08 712.275 1776.51 712.275H345.41C333.984 835 355.527 948.018 404.736 1044.75L421.016 1074.53C431.323 1092.01 442.587 1108.91 454.756 1125.16C513.594 1128.94 567.842 1130.23 617.471 1129.14H617.49C715.019 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.144 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 742.705 1157.6 677.002 1161.65C680.908 1161.72 672.939 1162.24 672.92 1162.24C670.684 1162.38 667.871 1162.71 665.625 1162.82C639.766 1164.28 611.855 1164.58 583.32 1164.58C552.109 1164.58 521.377 1163.99 487.012 1162.24L486.133 1162.82C605.371 1296.85 791.816 1377.23 1025.53 1377.23C1520.14 1377.23 1939.67 1157.97 2125.45 665.732C2257.25 679.258 2383.92 645.645 2441.53 533.164C2349.76 480.205 2231.73 497.09 2163.77 531.25" fill="#22A0C8"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M2163.77 531.25C2178.74 414.883 2091.66 323.486 2037.66 280.088C1975.42 352.041 1965.75 540.615 2063.39 620.01C2008.9 668.408 1894.08 712.275 1776.51 712.275H430.156C424.316 900.225 494.063 1042.89 617.461 1129.14H617.49C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 738.33 1158.77 672.627 1162.82C672.607 1162.82 671.035 1161.31 671.016 1161.31C839.346 1247.66 1083.42 1247.34 1363.25 1139.85C1677.02 1019.31 1969 789.658 2172.72 526.992C2169.66 528.379 2166.67 529.795 2163.77 531.25" fill="#37B1D9"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M348.096 861.387C356.982 927.129 376.221 988.682 404.736 1044.75L421.016 1074.53C431.322 1092.01 442.586 1108.92 454.756 1125.16C513.604 1128.94 567.852 1130.23 617.49 1129.14C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 738.623 1158.18 672.92 1162.25C670.664 1162.38 666.729 1162.41 664.453 1162.54C638.613 1163.98 610.986 1164.87 582.441 1164.87C551.24 1164.87 519.326 1164.28 484.98 1162.53C604.219 1296.55 791.816 1377.23 1025.53 1377.23C1448.96 1377.23 1817.36 1216.5 2031.18 861.387H348.096Z" fill="#1B81A5"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M443.037 861.387C468.35 976.816 529.18 1067.43 617.49 1129.14C715.02 1126.99 794.6 1115.47 854.912 1094.57C859.176 1093.24 863.788 1093.63 867.774 1095.64C871.76 1097.65 874.806 1101.14 876.269 1105.36C877.731 1109.58 877.495 1114.2 875.611 1118.25C873.727 1122.3 870.342 1125.45 866.172 1127.05C858.145 1129.84 849.785 1132.44 841.152 1134.91H841.123C793.633 1148.48 737.461 1158.18 671.748 1162.25C840.068 1248.57 1083.44 1247.33 1363.25 1139.85C1532.53 1074.81 1695.45 977.998 1841.61 861.387H443.037Z" fill="#1D91B4"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M539.648 484.014H733.184V677.549H539.648V484.014ZM555.771 500.146H571.045V661.426H555.771V500.146ZM584.482 500.146H600.371V661.426H584.492V500.146H584.482ZM613.799 500.146H629.688V661.426H613.799V500.146ZM643.135 500.146H659.014V661.426H643.135V500.146ZM672.461 500.146H688.34V661.426H672.461V500.146ZM701.777 500.146H717.061V661.426H701.777V500.146ZM762.949 260.713H956.494V454.238H762.939V260.713H762.949ZM779.082 276.846H794.346V438.115H779.082V276.846ZM807.793 276.846H823.672V438.115H807.803V276.846H807.793ZM837.109 276.846H852.988V438.115H837.109V276.846ZM866.436 276.846H882.314V438.115H866.436V276.846ZM895.762 276.846H911.65V438.115H895.762V276.846ZM925.078 276.846H940.371V438.115H925.078V276.846Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M762.949 486.014H956.494V679.549H762.939V486.014H762.949ZM779.082 502.146H794.346V663.426H779.082V502.146ZM807.793 502.146H823.672V663.426H807.803V502.146H807.793ZM837.109 502.146H852.988V663.426H837.109V502.146ZM866.436 502.146H882.314V663.426H866.436V502.146ZM895.762 502.146H911.65V663.426H895.762V502.146ZM925.078 502.146H940.371V663.426H925.078V502.146Z" fill="#34BBDE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M986.26 484.014H1179.79V677.549H986.26V484.014ZM1002.38 500.146H1017.65V661.426H1002.38V500.146ZM1031.09 500.146H1046.97V661.426H1031.09V500.146ZM1060.42 500.146H1076.3V661.426H1060.42V500.146ZM1089.75 500.146H1105.63V661.426H1089.75V500.146ZM1119.06 500.146H1134.96V661.426H1119.06V500.146ZM1148.39 500.146H1163.66V661.426H1148.39V500.146V500.146Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M986.26 260.713H1179.79V454.238H986.26V260.713ZM1002.38 276.846H1017.65V438.115H1002.38V276.846ZM1031.09 276.846H1046.97V438.115H1031.09V276.846ZM1060.42 276.846H1076.3V438.115H1060.42V276.846ZM1089.75 276.846H1105.63V438.115H1089.75V276.846ZM1119.06 276.846H1134.96V438.115H1119.06V276.846ZM1148.39 276.846H1163.66V438.115H1148.39V276.846V276.846ZM1209.56 484.014H1403.1V677.549H1209.56V484.014ZM1225.69 500.146H1240.96V661.426H1225.69V500.146ZM1254.4 500.146H1270.28V661.426H1254.4V500.146ZM1283.72 500.146H1299.6V661.426H1283.72V500.146ZM1313.05 500.146H1328.94V661.426H1313.05V500.146ZM1342.37 500.146H1358.26V661.426H1342.37V500.146ZM1371.7 500.146H1386.97V661.426H1371.7V500.146Z" fill="#34BBDE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1209.56 260.713H1403.1V454.238H1209.56V260.713ZM1225.69 276.846H1240.96V438.115H1225.69V276.846ZM1254.4 276.846H1270.28V438.115H1254.4V276.846ZM1283.72 276.846H1299.6V438.115H1283.72V276.846ZM1313.05 276.846H1328.94V438.115H1313.05V276.846ZM1342.37 276.846H1358.26V438.115H1342.37V276.846ZM1371.7 276.846H1386.97V438.115H1371.7V276.846Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1209.56 37.4023H1403.1V230.957H1209.56V37.4023ZM1225.69 53.5254H1240.96V214.814H1225.69V53.5156V53.5254ZM1254.4 53.5254H1270.28V214.814H1254.4V53.5156V53.5254ZM1283.72 53.5254H1299.6V214.814H1283.72V53.5156V53.5254ZM1313.05 53.5254H1328.94V214.814H1313.05V53.5156V53.5254ZM1342.37 53.5254H1358.26V214.814H1342.37V53.5156V53.5254ZM1371.7 53.5254H1386.97V214.814H1371.7V53.5156V53.5254Z" fill="#34BBDE"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1432.86 484.014H1626.4V677.549H1432.86V484.014ZM1448.97 500.146H1464.26V661.426H1448.98V500.146H1448.97ZM1477.69 500.146H1493.57V661.426H1477.7V500.146H1477.69ZM1507.02 500.146H1522.91V661.426H1507.02V500.146ZM1536.34 500.146H1552.23V661.426H1536.34V500.146ZM1565.67 500.146H1581.55V661.426H1565.67V500.146ZM1594.99 500.146H1610.26V661.426H1594.99V500.146Z" fill="#23A3C2"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M944.375 991.328C951.448 991.234 958.468 992.545 965.03 995.187C971.591 997.829 977.562 1001.75 982.597 1006.72C987.631 1011.68 991.628 1017.6 994.355 1024.13C997.083 1030.66 998.487 1037.66 998.486 1044.73C998.484 1051.8 997.078 1058.81 994.348 1065.33C991.618 1071.86 987.619 1077.77 982.583 1082.74C977.546 1087.71 971.574 1091.62 965.012 1094.26C958.449 1096.9 951.428 1098.21 944.356 1098.12C930.32 1097.92 916.924 1092.21 907.068 1082.22C897.211 1072.22 891.686 1058.75 891.689 1044.71C891.691 1030.67 897.221 1017.2 907.081 1007.21C916.942 997.222 930.339 991.515 944.375 991.328Z" fill="#D3ECEC"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M944.375 1006.47C949.258 1006.47 953.916 1007.39 958.213 1009.06C955.248 1010.78 952.932 1013.43 951.624 1016.6C950.315 1019.77 950.087 1023.28 950.973 1026.6C951.86 1029.91 953.813 1032.83 956.53 1034.93C959.247 1037.02 962.577 1038.15 966.006 1038.16C971.914 1038.16 977.041 1034.89 979.697 1030.05C982.842 1037.62 983.467 1046.01 981.48 1053.97C979.492 1061.93 974.998 1069.04 968.66 1074.25C962.323 1079.45 954.478 1082.48 946.285 1082.89C938.092 1083.3 929.986 1081.06 923.163 1076.51C916.34 1071.95 911.162 1065.33 908.395 1057.6C905.628 1049.88 905.418 1041.47 907.796 1033.62C910.174 1025.77 915.013 1018.9 921.6 1014.01C928.187 1009.12 936.172 1006.48 944.375 1006.47V1006.47ZM0 880.684H2483.66C2429.59 866.973 2312.57 848.437 2331.87 777.559C2233.53 891.348 1996.39 857.393 1936.53 801.289C1869.89 897.949 1481.9 861.201 1454.84 785.898C1371.29 883.955 1112.39 883.955 1028.84 785.898C1001.76 861.201 613.779 897.949 547.129 801.279C487.285 857.393 250.156 891.348 151.816 777.568C171.113 848.437 54.0918 866.973 0 880.693" fill="#364548"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M1086.3 1376.07C954.072 1313.33 881.504 1228.03 841.123 1134.92C792.002 1148.94 732.969 1157.9 664.365 1161.75C638.525 1163.19 611.338 1163.94 582.822 1163.94C549.932 1163.94 515.273 1162.96 478.887 1161.04C600.146 1282.23 749.316 1375.53 1025.53 1377.23C1045.92 1377.23 1066.15 1376.84 1086.3 1376.07" fill="#BDD9D7"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M890.234 1220.84C871.943 1196.01 854.199 1164.79 841.152 1134.9C792.031 1148.94 732.979 1157.9 664.365 1161.76C711.494 1187.33 778.887 1211.04 890.244 1220.84" fill="#D3ECEC"/>
</svg>

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="162px" height="185px" viewBox="0 0 162 185" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 52.6 (67491) - http://www.bohemiancoding.com/sketch -->
<title>element-logo</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="element-logo" transform="translate(-1.000000, -1.000000)" fill="#409EFF" fill-rule="nonzero">
<path d="M156.79,42.9 C160.719111,44.6342514 163.127559,48.6576824 162.8,52.94 C162.8,52.94 162.8,126.2 162.8,133.32 C162.8,140.99 158.8,142.7 158.8,142.7 C158.8,142.7 90.08,182.41 85.61,184.9 C81.22,186.8 78.22,184.9 78.22,184.9 C78.22,184.9 6.31,143.2 3.69,141.36 C2.13506061,140.279463 1.1475571,138.557756 1,136.67 C1,136.67 1.07,54.1 1,50.27 C0.93,46.44 5.7,43.57 5.7,43.57 L77.55,2 C80.3018235,0.643101287 83.5281765,0.643101287 86.28,2 C86.28,2 149.75,38.93 156.79,42.9 Z M144.88,124.64 C144.89,122.91 144.89,116.19 144.89,107.71 L81.36,146.2 L81.36,131.48 C81.36,125.48 86.05,121.48 86.05,121.48 L142.26,87.62 C144.38,85.4 144.81,81.86 144.9,80.52 L144.9,65.61 L81.38,104.09 L81.38,88.7 C81.239749,85.3260948 82.7276345,82.0899436 85.38,80 L134.14,50.44 C119.43,42 84.78,21.89 84.78,21.89 C82.6164152,20.8289683 80.0835848,20.8289683 77.92,21.89 L21.51,54.39 C21.51,54.39 17.76,56.63 17.82,59.63 C17.88,62.63 17.82,127.26 17.82,127.26 C17.9452126,128.735416 18.7179395,130.079448 19.93,130.93 C22,132.36 78.45,164.98 78.45,164.98 C80.2731501,165.903084 82.4268499,165.903084 84.25,164.98 C87.76,163.05 141.71,131.98 141.71,131.98 C141.71,131.98 144.88,130.64 144.88,124.64 Z" id="Combined-Shape"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 256 B

@ -0,0 +1,30 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="512" height="512" rx="256" fill="#0D2538"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M395.449 227.098C411.96 226.303 426.575 239.112 428 255.638C434.176 335.58 362.331 424.985 259.229 427.85C242.706 428.309 228.94 415.249 228.482 398.68C228.025 382.111 241.048 368.307 257.571 367.848C325.97 365.947 369.301 306.869 366.988 258.514C366.196 241.957 378.939 227.892 395.449 227.098Z" fill="url(#paint0_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M115.322 225.395C131.851 225.395 145.251 238.832 145.251 255.408C145.251 324.59 200.878 369.364 256.439 367.993C272.963 367.585 286.689 380.687 287.095 397.258C287.502 413.828 274.436 427.592 257.911 428C171.026 430.144 85.0952 360.584 85.0952 255.408C85.0952 238.832 98.7921 225.395 115.322 225.395Z" fill="url(#paint1_linear)"/>
<path d="M320.681 257.735C320.681 240.765 334.523 227.008 351.598 227.008H396.655C413.73 227.008 428 240.765 428 257.735C428 274.705 413.73 288.462 396.655 288.462H351.598C334.523 288.462 320.681 274.705 320.681 257.735Z" fill="url(#paint2_linear)"/>
<path d="M226.142 257.78C226.142 240.785 239.896 227.008 256.844 227.008C273.792 227.008 287.546 240.785 287.546 257.78C287.546 274.775 273.792 288.552 256.844 288.552C239.896 288.552 226.142 274.775 226.142 257.78Z" fill="url(#paint3_linear)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M286.696 114.008C287.382 130.569 274.549 144.552 258.034 145.24C186.74 148.209 143.215 204.243 145.334 257.449C145.993 274.011 133.407 287.974 116.891 288.635C100.374 289.296 85.8498 275.93 85.1903 259.367C81.738 172.664 153.932 86.95 255.55 85.2667C272.066 84.5789 286.01 97.4468 286.696 114.008Z" fill="url(#paint4_linear)"/>
<defs>
<linearGradient id="paint0_linear" x1="269.802" y1="499.697" x2="363.377" y2="511.725" gradientUnits="userSpaceOnUse">
<stop stop-color="#1A7D75"/>
<stop offset="1" stop-color="#1A8864"/>
</linearGradient>
<linearGradient id="paint1_linear" x1="96.4018" y1="247.925" x2="49.267" y2="371.855" gradientUnits="userSpaceOnUse">
<stop offset="0.0129262" stop-color="#168A81"/>
<stop offset="1" stop-color="#31A97F"/>
</linearGradient>
<linearGradient id="paint2_linear" x1="165.819" y1="264.17" x2="245.175" y2="384.491" gradientUnits="userSpaceOnUse">
<stop stop-color="#27A59B"/>
<stop offset="1" stop-color="#64D8A2"/>
</linearGradient>
<linearGradient id="paint3_linear" x1="137.536" y1="264.224" x2="223.107" y2="338.352" gradientUnits="userSpaceOnUse">
<stop stop-color="#27A59B"/>
<stop offset="1" stop-color="#64D8A2"/>
</linearGradient>
<linearGradient id="paint4_linear" x1="511.85" y1="-203.453" x2="259.997" y2="-288.462" gradientUnits="userSpaceOnUse">
<stop stop-color="#27A59B"/>
<stop offset="1" stop-color="#64D8A2"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

@ -0,0 +1,30 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="256.000000pt" height="256.000000pt" viewBox="0 0 256.000000 256.000000"
preserveAspectRatio="xMidYMid meet">
<g transform="translate(0.000000,256.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1035 2500 c-508 -110 -892 -503 -980 -1005 -23 -130 -21 -330 5
-454 102 -500 477 -877 977 -980 139 -29 345 -29 484 -1 435 89 783 390 933
808 87 244 90 554 5 806 -137 409 -471 713 -898 818 -127 31 -401 35 -526 8z
m-203 -1195 l-57 -190 -62 -3 -61 -3 29 93 c16 50 29 96 29 101 0 4 -19 7 -42
5 l-41 -3 -30 -97 -30 -98 -59 0 c-52 0 -59 2 -54 18 3 9 15 50 27 90 11 40
19 76 16 79 -4 3 -23 -4 -43 -16 -20 -12 -38 -21 -39 -19 -8 8 54 85 83 103
22 14 36 35 50 75 l19 55 56 3 c64 3 66 0 42 -67 l-14 -41 44 0 44 0 16 55 16
54 57 3 c31 2 58 1 59 -2 2 -3 -23 -90 -55 -195z m418 5 l0 -200 -55 0 -55 0
0 40 0 40 -60 0 c-59 0 -60 0 -80 -40 l-20 -40 -65 0 -64 0 104 173 c57 94
114 182 127 194 18 17 38 23 93 26 39 1 71 4 73 5 1 1 2 -88 2 -198z m742 190
c54 -15 81 -54 72 -105 -23 -140 -64 -237 -112 -267 -30 -18 -51 -22 -131 -22
-170 -1 -199 29 -163 173 39 163 65 199 157 222 45 11 135 10 177 -1z m-492
-11 c0 -6 -16 -63 -35 -126 -19 -64 -35 -124 -35 -134 0 -26 37 -33 125 -26
l73 7 -14 -47 c-8 -25 -17 -49 -20 -52 -3 -3 -56 -6 -118 -6 -188 0 -199 20
-135 245 l43 150 58 0 c35 0 58 -4 58 -11z"/>
<path d="M1108 1339 c-21 -36 -38 -69 -38 -72 0 -13 71 -7 76 7 3 7 4 40 2 72
l-3 59 -37 -66z"/>
<path d="M1839 1420 c-19 -11 -29 -36 -60 -138 -24 -84 -18 -102 36 -102 48 0
71 26 100 112 29 88 31 123 9 132 -23 9 -67 7 -85 -4z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 671 B

After

Width:  |  Height:  |  Size: 19 KiB

@ -1 +1,15 @@
<svg width="128" height="128" viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg"><title>klarna</title><path d="M50.487 67.747c.197 21.498 12.425 41.418 31.753 52.167 9.467 5.226 20.117 7.987 31.064 8.086-.198-10.453-3.057-20.709-8.481-29.683-11.242-18.637-32.05-30.274-54.336-30.57zm0-7.494c22.286-.296 43.094-11.933 54.336-30.57 5.424-8.974 8.283-19.23 8.48-29.683-10.946.099-21.596 2.958-31.063 8.185-19.328 10.749-31.556 30.669-31.753 52.068zM39.639 0H21.89C17.55 0 14 3.353 14 7.495v117.448c0 1.38 1.282 2.761 3.156 2.761h17.849c4.339 0 7.79-3.353 7.79-7.494V2.564C42.795 1.084 41.513 0 39.64 0z" fill="#0072CC" fill-rule="evenodd"/></svg>
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.2.1, 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 165.9 144.2" style="enable-background:new 0 0 165.9 144.2;" xml:space="preserve">
<g>
<path d="M114,0.6H82.2c0,26.1-12,50.1-33,65.8l-12.6,9.5l48.9,66.7H125h0.7l-45-61.4C102.1,60,114,31.4,114,0.6z"/>
<rect y="0.6" width="32.7" height="142"/>
<path d="M148.1,108.5c-9.9,0-17.8,8-17.8,17.8c0,9.8,8,17.8,17.8,17.8c9.8,0,17.8-8,17.8-17.8C165.9,116.5,157.9,108.5,148.1,108.5
z"/>
<path d="M136.1,5.3c0-1.3-1-2.2-2.5-2.2H131v7.2h1.3V7.6h1.4l1,2.7h1.4l-1.3-2.9C135.6,7,136.1,6.3,136.1,5.3z M133.6,6.5h-1.4V4.3
h1.4c0.9,0,1.2,0.4,1.2,1.1C134.8,6,134.6,6.5,133.6,6.5z"/>
<path d="M140,6.8c0-3.8-3-6.8-6.7-6.8c-3.7,0-6.7,3.1-6.7,6.8c0,3.7,3,6.8,6.7,6.8C137,13.6,140,10.6,140,6.8z M127.8,6.8
c0-3,2.4-5.5,5.4-5.5s5.4,2.5,5.4,5.5s-2.4,5.5-5.4,5.5S127.8,9.9,127.8,6.8z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 649 B

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="windows-1252"?>
<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 38.044 38.044" style="enable-background:new 0 0 38.044 38.044;" xml:space="preserve">
<g>
<g>
<path style="fill:#010002;" d="M31.716,13.5C31.699,6.47,25.974,0.755,18.94,0.755c-7.045,0-12.777,5.732-12.777,12.777 c0,0.022,0.004,0.043,0.004,0.065C2.477,15.84,0,19.887,0,24.511c0,7.046,5.731,12.777,12.777,12.777 c2.268,0,4.395-0.601,6.244-1.642c1.849,1.041,3.977,1.642,6.245,1.642c7.046,0,12.777-5.732,12.777-12.777 C38.043,19.82,35.495,15.722,31.716,13.5z M19.021,32.961c-2.312-1.713-3.906-4.341-4.22-7.352c1.3,0.448,2.689,0.702,4.139,0.702 c1.514,0,2.96-0.278,4.307-0.764C22.949,28.584,21.349,31.236,19.021,32.961z M8.517,14.898c1.303-0.579,2.743-0.909,4.26-0.909 c1.475,0,2.879,0.307,4.154,0.858c-2.114,1.826-3.629,4.325-4.195,7.167C10.473,20.352,8.898,17.814,8.517,14.898z M18.94,24.055 c-1.457,0-2.846-0.298-4.109-0.837c0.361-2.928,1.929-5.482,4.19-7.157c2.243,1.662,3.802,4.187,4.18,7.085 C21.897,23.727,20.457,24.055,18.94,24.055z M21.111,14.846c1.275-0.55,2.679-0.858,4.154-0.858c1.457,0,2.846,0.298,4.11,0.837 c-0.356,2.885-1.883,5.404-4.089,7.082C24.704,19.108,23.199,16.65,21.111,14.846z M18.94,3.01c5.432,0,9.915,4.137,10.466,9.425 c-1.3-0.447-2.689-0.702-4.14-0.702c-2.268,0-4.396,0.601-6.245,1.642c-1.848-1.041-3.975-1.642-6.244-1.642 c-1.514,0-2.96,0.278-4.307,0.763C8.993,7.179,13.488,3.01,18.94,3.01z M12.777,35.034c-5.803,0-10.523-4.72-10.523-10.523 c0-3.418,1.645-6.451,4.177-8.375c0.744,3.581,2.999,6.607,6.059,8.408c0.011,3.847,1.735,7.293,4.442,9.631 C15.656,34.727,14.253,35.034,12.777,35.034z M25.266,35.034c-1.475,0-2.879-0.307-4.154-0.858 c2.715-2.345,4.444-5.804,4.444-9.664c0-0.022-0.004-0.044-0.004-0.065c3.007-1.829,5.209-4.852,5.918-8.416 c2.613,1.917,4.319,4.999,4.319,8.48C35.788,30.313,31.068,35.034,25.266,35.034z"/>
</g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
<g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 497 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 430 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 902 B

@ -0,0 +1,10 @@
<svg width="486px" height="346px" viewBox="0 0 486 346" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Nuxt Logo</title>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g fill-rule="nonzero">
<polygon id="Shape" fill="#42B883" points="200 0 400 346 0 346"></polygon>
<polygon id="Shape" fill="#3C8171" points="311 43 486 346 136 346"></polygon>
<polygon id="Shape" fill="#35495E" points="267.945522 117 400 345.454247 136 345.454247"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 599 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

@ -0,0 +1 @@
<svg viewBox="0 0 30.58 26.03" xmlns="http://www.w3.org/2000/svg"><path d="m5.07 0h2.63l-4.14 4.17z" fill="#3cd52e"/><path d="m2.16 11.04-2.16-3.88h2.11z" fill="#d70036"/><path d="m2.11 7.17h4.34l-4.29 3.87z" fill="#ea1d76"/><path d="m6.29 14.44.16-7.27-4.29 3.87z" fill="#ff8300"/><path d="m11.47 10.82-5.19 3.62.17-7.27z" fill="#ffce00"/><path d="m14.7 6.03-8.25 1.14 5.02 3.65z" fill="#3cd52e"/><path d="m12.79 0-3.33 4.09 5.24 1.94z" fill="#d70036"/><path d="m20.61 0h-7.82l1.91 6.03z" fill="#3e8ede"/><path d="m6.45 7.17 8.25-1.14-5.24-1.94z" fill="#ea1d76"/><path d="m22.09 6.03h-7.39l5.91-6.03z" fill="#1d4f90"/><path d="m18.38 12.75-6.91-1.93 3.23-4.79z" fill="#47a141"/><path d="m22.09 6.03-3.71 6.72-3.68-6.72z" fill="#005744"/><path d="m24.69 10.82-6.31 1.93 3.71-6.72z" fill="#47a141"/><path d="m23.54 14.74-5.16-1.99 6.31-1.93z" fill="#3cd52e"/><path d="m20.61 0 5.69 4.69-4.21 1.34z" fill="#3e8ede"/><path d="m22.09 6.03 4.21-1.34-1.61 6.13z" fill="#00953a"/><path d="m24.69 10.82 5.82 1.1-6.97 2.82z" fill="#005744"/><path d="m30.51 11.92.07 5.53-7.04-2.71z" fill="#47a141"/><path d="m23.54 14.74 7.04 2.71-5.32.89z" fill="#1d4f90"/><path d="m30.58 17.45-2.73 6.03-2.59-5.14z" fill="#3cd52e"/><path d="m25.26 18.34 2.59 5.14-3.94-2.19z" fill="#3e8ede"/><path d="m27.85 23.48-3.9 2.55-.04-4.74z" fill="#1d4f90"/><path d="m23.91 21.29.04 4.74-1.96-3.08z" fill="#3e8ede"/><path d="m23.95 26.03h-5.21l3.25-3.08z" fill="#1d4f90"/><path d="m21.99 22.95-3.25 3.08.57-3.08z" fill="#d70036"/><path d="m19.31 22.95-.57 3.08-2.51-3.08z" fill="#ea1d76"/><path d="m19.31 22.95h-3.08l1.83-2.13z" fill="#d70036"/><path d="m16.23 22.95v-4.03l1.83 1.9z" fill="#ff8300"/><path d="m26.3 4.69 4.21 7.23-5.82-1.1z" fill="#3cd52e"/><path d="m19.31 19.02-.42-2.07 3.08 1.39z" fill="#47a141"/><path d="m16.23 18.92 3.08.1-.42-2.07z" fill="#3cd52e"/><path d="m18.06 20.82 1.25-1.8-3.08-.1z" fill="#ffce00"/><path d="m7.17 2.69 2.29 1.4-.11-2.77z" fill="#47a141"/><path d="m7.17 2.69 2.18-1.37-1.65-1.32z" fill="#3cd52e"/><path d="m3.56 4.17 4.14-4.17-.53 2.69z" fill="#00953a"/><path d="m9.46 4.09-2.29-1.4-1.06 1.46z" fill="#005744"/><path d="m3.56 4.17 3.61-1.48-1.06 1.46z" fill="#47a141"/><path d="m2.11 7.17 4-3.02.34 3.02z" fill="#ff8300"/><path d="m6.11 4.15.34 3.02 3.01-3.08z" fill="#d70036"/><path d="m2.11 7.17 1.45-3 2.55-.02z" fill="#ffce00"/><path d="m11.87 14.43-1.25 2.13h3.6z" fill="#47a141"/><path d="m9.16 14.44 1.46 2.12 1.25-2.13z" fill="#3cd52e"/><path d="m11.47 10.82.4 3.61 6.51-1.68z" fill="#005744"/><path d="m14.22 16.56 4.16-3.81-6.51 1.68z" fill="#00953a"/></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,27 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.1, 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="52.2px" height="52.2px" viewBox="0 0 52.2 52.2" style="enable-background:new 0 0 52.2 52.2;" xml:space="preserve">
<style type="text/css">
.st0{fill:#EF7B24;}
</style>
<g>
<g>
</g>
<path class="st0" d="M44.6,7.6c-10.2-10.2-26.8-10.2-37,0s-10.2,26.8,0,37s26.8,10.2,37,0S54.8,17.8,44.6,7.6z M23.2,46.8
c-2.9-1.9-4.6-5.3-4.9-9.4c0-0.4,0-0.9,0-1.3c0,0,0.1,0,0.1,0c0,0,0.1,0,0.1,0c0.3,0,0.7-0.1,1-0.1c0.1,0,0.2,0,0.3,0
c0.3,0,0.6-0.1,0.8-0.1c0.1,0,0.2,0,0.4-0.1c0.2,0,0.5-0.1,0.7-0.2c0.1,0,0.3-0.1,0.4-0.1c0.2,0,0.4-0.1,0.5-0.1
c0.4,1.7,1.1,3.3,2,4.8c0.2,0.3,0.7,0.4,1,0.2c0.6-0.5,1.2-1,1.8-1.6c2.1-2.2,3.4-4.9,4-7.7c0.1-0.1,0.2-0.2,0.3-0.2
c0.1-0.1,0.2-0.2,0.4-0.3c0.2-0.2,0.4-0.3,0.6-0.5c0.1-0.1,0.2-0.2,0.3-0.3c0.3-0.3,0.6-0.5,0.8-0.8c4.4-4.4,7-10.2,7.3-16.3
c0-0.4-0.1-0.8-0.4-1l0,0c-0.3-0.3-0.7-0.4-1-0.4c-6.2,0.3-11.9,2.9-16.3,7.3c-0.3,0.3-0.5,0.5-0.8,0.8c-0.1,0.1-0.3,0.3-0.4,0.4
c-0.1,0.1-0.2,0.3-0.3,0.4c-0.2,0.2-0.4,0.5-0.6,0.7l0,0c-2.8,0.6-5.5,1.9-7.7,4c-0.6,0.6-1.2,1.2-1.6,1.8c-0.2,0.3-0.2,0.7,0.2,1
c1.5,1,3.1,1.6,4.8,2c-0.1,0.4-0.2,0.7-0.3,1.1c0,0,0,0,0,0c-0.1,0.3-0.1,0.7-0.2,1c0,0,0,0.1,0,0.1c-0.1,0.3-0.1,0.6-0.1,0.9
c0,0.1,0,0.2,0,0.3c0,0.3-0.1,0.5-0.1,0.8c0,0,0,0,0,0c-0.7,0-1.3,0-2-0.1c-3.7-0.3-6.8-2-8.6-4.9c0,0,0,0,0,0
c-1-1.5-1.3-3.3-1.1-5c0.6-5.7,3.3-11.2,8.4-15.2c7.9-6.2,19.2-6.1,27,0.1c10.4,8.3,11,23.5,1.9,32.6c-3.9,3.9-8.9,6-14.1,6.3
C26,48,24.5,47.7,23.2,46.8C23.2,46.8,23.2,46.8,23.2,46.8z M18.4,33.8c0.5-5.2,2.8-10.1,6.6-13.9c3.7-3.7,8.6-6.1,13.9-6.6
c-0.5,5.2-2.8,10.1-6.6,13.9c-0.5,0.5-1,0.9-1.5,1.3c-0.2,0.1-0.3,0.2-0.5,0.4c-0.4,0.3-0.7,0.6-1.1,0.8c-0.2,0.1-0.4,0.3-0.6,0.4
c-0.3,0.2-0.7,0.4-1,0.6c-0.3,0.1-0.5,0.3-0.8,0.4c-0.3,0.2-0.6,0.3-1,0.5c-0.3,0.2-0.7,0.3-1.1,0.4c-0.2,0.1-0.5,0.2-0.7,0.3
c-0.6,0.2-1.2,0.4-1.8,0.6c0,0-0.1,0-0.1,0C21,33.4,19.7,33.7,18.4,33.8z M5,32c2.2,2.4,5.3,3.8,8.9,4.1c0.7,0.1,1.4,0.1,2.1,0.1
l0,0l0,0c0,0.4,0,0.9,0,1.3c0.2,3.9,1.6,7.3,4,9.6c0,0,0,0,0,0c-3.5-1-6.7-2.8-9.4-5.6C7.9,38.8,6,35.5,5,32z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1 @@
<svg width="36px" height="45px" viewBox="0 0 36 45" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g fill="#5ABF9D"><path d="M27.4,39.589 L8.183,39.589 C6.96119557,39.646138 5.99997546,40.6533603 5.99997546,41.8765 C5.99997546,43.0996397 6.96119557,44.106862 8.183,44.164 L27.4,44.164 C28.6218044,44.106862 29.5830245,43.0996397 29.5830245,41.8765 C29.5830245,40.6533603 28.6218044,39.646138 27.4,39.589 L27.4,39.589 Z"></path><path d="M32.781,33.082 L19.681,33.082 C18.4591956,33.139138 17.4979755,34.1463603 17.4979755,35.3695 C17.4979755,36.5926397 18.4591956,37.599862 19.681,37.657 L32.781,37.657 C34.0028044,37.599862 34.9640245,36.5926397 34.9640245,35.3695 C34.9640245,34.1463603 34.0028044,33.139138 32.781,33.082 L32.781,33.082 Z"></path><path d="M32.776,26.575 L24.16,26.575 C22.9424076,26.637386 21.9871793,27.6428104 21.9871793,28.862 C21.9871793,30.0811896 22.9424076,31.086614 24.16,31.149 L32.776,31.149 C33.9935924,31.086614 34.9488207,30.0811896 34.9488207,28.862 C34.9488207,27.6428104 33.9935924,26.637386 32.776,26.575 L32.776,26.575 Z"></path><path d="M2.797,18.13 L11.413,18.13 C12.6348044,18.072862 13.5960245,17.0656397 13.5960245,15.8425 C13.5960245,14.6193603 12.6348044,13.612138 11.413,13.555 L2.797,13.555 C1.57519557,13.612138 0.613975464,14.6193603 0.613975464,15.8425 C0.613975464,17.0656397 1.57519557,18.072862 2.797,18.13 L2.797,18.13 Z"></path><path d="M13.479,20.056 C12.2525592,20.1072913 11.284687,21.1164872 11.284687,22.344 C11.284687,23.5715128 12.2525592,24.5807087 13.479,24.632 L22.094,24.632 C23.3158044,24.574862 24.2770245,23.5676397 24.2770245,22.3445 C24.2770245,21.1213603 23.3158044,20.114138 22.094,20.057 L13.48,20.057 L13.479,20.056 Z"></path><path d="M2.797,11.617 L15.891,11.617 C17.1085924,11.554614 18.0638207,10.5491896 18.0638207,9.33 C18.0638207,8.11081036 17.1085924,7.10538596 15.891,7.043 L2.797,7.043 C1.57940755,7.10538596 0.62417935,8.11081036 0.62417935,9.33 C0.62417935,10.5491896 1.57940755,11.554614 2.797,11.617 L2.797,11.617 Z"></path><path d="M8.173,5.11 L27.39,5.11 C28.6075924,5.04761404 29.5628207,4.04218964 29.5628207,2.823 C29.5628207,1.60381036 28.6075924,0.59838596 27.39,0.536 L8.173,0.536 C6.95540755,0.59838596 6.00017935,1.60381036 6.00017935,2.823 C6.00017935,4.04218964 6.95540755,5.04761404 8.173,5.11 Z"></path><circle cx="32.776" cy="9.333" r="2.285"></circle><circle cx="2.797" cy="35.372" r="2.285"></circle></g></g></svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 711 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 432 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 812 B

@ -0,0 +1,3 @@
<svg width="62" height="54" viewBox="0 0 31 27" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M28.1389 0H5.42579C3.66461 0 2.53685 1.94391 3.36096 3.55995L5.63288 8.0266H1.51415C1.25332 8.02668 0.996923 8.0967 0.769805 8.22987C0.542687 8.36304 0.352542 8.55485 0.217788 8.78671C0.0830333 9.01858 0.0082363 9.28265 0.000642202 9.55335C-0.0069519 9.82404 0.0529137 10.0922 0.174441 10.3318L7.48211 24.692C7.61094 24.9446 7.80362 25.1559 8.03945 25.3033C8.27528 25.4507 8.54534 25.5286 8.82061 25.5286C9.09587 25.5286 9.36593 25.4507 9.60176 25.3033C9.83759 25.1559 10.0303 24.9446 10.1591 24.692L12.1438 20.813L14.6337 25.7072C15.51 27.4285 17.884 27.4317 18.7634 25.7122L30.1479 3.46979C30.9525 1.89662 29.8545 0 28.1389 0ZM17.9362 9.50329L13.0274 19.0961C12.9416 19.2641 12.8134 19.4046 12.6565 19.5026C12.4995 19.6006 12.3199 19.6524 12.1368 19.6524C11.9537 19.6524 11.774 19.6006 11.6171 19.5026C11.4602 19.4046 11.332 19.2641 11.2462 19.0961L6.38472 9.54364C6.30346 9.38438 6.2632 9.20602 6.26782 9.02586C6.27244 8.84569 6.32179 8.66982 6.41109 8.51527C6.5004 8.36071 6.62663 8.23272 6.77756 8.14369C6.92849 8.05465 7.099 8.00759 7.27259 8.00705H17.0702C17.2395 8.00706 17.4058 8.05254 17.5531 8.13907C17.7004 8.2256 17.8237 8.35023 17.9108 8.50085C17.998 8.65146 18.0462 8.82294 18.0506 8.9986C18.0551 9.17426 18.0157 9.34813 17.9362 9.50329Z" fill="#F71963"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 334 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256"><path fill="#8759F2" d="M128.928 163.067L81.066 80.152H32.898c-19.702.055-31.987 21.368-22.187 38.44L82.65 243.22c9.787 16.957 34.5 17.13 44.415-.023l46.277-80.15c-9.912 17.165-34.637 16.953-44.415.02z"/><path fill="#FF3E80" d="M176.806 80.152h-95.75l47.862 82.918c9.788 16.96 34.5 17.13 44.415-.023l25.665-44.422c9.908-17.17-2.642-38.475-22.192-38.473z"/><path fill="#FFC300" d="M223.083 0H79.176C59.473.055 47.188 21.367 56.988 38.44c0 .02 24.078 41.71 24.078 41.71h95.75c19.775 0 32 21.485 22.185 38.475l46.277-80.15C255.101 21.445 242.808 0 223.083 0z"/><path fill="#00D4E6" d="M56.998 38.442a25.638 25.638 0 0 1 .025-25.612L10.748 92.977A25.638 25.638 0 0 1 32.911 80.15h48.165L56.998 38.442z"/></svg>

After

Width:  |  Height:  |  Size: 771 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 520 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

@ -0,0 +1,18 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 254.12 117.33">
<defs>
<style>.cls-1{fill:#1ab394;}.cls-2{fill:#a7a9ac;}</style>
</defs>
<title>logo</title>
<g id="Layer_2" >
<g id="Layer_3" >
<path class="cls-1"
d="M95,67a90.66,90.66,0,0,1,10.28,1.69l3.79-1.41c10-3.75,14.25-17.22,9.43-30.11s-16.84-20.3-26.87-16.55l-3.11,1.16c-2.44,2.57-5.76,5.94-7.38,7.49s-6.42-1.85-8.21-6.16L67.42,9.85A13.83,13.83,0,0,0,55.65,2H6C1.32,2-1.15,5.58.52,9.95l37.94,99.44A13.32,13.32,0,0,0,50,117.33h53.63c4.68,0,7-3.53,5.24-7.85l-14-33.7C93,71.46,93.7,67,95,67Z"/>
<path class="cls-2"
d="M161.33,42.63l-3-1.51c-3.54-.07-7.91-.1-9.71-.07s-3.08-4.75-1.36-9.1l9.08-23C158.09,4.56,155.66,1,151,1H99.33A15.11,15.11,0,0,0,87,8.61L84,14.73c-2.09,4.18-3.48,8.37-3.08,9.3s1.09,1.27,1.53.75,4-4.7,6.77-7.65l3.58-1.34c11.53-4.31,25.36,4.21,30.9,19s.69,30.32-10.84,34.63A30.42,30.42,0,0,1,108.48,71c-4.6-.83-6.88,2-5.05,6.33l7.38,17.42c1.82,4.31,4.52,7.83,6,7.83s4.08-3.56,5.8-7.91l4-10.17c1.71-4.35,3.3-7.69,3.52-7.41s2.65,4.28,4.93,8.11l3.6,1.84c9.53,4.87,22.33-1.11,28.59-13.36S170.86,47.5,161.33,42.63Z"/>
<path class="cls-1"
d="M219.29,49.94c-4.82-12.89-16.84-20.3-26.87-16.55l-3.11,1.16c-2.44,2.57-5.24,5.65-6.22,6.84s-4.72-.92-6.46-5.26l-6-14.9c-1.74-4.34-4.51-7.89-6.16-7.89s-4.42,3.55-6.15,7.9l-3.61,9c-1.73,4.34-2.71,7.87-2.16,7.83s5.5-.21,9.57-.13l3.4,1.74c11,5.6,14,21.56,6.8,35.65s-21.92,21-32.88,15.37l-2.67-1.37c-2.14-2.43-4.58-2.68-5.43-.55s-.1,7.41,1.67,11.74l3.24,7.92A13.72,13.72,0,0,0,148,116.33h46.66c4.68,0,9.25-1.27,10.17-2.83s.24-6.39-1.5-10.73l-6-15.08c-1.74-4.34-2.64-8-2-8a102,102,0,0,1,10.78,1.82l3.79-1.41C219.89,76.31,224.11,62.83,219.29,49.94Z"/>
<path class="cls-1"
d="M194.16,0A10,10,0,0,0,186,5.09l-6.32,12.83a14.27,14.27,0,0,0-.33,10.32L181,32.35c1.2,2.88,2.42,4.92,2.72,4.53s2.86-3.43,5-5.69c0,0,1.2-1.26,4.78-2.6,11.53-4.31,25.36,4.21,30.9,19s.69,30.32-10.84,34.63a13.72,13.72,0,0,1-6,1.09c-3.09-.43-4.64,1.58-3.44,4.46l3.53,8.48c1.2,2.88,3.6,5.23,5.34,5.23s4.1-2.38,5.23-5.28l35.54-91c1.13-2.9-.49-5.28-3.61-5.28Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

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