Compare commits

..

9 Commits

Author SHA1 Message Date
829d01bf06 update: javscript not loading 2024-04-02 12:09:28 +02:00
e1de2cbf77 update 2024-04-02 11:13:35 +02:00
5891da6fa5 update 2024-03-29 11:22:52 +01:00
83f97a8d65 update 2024-03-29 10:43:00 +01:00
33eba8fcfb update 2024-03-28 12:43:09 +01:00
Your Name
2f0d08cf0a update 2024-03-28 09:56:53 +01:00
Your Name
cbc84b434b update 2024-03-28 09:53:35 +01:00
Your Name
5b5c0ca098 update 2024-03-28 09:46:50 +01:00
Your Name
b6b70dde04 cleanup 2024-03-28 09:43:59 +01:00
70 changed files with 3938 additions and 1422 deletions

4
.gitignore vendored
View File

@ -1 +1,3 @@
*.pgm
*.pgm
maps/
__pycache__/

Binary file not shown.

View File

@ -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
View 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
View 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
}
}

View 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>

View 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>

View 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();
};
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View 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

View 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

View 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

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 80 KiB

View 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="&lt;Group&gt;"><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

View 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;
}
}

View 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="&lt;Group&gt;"><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

View File

@ -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 "$@"

View File

@ -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:

View 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

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 MiB

After

Width:  |  Height:  |  Size: 13 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

View File

@ -0,0 +1 @@
ba1fa920-2863-4600-994f-23559acfcab2

View File

@ -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

View File

@ -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

Binary file not shown.

View 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)

View File

@ -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

View File

@ -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
View File

@ -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-----

Binary file not shown.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Binary file not shown.

View File

@ -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

Binary file not shown.

File diff suppressed because one or more lines are too long

View File

@ -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

File diff suppressed because one or more lines are too long

Binary file not shown.

View File

@ -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

File diff suppressed because one or more lines are too long

View File

@ -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

File diff suppressed because one or more lines are too long

View File

@ -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

Binary file not shown.

Binary file not shown.

View File

@ -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.")

View File

@ -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.

View File

@ -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": ""
}

View File

@ -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.")

View File

@ -1 +0,0 @@
docker compose up -d controller teleop rsp lidar mapping navigation

View File

@ -1 +0,0 @@
docker compose up -d controller teleop rsp lidar amcl navigation

View File

@ -1 +0,0 @@
docker compose up -d controller teleop rsp lidar

133
test.rviz
View File

@ -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

View File

88
webcam.launch.py Normal file
View 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
])