Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
829d01bf06 | |||
e1de2cbf77 | |||
5891da6fa5 | |||
83f97a8d65 | |||
33eba8fcfb | |||
|
2f0d08cf0a | ||
|
cbc84b434b | ||
|
5b5c0ca098 | ||
|
b6b70dde04 |
4
.gitignore
vendored
@ -1 +1,3 @@
|
||||
*.pgm
|
||||
*.pgm
|
||||
maps/
|
||||
__pycache__/
|
BIN
__pycache__/webcam.launch.cpython-310.pyc
Normal file
29
cert.pem
@ -1,29 +0,0 @@
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIFCTCCAvGgAwIBAgIUSToN1sKvyyEHUX43N0x2pJ2tozYwDQYJKoZIhvcNAQEL
|
||||
BQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIzMDgyMzE0NDgwMFoXDTI0MDgy
|
||||
MjE0NDgwMFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF
|
||||
AAOCAg8AMIICCgKCAgEAuz16ToP/oe0GlHELnOxXVMbQ4ygDhAoJRDW+h3AN01QP
|
||||
GD8hKByM5QKUd1bnUa40jKeENerJLVpwvYW+wksIw8OEoU+XKLQav59LkumMx94Y
|
||||
92vhfYPEdjJGfBSemf4GALw0GmeizeglGKQAomBN2fV0Wege77T6aE3GSafzmgWk
|
||||
WKIXLzYd0C+fzMUnf7TtbpacG71D1VAryedq2/srR6ZnrP92SyWB6vJt9kdFxhie
|
||||
V0zdrmiLhKbj4QBHn2ZfBzBe33eLHEJc7DlQ7fkQr58PVnF35h0lIYC2YdZjGSIe
|
||||
1r12HGCvjDlDX3ygznsnMIIOGPd78vzpiVUlIk1MLqS4FeAMqyTFuljZ7UjG2+Yf
|
||||
p+9gJ/3vfbCiWmtwJOuZvCeXvCwUGlvJH7aFan9UKG0OCuIOBY+8ZqkbgKQ8lCNv
|
||||
hk5HD8z49pa2u9Tzau68KMLOIhJ000sPW17RrWTrQK0izLeNmxlUvNFtg65pCpE7
|
||||
yUinlKVfBjPraK1htuZL/E0MZ1sq9YV/VbjFQnrhad1bZ+DvLRuX2Ehd8gsUt6UL
|
||||
hQW3vq7GmXo0u+xT1XIkCEYdNUGo4xXKr925MmcRVa6gR5dsAuAoQ5cN/5z4wnJt
|
||||
eNonakERtPomAC/ACTsbr3RjpG6h0jPHXta5XC+PKydV9riuk/LAIRIF0dKGfHUC
|
||||
AwEAAaNTMFEwHQYDVR0OBBYEFKL/qoyl0fc1f6VBhW5GJDpae5a7MB8GA1UdIwQY
|
||||
MBaAFKL/qoyl0fc1f6VBhW5GJDpae5a7MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
|
||||
hvcNAQELBQADggIBADoEzbUqOiTbTOppCRP3q+l8Z3mlymtZgz/BcyGms+8B2LMC
|
||||
xSJ88+lkg23XG8KQ+oIOHDaLBsVUePeSLLt3MAtDMbBEDUsUf2nWK+l3IbNlMxTn
|
||||
1beb/FM1QRwLfbqGvVi7afpZvLH7wJc2SCv+996eW/Hau5yDxntqupjAd1G7pDrJ
|
||||
PQMJhmWg1VQHxBC1MyMVdz8r4nqBSIKN5XMxdrZitXOa6c2b2/SvolGN6UEUD1at
|
||||
LAbS1nXloBNVuOrmTCxRxCKxec8+2qs4QOc/Ux7jF9Q65TkW1IkucnDaOluDcufY
|
||||
n4GQXaRFyQJInoGpWlOM3hJ2ZlhlQj+tjuvTyu7uWCINC4r0bYqpIpY4mWzXKRFT
|
||||
e5M4nVy8YukjsM82zZRvXdD8Mlfuxb8xkpQBdqVClO24TSjZOCAw4qsizpV/N7S9
|
||||
NmQ5+2CI4l3KvhH1gAjtXvNOOicn7laXDtz5wc1fZxmUptQQp5JXFtSguLpJpGli
|
||||
r7s8wRPnVJW3HhjNIzYIzOm3J4dtl1+ZqHGfeFes+8ty2HAJK1AmnRvt8UQK3VjR
|
||||
YrlzbM6+cjzmJQ3S3LTXOi0Zssf6SQspCaAMP8hUXhZyi8y7PMNHpp/LuUEFox03
|
||||
/L8X5DB9SXofdFp+1jVh6WZCV8wt39Fxo+l+5afpeIc138XOkgvsrBFNzTi9
|
||||
-----END CERTIFICATE-----
|
27
config/box_filter.yaml
Normal file
@ -0,0 +1,27 @@
|
||||
scan_to_scan_filter_chain:
|
||||
ros__parameters:
|
||||
filter1:
|
||||
name: box_filter
|
||||
type: laser_filters/LaserScanBoxFilter
|
||||
params:
|
||||
box_frame: laser_frame
|
||||
max_x: 0.80 #was 0.16
|
||||
max_y: 0.18 #was 0.17
|
||||
max_z: 0.1
|
||||
min_x: -0.41 #was -0.41
|
||||
min_y: -0.18 # was -0.17
|
||||
min_z: -0.2
|
||||
invert: false # activate to remove all points outside of the box
|
||||
name: shadows
|
||||
type: laser_filters/ScanShadowsFilter
|
||||
params:
|
||||
min_angle: 10
|
||||
max_angle: 170
|
||||
neighbors: 20
|
||||
window: 1
|
||||
name: dark_shadows
|
||||
type: laser_filters/LaserScanIntensityFilter
|
||||
params:
|
||||
lower_threshold: 100
|
||||
upper_threshold: 10000
|
||||
disp_histogram: 0
|
34
config/caddy/Caddyfile
Normal file
@ -0,0 +1,34 @@
|
||||
# {
|
||||
# debug
|
||||
# }
|
||||
|
||||
http://cps-seggy {
|
||||
root * /usr/share/caddy
|
||||
file_server browse
|
||||
|
||||
handle_path /config* {
|
||||
reverse_proxy http://olivetin:1337
|
||||
}
|
||||
|
||||
handle_path /viz* {
|
||||
reverse_proxy http://foxglove:8080
|
||||
}
|
||||
|
||||
# this is not working right now
|
||||
handle_path /joy* {
|
||||
reverse_proxy http://host.docker.internal:8000
|
||||
}
|
||||
}
|
||||
|
||||
http://cps-seggy.local {
|
||||
root * /usr/share/caddy
|
||||
file_server browse
|
||||
|
||||
handle_path /config {
|
||||
reverse_proxy http://olivetin:1337
|
||||
}
|
||||
|
||||
handle_path /viz* {
|
||||
reverse_proxy http://foxglove:8080
|
||||
}
|
||||
}
|
69
config/caddy/content/bootstrap/index.html
Normal file
@ -0,0 +1,69 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>ROS + Bootstrap 4 demo</title>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||
|
||||
<!-- Bootstrap CSS -->
|
||||
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
|
||||
</head>
|
||||
<body>
|
||||
<body class="bg-light">
|
||||
|
||||
<!-- SPEED -->
|
||||
<div class="row">
|
||||
<div class="col-md-4"></div>
|
||||
<div class=" col-md-4">
|
||||
<label for="robot-speed">
|
||||
<strong>Robot speed</strong>
|
||||
</label>
|
||||
<input type="range" min="15" max="80" class="custom-range" id="robot-speed">
|
||||
</div>
|
||||
<div class="col-md-4"></div>
|
||||
</div>
|
||||
|
||||
<!-- VIDEO -->
|
||||
<div class="row my-4">
|
||||
<div class="col d-flex justify-content-center">
|
||||
<img src="" class="p-1 bg-dark" alt="" id="video" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- JOYSTICK -->
|
||||
<div class="row my-4">
|
||||
<div class="col">
|
||||
<div class="d-flex justify-content-center" style="width: 210px; height: 210px;">
|
||||
<div id="joystick"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO -->
|
||||
<div class="row my-4">
|
||||
<div class="col-md-2"></div>
|
||||
<div class="col-md-8">
|
||||
<div class="alert alert-success">
|
||||
<h4 class="alert-heading">ROS + Bootstrap interface demo</h4>
|
||||
<ul>
|
||||
<li>set speed using a slider</li>
|
||||
<li>use joystick or WASD keys on keyboard to move </li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2"></div>
|
||||
</div>
|
||||
|
||||
<!-- Optional JavaScript -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/roslibjs/1.1.0/roslib.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/eventemitter3/5.0.1/index.min.js"></script>
|
||||
<script src="https://github.com/GT-RAIL/keyboardteleopjs/raw/develop/build/keyboardteleop.min.js"></script>
|
||||
<script src="//yoannmoinet.github.io/nipplejs/javascripts/nipplejs.js"></script>
|
||||
<script src="webui.js"></script>
|
||||
<!-- jQuery first, then Popper.js, then Bootstrap JS -->
|
||||
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
|
||||
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
|
||||
</body>
|
||||
</html>
|
103
config/caddy/content/bootstrap/index_new.html
Normal file
@ -0,0 +1,103 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>ROS + Bootstrap 5 demo</title>
|
||||
<!-- Required meta tags -->
|
||||
<meta charset="utf-8" />
|
||||
<meta
|
||||
name="viewport"
|
||||
content="width=device-width, initial-scale=1, shrink-to-fit=no"
|
||||
/>
|
||||
|
||||
<!-- Bootstrap CSS v5.2.1 -->
|
||||
<link
|
||||
href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css"
|
||||
rel="stylesheet"
|
||||
integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN"
|
||||
crossorigin="anonymous"
|
||||
/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<body class="bg-light"></body>
|
||||
|
||||
<header>
|
||||
<!-- place navbar here -->
|
||||
</header>
|
||||
<main>
|
||||
<!-- SPEED -->
|
||||
<div class="row">
|
||||
<div class="col-md-4"></div>
|
||||
<div class="col-md-4">
|
||||
<label for="robot-speed">
|
||||
<strong>Robot speed</strong>
|
||||
</label>
|
||||
<input
|
||||
type="range"
|
||||
min="15"
|
||||
max="80"
|
||||
class="custom-range"
|
||||
id="robot-speed"
|
||||
/>
|
||||
</div>
|
||||
<div class="col-md-4"></div>
|
||||
</div>
|
||||
|
||||
<!-- VIDEO -->
|
||||
<div class="row my-4">
|
||||
<div class="col d-flex justify-content-center">
|
||||
<img src="" class="p-1 bg-dark" alt="" id="video" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- JOYSTICK -->
|
||||
<div class="row my-4">
|
||||
<div class="col">
|
||||
<div
|
||||
class="d-flex justify-content-center"
|
||||
style="width: 210px; height: 210px"
|
||||
>
|
||||
<div id="joystick"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- INFO -->
|
||||
<div class="row my-4">
|
||||
<div class="col-md-2"></div>
|
||||
<div class="col-md-8">
|
||||
<div class="alert alert-success">
|
||||
<h4 class="alert-heading">ROS + Bootstrap interface demo</h4>
|
||||
<ul>
|
||||
<li>set speed using a slider</li>
|
||||
<li>use joystick or WASD keys on keyboard to move</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-2"></div>
|
||||
</div>
|
||||
</main>
|
||||
<footer>
|
||||
<!-- place footer here -->
|
||||
</footer>
|
||||
|
||||
<!-- Optional JavaScript -->
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/roslibjs/1.1.0/roslib.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/eventemitter3/5.0.1/index.min.js"></script>
|
||||
<script src="https://github.com/GT-RAIL/keyboardteleopjs/raw/develop/build/keyboardteleop.min.js"></script>
|
||||
<script src="//yoannmoinet.github.io/nipplejs/javascripts/nipplejs.js"></script>
|
||||
<script src="webui.js"></script>
|
||||
<!-- Bootstrap JavaScript Libraries -->
|
||||
<script
|
||||
src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"
|
||||
integrity="sha384-I7E8VVD/ismYTF4hNIPjVp/Zjvgyol6VFvRkX/vR+Vc4jQkC+hVqc2pM8ODewa9r"
|
||||
crossorigin="anonymous"
|
||||
></script>
|
||||
|
||||
<script
|
||||
src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/js/bootstrap.min.js"
|
||||
integrity="sha384-BBtl+eGJRgqQAUMxJ7pMwbEyER4l1g+O15P+16Ep7Q9Q+zqX6gSbd85u4mG4QzX+"
|
||||
crossorigin="anonymous"
|
||||
></script>
|
||||
</body>
|
||||
</html>
|
139
config/caddy/content/bootstrap/webui.js
Normal file
@ -0,0 +1,139 @@
|
||||
// Begin by creating some global variables:
|
||||
|
||||
var twist;
|
||||
var cmdVel;
|
||||
var publishImmidiately = true;
|
||||
var robot_IP;
|
||||
var manager;
|
||||
var teleop;
|
||||
var ros;
|
||||
|
||||
// Write a function to send ROS messages with velocity for robot:
|
||||
|
||||
function moveAction(linear, angular) {
|
||||
if (linear !== undefined && angular !== undefined) {
|
||||
twist.linear.x = linear;
|
||||
twist.angular.z = angular;
|
||||
} else {
|
||||
twist.linear.x = 0;
|
||||
twist.angular.z = 0;
|
||||
}
|
||||
cmdVel.publish(twist);
|
||||
}
|
||||
|
||||
// Write a function to create velocity message publisher:
|
||||
|
||||
function initVelocityPublisher() {
|
||||
// Init message with zero values.
|
||||
twist = new ROSLIB.Message({
|
||||
linear: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
z: 0
|
||||
},
|
||||
angular: {
|
||||
x: 0,
|
||||
y: 0,
|
||||
z: 0
|
||||
}
|
||||
});
|
||||
// Init topic object
|
||||
cmdVel = new ROSLIB.Topic({
|
||||
ros: ros,
|
||||
name: '/cmd_vel',
|
||||
messageType: 'geometry_msgs/Twist'
|
||||
});
|
||||
// Register publisher within ROS system
|
||||
cmdVel.advertise();
|
||||
}
|
||||
|
||||
// Write a function to create keyboard controller object:
|
||||
function initTeleopKeyboard() {
|
||||
// Use w, s, a, d keys to drive your robot
|
||||
|
||||
// Check if keyboard controller was aready created
|
||||
if (teleop == null) {
|
||||
// Initialize the teleop.
|
||||
teleop = new KEYBOARDTELEOP.Teleop({
|
||||
ros: ros,
|
||||
topic: '/cmd_vel'
|
||||
});
|
||||
}
|
||||
|
||||
// Add event listener for slider moves
|
||||
robotSpeedRange = document.getElementById("robot-speed");
|
||||
robotSpeedRange.oninput = function () {
|
||||
teleop.scale = robotSpeedRange.value / 100
|
||||
}
|
||||
}
|
||||
|
||||
// Write a function to create joystick object:
|
||||
function createJoystick() {
|
||||
// Check if joystick was aready created
|
||||
if (manager == null) {
|
||||
joystickContainer = document.getElementById('joystick');
|
||||
// joystck configuration, if you want to adjust joystick, refer to:
|
||||
// https://yoannmoinet.github.io/nipplejs/
|
||||
var options = {
|
||||
zone: joystickContainer,
|
||||
position: { left: 50 + '%', top: 105 + 'px' },
|
||||
mode: 'static',
|
||||
size: 200,
|
||||
color: '#0066ff',
|
||||
restJoystick: true
|
||||
};
|
||||
manager = nipplejs.create(options);
|
||||
// event listener for joystick move
|
||||
manager.on('move', function (evt, nipple) {
|
||||
// nipplejs returns direction is screen coordiantes
|
||||
// we need to rotate it, that dragging towards screen top will move robot forward
|
||||
var direction = nipple.angle.degree - 90;
|
||||
if (direction > 180) {
|
||||
direction = -(450 - nipple.angle.degree);
|
||||
}
|
||||
// convert angles to radians and scale linear and angular speed
|
||||
// adjust if youwant robot to drvie faster or slower
|
||||
var lin = Math.cos(direction / 57.29) * nipple.distance * 0.005;
|
||||
var ang = Math.sin(direction / 57.29) * nipple.distance * 0.05;
|
||||
// nipplejs is triggering events when joystic moves each pixel
|
||||
// we need delay between consecutive messege publications to
|
||||
// prevent system from being flooded by messages
|
||||
// events triggered earlier than 50ms after last publication will be dropped
|
||||
if (publishImmidiately) {
|
||||
publishImmidiately = false;
|
||||
moveAction(lin, ang);
|
||||
setTimeout(function () {
|
||||
publishImmidiately = true;
|
||||
}, 50);
|
||||
}
|
||||
});
|
||||
// event litener for joystick release, always send stop message
|
||||
manager.on('end', function () {
|
||||
moveAction(0, 0);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// …and finally main app initialization:
|
||||
window.onload = function () {
|
||||
// determine robot address automatically
|
||||
// robot_IP = location.hostname;
|
||||
// set robot address statically
|
||||
robot_IP = "100.105.121.16";
|
||||
|
||||
// // Init handle for rosbridge_websocket
|
||||
ros = new ROSLIB.Ros({
|
||||
url: "ws://" + robot_IP + ":9090"
|
||||
});
|
||||
|
||||
initVelocityPublisher();
|
||||
// get handle for video placeholder
|
||||
video = document.getElementById('video');
|
||||
// Populate video source
|
||||
video.src = "http://" + robot_IP + ":8080/stream?topic=/camera/rgb/image_raw&type=mjpeg&quality=80";
|
||||
video.onload = function () {
|
||||
// joystick and keyboard controls will be available only when video is correctly loaded
|
||||
createJoystick();
|
||||
initTeleopKeyboard();
|
||||
};
|
||||
}
|
BIN
config/caddy/content/overview/CPS_Logo_White_square_TRANSP.png
Normal file
After Width: | Height: | Size: 14 KiB |
1
config/caddy/content/overview/blueprint.svg
Normal file
After Width: | Height: | Size: 5.8 KiB |
95
config/caddy/content/overview/index.html
Normal file
@ -0,0 +1,95 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<!-- ersetze die Links + QR Codes unter den Kommentaren -->
|
||||
|
||||
<head>
|
||||
<title>CPS Bot Overview</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
|
||||
<link rel="stylesheet" href="style.css">
|
||||
</head>
|
||||
|
||||
<header>
|
||||
<h1 id="HEADLINE">CPS Seggy Overview<img src="CPS_Logo_White_square_TRANSP.png" id="LOGO"></h1>
|
||||
</header>
|
||||
|
||||
<body>
|
||||
|
||||
<div class="box" id="RIGHT">
|
||||
<div id="BLOCK_ONE">
|
||||
<p class="mini-heads">Teleop:</p>
|
||||
<!-- again -->
|
||||
<!-- Replace link at href -->
|
||||
<!-- hier Link zu Joystick -->
|
||||
<a href="http://cps-seggy.local:8000/">
|
||||
<img src="joystick.png" class="qr qr_2"></a>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<div id="BLOCK_ONE">
|
||||
<p class="mini-heads">Robot Configuration:</p>
|
||||
<!-- again -->
|
||||
<!-- Replace link at href -->
|
||||
<!-- hier Link zu WebGui -->
|
||||
<a href="/config/">
|
||||
<img src="wrench.svg" class="qr qr_2"></a>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<p id="SPACE"> </p>
|
||||
|
||||
<div id="BLOCK_TWO">
|
||||
<p class="mini-heads">Data View:</p>
|
||||
<!-- again -->
|
||||
<!-- hier Link zu Manual -->
|
||||
<a href="/viz/">
|
||||
<img src="safety-glasses.svg" class="qr qr_2">
|
||||
</a>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<p id="SPACE"> </p>
|
||||
|
||||
<div id="BLOCK_THREE">
|
||||
<p class="mini-heads">Manual:</p>
|
||||
<!-- again -->
|
||||
<!-- hier Link zu Manual -->
|
||||
<a href="https://cps.unileoben.ac.at">
|
||||
<img src="blueprint.svg" class="qr qr_2">
|
||||
</a>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="box" id="LEFT">
|
||||
<p class="mini-heads">Connect to Wi-Fi:</p>
|
||||
<!-- replace mit relativen Link!!!, bei mir spinnts und es wird das gebrochene Bild symbol angezeigt. Anders geht
|
||||
es allerdings, falls nicht bei dir sags mir -->
|
||||
<img src="qr-loki.wifi.svg" class="qr">
|
||||
<div id="NORM_SET">
|
||||
<table>
|
||||
<tr>
|
||||
<td>SSID:</td>
|
||||
<td>cps-loki</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Password: </td>
|
||||
<td>cps-loki</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="info">
|
||||
<!-- Link zum Lehrstuhl, einfach den ganzen Div Block rausnehmen falls du das nicht willst -->
|
||||
<a href="https://cps.unileoben.ac.at/">Check us out!</a>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
|
||||
</html>
|
BIN
config/caddy/content/overview/joystick.png
Normal file
After Width: | Height: | Size: 21 KiB |
508
config/caddy/content/overview/qr-loki-config.svg
Normal file
@ -0,0 +1,508 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="1160px" height="1160px" viewBox="0 0 1160 1160" enable-background="new 0 0 1160 1160" xml:space="preserve">
|
||||
<rect x="0" y="0" width="1160" height="1160" fill="rgb(255,255,255)" /><g transform="translate(80,80)"><g transform="translate(320,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,40) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,40) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,40) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,40) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,0) scale(2.8, 2.8)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(720,0) scale(2.8, 2.8)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(0,720) scale(2.8, 2.8)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(80,80) scale(1.2, 1.2)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g><g transform="translate(800,80) scale(1.2, 1.2)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g><g transform="translate(80,800) scale(1.2, 1.2)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g></g></svg>
|
After Width: | Height: | Size: 34 KiB |
728
config/caddy/content/overview/qr-loki-overview.svg
Normal file
@ -0,0 +1,728 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="1155px" height="1155px" viewBox="0 0 1155 1155" enable-background="new 0 0 1155 1155" xml:space="preserve">
|
||||
<rect x="0" y="0" width="1155" height="1155" fill="rgb(255,255,255)" /><g transform="translate(70,70)"><g transform="translate(280,0) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,0) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,0) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,0) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,0) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,0) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,35) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,70) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,70) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,70) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,70) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,70) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,105) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,105) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,105) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,105) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,140) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,175) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,210) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,245) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,245) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,245) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,245) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(140,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,280) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,315) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,350) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(140,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,385) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,420) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(140,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,455) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(140,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,490) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,525) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,560) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(140,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(175,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,595) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,630) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,665) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(35,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(70,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(105,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(210,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(245,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,700) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,735) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,770) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,805) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,840) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(385,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,875) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(735,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(945,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,910) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(350,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(420,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(455,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(525,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(770,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(805,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(875,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(910,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(980,945) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(315,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(490,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(595,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(630,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(665,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(700,980) scale(0.35,0.35)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,0) scale(2.45, 2.45)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(770,0) scale(2.45, 2.45)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(0,770) scale(2.45, 2.45)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(70,70) scale(1.05, 1.05)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g><g transform="translate(840,70) scale(1.05, 1.05)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g><g transform="translate(70,840) scale(1.05, 1.05)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g></g></svg>
|
After Width: | Height: | Size: 50 KiB |
552
config/caddy/content/overview/qr-loki-viz.svg
Normal file
@ -0,0 +1,552 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="1160px" height="1160px" viewBox="0 0 1160 1160" enable-background="new 0 0 1160 1160" xml:space="preserve">
|
||||
<rect x="0" y="0" width="1160" height="1160" fill="rgb(255,255,255)" /><g transform="translate(80,80)"><g transform="translate(320,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,0) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,40) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,40) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,80) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,120) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,160) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,200) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,240) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,280) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,320) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,360) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,400) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(120,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,440) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,480) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,520) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(40,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,560) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(200,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,600) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(80,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(160,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(240,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(280,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,640) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,680) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,720) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,760) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(600,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,800) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(560,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(720,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,840) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,880) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(760,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(800,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(880,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(920,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,920) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(320,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(360,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(400,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(440,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(480,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(520,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(640,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(680,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(840,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(960,960) scale(0.4,0.4)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<rect width="100" height="100"/>
|
||||
</g></g><g transform="translate(0,0) scale(2.8, 2.8)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(720,0) scale(2.8, 2.8)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(0,720) scale(2.8, 2.8)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<path style="fill:none;" d="M65.859,15.008H34.141c-4.082,0-7.869,1.258-10.979,3.398c-2.419,1.665-4.428,3.864-5.848,6.421
|
||||
C15.838,27.484,15,30.526,15,33.758v32.471c0,10.344,8.586,18.76,19.145,18.76L50,84.992l15.855-0.004
|
||||
C76.414,84.988,85,76.572,85,66.229V33.758C85,23.419,76.414,15.008,65.859,15.008z"/>
|
||||
<path d="M65.859,0.008H34.141h0C18.683,0.008,5.587,10.221,1.4,24.18c-0.433,1.444-0.771,2.928-1.006,4.445
|
||||
C0.135,30.299,0,32.013,0,33.758v32.471c0,18.619,15.32,33.76,34.141,33.76L50,99.992l15.859-0.004
|
||||
c18.82,0,34.141-15.141,34.141-33.76V33.758C100,15.148,84.68,0.008,65.859,0.008z M85,66.229c0,10.344-8.586,18.76-19.145,18.76
|
||||
L50,84.992l-15.855-0.004C23.586,84.988,15,76.572,15,66.229V33.758c0-3.231,0.838-6.273,2.313-8.931
|
||||
c1.42-2.557,3.429-4.756,5.848-6.421c3.11-2.141,6.897-3.398,10.979-3.398h31.719C76.414,15.008,85,23.419,85,33.758V66.229z"/>
|
||||
</g>
|
||||
</g></g><g transform="translate(80,80) scale(1.2, 1.2)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g><g transform="translate(800,80) scale(1.2, 1.2)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g><g transform="translate(80,800) scale(1.2, 1.2)"><g transform="" style="fill: rgb(16, 64, 102);">
|
||||
<g>
|
||||
<g id="XMLID_1_">
|
||||
<g>
|
||||
<path d="M27.351,100c-15.09,0-27.365-12.032-27.365-26.808V26.794c0-4.616,1.2-8.96,3.301-12.761
|
||||
c2.029-3.658,4.901-6.802,8.36-9.174C16.09,1.801,21.506,0,27.336,0h45.327c15.076,0,27.351,12.018,27.351,26.793v46.398
|
||||
c0,14.775-12.274,26.808-27.351,26.808H50H27.351z"/>
|
||||
</g>
|
||||
<g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g></g></g></svg>
|
After Width: | Height: | Size: 37 KiB |
1043
config/caddy/content/overview/qr-loki.wifi.svg
Normal file
After Width: | Height: | Size: 80 KiB |
1
config/caddy/content/overview/safety-glasses.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><style>.cls-1{fill:#b7e29c;}.cls-2{fill:#97cc83;}.cls-3{fill:#f4d647;}.cls-4{fill:#f4a742;}.cls-5{fill:#5282ef;}.cls-6{fill:#a2bdf4;}.cls-7{fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}</style></defs><title>safety-glasses</title><path class="cls-1" d="M48,37a33.319,33.319,0,0,1,8.56,1.083A27.63,27.63,0,0,0,64,39a27.643,27.643,0,0,0,7.44-.917A33.308,33.308,0,0,1,80,37h22.474a1,1,0,0,0,.85-1.536C96.759,24.828,84.651,18,64,18S31.241,24.828,24.675,35.464A1,1,0,0,0,25.526,37Z"/><path class="cls-1" d="M90,91c-15.884,0-19.965-7.631-22.665-12.681C65.561,75,64.656,75,64,75s-1.56,0-3.335,3.319C57.964,83.369,53.883,91,38,91c-5.978,0-10.526-1.4-13.985-3.723a1,1,0,0,0-1.487,1.229C28.428,101.418,40.846,110,64,110s35.572-8.582,41.473-21.495a1,1,0,0,0-1.487-1.229C100.526,89.6,95.978,91,90,91Z"/><path class="cls-2" d="M67.33,78.32a26.676,26.676,0,0,0,4.57,6.64,282.35,282.35,0,0,0-15.14,24.73C38.2,108.07,27.78,100,22.53,88.51a1,1,0,0,1,1.48-1.23C27.47,89.6,32.02,91,38,91c15.88,0,19.96-7.63,22.67-12.68C62.44,75,63.34,75,64,75S65.56,75,67.33,78.32Z"/><path class="cls-2" d="M102.47,37H80a33.7,33.7,0,0,0-8.56,1.08c-.89.21-1.73.41-2.67.57A170.727,170.727,0,0,1,91.95,24.34a32.506,32.506,0,0,1,11.37,11.12A1,1,0,0,1,102.47,37Z"/><g id="_Group_" data-name="<Group>"><path class="cls-3" d="M113,46v4a2.006,2.006,0,0,1-2,2h-4.33c-.23,0-.45-.01-.68-.02a11.881,11.881,0,0,1-2.59-.43l-7.39-2.1A12,12,0,0,0,92.74,49s-10.25,2.86-27.5,2.99h-.01c-.41.01-.82.01-1.23.01-5.4,0-10.14-.27-14.14-.65h-.01A91.913,91.913,0,0,1,35.26,49a12,12,0,0,0-3.27.45l-7.39,2.1a11.881,11.881,0,0,1-2.59.43c-.23.01-.45.02-.68.02H17a2.006,2.006,0,0,1-2-2V46a4,4,0,0,1,4-4H48c7,0,8,2,16,2s9-2,16-2h29A4,4,0,0,1,113,46Z"/><path class="cls-4" d="M106.67,52h3.32c0,17-1.04,34-19.99,34C68,86,75,70,64,70S60,86,38,86C19.05,86,18.01,69,18.01,52h3.32c.23,0,.45-.01.68-.02V52c0,7.02.29,12.77,1.22,17.29a21.68,21.68,0,0,0,2.42,6.75C28.03,80.04,31.88,82,38,82c10.49,0,12.45-3.67,14.73-7.92C54.55,70.67,57.05,66,64,66s9.45,4.67,11.27,8.08C77.55,78.33,79.51,82,90,82c13.6,0,15.99-9.67,15.99-30v-.02C106.22,51.99,106.44,52,106.67,52Z"/><path class="cls-5" d="M105.99,51.98V52c0,20.33-2.39,30-15.99,30-10.49,0-12.45-3.67-14.73-7.92C73.45,70.67,70.95,66,64,66s-9.45,4.67-11.27,8.08C50.45,78.33,48.49,82,38,82c-6.12,0-9.97-1.96-12.35-5.96,6.37-7.39,18.66-18.12,39.58-24.05h.01C82.49,51.86,92.74,49,92.74,49a12,12,0,0,1,3.27.45l7.39,2.1A11.881,11.881,0,0,0,105.99,51.98Z"/><path class="cls-6" d="M64,52c.41,0,.82,0,1.23-.01C44.31,57.92,32.02,68.65,25.65,76.04a21.68,21.68,0,0,1-2.42-6.75A60.754,60.754,0,0,1,49.85,51.35h.01C53.86,51.73,58.6,52,64,52Z"/><path class="cls-5" d="M35.26,49a91.913,91.913,0,0,0,14.59,2.35A60.754,60.754,0,0,0,23.23,69.29C22.3,64.77,22.01,59.02,22.01,52v-.02a11.881,11.881,0,0,0,2.59-.43l7.39-2.1A12,12,0,0,1,35.26,49Z"/><path class="cls-7" d="M18.01,52c0,17,1.04,34,19.99,34,22,0,15-16,26-16s4,16,26,16c18.95,0,19.99-17,19.99-34"/><path class="cls-7" d="M65.24,51.99C82.49,51.86,92.74,49,92.74,49a12,12,0,0,1,3.27.45l7.39,2.1a11.881,11.881,0,0,0,2.59.43c.23.01.45.02.68.02H111a2.006,2.006,0,0,0,2-2V46a4,4,0,0,0-4-4H80c-7,0-8,2-16,2s-9-2-16-2H19a4,4,0,0,0-4,4v4a2.006,2.006,0,0,0,2,2h4.33c.23,0,.45-.01.68-.02a11.881,11.881,0,0,0,2.59-.43l7.39-2.1A12,12,0,0,1,35.26,49a91.913,91.913,0,0,0,14.59,2.35"/><path class="cls-7" d="M49.86,51.35c4,.38,8.74.65,14.14.65.41,0,.82,0,1.23-.01"/><path class="cls-7" d="M105.99,51.98V52c0,20.33-2.39,30-15.99,30-10.49,0-12.45-3.67-14.73-7.92C73.45,70.67,70.95,66,64,66s-9.45,4.67-11.27,8.08C50.45,78.33,48.49,82,38,82c-6.12,0-9.97-1.96-12.35-5.96a21.68,21.68,0,0,1-2.42-6.75C22.3,64.77,22.01,59.02,22.01,52v-.02"/><path class="cls-7" d="M23.23,69.29A60.754,60.754,0,0,1,49.85,51.35h.01"/><path class="cls-7" d="M25.65,76.04c6.37-7.39,18.66-18.12,39.58-24.05h.01"/></g></svg>
|
After Width: | Height: | Size: 3.8 KiB |
247
config/caddy/content/overview/style.css
Normal file
@ -0,0 +1,247 @@
|
||||
html
|
||||
{
|
||||
background-color: rgb(51, 51, 51);
|
||||
font-family: sans-serif;
|
||||
padding-bottom: 50px;
|
||||
}
|
||||
|
||||
#HEADLINE
|
||||
{
|
||||
font-family:'Gill Sans', 'Gill Sans MT', Calibri, 'Trebuchet MS', sans-serif;
|
||||
text-align: center;
|
||||
color: white;
|
||||
background-color: rgb(1, 115, 126);
|
||||
box-shadow: 0px 15px 0px -5px rgb(1, 89, 97);
|
||||
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
#LOGO
|
||||
{
|
||||
height: 1em;
|
||||
width: auto;
|
||||
|
||||
float: right;
|
||||
margin-top: 2px;
|
||||
padding-left: 12px;
|
||||
padding-right: 12px;
|
||||
background-color: inherit;
|
||||
}
|
||||
|
||||
.mini-heads
|
||||
{
|
||||
color: white;
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
#LEFT
|
||||
{
|
||||
float: left;
|
||||
max-width: 49.5%;
|
||||
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#RIGHT
|
||||
{
|
||||
float: right;
|
||||
max-width: 49.5%;
|
||||
flex-direction: row;
|
||||
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.qr
|
||||
{
|
||||
max-width: 59.5%;
|
||||
height: auto;
|
||||
|
||||
object-fit: cover;
|
||||
|
||||
border-color: black;
|
||||
border: 3px solid;
|
||||
border-radius: 10%;
|
||||
|
||||
}
|
||||
|
||||
.qr_2
|
||||
{
|
||||
width: 35%;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
table, td
|
||||
{
|
||||
color: white;
|
||||
|
||||
width: 70%;
|
||||
line-height: 190%;
|
||||
border: 1px solid rgb(76, 76, 76);
|
||||
background-color: rgb(34, 34, 34);
|
||||
border-collapse: collapse;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
#SPACE
|
||||
{
|
||||
padding: 3px;
|
||||
}
|
||||
|
||||
#NORM_SET
|
||||
{
|
||||
padding-top: 6px;
|
||||
}
|
||||
|
||||
.link
|
||||
{
|
||||
color: white;
|
||||
background-color: rgb(1, 115, 126);
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
border-radius: 3px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.link:hover
|
||||
{
|
||||
color: rgb(206, 206, 206);
|
||||
}
|
||||
|
||||
.link:visited
|
||||
{
|
||||
color: rgb(75, 75, 75);
|
||||
background-color: rgb(1, 89, 97);
|
||||
}
|
||||
|
||||
.info
|
||||
{
|
||||
color: white;
|
||||
|
||||
background-color: rgb(34, 34, 34);
|
||||
|
||||
padding-top: 3px;
|
||||
padding-right: 6px;
|
||||
text-indent: 6px;
|
||||
|
||||
position: fixed;
|
||||
bottom: 0px;
|
||||
right: 6px;
|
||||
|
||||
border: 1px solid rgb(76, 76, 76);
|
||||
}
|
||||
|
||||
.info:hover
|
||||
{
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.info:visited
|
||||
{
|
||||
color: rgb(206, 206, 206);
|
||||
}
|
||||
|
||||
a, a:visited, a:hover, a:active {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Phone */ /* pract. ab 400% zoom (inludkiert) am pc */
|
||||
@media only screen and (max-width : 480px)
|
||||
{
|
||||
#LEFT
|
||||
{
|
||||
width: 100%;
|
||||
max-width: none;
|
||||
clear: both;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#RIGHT
|
||||
{
|
||||
max-width: none;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.qr
|
||||
{
|
||||
max-width: 43.9%;
|
||||
}
|
||||
|
||||
.qr_2
|
||||
{
|
||||
width: 29%;
|
||||
}
|
||||
}
|
||||
|
||||
/* Tablet / Ipad */ /* pract. ab 200% Zoom (nicht inkludiert) am pc */
|
||||
@media only screen and (max-width : 767px) and (min-width: 481px)
|
||||
{
|
||||
#LEFT
|
||||
{
|
||||
max-width: none;
|
||||
width: 100%;
|
||||
clear: both;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.qr
|
||||
{
|
||||
max-width: 35%;
|
||||
}
|
||||
|
||||
table td
|
||||
{
|
||||
font-size: large;
|
||||
}
|
||||
|
||||
.mini-heads
|
||||
{
|
||||
font-size: x-large;
|
||||
}
|
||||
|
||||
#RIGHT
|
||||
{
|
||||
max-width: none;
|
||||
}
|
||||
|
||||
#SPACE
|
||||
{
|
||||
padding: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#BLOCK_ONE
|
||||
{
|
||||
max-width: 49.5%;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#BLOCK_TWO
|
||||
{
|
||||
max-width: 49.5%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#BLOCK_THREE
|
||||
{
|
||||
max-width: 49.5%;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.qr_2
|
||||
{
|
||||
max-width: 80%;
|
||||
width: 50%;
|
||||
}
|
||||
|
||||
.link
|
||||
{
|
||||
font-size: larger;
|
||||
}
|
||||
|
||||
.info
|
||||
{
|
||||
font-size: larger;
|
||||
}
|
||||
}
|
1
config/caddy/content/overview/wrench.svg
Normal file
@ -0,0 +1 @@
|
||||
<svg id="icons" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128"><defs><style>.cls-1{fill:#9addf7;}.cls-2{fill:#65c7e5;}.cls-3{fill:#cbccd3;}.cls-4{fill:#a5a7ad;}.cls-5{fill:none;stroke:#000;stroke-linecap:round;stroke-linejoin:round;stroke-width:2px;}.cls-6{opacity:0.16;}</style></defs><title>wrench</title><path class="cls-1" d="M108.91,50.84a1,1,0,0,0-1.57-.62c-5.62,4.09-10.88,5.38-15.64,6.53-3.79.92-7.06,1.71-10.22,3.9a19.456,19.456,0,0,0-3.84,3.7C66.47,78.2,51.65,95.15,42.5,105.22a1,1,0,0,0,.42,1.62A63.082,63.082,0,0,0,64,110a78.244,78.244,0,0,0,8.64-.45,49.668,49.668,0,0,0,17.25-4.75C105.07,97.12,110,81.74,110,64A74.515,74.515,0,0,0,108.91,50.84ZM73.98,18.61A77.519,77.519,0,0,0,64,18c-9.06,0-16.47,1.31-22.5,3.69A33.934,33.934,0,0,0,26.95,32.2C20.39,40.47,18,51.67,18,64a65.914,65.914,0,0,0,2.58,19.37.993.993,0,0,0,1.63.42c4.55-4.21,10.43-9.52,16.74-15.09,2.68-2.37,5.44-4.78,8.21-7.18,5.14-4.45,10.32-8.84,15.12-12.78a19.294,19.294,0,0,0,3.03-3.05c3.47-4.53,3.86-8.9,4.24-13.12.34-3.79.68-7.71,3.6-10.65l1.46-1.66A1,1,0,0,0,73.98,18.61Z"/><path class="cls-2" d="M45.74,30.99l-4.01,7A2,2,0,0,1,39.99,39H32.01a2,2,0,0,1-1.74-1.01L26.95,32.2A33.934,33.934,0,0,1,41.5,21.69a1.858,1.858,0,0,1,.23.32l4.01,7A2,2,0,0,1,45.74,30.99Z"/><path class="cls-2" d="M94.993,70.5H91.007a2,2,0,0,0-1.735,1.006l-2.006,3.5a2,2,0,0,0,0,1.989l2.006,3.5A2,2,0,0,0,91.007,81.5h3.985a2,2,0,0,0,1.735-1.006l2.006-3.5a2,2,0,0,0,0-1.989l-2.006-3.5A2,2,0,0,0,94.993,70.5Z"/><path class="cls-2" d="M47.16,61.52c-2.77,2.4-5.53,4.81-8.21,7.18a1.934,1.934,0,0,1-.68-.71l-2.01-3.5a2,2,0,0,1,0-1.98l2.01-3.5A2,2,0,0,1,40.01,58h3.98a2,2,0,0,1,1.74,1.01Z"/><path class="cls-2" d="M89.89,104.8a49.668,49.668,0,0,1-17.25,4.75l-1.53-5.65a1.991,1.991,0,0,1,.51-1.94l5.65-5.65a2,2,0,0,1,1.94-.52L87,97.9a2.011,2.011,0,0,1,1.4,1.41Z"/><g id="_Group_" data-name="<Group>"><path class="cls-3" d="M92.89,42l-1.76,3.63c-.04.08-.08.16-.13.24a1.986,1.986,0,0,1-1.47.88,1.574,1.574,0,0,1-.53-.01,1.721,1.721,0,0,1-.54-.18l-.85-.42-.61-.3-1.18-.58-1.8-.88L83,43.88l-.78-.38-.97-.48a1.274,1.274,0,0,1-.25-.15,1.869,1.869,0,0,1-.47-.46,2.012,2.012,0,0,1-.2-2.09L81,38.93l1.09-2.25a1.98,1.98,0,0,1,.91-.92,2.107,2.107,0,0,1,.73-.21,1.9,1.9,0,0,1,1.03.2l.24.12.63.31,1.37.67.43.21,1.57.78.23.11,1.77.87.02.01.95.47a2.03,2.03,0,0,1,.92,2.7Z"/><path class="cls-3" d="M94.4,16.02a2,2,0,0,1,1.66,2.86L90.14,31.7,79.35,26.67a15.038,15.038,0,0,1,3.72-6.24A14.881,14.881,0,0,1,94.4,16.02Z"/><path class="cls-4" d="M111.47,22.16c1.8,5.55,3.17,14.29-2.91,20.43-11.01,11.11-20.5,7.4-29.93,13.96a23.949,23.949,0,0,0-4.88,4.66C58.54,80.07,37.58,103.5,32.09,109.04a9.941,9.941,0,0,1-14.16,0,10.171,10.171,0,0,1,0-14.29c5.5-5.55,28.81-26.79,47.52-42.15a24.047,24.047,0,0,0,3.82-3.86c7.55-9.83,3.53-19.36,7.43-23.3l2.65,1.23L90.14,31.7l4.02,1.87a4.013,4.013,0,0,0,1.99.36l5.43-.42a4.014,4.014,0,0,0,3.53-2.86l2.54-8.43A2,2,0,0,1,111.47,22.16ZM92.89,42a2.032,2.032,0,0,0-.92-2.7l-7.21-3.55a1.987,1.987,0,0,0-2.67.93l-1.76,3.64a2.035,2.035,0,0,0,.92,2.7l7.21,3.54a1.979,1.979,0,0,0,2.67-.93ZM25.02,106A3.952,3.952,0,0,0,29,102.02,4.046,4.046,0,0,0,24.98,98,3.952,3.952,0,0,0,21,101.98,4.046,4.046,0,0,0,25.02,106Z"/><path class="cls-5" d="M79.35,26.67,76.7,25.44c-3.9,3.94.12,13.47-7.43,23.3a24.047,24.047,0,0,1-3.82,3.86C46.74,67.96,23.43,89.2,17.93,94.75a10.171,10.171,0,0,0,0,14.29,9.941,9.941,0,0,0,14.16,0c5.49-5.54,26.45-28.97,41.66-47.83a23.949,23.949,0,0,1,4.88-4.66c9.43-6.56,18.92-2.85,29.93-13.96,6.08-6.14,4.71-14.88,2.91-20.43a2,2,0,0,0-3.82.06l-2.54,8.43a4.014,4.014,0,0,1-3.53,2.86l-5.43.42a4.013,4.013,0,0,1-1.99-.36L90.14,31.7Z"/><path class="cls-5" d="M21,101.98A3.952,3.952,0,0,1,24.98,98,4.046,4.046,0,0,1,29,102.02,3.952,3.952,0,0,1,25.02,106,4.046,4.046,0,0,1,21,101.98Z"/><path class="cls-5" d="M79.35,26.67a15.038,15.038,0,0,1,3.72-6.24A14.881,14.881,0,0,1,94.4,16.02a2,2,0,0,1,1.66,2.86L90.14,31.7"/><path class="cls-5" d="M80.33,40.32l1.76-3.64a1.987,1.987,0,0,1,2.67-.93l7.21,3.55a2.032,2.032,0,0,1,.92,2.7l-1.76,3.63a1.979,1.979,0,0,1-2.67.93l-7.21-3.54A2.035,2.035,0,0,1,80.33,40.32Z"/><line class="cls-5" x1="86.72" y1="36.71" x2="83.3" y2="44.03"/><line class="cls-5" x1="90.31" y1="38.48" x2="86.9" y2="45.79"/></g><g class="cls-6"><path d="M30.172,91.172,58.879,63.879a3,3,0,0,1,4.243,4.243L35.828,96.828a4,4,0,0,1-5.8-5.514C30.072,91.269,30.127,91.215,30.172,91.172Z"/></g></svg>
|
After Width: | Height: | Size: 4.3 KiB |
@ -11,7 +11,7 @@ echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
if [ -f ${UNDERLAY_WS}/install/setup.bash ]
|
||||
then
|
||||
source ${UNDERLAY_WS}/install/setup.bash
|
||||
# vcs pull ${UNDERLAY_WS}/src
|
||||
vcs pull ${UNDERLAY_WS}/src
|
||||
echo "Sourced CPS RMP 220 base workspace"
|
||||
fi
|
||||
|
||||
@ -19,7 +19,7 @@ fi
|
||||
if [ -f /overlay_ws/install/setup.bash ]
|
||||
then
|
||||
source /overlay_ws/install/setup.bash
|
||||
# vcs pull /overlay_ws/src
|
||||
vcs pull /overlay_ws/src
|
||||
echo "Sourced CPS RMP 220 Overlay workspace"
|
||||
fi
|
||||
|
||||
@ -32,19 +32,67 @@ then
|
||||
fi
|
||||
|
||||
# Implement updating all repositories at launch
|
||||
# if [ -f ${UNDERLAY_WS}/]
|
||||
if [ -f ${UNDERLAY_WS}/]
|
||||
then
|
||||
cd ${UNDERLAY_WS}
|
||||
vcs pull src
|
||||
echo "Updated base workspace"
|
||||
fi
|
||||
|
||||
if [ -f /overlay_ws/]
|
||||
then
|
||||
cd /overlay_ws
|
||||
vcs pull src
|
||||
echo "Updated overlay workspace"
|
||||
fi
|
||||
|
||||
# configure container networking to use zerotier interface as standard gateway
|
||||
# this might be for later
|
||||
# if [ -f /zerotier-one/zerotier-cli ]
|
||||
# then
|
||||
# cd ${UNDERLAY_WS}
|
||||
# vcs pull src
|
||||
# echo "Updated base workspace"
|
||||
# /zerotier-one/zerotier-cli join 8056c2e21c000001
|
||||
# echo "Joined zerotier network"
|
||||
# fi
|
||||
# # set standard gateway to zerotier interface
|
||||
# ip route del default
|
||||
# ip route add default via $(ip addr show zt* | grep -Po 'inet \K[\d.]+')
|
||||
# echo "Set zerotier interface as standard gateway"
|
||||
# this should now route the ros2 traffic through zerotier?
|
||||
|
||||
# # Find the ZeroTier interface name dynamically
|
||||
# zerotier_interface=$(ip addr show | awk '/^.*: zt/{print $2}' | cut -d ':' -f 1)
|
||||
|
||||
# if [ -z "$zerotier_interface" ]; then
|
||||
# echo "ZeroTier interface not found."
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
# if [ -f /overlay_ws/]
|
||||
# then
|
||||
# cd /overlay_ws
|
||||
# vcs pull src
|
||||
# echo "Updated overlay workspace"
|
||||
# # Set the standard gateway to the ZeroTier interface
|
||||
# ip route del default
|
||||
# ip route add default via $(ip addr show "$zerotier_interface" | grep -Po 'inet \K[\d.]+')
|
||||
|
||||
# echo "Set ZeroTier interface '$zerotier_interface' as the standard gateway."
|
||||
|
||||
# Changing apporach to just configure the cyconedds to use the zerotier interface
|
||||
|
||||
# For now add respective ip apps to do the stuff below:
|
||||
apt update && apt install -y iproute2
|
||||
|
||||
# Find the ZeroTier interface name dynamically
|
||||
# zerotier_interface=$(ip addr show | awk '/^.*: zt/{print $2}' | cut -d ':' -f 1)
|
||||
|
||||
# if [ -z "$zerotier_interface" ]; then
|
||||
# echo "ZeroTier interface not found."
|
||||
# exit 1
|
||||
# fi
|
||||
|
||||
# echo "Using ZeroTier interface: $zerotier_interface"
|
||||
|
||||
# # Set the path to your CycloneDDS configuration file
|
||||
# config_file="/cyclonedds.xml"
|
||||
|
||||
# # Replace the content between <NetworkInterfaceAddress> tags
|
||||
# sed -i "s|<NetworkInterfaceAddress>.*</NetworkInterfaceAddress>|<NetworkInterfaceAddress>$zerotier_interface</NetworkInterfaceAddress>|g" "$config_file"
|
||||
|
||||
# Execute the command passed into this entrypoint
|
||||
exec "$@"
|
@ -254,139 +254,52 @@ bt_navigator_navigate_to_pose_rclcpp_node:
|
||||
# RotateToGoal.scale: 32.0
|
||||
# RotateToGoal.slowing_factor: 5.0
|
||||
# RotateToGoal.lookahead_time: -1.0
|
||||
# controller_server:
|
||||
# ros__parameters:
|
||||
# use_sim_time: True
|
||||
# controller_frequency: 100.0 # was 20.0
|
||||
# min_x_velocity_threshold: 0.001
|
||||
# min_y_velocity_threshold: 0.5
|
||||
# min_theta_velocity_threshold: 0.001
|
||||
# progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
|
||||
# goal_checker_plugins: ["goal_checker"]
|
||||
# controller_plugins: ["FollowPath"]
|
||||
|
||||
# progress_checker:
|
||||
# plugin: "nav2_controller::SimpleProgressChecker"
|
||||
# required_movement_radius: 0.5
|
||||
# movement_time_allowance: 10.0
|
||||
# goal_checker:
|
||||
# plugin: "nav2_controller::SimpleGoalChecker"
|
||||
# xy_goal_tolerance: 0.25 # was 0.25
|
||||
# yaw_goal_tolerance: 0.25 # was 0.25
|
||||
# stateful: True
|
||||
# FollowPath:
|
||||
# plugin: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController"
|
||||
# desired_linear_vel: 0.5
|
||||
# lookahead_dist: 0.6
|
||||
# min_lookahead_dist: 0.3
|
||||
# max_lookahead_dist: 0.9
|
||||
# lookahead_time: 1.5
|
||||
# rotate_to_heading_angular_vel: 1.8
|
||||
# transform_tolerance: 0.1
|
||||
# use_velocity_scaled_lookahead_dist: false
|
||||
# min_approach_linear_velocity: 0.007 # was 0.05
|
||||
# approach_velocity_scaling_dist: 0.6
|
||||
# use_collision_detection: true
|
||||
# max_allowed_time_to_collision_up_to_carrot: 1.0
|
||||
# use_regulated_linear_velocity_scaling: true
|
||||
# use_fixed_curvature_lookahead: false
|
||||
# curvature_lookahead_dist: 0.25
|
||||
# use_cost_regulated_linear_velocity_scaling: false
|
||||
# regulated_linear_scaling_min_radius: 0.9
|
||||
# regulated_linear_scaling_min_speed: 0.25
|
||||
# use_rotate_to_heading: false # was true, cannot be set together with allow_reversing
|
||||
# allow_reversing: true # was false
|
||||
# rotate_to_heading_min_angle: 0.785
|
||||
# max_angular_accel: 3.2
|
||||
# max_robot_pose_search_dist: 10.0
|
||||
# use_interpolation: true # was false
|
||||
controller_server:
|
||||
ros__parameters:
|
||||
controller_frequency: 50.0 # was 30.0 # ! must be float!
|
||||
use_sim_time: True
|
||||
controller_frequency: 100.0 # was 20.0
|
||||
min_x_velocity_threshold: 0.001
|
||||
min_y_velocity_threshold: 0.5
|
||||
min_theta_velocity_threshold: 0.001
|
||||
progress_checker_plugins: ["progress_checker"] # progress_checker_plugin: "progress_checker" For Humble and older
|
||||
goal_checker_plugins: ["goal_checker"]
|
||||
controller_plugins: ["FollowPath"]
|
||||
|
||||
progress_checker:
|
||||
plugin: "nav2_controller::SimpleProgressChecker"
|
||||
required_movement_radius: 0.5
|
||||
movement_time_allowance: 10.0
|
||||
goal_checker:
|
||||
plugin: "nav2_controller::SimpleGoalChecker"
|
||||
xy_goal_tolerance: 0.25 # was 0.25
|
||||
yaw_goal_tolerance: 0.25 # was 0.25
|
||||
stateful: True
|
||||
FollowPath:
|
||||
plugin: "nav2_mppi_controller::MPPIController"
|
||||
time_steps: 56
|
||||
model_dt: 0.05
|
||||
batch_size: 1000 # was 2000
|
||||
vx_std: 0.2
|
||||
vy_std: 0.2
|
||||
wz_std: 0.4
|
||||
vx_max: 0.5
|
||||
vx_min: -0.35
|
||||
vy_max: 0.5
|
||||
wz_max: 1.9
|
||||
iteration_count: 1
|
||||
prune_distance: 1.7
|
||||
plugin: "nav2_regulated_pure_pursuit_controller::RegulatedPurePursuitController"
|
||||
desired_linear_vel: 0.5
|
||||
lookahead_dist: 0.6
|
||||
min_lookahead_dist: 0.3
|
||||
max_lookahead_dist: 0.9
|
||||
lookahead_time: 1.5
|
||||
rotate_to_heading_angular_vel: 1.8
|
||||
transform_tolerance: 0.1
|
||||
temperature: 0.3
|
||||
gamma: 0.015
|
||||
motion_model: "DiffDrive"
|
||||
visualize: false
|
||||
reset_period: 1.0 # (only in Humble)
|
||||
regenerate_noises: false
|
||||
TrajectoryVisualizer:
|
||||
trajectory_step: 5
|
||||
time_step: 3
|
||||
AckermannConstraints:
|
||||
min_turning_r: 0.1 # was0.2 # only active for ackermann
|
||||
critics: ["ConstraintCritic", "ObstaclesCritic", "GoalCritic", "GoalAngleCritic", "PathAlignCritic", "PathFollowCritic", "PathAngleCritic", "PreferForwardCritic"]
|
||||
ConstraintCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 4.0
|
||||
GoalCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 5.0
|
||||
threshold_to_consider: 1.4
|
||||
GoalAngleCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 3.0
|
||||
threshold_to_consider: 0.5
|
||||
PreferForwardCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 10.0 # was 5.0
|
||||
threshold_to_consider: 0.5
|
||||
ObstaclesCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
repulsion_weight: 1.5
|
||||
critical_weight: 20.0
|
||||
consider_footprint: true # was false
|
||||
collision_cost: 10000.0
|
||||
collision_margin_distance: 0.1
|
||||
near_goal_distance: 0.5
|
||||
inflation_radius: 0.35 #was0.55 # (only in Humble)
|
||||
cost_scaling_factor: 10.0 # (only in Humble)
|
||||
PathAlignCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 14.0
|
||||
max_path_occupancy_ratio: 0.05
|
||||
trajectory_point_step: 3
|
||||
threshold_to_consider: 0.5
|
||||
offset_from_furthest: 20
|
||||
use_path_orientations: true # was false
|
||||
PathFollowCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 5.0
|
||||
offset_from_furthest: 5
|
||||
threshold_to_consider: 1.4
|
||||
PathAngleCritic:
|
||||
enabled: true
|
||||
cost_power: 1
|
||||
cost_weight: 2.0
|
||||
offset_from_furthest: 4
|
||||
threshold_to_consider: 0.5
|
||||
max_angle_to_furthest: 1.0
|
||||
mode: 0
|
||||
# TwirlingCritic:
|
||||
# enabled: true
|
||||
# twirling_cost_power: 1
|
||||
# twirling_cost_weight: 10.0
|
||||
use_velocity_scaled_lookahead_dist: false
|
||||
min_approach_linear_velocity: 0.007 # was 0.05
|
||||
approach_velocity_scaling_dist: 0.6
|
||||
use_collision_detection: true
|
||||
max_allowed_time_to_collision_up_to_carrot: 1.0
|
||||
use_regulated_linear_velocity_scaling: true
|
||||
use_fixed_curvature_lookahead: false
|
||||
curvature_lookahead_dist: 0.25
|
||||
use_cost_regulated_linear_velocity_scaling: false
|
||||
regulated_linear_scaling_min_radius: 0.9
|
||||
regulated_linear_scaling_min_speed: 0.25
|
||||
use_rotate_to_heading: false # was true, cannot be set together with allow_reversing
|
||||
allow_reversing: true # was false
|
||||
rotate_to_heading_min_angle: 0.785
|
||||
max_angular_accel: 3.2
|
||||
max_robot_pose_search_dist: 10.0
|
||||
use_interpolation: true # was false
|
||||
|
||||
|
||||
local_costmap:
|
||||
@ -406,8 +319,8 @@ local_costmap:
|
||||
plugins: ["voxel_layer", "inflation_layer"]
|
||||
inflation_layer:
|
||||
plugin: "nav2_costmap_2d::InflationLayer"
|
||||
cost_scaling_factor: 10.0 # was 3.0 ;exponential rate at which the obstacle cost drops off (default: 10)
|
||||
inflation_radius: 0.35 # max. distance from an obstacle at which costs are incurred for planning paths.
|
||||
cost_scaling_factor: 2.0 # was 3.0 ;exponential rate at which the obstacle cost drops off (default: 10)
|
||||
inflation_radius: 0.70 # max. distance from an obstacle at which costs are incurred for planning paths.
|
||||
voxel_layer:
|
||||
plugin: "nav2_costmap_2d::VoxelLayer"
|
||||
enabled: True
|
||||
@ -477,7 +390,7 @@ global_costmap:
|
||||
inflation_layer:
|
||||
plugin: "nav2_costmap_2d::InflationLayer"
|
||||
cost_scaling_factor: 10.0 # was 3.0
|
||||
inflation_radius: 0.35
|
||||
inflation_radius: 0.55
|
||||
always_send_full_costmap: True
|
||||
|
||||
map_server:
|
||||
@ -505,67 +418,27 @@ map_saver:
|
||||
# tolerance: 0.5
|
||||
# use_astar: false
|
||||
# allow_unknown: true
|
||||
# planner_server:
|
||||
# ros__parameters:
|
||||
# planner_plugins: ["GridBased"]
|
||||
# use_sim_time: True
|
||||
# GridBased:
|
||||
# plugin: "nav2_smac_planner/SmacPlanner2D"
|
||||
# tolerance: 0.125 # tolerance for planning if unable to reach exact pose, in meters
|
||||
# downsample_costmap: false # whether or not to downsample the map
|
||||
# downsampling_factor: 1 # multiplier for the resolution of the costmap layer (e.g. 2 on a 5cm costmap would be 10cm)
|
||||
# allow_unknown: true # allow traveling in unknown space
|
||||
# max_iterations: 1000000 # maximum total iterations to search for before failing (in case unreachable), set to -1 to disable
|
||||
# max_on_approach_iterations: 1000 # maximum number of iterations to attempt to reach goal once in tolerance
|
||||
# max_planning_time: 2.0 # max time in s for planner to plan, smooth
|
||||
# cost_travel_multiplier: 2.0 # Cost multiplier to apply to search to steer away from high cost areas. Larger values will place in the center of aisles more exactly (if non-`FREE` cost potential field exists) but take slightly longer to compute. To optimize for speed, a value of 1.0 is reasonable. A reasonable tradeoff value is 2.0. A value of 0.0 effective disables steering away from obstacles and acts like a naive binary search A*.
|
||||
# use_final_approach_orientation: true # Whether to set the final path pose at the goal's orientation to the requested orientation (false) or in line with the approach angle so the robot doesn't rotate to heading (true)
|
||||
# smoother:
|
||||
# max_iterations: 1000
|
||||
# w_smooth: 0.3
|
||||
# w_data: 0.2
|
||||
# tolerance: 0.1
|
||||
planner_server:
|
||||
ros__parameters:
|
||||
planner_plugins: ["GridBased"]
|
||||
use_sim_time: True
|
||||
|
||||
GridBased:
|
||||
plugin: "nav2_smac_planner/SmacPlannerHybrid"
|
||||
downsample_costmap: false # whether or not to downsample the map
|
||||
downsampling_factor: 1 # multiplier for the resolution of the costmap layer (e.g. 2 on a 5cm costmap would be 10cm)
|
||||
tolerance: 0.25 # dist-to-goal heuristic cost (distance) for valid tolerance endpoints if exact goal cannot be found.
|
||||
allow_unknown: true # allow traveling in unknown space
|
||||
max_iterations: 1000000 # maximum total iterations to search for before failing (in case unreachable), set to -1 to disable
|
||||
max_on_approach_iterations: 1000 # Maximum number of iterations after within tolerances to continue to try to find exact solution
|
||||
max_planning_time: 5.0 # max time in s for planner to plan, smooth
|
||||
motion_model_for_search: "DUBIN" # Hybrid-A* Dubin, Redds-Shepp
|
||||
angle_quantization_bins: 72 # Number of angle bins for search
|
||||
analytic_expansion_ratio: 3.5 # The ratio to attempt analytic expansions during search for final approach.
|
||||
analytic_expansion_max_length: 3.0 # For Hybrid/Lattice nodes: The maximum length of the analytic expansion to be considered valid to prevent unsafe shortcutting
|
||||
analytic_expansion_max_cost: true # The maximum single cost for any part of an analytic expansion to contain and be valid, except when necessary on approach to goal
|
||||
analytic_expansion_max_cost_override: false # Whether or not to override the maximum cost setting if within critical distance to goal (ie probably required)
|
||||
minimum_turning_radius: 0.20 # was 0.40 # minimum turning radius in m of path / vehicle
|
||||
reverse_penalty: 1.0 #was2.0 # Penalty to apply if motion is reversing, must be => 1
|
||||
change_penalty: 0.0 # Penalty to apply if motion is changing directions (L to R), must be >= 0
|
||||
non_straight_penalty: 2.0 #was 1.2 # Penalty to apply if motion is non-straight, must be => 1
|
||||
cost_penalty: 2.0 # Penalty to apply to higher cost areas when adding into the obstacle map dynamic programming distance expansion heuristic. This drives the robot more towards the center of passages. A value between 1.3 - 3.5 is reasonable.
|
||||
retrospective_penalty: 0.015
|
||||
lookup_table_size: 20.0 # Size of the dubin/reeds-sheep distance window to cache, in meters.
|
||||
cache_obstacle_heuristic: true #was false # Cache the obstacle map dynamic programming distance expansion heuristic between subsiquent replannings of the same goal location. Dramatically speeds up replanning performance (40x) if costmap is largely static.
|
||||
debug_visualizations: false # For Hybrid nodes: Whether to publish expansions on the /expansions topic as an array of poses (the orientation has no meaning) and the path's footprints on the /planned_footprints topic. WARNING: heavy to compute and to display, for debug only as it degrades the performance.
|
||||
use_quadratic_cost_penalty: True #was False
|
||||
downsample_obstacle_heuristic: True
|
||||
allow_primitive_interpolation: False
|
||||
smooth_path: True # If true, does a simple and quick smoothing post-processing to the path
|
||||
|
||||
plugin: "nav2_smac_planner/SmacPlanner2D"
|
||||
tolerance: 0.125 # tolerance for planning if unable to reach exact pose, in meters
|
||||
downsample_costmap: false # whether or not to downsample the map
|
||||
downsampling_factor: 1 # multiplier for the resolution of the costmap layer (e.g. 2 on a 5cm costmap would be 10cm)
|
||||
allow_unknown: true # allow traveling in unknown space
|
||||
max_iterations: 1000000 # maximum total iterations to search for before failing (in case unreachable), set to -1 to disable
|
||||
max_on_approach_iterations: 1000 # maximum number of iterations to attempt to reach goal once in tolerance
|
||||
max_planning_time: 2.0 # max time in s for planner to plan, smooth
|
||||
cost_travel_multiplier: 2.0 # Cost multiplier to apply to search to steer away from high cost areas. Larger values will place in the center of aisles more exactly (if non-`FREE` cost potential field exists) but take slightly longer to compute. To optimize for speed, a value of 1.0 is reasonable. A reasonable tradeoff value is 2.0. A value of 0.0 effective disables steering away from obstacles and acts like a naive binary search A*.
|
||||
use_final_approach_orientation: true # Whether to set the final path pose at the goal's orientation to the requested orientation (false) or in line with the approach angle so the robot doesn't rotate to heading (true)
|
||||
smoother:
|
||||
max_iterations: 1000
|
||||
w_smooth: 0.3
|
||||
w_data: 0.2
|
||||
tolerance: 1.0e-10
|
||||
do_refinement: true
|
||||
refinement_num: 2
|
||||
tolerance: 0.1
|
||||
|
||||
smoother_server:
|
||||
ros__parameters:
|
||||
|
35
config/olivetin/config.yaml
Normal file
@ -0,0 +1,35 @@
|
||||
showNavigation: false
|
||||
logLevel: "INFO"
|
||||
showNewVersions: false
|
||||
showFooter: false
|
||||
|
||||
actions:
|
||||
- title: "Start Navigation Stack"
|
||||
shell: docker start ros2_rmp-navigation-1
|
||||
icon: '<img src = "customIcons/nav2_start.png" width = "48px"/>'
|
||||
- title: "Stop Navigation Stack"
|
||||
shell: docker stop ros2_rmp-navigation-1
|
||||
icon: '<img src = "customIcons/nav2_stop.png" width = "48px"/>'
|
||||
- title: "Start Mapping"
|
||||
shell: docker start ros2_rmp-mapping-1
|
||||
icon: '<img src = "customIcons/mapping_start.gif" width = "48px"/>'
|
||||
- title: "Stop Mapping"
|
||||
shell: docker stop ros2_rmp-mapping-1
|
||||
icon: '<img src = "customIcons/mapping_stop.gif" width = "48px"/>'
|
||||
- title: "Restart Teleop"
|
||||
icon: '<img src = "customIcons/gamepad.png" width = "48px"/>'
|
||||
shell: docker restart ros2_rmp-teleop-1
|
||||
- title: Restart or Shutdown System
|
||||
icon: restart
|
||||
shell: systemctl {{ choice }}
|
||||
arguments:
|
||||
- name: choice
|
||||
title: Pick one
|
||||
choices:
|
||||
- value: reboot
|
||||
- value: shutdown
|
||||
# This will SSH into a server an run the command 'service httpd restart'
|
||||
# - title: Restart httpd on Server 1
|
||||
# shell: ssh bjorn@loki.local 'echo "it works"'
|
||||
# icon: ping
|
||||
# timeout: 5
|
BIN
config/olivetin/icons/gamepad.png
Normal file
After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 14 MiB After Width: | Height: | Size: 13 MiB |
BIN
config/olivetin/icons/mapping_stop.gif
Normal file
After Width: | Height: | Size: 137 KiB |
BIN
config/olivetin/icons/nav2_start.png
Normal file
After Width: | Height: | Size: 34 KiB |
BIN
config/olivetin/icons/nav2_stop.gif
Normal file
After Width: | Height: | Size: 10 KiB |
BIN
config/olivetin/icons/nav2_stop.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
config/olivetin/icons/qr-code.png
Normal file
After Width: | Height: | Size: 78 KiB |
1
config/olivetin/installation-id.txt
Normal file
@ -0,0 +1 @@
|
||||
ba1fa920-2863-4600-994f-23559acfcab2
|
@ -1,28 +1,5 @@
|
||||
version: "3.9"
|
||||
|
||||
# First network configuration. Change this to the network interface you want to use primarily. (Better configuration for multiple Network interfaces needed).
|
||||
networks:
|
||||
# rmp:
|
||||
# driver: macvlan
|
||||
# driver_opts:
|
||||
# parent: eno1 # robot network interface
|
||||
# ipam:
|
||||
# config:
|
||||
# - subnet: 192.168.0.0/24
|
||||
# gateway: 192.168.0.1
|
||||
# ip_range: 192.168.0.200/25
|
||||
# aux_addresses:
|
||||
# net-address: 192.168.0.100 #? what is this for --> to exclude addresses from buing used.
|
||||
# make new bridge network for ros
|
||||
rmp:
|
||||
driver: bridge
|
||||
# ipam:
|
||||
# config:
|
||||
# - subnet:
|
||||
|
||||
# add this mountpoint to all services: - ./customize/entrypoint.sh:/entrypoint.sh
|
||||
# Attention: child services will inherit settings from their parents. So if you set a network_mode: host in the base service, all child services will also use host networking. This is not always what you want. So be careful with this.
|
||||
|
||||
services:
|
||||
# Base image containing dependencies.
|
||||
base:
|
||||
@ -61,11 +38,6 @@ services:
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
- ./config/entrypoint.sh:/entrypoint.sh
|
||||
- ./config/cyclonedds.xml:/cyclonedds.xml
|
||||
restart: unless-stopped
|
||||
|
||||
# networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
# rmp:
|
||||
# #ipv4_address: 192.168.0.101 #actually don't need to set ips. they are set automatically by docker-compose. SHould be inherited by all child services.
|
||||
|
||||
# Overlay image containing the project specific source code.
|
||||
overlay:
|
||||
@ -96,10 +68,6 @@ services:
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
target: guis
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
command: >
|
||||
/bin/bash
|
||||
devices:
|
||||
@ -142,8 +110,8 @@ services:
|
||||
ros2 launch cps_rmp220_support robot_lidar.launch.py serial_port:=/dev/rplidarA1
|
||||
devices:
|
||||
- /dev/rplidarA1:/dev/rplidarA1 #udevrules needed for this to work:
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="0001", SYMLINK+="segway"
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="3453995662b3af4f81f4a69eba5f3f29", SYMLINK+="rplidarA1"
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="0001", SYMLINK+="segway"
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="3453995662b3af4f81f4a69eba5f3f29", SYMLINK+="rplidarA1"
|
||||
|
||||
# Lidar filtering node.
|
||||
lidar_filter:
|
||||
@ -151,7 +119,7 @@ services:
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_scan_filter.launch.py
|
||||
|
||||
# localization by ekf node
|
||||
# localiaztion by ekf node
|
||||
ekf:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
@ -201,7 +169,7 @@ services:
|
||||
- ekf
|
||||
- oakd
|
||||
command: >
|
||||
ros2 launch nav2_bringup bringup_launch.py slam:=False map:=/repo/maps/map_01-26-24.yaml use_sim_time:=False use_composition:=True params_file:=/repo/config/nav2_params.yaml
|
||||
ros2 launch nav2_bringup bringup_launch.py slam:=True map:=/repo/maps/map.yaml use_sim_time:=False use_composition:=True params_file:=/repo/config/nav2_params.yaml
|
||||
#maps/map_openlabday.yaml
|
||||
# bash
|
||||
bash:
|
||||
@ -215,28 +183,12 @@ services:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Needed to display graphical applications
|
||||
privileged: true # really necessary?
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
|
||||
|
||||
# Foxglove Studio Bridge
|
||||
foxglove_bridge:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765
|
||||
#tls:=true certfile:=/certs/foxgloveCert.crt keyfile:=/certs/foxgloveKey.key
|
||||
volumes:
|
||||
- /opt/cps/certs:/certs
|
||||
|
||||
# Foxglove Studio Webserver
|
||||
foxglove:
|
||||
@ -244,22 +196,14 @@ services:
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking
|
||||
network_mode: bridge
|
||||
networks:
|
||||
- caddy_network
|
||||
ports:
|
||||
- 8080:8080
|
||||
depends_on:
|
||||
- foxglove_bridge
|
||||
volumes:
|
||||
- ./foxglove/default.json:/foxglove/default-layout.json
|
||||
|
||||
# USB Camera Stream
|
||||
cam:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 run ros2_cam_openCV cam_node
|
||||
devices:
|
||||
- /dev/video0:/dev/video0
|
||||
|
||||
- ./config/foxglove/default.json:/foxglove/default-layout.json
|
||||
|
||||
# ROS2 Frontier exploration
|
||||
explorer:
|
||||
@ -276,41 +220,41 @@ services:
|
||||
|
||||
### Images for ROS1 Interactions
|
||||
#ROS1 Bridge
|
||||
ros1bridge:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
command: >
|
||||
ros2 run ros1_bridge dynamic_bridge --bridge-all-2to1-topics
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: bridge
|
||||
x-bake:
|
||||
platforms:
|
||||
#- linux/arm64
|
||||
- linux/amd64
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
# ros1bridge:
|
||||
# image: ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
# command: >
|
||||
# ros2 run ros1_bridge dynamic_bridge --bridge-all-2to1-topics
|
||||
# build:
|
||||
# context: .
|
||||
# dockerfile: docker/Dockerfile
|
||||
# tags:
|
||||
# - ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
# args:
|
||||
# ROS_DISTRO: humble
|
||||
# target: bridge
|
||||
# x-bake:
|
||||
# platforms:
|
||||
# #- linux/arm64
|
||||
# - linux/amd64
|
||||
# # Networking and IPC for ROS 2
|
||||
# network_mode: host
|
||||
# ipc: host
|
||||
# environment:
|
||||
# - ROS_DOMAIN_ID=5
|
||||
# - RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
# - ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
#ROS1 roscore
|
||||
roscore:
|
||||
command: >
|
||||
roscore
|
||||
extends: ros1bridge
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
# roscore:
|
||||
# command: >
|
||||
# roscore
|
||||
# extends: ros1bridge
|
||||
# network_mode: host
|
||||
# ipc: host
|
||||
# environment:
|
||||
# - ROS_DOMAIN_ID=5
|
||||
# - RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
# - ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
## Configure on ROS1 Hosts
|
||||
# seggy 192.168.0.100
|
||||
@ -331,9 +275,9 @@ services:
|
||||
|
||||
# In order to connect to the ROS-master, we execute locally on robot2:
|
||||
|
||||
# export ROS_MASTER_URI=http://192.168.0.100:11311
|
||||
# export ROS_IP=192.168.0.?
|
||||
# export ROS_HOSTNAME=192.168.1.?
|
||||
# export ROS_MASTER_URI=http://192.1.1.1:11311
|
||||
# export ROS_IP=192.168.1.2
|
||||
# export ROS_HOSTNAME=192.168.1.2
|
||||
|
||||
# ROS2 oak-d-lite camera
|
||||
oakd:
|
||||
@ -342,7 +286,7 @@ services:
|
||||
ros2 launch depthai_examples stereo.launch.py
|
||||
#devices:
|
||||
#- /dev/oakd-lite:/dev/oakd-lite # need corresponding udevrules for this to work:
|
||||
# SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666", SYMLINK+="oakd-lite"
|
||||
# SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666", SYMLINK+="oakd-lite"
|
||||
#- /dev/:/dev/
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
@ -364,25 +308,108 @@ services:
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
|
||||
zerotier:
|
||||
image: "zyclonite/zerotier:router"
|
||||
container_name: zerotier-one
|
||||
devices:
|
||||
- /dev/net/tun
|
||||
network_mode: host
|
||||
|
||||
################################################################################################################################
|
||||
# Core Services for Web Management #
|
||||
################################################################################################################################
|
||||
caddy:
|
||||
image: caddy:latest
|
||||
networks:
|
||||
- caddy_network
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
volumes:
|
||||
- '/var/lib/zerotier-one:/var/lib/zerotier-one'
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
- SYS_ADMIN
|
||||
- NET_RAW
|
||||
restart: unless-stopped
|
||||
- ./config/caddy/Caddyfile:/etc/caddy/Caddyfile
|
||||
- ./config/caddy/content:/usr/share/caddy/
|
||||
restart: always
|
||||
depends_on:
|
||||
- foxglove
|
||||
- olivetin
|
||||
# roscore:
|
||||
# image: husarion/ros1-bridge:foxy-0.9.6-20230327-stable
|
||||
# command: |
|
||||
# bash -c "source /opt/ros/noetic/setup.bash && roscore"
|
||||
# network_mode: host
|
||||
# environment:
|
||||
# - ROS_DOMAIN_ID=5
|
||||
# restart: always
|
||||
|
||||
# Webui Stuff
|
||||
# need to properly setup ros1bridge initialization
|
||||
ros1bridge:
|
||||
image: husarion/ros1-bridge:foxy-0.9.6-20230327-stable
|
||||
command: |
|
||||
sh /opt/ros/noetic/setup.sh && ros2 run ros1_bridge dynamic_bridge
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- TZ=Europe/Amsterdam
|
||||
- PUID=1000
|
||||
- PGID=1000
|
||||
- ZEROTIER_ONE_LOCAL_PHYS=enp5s0 wlx00e04c5513fc # change for actual interfaces
|
||||
- ZEROTIER_ONE_USE_IPTABLES_NFT=false
|
||||
- ZEROTIER_ONE_GATEWAY_MODE=inbound # might change to both ways
|
||||
#- ZEROTIER_ONE_NETWORK_IDS= # does not really do much?
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
restart: always
|
||||
webui-joystick:
|
||||
image: husarion/webui-ros-joystick:noetic-0.0.1-20230510-stable
|
||||
network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
restart: always
|
||||
depends_on:
|
||||
- ros1bridge
|
||||
command: roslaunch webui-ros-joystick webui.launch
|
||||
olivetin:
|
||||
container_name: olivetin
|
||||
image: jamesread/olivetin
|
||||
#image: ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/cps_bot_mini_ws/olivetin
|
||||
target: olivetin
|
||||
x-bake:
|
||||
platforms:
|
||||
#- linux/arm64
|
||||
- linux/amd64
|
||||
user: root
|
||||
privileged: true
|
||||
volumes:
|
||||
- ./config/olivetin/:/config/ # here is config.yaml and icons located
|
||||
- ./config/olivetin/icons:/var/www/olivetin/customIcons
|
||||
- .:/repo
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
|
||||
# - /var/lib/docker:/var/lib/docker
|
||||
- ~/.ssh/id_rsa:/root/.ssh/id_rsa
|
||||
networks:
|
||||
- caddy_network
|
||||
ports:
|
||||
- "1337:1337"
|
||||
restart: always
|
||||
|
||||
# Webcam stream with ffmpeg x264 compression
|
||||
# need to add ros-humble-v4l2-camera
|
||||
webcam:
|
||||
#extends: overlay
|
||||
build: https://github.com/bjoernellens1/image-transport-docker/raw/main/demo/webcam/Dockerfile.webcam
|
||||
image: husarion/image-transport:humble-4.2.0
|
||||
devices:
|
||||
- /dev/video1:/dev/video0
|
||||
- /dev/dri:/dev/dri
|
||||
volumes:
|
||||
- ./:/repo
|
||||
command: >
|
||||
ros2 launch /repo/webcam.launch.py
|
||||
ffmpeg_encoding:=libx264
|
||||
ffmpeg_preset:=ultrafast
|
||||
ffmpeg_tune:=zerolatency
|
||||
|
||||
|
||||
################################################################################################################################
|
||||
# Docker related extra stuff #
|
||||
################################################################################################################################
|
||||
networks:
|
||||
caddy_network:
|
||||
driver: bridge
|
@ -1,460 +0,0 @@
|
||||
version: "3.9"
|
||||
|
||||
# First network configuration. Change this to the network interface you want to use primarily. (Better configuration for multiple Network interfaces needed).
|
||||
networks:
|
||||
rmp:
|
||||
driver: macvlan
|
||||
driver_opts:
|
||||
parent: eno1 # robot network interface
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.0.0/24
|
||||
gateway: 192.168.0.1
|
||||
ip_range: 192.168.0.200/25
|
||||
aux_addresses:
|
||||
net-address: 192.168.0.100 #? what is this for --> to exclude addresses from buing used.
|
||||
|
||||
services:
|
||||
# Base image containing dependencies.
|
||||
base:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:base
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:base
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: base
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
#privileged: true
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
|
||||
networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
rmp:
|
||||
#ipv4_address: 192.168.0.101 #actually don't need to set ips. they are set automatically by docker-compose. SHould be inherited by all child services.
|
||||
|
||||
# Overlay image containing the project specific source code.
|
||||
overlay:
|
||||
extends: base
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:overlay
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:overlay
|
||||
target: overlay
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
volumes:
|
||||
- .:/repo
|
||||
command: >
|
||||
/bin/bash
|
||||
|
||||
# Additional dependencies for GUI applications
|
||||
guis:
|
||||
extends: overlay
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
target: guis
|
||||
x-bake:
|
||||
platforms:
|
||||
- linux/arm64
|
||||
- linux/amd64
|
||||
#entrypoint: /bin/bash
|
||||
command: >
|
||||
/bin/bash
|
||||
|
||||
# Robot State Publisher
|
||||
rsp:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rsp.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# Controller
|
||||
controller:
|
||||
extends: base
|
||||
command: >
|
||||
ros2 run segwayrmp SmartCar --ros-args -r cmd_vel:=cmd_vel_out -p serial_full_name:=/dev/segway
|
||||
devices:
|
||||
- /dev/segway:/dev/segway
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: false
|
||||
# depends_on:
|
||||
# - robot_state_publisher
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# teleop
|
||||
teleop:
|
||||
extends: base
|
||||
depends_on:
|
||||
- controller
|
||||
command: >
|
||||
ros2 launch rmp220_teleop robot_joystick.launch.py
|
||||
devices:
|
||||
- /dev/input/js0:/dev/input/js0
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# lidar
|
||||
lidar:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_lidar.launch.py serial_port:=/dev/rplidarA1
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
# depends_on:
|
||||
# - robot_state_publisher
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
devices:
|
||||
- /dev/rplidarA1:/dev/rplidarA1 #udevrules needed for this to work:
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="0001", SYMLINK+="segway"
|
||||
# SUBSYSTEM=="tty", ATTRS{serial}=="3453995662b3af4f81f4a69eba5f3f29", SYMLINK+="rplidarA1"
|
||||
|
||||
|
||||
# localiaztion by ekf node
|
||||
ekf:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- rsp
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_localization.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# mapping
|
||||
mapping:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_mapping.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# slam-toolbox-localization
|
||||
localization:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_mapping_localization.launch.py map_file_name:=/repo/maps/map.yaml
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# amcl_localization
|
||||
amcl:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- ekf
|
||||
- rsp
|
||||
- lidar
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_amcl.launch.py map:=/repo/maps/map.yaml
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# navigation
|
||||
navigation:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- teleop
|
||||
- rsp
|
||||
- lidar
|
||||
- ekf
|
||||
- oakd
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_navigation.launch.py
|
||||
# map_subscribe_transient_local:=true
|
||||
command: >
|
||||
ros2 launch nav2_bringup bringup_launch.py slam:=True map:=/repo/maps/map_current.sav.yaml use_sim_time:=False use_composition:=True params_file:=/overlay_ws/src/cps_rmp220_support/config/nav2_params.yaml
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# bash
|
||||
bash:
|
||||
extends: overlay
|
||||
command: >
|
||||
/bin/bash
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
# rviz2
|
||||
rviz2:
|
||||
#extends: guis
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_rviz2.launch.py
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
|
||||
# Foxglove Studio Bridge
|
||||
foxglove_bridge:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
rmp:
|
||||
ipv4_address: 192.168.0.201 #actually don't need to set ips. they are set automatically by docker-compose. SHould be inherited by all child services.
|
||||
|
||||
|
||||
# Foxglove Studio Webserver
|
||||
foxglove_webserver:
|
||||
image: ghcr.io/foxglove/studio:latest
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking
|
||||
network_mode: bridge
|
||||
ports:
|
||||
- 8080:8080
|
||||
depends_on:
|
||||
- foxglove_bridge
|
||||
volumes:
|
||||
- ./foxglove/default.json:/foxglove/default-layout.json
|
||||
|
||||
# USB Camera Stream
|
||||
cam:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 run ros2_cam_openCV cam_node
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
devices:
|
||||
- /dev/video0:/dev/video0
|
||||
|
||||
|
||||
# ROS2 Frontier exploration
|
||||
explorer:
|
||||
extends: overlay
|
||||
depends_on:
|
||||
- controller
|
||||
- teleop
|
||||
- rsp
|
||||
- lidar
|
||||
- ekf
|
||||
- navigation
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support robot_exploration.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
|
||||
### Images for ROS1 Interactions
|
||||
#ROS1 Bridge
|
||||
ros1bridge:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
command: >
|
||||
ros2 run ros1_bridge dynamic_bridge --bridge-all-2to1-topics
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile
|
||||
tags:
|
||||
- ghcr.io/bjoernellens1/ros2_rmp/ros1bridge
|
||||
args:
|
||||
ROS_DISTRO: humble
|
||||
target: bridge
|
||||
x-bake:
|
||||
platforms:
|
||||
#- linux/arm64
|
||||
- linux/amd64
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
#ROS1 roscore
|
||||
roscore:
|
||||
command: >
|
||||
roscore
|
||||
extends: ros1bridge
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
- ROS_MASTER_URI=http://localhost:11311 # is configured to run roscore on the robot but could change to local ros1 machine here
|
||||
|
||||
|
||||
# ROS2 oak-d-lite camera
|
||||
oakd:
|
||||
extends: overlay
|
||||
command: >
|
||||
ros2 launch depthai_examples stereo.launch.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
#network_mode: host
|
||||
ipc: host
|
||||
environment:
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
#privileged: true
|
||||
#devices:
|
||||
#- /dev/oakd-lite:/dev/oakd-lite # need corresponding udevrules for this to work:
|
||||
# SUBSYSTEM=="usb", ATTRS{idVendor}=="03e7", MODE="0666", SYMLINK+="oakd-lite"
|
||||
#- /dev/:/dev/
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
volumes:
|
||||
- /dev/bus/usb:/dev/bus/usb
|
||||
|
||||
|
||||
# for testing the oak-d-lite camera -> works now with cgroup rules
|
||||
depthai:
|
||||
image: luxonis/depthai:latest
|
||||
command: >
|
||||
python3 /depthai/depthai_demo.py
|
||||
stdin_open: true
|
||||
tty: true
|
||||
device_cgroup_rules:
|
||||
- 'c 189:* rmw'
|
||||
volumes:
|
||||
- /dev/bus/usb:/dev/bus/usb
|
||||
environment:
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
|
BIN
docs/loki_overview.odg
Normal file
@ -1,62 +0,0 @@
|
||||
services:
|
||||
### Husarnet VPN Container for remote access
|
||||
husarnet:
|
||||
image: husarnet/husarnet
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /var/lib/husarnet # This will persist your Husarnet Client keys, thus IP of the container will be stable/the same between (re)boots
|
||||
sysctls:
|
||||
- net.ipv6.conf.all.disable_ipv6=0 # Husarnet is using IPv6 for the internal connections
|
||||
cap_add:
|
||||
- NET_ADMIN
|
||||
devices:
|
||||
- /dev/net/tun
|
||||
env_file:
|
||||
- ./husarnet/.env # create .env file in the same folder as Dockerfile and specify HOSTNAME and JOINCODE there
|
||||
|
||||
color_controller:
|
||||
build:
|
||||
dockerfile: husarnet/Dockerfile
|
||||
volumes:
|
||||
- ./husarnet/cyclonedds.xml:/cyclonedds.xml
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
export CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
ros2 run my_demo_pkg color_controller
|
||||
network_mode: service:husarnet
|
||||
|
||||
move_controller:
|
||||
build:
|
||||
dockerfile: husarnet/Dockerfile
|
||||
volumes:
|
||||
- ./husarnet/cyclonedds.xml:/cyclonedds.xml
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
export CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
ros2 run my_demo_pkg move_controller
|
||||
network_mode: service:husarnet
|
||||
|
||||
turtle_sim:
|
||||
image: osrf/ros:galactic-desktop
|
||||
privileged: true
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
- ./husarnet/cyclonedds.xml:/cyclonedds.xml
|
||||
command:
|
||||
- bash
|
||||
- -c
|
||||
- |
|
||||
export CYCLONEDDS_URI=file:///cyclonedds.xml
|
||||
ros2 run turtlesim turtlesim_node
|
||||
network_mode: service:husarnet # This is the most important line in this setup. This will put the Husarnet Client in the same network namespace as your app (in this example: turtle_sim)
|
27
init_repo.sh
@ -1,27 +0,0 @@
|
||||
#!/bin/bash
|
||||
# Basic entrypoint for ROS / Colcon Docker containers
|
||||
|
||||
# Source ROS 2
|
||||
source /opt/ros/${ROS_DISTRO}/setup.bash
|
||||
echo "Sourced ROS 2 ${ROS_DISTRO}"
|
||||
|
||||
# Source the base workspace, if built
|
||||
if [ -f ${UNDERLAY_WS}/install/setup.bash ]
|
||||
then
|
||||
source ${UNDERLAY_WS}/install/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix turtlebot3_gazebo)/share/turtlebot3_gazebo/models
|
||||
echo "Sourced Bot Mini base workspace"
|
||||
fi
|
||||
|
||||
# Source the overlay workspace, if built
|
||||
if [ -f /overlay_ws/install/setup.bash ]
|
||||
then
|
||||
source /overlay_ws/install/setup.bash
|
||||
#export GAZEBO_MODEL_PATH=$GAZEBO_MODEL_PATH:$(ros2 pkg prefix tb3_worlds)/share/tb3_worlds/models
|
||||
echo "Sourced Bot Mini overlay workspace"
|
||||
fi
|
||||
|
||||
# Copy over files
|
||||
cp -r /overlay_ws/src/* /repo/src/
|
||||
|
||||
wait
|
19
install.sh
@ -1,19 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Specify the name of your Python script
|
||||
SCRIPT_NAME="robot_config.py"
|
||||
|
||||
# Check if the script exists in the current directory
|
||||
if [ -f "$SCRIPT_NAME" ]; then
|
||||
# Check if /usr/local/bin is writable
|
||||
if [ -w "/usr/local/bin" ]; then
|
||||
# Copy the script to /usr/local/bin
|
||||
sudo cp "$SCRIPT_NAME" "/usr/local/bin"
|
||||
sudo chmod +x "/usr/local/bin/$SCRIPT_NAME"
|
||||
echo "Script '$SCRIPT_NAME' has been installed in /usr/local/bin."
|
||||
else
|
||||
echo "Error: /usr/local/bin is not writable. You may need to use 'sudo' to install the script."
|
||||
fi
|
||||
else
|
||||
echo "Error: Script '$SCRIPT_NAME' not found in the current directory."
|
||||
fi
|
52
key.pem
@ -1,52 +0,0 @@
|
||||
-----BEGIN PRIVATE KEY-----
|
||||
MIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC7PXpOg/+h7QaU
|
||||
cQuc7FdUxtDjKAOECglENb6HcA3TVA8YPyEoHIzlApR3VudRrjSMp4Q16sktWnC9
|
||||
hb7CSwjDw4ShT5cotBq/n0uS6YzH3hj3a+F9g8R2MkZ8FJ6Z/gYAvDQaZ6LN6CUY
|
||||
pACiYE3Z9XRZ6B7vtPpoTcZJp/OaBaRYohcvNh3QL5/MxSd/tO1ulpwbvUPVUCvJ
|
||||
52rb+ytHpmes/3ZLJYHq8m32R0XGGJ5XTN2uaIuEpuPhAEefZl8HMF7fd4scQlzs
|
||||
OVDt+RCvnw9WcXfmHSUhgLZh1mMZIh7WvXYcYK+MOUNffKDOeycwgg4Y93vy/OmJ
|
||||
VSUiTUwupLgV4AyrJMW6WNntSMbb5h+n72An/e99sKJaa3Ak65m8J5e8LBQaW8kf
|
||||
toVqf1QobQ4K4g4Fj7xmqRuApDyUI2+GTkcPzPj2lra71PNq7rwows4iEnTTSw9b
|
||||
XtGtZOtArSLMt42bGVS80W2DrmkKkTvJSKeUpV8GM+torWG25kv8TQxnWyr1hX9V
|
||||
uMVCeuFp3Vtn4O8tG5fYSF3yCxS3pQuFBbe+rsaZejS77FPVciQIRh01QajjFcqv
|
||||
3bkyZxFVrqBHl2wC4ChDlw3/nPjCcm142idqQRG0+iYAL8AJOxuvdGOkbqHSM8de
|
||||
1rlcL48rJ1X2uK6T8sAhEgXR0oZ8dQIDAQABAoICABwvlX1DRpSQEzj+SXK+aykS
|
||||
YriHOfxC7IEtm/hUaGhjE4ChZDLfFWCWAlZyqRC1KijwQKlDJjSjFCybeQtTc0bQ
|
||||
5GLKEeWpMwuchapgaPZfWx/HyCJ2Vvk5+T1Nd1CUGkA7FJbS+gGIDCmI6qWG3MFO
|
||||
P00XcazA8B8Kcip9U2Dgr4w+HkJXoaZIvQP8u8TwLfvDRU2xsIfocScMJJxn02yO
|
||||
QrYaoKqQQ13kT6ROt1SqOQ/IPOi3ySTXYJ9qxN1ccjqpT+bQ3oqK/OT8fc/M+fON
|
||||
/KeVHijwQzonX40b0kAi0ESgMar07QgtSJSTtLtQc6ZMNaYRf0GlS9yGCjh/LVPo
|
||||
IFCKjpSDfp2J9Q7RSFKdb8tghcTfQNAg/6zen1JnE5iUBiaQZfIj7+iD5hQfn9a2
|
||||
I1Fs3m1or3n1Z+BUg7vkDPQCyRkVEBXkKsbpD3T2cnxY9sfF0+ClmdfBQyCcLG5p
|
||||
mf6XAWQEiJrQ9iWuQYWpHDqaatan6G5ym8Wy7nJYdjJgJTszzduUSt176W8R7bGW
|
||||
73y9de+kEODQsxehSpkTVEqsMEgpTAKi5u59RRhj4OT9Lbvk9Xs9OH23aUcVUu5H
|
||||
urMIAKdsjlAUhLSPupDr4bJPRM9N4t2v709VeH170Z/9X5j7LbF++Wh2t+UXprmb
|
||||
0nDk5fjfzJnjXJQgd+nRAoIBAQDpUc+3MuLadphfyM5b5xc9A/8TuwW5a2jcLi1h
|
||||
6NlZa63qPbGvEk3kUw71ELrh8NorRqvn895CJUG4K+zVUTl9dgsXqla7GWZFHIXW
|
||||
2641R4p8HQNwNFP7KIyvvv5l72A+wWf1jpZiXXYNinrHDtPgdVXEFMDhDLibu6AK
|
||||
jsfdNOXDE+mmxMTSwwgJ9blZkdp1pBEWYCZsqW/yED6pLdTh8ZRPGHOb24x6HksZ
|
||||
Z/Gc4SIOrj5jrt3/M9oEymP+fQnF/StlnVsRnai6hBQX9khlS3pjneLOCLJfhpt/
|
||||
qcIDL03KsIhf0miIkOpNTATL4SGsWDBAQp17eN4UToacARRpAoIBAQDNcPlDVBqt
|
||||
K+fy9BBR9HBzBQlx6XkrmZ9Cgje/FrpMT+2UZ5wqMMPyB7SdoXkxx0CpB3ajOost
|
||||
i92fk7Y03xHXS3COGLKhWqDNhH1Uotlp3wpeOWx3DlAFRcIvy86iDzTa/hGaq8Kp
|
||||
2HPw0YqcxQjwYQzILBfZx3DRuQ8bt3Wiqxer/K+NRDnass/ZUTqz6nZcadMj6NiS
|
||||
Zlwm7ErjhjdYRc6amTZMtxOenxP8cAtNW+RBZ7JbUEhAhE8zU42wZI+DxhvM0mTg
|
||||
/CrRaYVE6YyAnaYo0RuJCRldz6obbgABn0q8qoY1Rmxjm+Do27hsrQgAB9Z/gmAp
|
||||
hdU2+S270fYtAoIBAQCuEYlEhkRU9HHN1ESQsCHYNakSEU+9+/JpglH9X/j4C6ve
|
||||
vFRZ5vARzh20m9yxQD2kV79c98Xz11PmkW7J3yVjArRX3Y+DWvm/yf3YRGD+AvfA
|
||||
jOzJw2B8Ws5LN9UYO7S0XRqwSsbLcCrpA02CQP+10BRCi7EytYjtNte5yLg3woVA
|
||||
OxTwhJDLJRJUS+0SdAxmBBdzeBxyqR6Jm7EECttuDgu1zupBd1SgrwUcWT4a6qO8
|
||||
DCcju4yIHykitdRQQv0Np0m/L9yHkfYV4QAUuHtehycyNtLFIBvjxMsyPXYvZhVF
|
||||
iNrVkmbGrEcBkBtr9/RlXg3xg0F2osAcqlEnBm8xAoIBADGLZkGrfcd3iDeaTnlF
|
||||
Rv0mINH86UDvim3is4j89S7EM9qPZiTyn761xwQg1faARAK/jwfsbXYtfeQnHlD/
|
||||
3vCZ++n44NNy5MbLheIsZ9xVcs2ocZUAuaGb4iner9V7b1bE4P/5HjgRwFw6XIBU
|
||||
MESwUwHPSG034OhjBda8Vr1FH69VgAzEgGNSrjeNlGehSqwcxVOqqtgboWutnp3i
|
||||
V2SNaTb1bhfwKuYdHRfK+Z7NY222kVfeM56Digopw0jf55By7W9m6fcsOTNJjF9D
|
||||
J6Q44MKFM2vH6vspwq9cxtmdTcvUIAunESqwg/wESSTEUeKYAU285m39HZ9lVncu
|
||||
On0CggEAEk6pzS5OX7DSWqrTnYd9T83lr7RzFQpWpbeK7OOidMUYm/MHx7I2UyLN
|
||||
V0K/ChkYowm69VvHJW9mcSHo0RAZiokBegJP8fhU0RJJaWyED+wdw2vOHlwAI7WP
|
||||
hj3xCOT8D+qfx12wVqo6c0jRXnNUsd5V9DPtMkn7YFYuq56gSqwlLvIpuhfU8dJM
|
||||
dCznLvjQqRQhqMk3p0bbcy4+EICR19F8UzgUfqWITwrdIriWQEWzDXIZvsBjxpaE
|
||||
PenJGHMSac7xOU/hdljj6FSpwu03aA0HklCQhwpfNDd+KPR7ntNE1DBEn93/bScb
|
||||
O61K2Igm/AywqweBe9cWRgB7lOXwIA==
|
||||
-----END PRIVATE KEY-----
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-13.7, -5.57, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_mainb_save_retouched.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-66.2, -24.5, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_mainb_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-20.9, -7.03, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_01-26-24.pgm
|
||||
mode: trinary
|
||||
resolution: 0.02
|
||||
origin: [-4, -14.8, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_03-10-23.sav.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-27.2, -0.0189, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_mainb_save_retouched.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-20.9, -7.03, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_floor_save.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-13.7, -5.57, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_openlabday.pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-13.5, -20.9, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,7 +0,0 @@
|
||||
image: map_save_16.10..pgm
|
||||
mode: trinary
|
||||
resolution: 0.05
|
||||
origin: [-25.7, -17, 0]
|
||||
negate: 0
|
||||
occupied_thresh: 0.65
|
||||
free_thresh: 0.25
|
@ -1,71 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
# Function to get the path to the docker-compose.yaml file
|
||||
def get_compose_file_path():
|
||||
path = input("Enter the path to the docker-compose.yaml file (press Enter for current directory): ").strip()
|
||||
return path if path else "docker-compose.yaml"
|
||||
|
||||
# Initialize the path to the docker-compose.yaml file
|
||||
compose_file_path = get_compose_file_path()
|
||||
|
||||
# Define a list to keep track of running services
|
||||
running_services = []
|
||||
|
||||
# Function to check if a service is already running
|
||||
def is_service_running(service_name):
|
||||
return service_name in running_services
|
||||
|
||||
# Function to start a service
|
||||
def start_service(service_name):
|
||||
if not is_service_running(service_name):
|
||||
print(f"Starting {service_name}...")
|
||||
subprocess.run(["docker", "compose", "-f", compose_file_path, "up", "-d", service_name])
|
||||
running_services.append(service_name)
|
||||
else:
|
||||
print(f"{service_name} is already running.")
|
||||
|
||||
# Function to stop a service
|
||||
def stop_service(service_name):
|
||||
if is_service_running(service_name):
|
||||
print(f"Stopping {service_name}...")
|
||||
subprocess.run(["docker", "compose", "-f", compose_file_path, "down", "-v", "--remove-orphans", service_name])
|
||||
running_services.remove(service_name)
|
||||
else:
|
||||
print(f"{service_name} is not running.")
|
||||
|
||||
# Main program
|
||||
if __name__ == "__main__":
|
||||
while True:
|
||||
print("Options:")
|
||||
print("1. Start Controller, Teleop, RSP, Lidar")
|
||||
print("2. Start AMCL and Navigation")
|
||||
print("3. Start Mapping and Navigation")
|
||||
print("4. Stop AMCL and Mapping")
|
||||
print("5. Change docker-compose.yaml file path")
|
||||
print("6. Quit")
|
||||
|
||||
choice = input("Enter your choice: ")
|
||||
|
||||
if choice == "1":
|
||||
start_service("controller")
|
||||
start_service("teleop")
|
||||
start_service("rsp")
|
||||
start_service("lidar")
|
||||
elif choice == "2":
|
||||
start_service("amcl")
|
||||
start_service("navigation")
|
||||
elif choice == "3":
|
||||
start_service("mapping")
|
||||
start_service("navigation")
|
||||
elif choice == "4":
|
||||
stop_service("amcl")
|
||||
stop_service("mapping")
|
||||
elif choice == "5":
|
||||
compose_file_path = get_compose_file_path()
|
||||
elif choice == "6":
|
||||
break
|
||||
else:
|
||||
print("Invalid choice. Please try again.")
|
70
rviz2.yaml
@ -1,70 +0,0 @@
|
||||
networks:
|
||||
pc: # config for this pc. Only required for running the containers locally on the pc. For instance rviz2 or guis with gazebo.
|
||||
driver: macvlan
|
||||
driver_opts:
|
||||
parent: wlx00e04c5513fc # pc network interface: here my wifi card. Can be found with ifconfig.
|
||||
ipam:
|
||||
config:
|
||||
- subnet: 192.168.0.0/24
|
||||
gateway: 192.168.0.1
|
||||
ip_range: 192.168.0.200/25
|
||||
aux_addresses:
|
||||
net-address: 192.168.0.100 #? what is this for --> to exclude addresses from buing used.
|
||||
|
||||
services:
|
||||
# rviz2
|
||||
rviz2:
|
||||
image: ghcr.io/bjoernellens1/ros2_rmp/rmp:guis
|
||||
# command: >
|
||||
# ros2 launch cps_rmp220_support robot_rviz2.launch.py
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
# networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
# pc:
|
||||
# ipv4_address: 192.168.0.201 #here need to set fixed ip to avoid collissions with other containers on robot.
|
||||
|
||||
rviz2-depthai:
|
||||
image: luxonis/depthai-ros:humble-latest
|
||||
command: >
|
||||
ros2 launch cps_rmp220_support rviz.launch.py
|
||||
# Interactive shell
|
||||
stdin_open: true
|
||||
tty: true
|
||||
# Networking and IPC for ROS 2
|
||||
network_mode: host
|
||||
ipc: host
|
||||
# Needed to display graphical applications
|
||||
privileged: true
|
||||
environment:
|
||||
# Allows graphical programs in the container.
|
||||
- DISPLAY=${DISPLAY}
|
||||
- QT_X11_NO_MITSHM=1
|
||||
- NVIDIA_DRIVER_CAPABILITIES=all
|
||||
- ROS_DOMAIN_ID=5
|
||||
- RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
|
||||
volumes:
|
||||
# Allows graphical programs in the container.
|
||||
- /tmp/.X11-unix:/tmp/.X11-unix:rw
|
||||
- ${XAUTHORITY:-$HOME/.Xauthority}:/root/.Xauthority
|
||||
# networks: # not using bridging anymore, instead try using all services on macvlan? let's see... shoudl word for now. Bridging does definitely not work because multicast is not supported here.
|
||||
# pc:
|
||||
# ipv4_address: 192.168.0.201 #here need to set fixed ip to avoid collissions with other containers on robot.
|
@ -1,47 +0,0 @@
|
||||
{
|
||||
"version": "1.1",
|
||||
"engine": "linux|Transformer|1.40.6|1.40.6|latest",
|
||||
"containerized": false,
|
||||
"host_distro": {
|
||||
"name": "NixOS",
|
||||
"version": "23.11",
|
||||
"display_name": "NixOS 23.11 (Tapir)"
|
||||
},
|
||||
"type": "build",
|
||||
"state": "error",
|
||||
"target_reference": "ubuntu",
|
||||
"system": {
|
||||
"type": "",
|
||||
"release": "",
|
||||
"distro": {
|
||||
"name": "",
|
||||
"version": "",
|
||||
"display_name": ""
|
||||
}
|
||||
},
|
||||
"source_image": {
|
||||
"identity": {
|
||||
"id": ""
|
||||
},
|
||||
"size": 0,
|
||||
"size_human": "",
|
||||
"create_time": "",
|
||||
"docker_version": "",
|
||||
"architecture": "",
|
||||
"container_entry": {
|
||||
"exe_path": ""
|
||||
}
|
||||
},
|
||||
"minified_image_size": 0,
|
||||
"minified_image_size_human": "",
|
||||
"minified_image": "",
|
||||
"minified_image_has_data": false,
|
||||
"minified_by": 0,
|
||||
"artifact_location": "",
|
||||
"container_report_name": "",
|
||||
"seccomp_profile_name": "",
|
||||
"apparmor_profile_name": "",
|
||||
"image_stack": null,
|
||||
"image_created": false,
|
||||
"image_build_engine": ""
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import subprocess
|
||||
|
||||
# Define the stacks
|
||||
stack1 = ["controller", "teleop", "rsp", "lidar"]
|
||||
stack2 = stack1 + ["mapping", "navigation"]
|
||||
stack3 = stack1 + ["amcl", "navigation"]
|
||||
|
||||
# Function to start a stack
|
||||
def start_stack(stack):
|
||||
print(f"Starting {', '.join(stack)}...")
|
||||
subprocess.run(["docker", "compose", "up", "-d"] + stack)
|
||||
|
||||
# Function to stop a stack
|
||||
def stop_stack(stack):
|
||||
print(f"Stopping {', '.join(stack)}...")
|
||||
subprocess.run(["docker", "compose", "down", "-v", "--remove-orphans"] + stack)
|
||||
|
||||
# Main program
|
||||
if __name__ == "__main__":
|
||||
while True:
|
||||
print("Options:")
|
||||
print("1. Start Stack 1")
|
||||
print("2. Start Stack 2")
|
||||
print("3. Start Stack 3")
|
||||
print("4. Stop Stack 1")
|
||||
print("5. Stop Stack 2")
|
||||
print("6. Stop Stack 3")
|
||||
print("7. Quit")
|
||||
|
||||
choice = input("Enter your choice: ")
|
||||
|
||||
if choice == "1":
|
||||
stop_stack(stack2 + stack3) # Stop stack2 and stack3 to avoid interference
|
||||
start_stack(stack1)
|
||||
elif choice == "2":
|
||||
stop_stack(stack1 + stack3) # Stop stack1 and stack3 to avoid interference
|
||||
start_stack(stack2)
|
||||
elif choice == "3":
|
||||
stop_stack(stack1 + stack2) # Stop stack1 and stack2 to avoid interference
|
||||
start_stack(stack3)
|
||||
elif choice == "4":
|
||||
stop_stack(stack1)
|
||||
elif choice == "5":
|
||||
stop_stack(stack2)
|
||||
elif choice == "6":
|
||||
stop_stack(stack3)
|
||||
elif choice == "7":
|
||||
break
|
||||
else:
|
||||
print("Invalid choice. Please try again.")
|
@ -1 +0,0 @@
|
||||
docker compose up -d controller teleop rsp lidar mapping navigation
|
@ -1 +0,0 @@
|
||||
docker compose up -d controller teleop rsp lidar amcl navigation
|
@ -1 +0,0 @@
|
||||
docker compose up -d controller teleop rsp lidar
|
133
test.rviz
@ -1,133 +0,0 @@
|
||||
Panels:
|
||||
- Class: rviz_common/Displays
|
||||
Help Height: 85
|
||||
Name: Displays
|
||||
Property Tree Widget:
|
||||
Expanded:
|
||||
- /Global Options1
|
||||
- /Status1
|
||||
Splitter Ratio: 0.5
|
||||
Tree Height: 528
|
||||
- Class: rviz_common/Selection
|
||||
Name: Selection
|
||||
- Class: rviz_common/Tool Properties
|
||||
Expanded:
|
||||
- /2D Goal Pose1
|
||||
- /Publish Point1
|
||||
Name: Tool Properties
|
||||
Splitter Ratio: 0.5886790156364441
|
||||
- Class: rviz_common/Views
|
||||
Expanded:
|
||||
- /Current View1
|
||||
Name: Views
|
||||
Splitter Ratio: 0.5
|
||||
- Class: rviz_common/Time
|
||||
Experimental: false
|
||||
Name: Time
|
||||
SyncMode: 0
|
||||
SyncSource: ""
|
||||
Visualization Manager:
|
||||
Class: ""
|
||||
Displays:
|
||||
- Alpha: 0.5
|
||||
Cell Size: 1
|
||||
Class: rviz_default_plugins/Grid
|
||||
Color: 160; 160; 164
|
||||
Enabled: true
|
||||
Line Style:
|
||||
Line Width: 0.029999999329447746
|
||||
Value: Lines
|
||||
Name: Grid
|
||||
Normal Cell Count: 0
|
||||
Offset:
|
||||
X: 0
|
||||
Y: 0
|
||||
Z: 0
|
||||
Plane: XY
|
||||
Plane Cell Count: 10
|
||||
Reference Frame: <Fixed Frame>
|
||||
Value: true
|
||||
Enabled: true
|
||||
Global Options:
|
||||
Background Color: 48; 48; 48
|
||||
Fixed Frame: map
|
||||
Frame Rate: 30
|
||||
Name: root
|
||||
Tools:
|
||||
- Class: rviz_default_plugins/Interact
|
||||
Hide Inactive Objects: true
|
||||
- Class: rviz_default_plugins/MoveCamera
|
||||
- Class: rviz_default_plugins/Select
|
||||
- Class: rviz_default_plugins/FocusCamera
|
||||
- Class: rviz_default_plugins/Measure
|
||||
Line color: 128; 128; 0
|
||||
- Class: rviz_default_plugins/SetInitialPose
|
||||
Covariance x: 0.25
|
||||
Covariance y: 0.25
|
||||
Covariance yaw: 0.06853891909122467
|
||||
Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /initialpose
|
||||
- Class: rviz_default_plugins/SetGoal
|
||||
Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /goal_pose
|
||||
- Class: rviz_default_plugins/PublishPoint
|
||||
Single click: true
|
||||
Topic:
|
||||
Depth: 5
|
||||
Durability Policy: Volatile
|
||||
History Policy: Keep Last
|
||||
Reliability Policy: Reliable
|
||||
Value: /clicked_point
|
||||
Transformation:
|
||||
Current:
|
||||
Class: rviz_default_plugins/TF
|
||||
Value: true
|
||||
Views:
|
||||
Current:
|
||||
Class: rviz_default_plugins/Orbit
|
||||
Distance: 10
|
||||
Enable Stereo Rendering:
|
||||
Stereo Eye Separation: 0.05999999865889549
|
||||
Stereo Focal Distance: 1
|
||||
Swap Stereo Eyes: false
|
||||
Value: false
|
||||
Focal Point:
|
||||
X: 0
|
||||
Y: 0
|
||||
Z: 0
|
||||
Focal Shape Fixed Size: true
|
||||
Focal Shape Size: 0.05000000074505806
|
||||
Invert Z Axis: false
|
||||
Name: Current View
|
||||
Near Clip Distance: 0.009999999776482582
|
||||
Pitch: 0.785398006439209
|
||||
Target Frame: <Fixed Frame>
|
||||
Value: Orbit (rviz)
|
||||
Yaw: 0.785398006439209
|
||||
Saved: ~
|
||||
Window Geometry:
|
||||
Displays:
|
||||
collapsed: false
|
||||
Height: 845
|
||||
Hide Left Dock: false
|
||||
Hide Right Dock: false
|
||||
QMainWindow State: 000000ff00000000fd00000004000000000000015a000002a6fc0200000008fb0000001200530065006c0065006300740069006f006e00000001e10000009b0000006b00fffffffb0000001e0054006f006f006c002000500072006f007000650072007400690065007302000001ed000001df00000185000000a3fb000000120056006900650077007300200054006f006f02000001df000002110000018500000122fb000000200054006f006f006c002000500072006f0070006500720074006900650073003203000002880000011d000002210000017afb000000100044006900730070006c0061007900730100000044000002a6000000eb00fffffffb0000002000730065006c0065006300740069006f006e00200062007500660066006500720200000138000000aa0000023a00000294fb00000014005700690064006500530074006500720065006f02000000e6000000d2000003ee0000030bfb0000000c004b0069006e0065006300740200000186000001060000030c00000261000000010000010f000002a6fc0200000003fb0000001e0054006f006f006c002000500072006f00700065007200740069006500730100000041000000780000000000000000fb0000000a005600690065007700730100000044000002a6000000b900fffffffb0000001200530065006c0065006300740069006f006e010000025a000000b200000000000000000000000200000490000000a9fc0100000001fb0000000a00560069006500770073030000004e00000080000002e10000019700000003000004af0000003efc0100000002fb0000000800540069006d00650100000000000004af000002d200fffffffb0000000800540069006d0065010000000000000450000000000000000000000238000002a600000004000000040000000800000008fc0000000100000002000000010000000a0054006f006f006c00730100000000ffffffff0000000000000000
|
||||
Selection:
|
||||
collapsed: false
|
||||
Time:
|
||||
collapsed: false
|
||||
Tool Properties:
|
||||
collapsed: false
|
||||
Views:
|
||||
collapsed: false
|
||||
Width: 1199
|
||||
X: 199
|
||||
Y: 115
|
88
webcam.launch.py
Normal file
@ -0,0 +1,88 @@
|
||||
from launch import LaunchDescription
|
||||
from launch_ros.actions import Node
|
||||
from launch.actions import DeclareLaunchArgument
|
||||
from launch.substitutions import LaunchConfiguration, ThisLaunchFileDir
|
||||
from launch.conditions import IfCondition, UnlessCondition
|
||||
from launch.substitutions import TextSubstitution
|
||||
|
||||
def generate_launch_description():
|
||||
# Declare launch arguments
|
||||
video_device_arg = DeclareLaunchArgument(
|
||||
'video_device', default_value='/dev/video0',
|
||||
description='Video device path')
|
||||
|
||||
pixel_format_arg = DeclareLaunchArgument(
|
||||
'pixel_format', default_value='YUYV',
|
||||
description='Pixel format')
|
||||
|
||||
output_encoding_arg = DeclareLaunchArgument(
|
||||
'output_encoding', default_value='yuv422_yuy2',
|
||||
description='Output encoding')
|
||||
|
||||
image_size_arg = DeclareLaunchArgument(
|
||||
'image_size', default_value='[640, 480]',
|
||||
description='Image size')
|
||||
|
||||
camera_frame_id_arg = DeclareLaunchArgument(
|
||||
'camera_frame_id', default_value='camera_optical_link',
|
||||
description='Camera frame ID')
|
||||
|
||||
params_file_arg = DeclareLaunchArgument(
|
||||
'params_file', default_value='',
|
||||
description='Path to the parameters file')
|
||||
|
||||
device_namespace_arg = DeclareLaunchArgument(
|
||||
'device_namespace', default_value='camera',
|
||||
description='Device namespace')
|
||||
|
||||
ffmpeg_encoding_arg = DeclareLaunchArgument(
|
||||
'ffmpeg_encoding', default_value='libx264',
|
||||
description='FFMPEG encoding')
|
||||
|
||||
ffmpeg_preset_arg = DeclareLaunchArgument(
|
||||
'ffmpeg_preset', default_value='ultrafast',
|
||||
description='FFMPEG preset')
|
||||
|
||||
ffmpeg_tune_arg = DeclareLaunchArgument(
|
||||
'ffmpeg_tune', default_value='zerolatency',
|
||||
description='FFMPEG tune')
|
||||
|
||||
# v4l2_camera node configuration
|
||||
v4l2_camera_node = Node(
|
||||
package='v4l2_camera',
|
||||
executable='v4l2_camera_node',
|
||||
name='camera',
|
||||
namespace=LaunchConfiguration('device_namespace'),
|
||||
parameters=[
|
||||
{
|
||||
'video_device': LaunchConfiguration('video_device'),
|
||||
'pixel_format': LaunchConfiguration('pixel_format'),
|
||||
'output_encoding': LaunchConfiguration('output_encoding'),
|
||||
'image_size': LaunchConfiguration('image_size'),
|
||||
'camera_frame_id': LaunchConfiguration('camera_frame_id'),
|
||||
'camera_name': LaunchConfiguration('device_namespace'),
|
||||
'camera_link_frame_id': [LaunchConfiguration('device_namespace'), TextSubstitution(text='_link')],
|
||||
'ffmpeg_image_transport.encoding': LaunchConfiguration('ffmpeg_encoding'),
|
||||
'ffmpeg_image_transport.preset': LaunchConfiguration('ffmpeg_preset'),
|
||||
'ffmpeg_image_transport.tune': LaunchConfiguration('ffmpeg_tune'),
|
||||
},
|
||||
LaunchConfiguration('params_file')
|
||||
],
|
||||
# Add any necessary remappings here
|
||||
)
|
||||
|
||||
# Assemble the launch description
|
||||
return LaunchDescription([
|
||||
video_device_arg,
|
||||
pixel_format_arg,
|
||||
output_encoding_arg,
|
||||
image_size_arg,
|
||||
camera_frame_id_arg,
|
||||
params_file_arg,
|
||||
device_namespace_arg,
|
||||
ffmpeg_encoding_arg,
|
||||
ffmpeg_preset_arg,
|
||||
ffmpeg_tune_arg,
|
||||
v4l2_camera_node
|
||||
])
|
||||
|