Add files via upload

pull/1724/head
snokvist 2025-02-23 20:07:09 +01:00 committed by GitHub
parent 2e9cf87ea1
commit 8b0c75da9d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 536 additions and 0 deletions

View File

@ -0,0 +1,514 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Camera</title>
<style>
/* Apply border-box to all elements */
*, *:before, *:after {
box-sizing: border-box;
}
body {
font-family: Helvetica, sans-serif;
background-color: #1e1e1e;
margin: 0;
padding: 0;
color: #dcdcdc;
text-align: center;
}
header {
background-color: #252526;
color: white;
padding: 15px 0;
}
header img {
display: block;
margin: 0 auto;
}
/* Overall information below the logo */
.ww-info {
color: #666;
font-style: italic;
text-align: center;
margin-top: 10px;
}
h3 {
font-size: 1.5rem;
margin-top: 1rem;
color: #dee2e6bf;
text-align: left;
}
/* Container with consistent width */
.container {
padding: 20px;
max-width: 800px;
margin: 0 auto;
text-align: left;
}
/* Form sections use full container width */
.form-section {
background-color: #2d2d2d;
border-radius: 8px;
box-shadow: 0 2px 10px #00000080;
width: 100%;
padding: 20px;
margin: 20px auto;
}
.form-section label {
width: 150px;
font-weight: bold;
color: #dee2e6;
}
.form-section input,
.form-section select {
width: 180px;
padding: 10px;
border-radius: 4px;
border: 1px solid #555;
background-color: #3c3c3c;
color: #dcdcdc;
}
.form-section button {
background-color: #0d6efd80;
box-shadow: 0 2px 10px #00000040;
color: white;
padding: 10px;
border: none;
border-radius: 4px;
cursor: pointer;
font-size: 1rem;
vertical-align: middle;
width: 200px; /* uniform button width */
}
.form-section button:hover {
background-color: #0b5ed7;
}
/* Red reset button style */
.red-button {
background-color: red !important;
}
/* Benchtest and Reboot button style (orange-yellow) */
.bench-button {
background-color: #D98C00 !important;
}
/* MJPEG video: same width as container */
#preview {
width: 100%;
max-width: 800px;
aspect-ratio: 16/9;
border-radius: 8px;
box-shadow: 0 2px 10px #00000080;
}
/* YAML output styling */
pre {
background-color: #3c3c3c;
padding: 10px;
border-radius: 4px;
color: #dcdcdc;
max-height: 500px;
overflow: auto;
}
/* VTX Log: half the height of VTX Info */
.log-pre {
max-height: 250px;
}
/* Configurator link styling */
.configurator-link {
margin-top: 20px;
background-color: #2d2d2d;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px #00000080;
}
.configurator-link a {
color: #0d6efd;
text-decoration: none;
font-weight: bold;
}
.configurator-link a:hover {
text-decoration: underline;
}
/* Small note styling */
.small-note {
font-size: 0.85rem;
color: #aaa;
margin: 5px 0 0 160px; /* indent to align with input fields */
}
/* Control group styling for standalone settings */
.control-group {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 10px;
}
/* For groups that contain only a button, add a placeholder label */
.control-group .placeholder {
display: inline-block;
width: 150px;
}
</style>
</head>
<body>
<header>
<img src="logo.svg" width="220px" alt="Logo">
<div id="wwInfo" class="ww-info">Loading overall info...</div>
</header>
<div class="container">
<!-- MJPEG Stream Section -->
<section>
<video id="preview" poster="/mjpeg" style="background:url(stream.svg); background-size:cover;"></video>
</section>
<!-- Configurator Link & Description -->
<div class="configurator-link">
<a href="https://github.com/OpenIPC/openipc-configurator/releases" target="_blank">
OpenIPC Configurator
</a>
<p>
A multi-platform configuration tool for OpenIPC cameras, built using Avalonia UI.
The application provides a user-friendly interface for managing camera settings,
viewing telemetry data, and setting up the camera.
<br><br>
<strong>Camera settings management:</strong> configure camera settings such as resolution, frame rate, and exposure<br>
<strong>Telemetry:</strong> view real-time telemetry data from the camera, including metrics such as temperature, voltage, and signal strength<br>
<strong>Setup wizards:</strong> guided setup processes for configuring the camera and connecting to the network<br>
<strong>Multi-platform support:</strong> run the application on Windows, macOS, and Linux platforms<br>
<strong>YAML-based configuration files:</strong> easily edit and customize camera settings using YAML configuration files
</p>
</div>
<!-- Bind with Groundstation Section -->
<section class="form-section">
<h3>Bind with groundstation</h3>
<div class="control-group">
<label>Bind:</label>
<button id="bind-wfb-button">Bind</button>
</div>
</section>
<!-- Standalone Settings Section -->
<section class="form-section">
<h3>Standalone settings</h3>
<!-- Passphrase Bind Control Group -->
<div class="control-group">
<label for="passphraseInput">Passphrase:</label>
<input type="text" id="passphraseInput" placeholder="Enter passphrase">
<button id="passphraseBindButton">Bind</button>
</div>
<div class="small-note">
Note: setting key with a passphrase requires a matching passphrase key on the groundstation.
</div>
<!-- Set VTX Name Control Group -->
<div class="control-group">
<label for="vtxNameInput">VTX Name:</label>
<input type="text" id="vtxNameInput" placeholder="Default: OpenIPC">
<button id="setVtxNameButton">Set VTX Name</button>
</div>
<!-- Set Wifi Adapter Control Group -->
<div class="control-group">
<label for="wifiAdapterSelect">Wifi Adapter:</label>
<select id="wifiAdapterSelect"></select>
<button id="setWifiAdapterButton">Set Wifi</button>
</div>
<!-- Set Bitrate Control Group -->
<div class="control-group">
<label for="bitrateSelect">Bitrate:</label>
<select id="bitrateSelect"></select>
<button id="setBitrateButton">Set Bitrate</button>
</div>
<!-- Benchtest and Reboot Control Group -->
<div class="control-group">
<label class="placeholder"></label>
<button id="benchTestButton" class="bench-button">Benchtest</button>
<button id="rebootButton" class="bench-button">Reboot</button>
</div>
<div class="small-note">
Note: Benchtest puts the VTX into low power mode. Always use a fan when benchtesting!
</div>
</section>
<!-- VTX Info Section -->
<section class="form-section">
<h3>VTX Info</h3>
<pre id="vtxDisplay">Loading...</pre>
<button id="refreshVtxButton">Refresh</button>
</section>
<!-- VTX Log Section -->
<section class="form-section">
<h3>VTX Log</h3>
<pre id="vtxLog" class="log-pre">Loading log...</pre>
</section>
</div>
<!-- Reset VTX Section -->
<div class="container">
<section class="form-section">
<h3>Reset VTX</h3>
<div class="control-group">
<label class="placeholder"></label>
<button id="reset-button" class="red-button">Reset</button>
</div>
</section>
</div>
<script src="js-yaml.min.js"></script>
<script>
let configData = { majestic: {}, wfb: {} };
async function loadYAML(url, setter) {
const response = await fetch(url);
const text = await response.text();
setter(jsyaml.load(text));
}
async function uploadYAML(data, location) {
const yamlData = jsyaml.dump(data);
await fetch('/upload', {
method: 'POST',
headers: { 'File-Location': location },
body: yamlData
});
}
async function runCommand(command) {
await fetch('/command', {
method: 'POST',
headers: { 'Run-Command': command }
});
}
function syncForm(data, formPrefix, mode) {
Object.keys(data).forEach((section) => {
Object.keys(data[section]).forEach((key) => {
const field = document.querySelector('[name="' + formPrefix + '.' + section + '.' + key + '"]');
if (field) {
if (mode === "setup") {
field.value = data[section][key];
} else if (mode === "update") {
data[section][key] = field.value;
}
}
});
});
}
function executeDelay(button, command) {
button.disabled = true;
runCommand(command);
setTimeout(() => {
button.disabled = false;
location.reload();
}, 1000);
}
// On page load, execute get_www_info.sh then load overall info
window.addEventListener('load', function() {
runCommand('get_www_info.sh')
.then(loadWwInfo)
.catch(loadWwInfo);
});
// Load overall info from /tmp/www_info
function loadWwInfo() {
fetch('/tmp/www_info')
.then(response => response.text())
.then(text => {
if (text.trim().toLowerCase().includes("<html")) {
document.getElementById('wwInfo').textContent = "VTX information not currently available ...";
} else {
document.getElementById('wwInfo').textContent = text.trim() || "VTX information not currently available ...";
}
})
.catch(err => {
document.getElementById('wwInfo').textContent = "VTX information not currently available ...";
});
}
// Bind with groundstation
document.getElementById('bind-wfb-button').addEventListener('click', function() {
executeDelay(this, 'provision_bind.sh');
});
// Passphrase bind
document.getElementById('passphraseBindButton').addEventListener('click', function() {
const passphrase = document.getElementById('passphraseInput').value.trim();
if (!passphrase) {
alert('Please enter a passphrase.');
return;
}
executeDelay(this, 'keygen ' + passphrase + ';generate_vtx_info.sh');
});
// Set VTX Name
document.getElementById('setVtxNameButton').addEventListener('click', function() {
let vtxName = document.getElementById('vtxNameInput').value.trim();
if (!vtxName) {
vtxName = 'OpenIPC';
}
executeDelay(this, 'fw_setenv vtx_name ' + vtxName + ';generate_vtx_info.sh');
});
// Set Wifi Adapter
document.getElementById('setWifiAdapterButton').addEventListener('click', function() {
let wifiProfile = document.getElementById('wifiAdapterSelect').value;
if (!wifiProfile) {
wifiProfile = 'default';
}
executeDelay(this, 'fw_setenv wifi_profile ' + wifiProfile + ';generate_vtx_info.sh;wifibroadcast start');
});
// Set Bitrate
document.getElementById('setBitrateButton').addEventListener('click', function() {
const bitrate = document.getElementById('bitrateSelect').value;
if (!bitrate) {
alert('No bitrate selected.');
return;
}
executeDelay(this, 'set_bitrate.sh ' + bitrate);
});
// Benchtest
document.getElementById('benchTestButton').addEventListener('click', function() {
executeDelay(this, 'set_benchtesting.sh');
});
// Reboot button
document.getElementById('rebootButton').addEventListener('click', function() {
executeDelay(this, 'reboot');
});
// Reset VTX with confirmation
document.getElementById('reset-button').addEventListener('click', function() {
if (confirm("This action will factory reset the VTX. Make sure the unit is powered during the next 2 minutes.")) {
executeDelay(this, 'firstboot.sh');
}
});
// Load YAML configuration files (if needed)
loadYAML('/etc/majestic.yaml', (data) => {
configData.majestic = data;
syncForm(configData.majestic, 'majestic', "setup");
});
loadYAML('/etc/wfb.yaml', (data) => {
configData.wfb = data;
syncForm(configData.wfb, 'wfb', "setup");
});
// Function to load and display /etc/vtx_info.yaml as plain text
function loadVtxYaml() {
fetch('/etc/vtx_info.yaml')
.then(function(response) {
if (!response.ok) { throw new Error('Network response was not ok'); }
return response.text();
})
.then(function(text) {
document.getElementById('vtxDisplay').textContent = text;
})
.catch(function(err) {
document.getElementById('vtxDisplay').textContent = 'Error loading VTX info: ' + err;
});
}
// Function to load latest 50 lines from /tmp/vtx.log
function loadVtxLog() {
fetch('/tmp/vtx.log')
.then(function(response) {
if (!response.ok) { throw new Error('Network response was not ok'); }
return response.text();
})
.then(function(text) {
if (text.trim().toLowerCase().includes("<html")) {
document.getElementById('vtxLog').textContent = "";
} else {
let lines = text.trim().split('\n');
let last50 = lines.slice(-50).join('\n');
document.getElementById('vtxLog').textContent = last50 || "No log available.";
}
})
.catch(function(err) {
document.getElementById('vtxLog').textContent = "No log available.";
});
}
// Refresh VTX Info and VTX Log together
document.getElementById('refreshVtxButton').addEventListener('click', function() {
loadVtxYaml();
loadVtxLog();
});
loadVtxYaml();
loadVtxLog();
// Function to load wifi profiles from /etc/wifi_profiles.yaml and populate the dropdown
function loadWifiProfiles() {
fetch('/etc/wifi_profiles.yaml')
.then(function(response) {
if (!response.ok) { throw new Error('Network response was not ok'); }
return response.text();
})
.then(function(text) {
let data = jsyaml.load(text);
let profiles = (data && data.all_profiles && Array.isArray(data.all_profiles)) ? data.all_profiles : ['default'];
let select = document.getElementById('wifiAdapterSelect');
select.innerHTML = '';
profiles.forEach(function(profile) {
let option = document.createElement('option');
option.value = profile;
option.textContent = profile;
select.appendChild(option);
});
})
.catch(function(err) {
let select = document.getElementById('wifiAdapterSelect');
select.innerHTML = '';
let option = document.createElement('option');
option.value = 'default';
option.textContent = 'default';
select.appendChild(option);
});
}
loadWifiProfiles();
// Function to load available bitrates from /etc/vtx_info.yaml and populate the dropdown
function loadAvailableBitrates() {
fetch('/etc/vtx_info.yaml')
.then(function(response) {
if (!response.ok) { throw new Error('Network response was not ok'); }
return response.text();
})
.then(function(text) {
let data = jsyaml.load(text);
let bitrates = (data && data.video && data.video.bitrate && Array.isArray(data.video.bitrate)) ? data.video.bitrate : [];
let select = document.getElementById('bitrateSelect');
select.innerHTML = '';
if (bitrates.length === 0) {
let option = document.createElement('option');
option.value = '';
option.textContent = 'No bitrates available';
select.appendChild(option);
} else {
bitrates.forEach(function(br) {
let option = document.createElement('option');
option.value = br;
option.textContent = br;
select.appendChild(option);
});
}
})
.catch(function(err) {
let select = document.getElementById('bitrateSelect');
select.innerHTML = '';
let option = document.createElement('option');
option.value = '';
option.textContent = 'default';
select.appendChild(option);
});
}
loadAvailableBitrates();
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,16 @@
<svg width="232" height="64" viewBox="0 0 232 64" xmlns="http://www.w3.org/2000/svg" style="background-color:transparent;" fill="#ffffff">
<g transform="matrix(1.3333333,0,0,-1.3333333,0,269.13333)">
<path d="m 19.092536,161.9099 -2.9415,-3.43102 1.572994,-1.34828 c 2.550878,-2.18732 5.677184,-3.2806 8.804272,-3.2806 3.126332,0 6.253161,1.09354 8.803537,3.27986 l 1.547984,1.32732 -2.9415,3.43102 -1.547984,-1.32732 c -3.397241,-2.91218 -8.327823,-2.9123 -11.724811,3.8e-4 z" />
<path d="m 119.62027,183.07744 c -1.15945,0 -2.08151,-0.28614 -2.74032,-0.85104 -0.63647,-0.54532 -1.09357,-1.19728 -1.35895,-1.9382 l -0.005,2.45824 h -4.27544 V 168.0588 h 4.27544 v 9.48392 c 0,0.33242 0.0708,0.62842 0.20963,0.87974 0.1396,0.25358 0.33073,0.47106 0.56749,0.64656 0.23852,0.1762 0.51119,0.30572 0.81022,0.38506 0.30354,0.0804 0.62037,0.121 0.94225,0.121 0.71731,0 1.22047,-0.21326 1.49539,-0.63406 0.28296,-0.4341 0.42662,-1.11842 0.42662,-2.03382 v -8.8484 h 4.27581 v 9.18014 c 0,1.8534 -0.3922,3.30358 -1.1655,4.31038 -0.77957,1.01382 -1.94265,1.52812 -3.45786,1.52812 z" />
<path d="m 102.09521,183.07744 c -1.09417,0 -2.08184,-0.1838 -2.935975,-0.54616 -0.85615,-0.36278 -1.58793,-0.88656 -2.17468,-1.55716 -0.58575,-0.66962 -1.03398,-1.48458 -1.331,-2.42258 -0.29601,-0.93422 -0.44611,-1.98918 -0.44611,-3.13532 0,-1.1642 0.15478,-2.23334 0.46009,-3.1776 0.30681,-0.9483 0.76933,-1.7635 1.37365,-2.4233 0.60433,-0.66082 1.35427,-1.18004 2.22875,-1.54284 0.872715,-0.36204 1.879265,-0.54542 2.991515,-0.54542 1.33142,0 2.53741,0.21654 3.58437,0.64362 1.04923,0.42858 1.91178,1.0338 2.56306,1.7988 l 0.0508,0.0588 -2.15923,2.69178 -0.0743,-0.0764 c -0.45344,-0.46726 -0.94969,-0.87268 -1.47443,-1.20486 -0.5162,-0.32664 -1.19643,-0.49208 -2.02095,-0.49208 -1.07282,0 -1.86704,0.27078 -2.36114,0.80506 -0.496615,0.53604 -0.748425,1.27472 -0.748425,2.19564 v 0.125 h 9.307385 v 1.30928 c 0,0.97944 -0.1268,1.93152 -0.3766,2.8286 -0.25082,0.90084 -0.65589,1.70618 -1.20448,2.39462 -0.54985,0.68918 -1.26733,1.24686 -2.13202,1.6561 -0.86569,0.409 -1.91535,0.6164 -3.12024,0.6164 z m 0.0831,-3.19858 c 0.79213,0 1.38471,-0.26106 1.76056,-0.77602 0.38213,-0.52448 0.57558,-1.22602 0.57558,-2.08494 v -0.1544 h -4.893305 v 0.1268 c 0,0.87448 0.2292,1.58366 0.681125,2.10664 0.44891,0.51896 1.08015,0.7819 1.87604,0.7819 z" />
<path d="m 87.438468,183.07744 c -0.95432,0 -1.813454,-0.26588 -2.55386,-0.79036 -0.690948,-0.48984 -1.155482,-1.11868 -1.383956,-1.8709 v 2.33026 H 79.22485 v -20.21132 h 4.275802 v 7.87158 c 0.11398,-0.3412 0.278698,-0.66668 0.491354,-0.96872 0.243036,-0.34698 0.543514,-0.65176 0.891498,-0.90584 0.346978,-0.25308 0.741392,-0.45288 1.17248,-0.59324 0.430838,-0.1406 0.89616,-0.21184 1.382484,-0.21184 1.86445,0 3.293182,0.6684 4.246748,1.98602 0.946538,1.30832 1.42625,3.22672 1.42625,5.70278 0,2.4758 -0.479828,4.39 -1.426616,5.68954 -0.953568,1.30858 -2.382182,1.97204 -4.246382,1.97204 z m -1.353062,-3.50236 c 0.741914,0 1.364476,-0.26412 1.850298,-0.78484 0.48733,-0.52274 0.734456,-1.23974 0.734456,-2.13128 v -2.51342 c 0,-0.89204 -0.24701,-1.6088 -0.734088,-2.13128 -0.48557,-0.52072 -1.108248,-0.78484 -1.850666,-0.78484 -0.749196,0 -1.376094,0.184 -1.86317,0.54762 -0.485572,0.36156 -0.721584,0.84714 -0.721584,1.4851 v 4.28058 c 0,0.63722 0.236012,1.12306 0.721584,1.4851 0.487578,0.3633 1.114478,0.54726 1.86317,0.54726 z" />
<path d="m 26.529036,186.38636 c -4.714606,0 -8.53616,-3.82156 -8.53616,-8.53616 0,-4.71436 3.821554,-8.53654 8.53616,-8.53654 4.714356,0 8.536531,3.82218 8.536531,8.53654 0,4.7146 -3.822175,8.53616 -8.536531,8.53616 z" />
<path d="m 140.56016,187.5239 v -19.4651 h 4.38651 v 6.95912 h 4.82159 c 0.91063,0 1.74071,0.156 2.46706,0.4634 0.72685,0.30756 1.35527,0.7376 1.86795,1.2784 0.51294,0.54082 0.91486,1.20204 1.19455,1.96578 0.27844,0.7615 0.41964,1.61806 0.41964,2.54578 0,0.90862 -0.1412,1.76002 -0.41964,2.53106 -0.27969,0.77228 -0.68136,1.4387 -1.19455,1.97976 -0.51344,0.54104 -1.14185,0.97146 -1.86795,1.27876 -0.72635,0.30706 -1.55643,0.46304 -2.46706,0.46304 z m 4.38651,-3.83374 h 4.32472 c 0.59855,0 1.07466,-0.1546 1.41411,-0.45936 0.33694,-0.30204 0.5079,-0.75704 0.5079,-1.35232 v -1.21514 c 0,-0.59554 -0.17096,-1.05042 -0.5079,-1.35196 -0.33895,-0.3048 -0.81481,-0.45936 -1.41411,-0.45936 h -4.32472 z" />
<path d="m 127.5301,187.52426 v -3.53032 h 2.48546 v -12.40556 h -2.48546 v -3.52958 h 9.35742 v 3.52958 h -2.48546 v 12.40556 h 2.48546 v 3.53032 z" />
<path d="m 67.953143,187.85526 c -1.276194,0 -2.458982,-0.21608 -3.515238,-0.64214 -1.059016,-0.42758 -1.972046,-1.07252 -2.714212,-1.91686 -0.741914,-0.84386 -1.324402,-1.90488 -1.731138,-3.15372 -0.406232,-1.2458 -0.612352,-2.7097 -0.612352,-4.3512 0,-1.64174 0.20612,-3.10574 0.612352,-4.35156 0.406986,-1.24932 0.989476,-2.31036 1.731138,-3.1537 0.741914,-0.84462 1.655196,-1.48956 2.714212,-1.91688 1.056256,-0.42606 2.239044,-0.64214 3.515238,-0.64214 1.276444,0 2.458864,0.21608 3.514868,0.64214 1.058514,0.42708 1.971913,1.07202 2.714581,1.91688 0.74116,0.84334 1.32365,1.90438 1.731138,3.1537 0.406232,1.24732 0.612352,2.71132 0.612352,4.35156 0,1.64026 -0.20612,3.10414 -0.612352,4.3512 -0.407238,1.24884 -0.989726,2.30986 -1.731138,3.15372 -0.742668,0.84484 -1.656067,1.4898 -2.714581,1.91686 -1.056004,0.42606 -2.238676,0.64214 -3.514868,0.64214 z m 0,-3.91648 c 1.23577,0 2.210436,-0.40706 2.897366,-1.21 0.690446,-0.80744 1.040816,-1.98554 1.040816,-3.50126 v -2.87236 c 0,-1.51596 -0.35037,-2.69392 -1.040816,-3.50162 -0.68718,-0.80268 -1.661596,-1.20962 -2.897366,-1.20962 -1.235772,0 -2.210438,0.40694 -2.897368,1.20962 -0.690444,0.8072 -1.040814,1.98516 -1.040814,3.50162 v 2.87236 c 0,1.51648 0.35037,2.69432 1.040814,3.50126 0.68668,0.80294 1.661596,1.21 2.897368,1.21 z" />
<path d="m 166.16055,187.85564 c -1.3136,0 -2.5155,-0.22558 -3.5715,-0.67046 -1.05902,-0.44592 -1.97193,-1.10948 -2.71385,-1.97242 -0.74141,-0.86166 -1.32341,-1.94146 -1.7304,-3.20886 -0.40623,-1.2639 -0.61235,-2.72766 -0.61235,-4.35084 0,-1.64174 0.20612,-3.09674 0.61235,-4.32398 0.40724,-1.2315 0.98996,-2.27414 1.73187,-3.09892 0.74217,-0.82602 1.6552,-1.4569 2.71422,-1.87494 1.0555,-0.41676 2.25656,-0.62816 3.56966,-0.62816 1.79692,0 3.30628,0.40952 4.48581,1.21772 1.17777,0.80694 2.14085,1.96664 2.86243,3.4472 l 0.0382,0.079 -3.59689,2.08826 -0.039,-0.1048 c -0.28822,-0.7738 -0.73945,-1.4444 -1.34202,-1.993 -0.5963,-0.5428 -1.40657,-0.81756 -2.40859,-0.81756 -1.20062,0 -2.17635,0.39406 -2.89994,1.17138 -0.72534,0.77906 -1.09341,1.93278 -1.09341,3.42916 v 3.09304 c 0,1.49638 0.36807,2.65046 1.09341,3.42954 0.72359,0.77756 1.69932,1.17174 2.89994,1.17174 1.02035,0 1.80261,-0.2381 2.32584,-0.7076 0.5275,-0.47454 0.92323,-1.11572 1.17505,-1.90584 l 0.0335,-0.1066 3.79659,1.97056 -0.0368,0.081 c -0.7045,1.57522 -1.65504,2.74604 -2.82528,3.47992 -1.16999,0.73364 -2.67348,1.10556 -4.46889,1.10556 z" />
<path d="M 16.140738,191.689 0,177.85056 16.145152,164.0077 l 2.9415,3.43066 -12.1433433,10.4122 12.1389293,10.40742 z" />
<path d="m 36.895639,191.70628 -2.941134,-3.43138 12.16026,-10.4247 -12.16541,-10.4295 2.941134,-3.43102 16.167952,13.86052 z" />
<path d="m 26.527566,201.85 c -3.126646,-1.2e-4 -6.253276,-1.09352 -8.803906,-3.28022 l -1.574462,-1.35012 2.9415,-3.43064 1.574464,1.35012 c 3.396988,2.91166 8.32819,2.91278 11.725177,3.8e-4 l 1.553502,-1.3321 2.941498,3.43138 -1.5535,1.33172 c -2.55088,2.18644 -5.677627,3.27962 -8.804273,3.27948 z" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 7.3 KiB

View File

@ -0,0 +1,4 @@
<svg width="160" height="90" viewBox="-10 -10 220 220" xmlns="http://www.w3.org/2000/svg" fill="#ddd">
<path d="M99.806 0C44.912 0 0 44.912 0 99.806s44.912 99.806 99.806 99.806S199.612 154.7 199.612 99.806 154.698 0 99.806 0m0 6.656c24.58 0 47.018 9.654 63.708 25.354l-25.47 25.264 -7.298 -18.678c-0.332 -0.998 -1.664 -1.996 -2.994 -1.996H72.526q-2 -0.002 -2.994 1.996l-8.32 21.29H42.25a11.93 11.93 0 0 0 -11.978 11.978v65.87A11.93 11.93 0 0 0 42.25 149.708h2.596L31.49 162.956c-15.394 -16.632 -24.834 -38.842 -24.834 -63.15 0 -51.232 41.918 -93.15 93.15 -93.15m23.286 93.15c0 12.974 -10.312 23.286 -23.286 23.286 -5.286 0 -10.132 -1.712 -14.02 -4.62l32.798 -32.53a23.3 23.3 0 0 1 4.506 13.862m-46.574 0c0 -12.974 10.312 -23.286 23.286 -23.286 5.33 0 10.202 1.74 14.106 4.688l-32.818 32.552a23.28 23.28 0 0 1 -4.574 -13.952m42.144 -23.314a29.86 29.86 0 0 0 -18.856 -6.628 29.82 29.82 0 0 0 -29.942 29.942c0 7.084 2.42 13.558 6.476 18.668l-24.786 24.58H41.918a5.252 5.252 0 0 1 -5.322 -5.322V71.86a5.252 5.252 0 0 1 5.322 -5.322h21.29c1.332 0 2.662 -0.998 2.994 -1.996l8.32 -21.296h50.564l7.568 19.368zm-37.626 46.694a29.86 29.86 0 0 0 18.772 6.56 29.82 29.82 0 0 0 29.942 -29.942c0 -7.044 -2.394 -13.484 -6.408 -18.58l14.81 -14.686h19.214a5.252 5.252 0 0 1 5.322 5.322v65.87a5.252 5.252 0 0 1 -5.322 5.322H61zm18.772 69.77c-24.542 0 -46.948 -9.622 -63.628 -25.278l18.116 -17.97h103.4c6.656 0 11.978 -5.322 12.308 -11.978V71.86a11.925 11.925 0 0 0 -11.978 -11.978h-13.166l23.342 -23.15c15.346 16.624 24.758 38.804 24.758 63.074 0 51.232 -41.918 93.15 -93.15 93.15"/>
<path d="M149.708 73.188c-3.662 0 -6.656 2.994 -6.656 6.656S146.046 86.5 149.708 86.5s6.656 -2.994 6.656 -6.656 -2.994 -6.656 -6.656 -6.656"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB