larry babby and threejs for glsl

This commit is contained in:
Sam
2024-06-24 21:24:00 +12:00
parent 87d5dc634d
commit 907ebae4c0
6474 changed files with 1279596 additions and 8 deletions

View File

@@ -0,0 +1,16 @@
{
"PolyTwistColourWidth": [
{ "type": "range", "min": 3, "max": 10, "defaultValue": 5, "property": "sides" },
{ "type": "range", "min": 1, "max": 600, "defaultValue": 300, "property": "width" },
{ "type": "range", "min": 1, "max": 100, "defaultValue": 50, "property": "depth" },
{ "type": "range", "min": 0, "max": 360, "defaultValue": 180, "property": "rotation" },
{ "type": "color", "defaultValue": "#4287f5", "property": "colour1" },
{ "type": "color", "defaultValue": "#42f57b", "property": "colour2" }
],
"FloralPhyllo": [
{ "type": "range", "min": 1, "max": 600, "defaultValue": 300, "property": "width" },
{ "type": "range", "min": 1, "max": 100, "defaultValue": 50, "property": "depth" },
{ "type": "color", "defaultValue": "#4287f5", "property": "colour1" },
{ "type": "color", "defaultValue": "#4287f5", "property": "colour2" }
]
}

View File

@@ -0,0 +1,111 @@
body {
-webkit-box-sizing: border-box;
/* Safari/Chrome, other WebKit */
-moz-box-sizing: border-box;
/* Firefox, other Gecko */
box-sizing: border-box;
/* Opera/IE 8+ */
height: 100%
}
p {
margin: 0px;
}
canvas {
position: absolute;
}
#toolbar {
display: flex;
flex-flow: column;
height: 100%;
position: absolute;
padding: 0px 20px 0px 20px;
width: 500px;
height: 100vh;
background-color: rgb(189, 189, 189);
}
#custom {
display: flex;
flex-flow: column;
height: 100%;
/* position: absolute; */
padding: 0px 20px 0px 20px;
/* width: 500px; */
/* height: 100vh; */
background-color: rgb(189, 189, 189);
}
.button {
display: block;
position: absolute;
right: 20px;
z-index: 100;
}
.controls {
display: flex;
margin: 8px 0px;
}
.controlFrameButton {
width: 8%;
}
.controlPauseButton {
width: 80%;
margin: auto;
}
/* <!-- HTML !-->
<button class="button-8" role="button">Button 8</button> */
/* CSS */
.button-8 {
background-color: #e1ecf4;
border-radius: 3px;
border: 1px solid #7aa7c7;
box-shadow: rgba(255, 255, 255, .7) 0 1px 0 0 inset;
box-sizing: border-box;
color: #1f3f55;
cursor: pointer;
display: inline-block;
/* font-family: -apple-system,system-ui,"Segoe UI","Liberation Sans",sans-serif; */
font-size: 13px;
font-weight: 400;
line-height: 1.15385;
/* margin: 0; */
outline: none;
padding: 8px .8em;
position: relative;
text-align: center;
text-decoration: none;
user-select: none;
-webkit-user-select: none;
touch-action: manipulation;
vertical-align: baseline;
white-space: nowrap;
}
.button-8:hover,
.button-8:focus {
background-color: #b3d3ea;
color: #2c5777;
}
.button-8:focus {
box-shadow: 0 0 0 4px rgba(0, 149, 255, .15);
}
.button-8:active {
background-color: #a0c7e4;
box-shadow: none;
color: #2c5777;
}
.buttonReset{
background-color: #f4e1e1;
}

View File

@@ -0,0 +1,60 @@
<!DOCTYPE html>
<html>
<!-- ahhh -->
<head>
<title>Document</title>
<link rel="stylesheet" href="./css/styles.css">
</head>
<body style="margin:0;">
<canvas id="myCanvas" style="display: block;box-sizing: border-box;"></canvas>
<div id="toolbar">
<br>
<select id="shape-selector">
<option value="Larry">Larry</option>
<option value="NewWave">NewWave</option>
<option value="EyePrototype">EyePrototype</option>
<option value="Nodal_expanding">Nodal_expanding</option>
<option value="MaryFace">MaryFace</option>
<option value="CircleExpand">CircleExpand</option>
<option value="PolyTwistColourWidth">PolyTwistColourWidth</option>
<option value="FloralPhyllo">FloralPhyllo</option>
<option value="FloralPhyllo_Accident">FloralPhyllo_Accident</option>
<option value="Spiral1">Spiral1</option>
<option value="FloralAccident">FloralAccident</option>
<option value="Phyllotaxis">Phyllotaxis</option>
<option value="SquareTwist_angle">SquareTwist_angle</option>
</select>
<div id="custom"></div>
<br>
<p>Controls:</p>
<p>
Press "Space" to pause and start the animation
</p>
<p>
Press "P" to show/hide the control panel
</p>
<br>
<p>Speed</p>
<input type="text" id="inputDegPerSec" value="10" onchange="ChangeDegPerSec(this.value)">
<br>
<p>Controls</p>
<div class="controls">
<button class="controlFrameButton button-8" onclick="BackwardFrame()"><</button>
<button class="controlPauseButton button-8" id="pauseButton" onclick="TogglePause()">Play</button>
<button class="controlFrameButton button-8" onclick="ForwardFrame()">></button>
</div>
<button class="buttonReset button-8" id="resetButton" onclick="Reset()">Reset Rotation</button>
</div>
<div>
<button onclick="manualToggleSettings()" class="button">Show/hide</button>
</div>
</body>
<script src="./js/helper.js" type="text/javascript"></script>
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="./js/math.js" type="text/javascript"></script>
<script src="./js/objects.js" type="text/javascript"></script>
<script src="./js/index.js"></script>
</html>

View File

@@ -0,0 +1,407 @@
async function fetchConfig(className) {
// Configurations for different shapes
const config = {
Larry: [
{
type: "range",
min: 1,
max: 5,
defaultValue: 1,
property: "magnitude"
},
// Dropdown control to select food
{
type: "dropdown",
property: "selectedFood",
defaultValue: "lettuce",
options: [
{ value: "lettuce", label: "Lettuce" },
{ value: "apple", label: "Apple" },
{ value: "carrot", label: "Carrot" }
]
},
{
type: "range",
min: 0,
max: 20,
defaultValue: 2,
property: "eatSpeed"
},
{
type: "range",
min: 0,
max: 10000,
defaultValue: 3000,
property: "eatDuration"
},
// Button control to start eating
{
type: "button",
label: "Start Eating",
method: "startEating",
},
// Dropdown control to select hat
{
type: "dropdown",
property: "selectedHat",
defaultValue: "",
options: [
{ value: "", label: "None" },
{ value: "cap", label: "Cap" },
{ value: "top_hat", label: "Top Hat" },
{ value: "center_box_full", label: "Center Full" },
{ value: "center_box_hollow", label: "Center Hollow" },
]
},
// Button control to apply a hat
{
type: "button",
label: "Apply Hat",
method: "applyHat"
},
// Movement controls
{
type: "range",
min: 0,
max: 360,
defaultValue: 0,
property: "moveDirection"
},
{
type: "range",
min: 1,
max: 100,
defaultValue: 10,
property: "moveDistance"
},
{
type: "range",
min: 1,
max: 10,
defaultValue: 5,
property: "moveSpeed"
},
{
type: "button",
label: "Wander",
method: "wander"
},
// Appearance controls
{
type: "dropdown",
property: "selectedShell",
defaultValue: "default",
options: [
{ value: "default", label: "Default" },
{ value: "spiky", label: "Spiky" },
{ value: "striped", label: "Striped" }
]
},
{
type: "button",
label: "Apply Shell",
method: "applyShell"
},
// Background controls
{
type: "dropdown",
property: "selectedBackground",
defaultValue: "",
options: [
{ value: "", label: "None" },
{ value: "field_white", label: "Field Whtie" },
{ value: "field_blue", label: "Field Blue" },
{ value: "field_trans", label: "Field Trans" }
]
},
{
type: "button",
label: "Apply Background",
method: "applyBackground"
}
],
// Add other shape configurations here
};
return config[className];
}
function addControl(item, instance) {
let parentDiv = document.getElementById("custom");
let title = document.createElement("p");
title.innerText = item.property + ": " + item.defaultValue;
title.id = "elText" + item.property;
let control;
if (item.type === "range") {
control = document.createElement("input");
control.type = "range";
control.min = item.min;
control.max = item.max;
control.value = item.defaultValue;
control.addEventListener("input", (event) => {
const newValue = event.target.value;
instance[item.property] = parseInt(newValue, 10);
title.innerText = item.property + ": " + newValue;
});
} else if (item.type === "button") {
control = document.createElement("button");
control.innerText = item.label;
control.addEventListener("click", () => {
instance[item.method]();
});
} else if (item.type === "dropdown") {
control = document.createElement("select");
item.options.forEach(option => {
let optionElement = document.createElement("option");
optionElement.value = option.value;
optionElement.innerText = option.label;
control.appendChild(optionElement);
});
control.value = item.defaultValue;
control.addEventListener("change", (event) => {
const newValue = event.target.value;
instance[item.property] = newValue;
title.innerText = item.property + ": " + newValue;
});
}
control.className = "control";
control.id = "el" + item.property;
parentDiv.appendChild(title);
parentDiv.appendChild(control);
return { element: control };
}
function drawEyelid(width, x1, y1, colour) {
x1 -= centerX;
y1 -= centerY;
const angle = Math.atan2(y1, x1);
const cosAngle = Math.cos(angle);
const sinAngle = Math.sin(angle);
const x2 = cosAngle * width;
const y2 = sinAngle * width;
const x3Old = width / 2;
const y3Old = width / 2;
const x4Old = width / 2;
const y4Old = -width / 2;
const x3 = x3Old * cosAngle - y3Old * sinAngle;
const y3 = x3Old * sinAngle + y3Old * cosAngle;
const x4 = x4Old * cosAngle - y4Old * sinAngle;
const y4 = x4Old * sinAngle + y4Old * cosAngle;
x1 += centerX;
y1 += centerY;
const x2Final = x2 + x1;
const y2Final = y2 + y1;
const x3Final = x3 + x1;
const y3Final = y3 + y1;
const x4Final = x4 + x1;
const y4Final = y4 + y1;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.quadraticCurveTo(x3Final, y3Final, x2Final, y2Final);
ctx.moveTo(x1, y1);
ctx.quadraticCurveTo(x4Final, y4Final, x2Final, y2Final);
ctx.fillStyle = colour;
ctx.fill();
ctx.lineWidth = 2;
ctx.strokeStyle = "black";
ctx.stroke();
}
function drawEyelidAccident(x1, y1) {
let leafWidth = 120;
let leafHeight = 60;
x1 -= centerX;
y1 -= centerY;
let angle = Math.atan(y1 / x1);
// if(angle >=Math.PI){
// angle -=Math.PI
// console.log("greater called")
// }
angle = Math.abs(angle);
let x2Old = 0 + leafWidth;
let y2Old = 0;
let x3Old = 0 + leafWidth / 2;
let y3Old = 0 + leafHeight / 2;
let x4Old = 0 + leafWidth / 2;
let y4Old = 0 - leafHeight / 2;
let x2 = x2Old * Math.cos(angle) - y2Old * Math.sin(angle);
let y2 = x2Old * Math.sin(angle) + y2Old * Math.cos(angle);
let x3 = x3Old * Math.cos(angle) - y3Old * Math.sin(angle);
let y3 = x3Old * Math.sin(angle) + y3Old * Math.cos(angle);
let x4 = x4Old * Math.cos(angle) - y4Old * Math.sin(angle);
let y4 = x4Old * Math.sin(angle) + y4Old * Math.cos(angle);
let oldx1 = x1;
let oldy1 = y1;
x1 += centerX; // +x2/2
y1 += centerY; // +x2/2
x2 += x1;
y2 += y1;
x3 += x1;
y3 += y1;
x4 += x1;
y4 += y1;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.quadraticCurveTo(x3, y3, x2, y2);
ctx.moveTo(x1, y1);
ctx.quadraticCurveTo(x4, y4, x2, y2);
ctx.fillStyle = "black";
ctx.fill();
ctx.lineWidth = 1;
ctx.beginPath();
ctx.moveTo(x1, y1);
ctx.quadraticCurveTo(x3, y3, x2, y2);
ctx.moveTo(x1, y1);
ctx.quadraticCurveTo(x4, y4, x2, y2);
ctx.strokeStyle = "orange";
ctx.stroke();
}
function DrawPolygon(sides, width, rotation, colour, line_width) {
ctx.beginPath();
ctx.moveTo(
centerX + width * Math.cos((rotation * Math.PI) / 180),
centerY + width * Math.sin((rotation * Math.PI) / 180)
);
for (var i = 1; i <= sides; i += 1) {
ctx.lineTo(
centerX +
width *
Math.cos((i * 2 * Math.PI) / sides + (rotation * Math.PI) / 180),
centerY +
width * Math.sin((i * 2 * Math.PI) / sides + (rotation * Math.PI) / 180)
);
}
ctx.strokeStyle = colour;
ctx.lineWidth = line_width;
ctx.stroke();
}
function rad(degrees) {
return (degrees * Math.PI) / 180;
}
function colourToText(colour) {
return "rgb(" + colour[0] + "," + colour[1] + "," + colour[2] + ")";
}
function waveNormal(x, max) {
let val = Math.sin((x / max) * Math.PI * 2 - max * (Math.PI / (max * 2))) / 2 + 0.5
return val
}
function LerpHex(a, b, amount) {
var ah = parseInt(a.replace(/#/g, ""), 16),
ar = ah >> 16,
ag = (ah >> 8) & 0xff,
ab = ah & 0xff,
bh = parseInt(b.replace(/#/g, ""), 16),
br = bh >> 16,
bg = (bh >> 8) & 0xff,
bb = bh & 0xff,
rr = ar + amount * (br - ar),
rg = ag + amount * (bg - ag),
rb = ab + amount * (bb - ab);
return (
"#" + (((1 << 24) + (rr << 16) + (rg << 8) + rb) | 0).toString(16).slice(1)
);
}
function LerpRGB(a, b, t) {
if (t < 0) {
t *= -1;
}
var newColor = [0, 0, 0];
newColor[0] = a[0] + (b[0] - a[0]) * t;
newColor[1] = a[1] + (b[1] - a[1]) * t;
newColor[2] = a[2] + (b[2] - a[2]) * t;
return newColor;
}
function lerpRGB(a, b, t) {
const result = [0, 0, 0];
for (let i = 0; i < 3; i++) {
result[i] = (1 - t) * a[i] + t * b[i];
}
return result;
}
function drawCenter(width) {
// console.log("center?")
ctx.strokeStyle = "pink";
ctx.lineWidth = 1
ctx.beginPath();
ctx.moveTo(centerX - width, centerY);
ctx.lineTo(centerX + width, centerY);
ctx.closePath();
ctx.stroke();
ctx.beginPath();
ctx.moveTo(centerX, centerY - width);
ctx.lineTo(centerX, centerY + width);
ctx.closePath();
ctx.stroke();
}
function render_clear() {
ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
ctx.fillStyle = "black";
ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}
function rotatePointTmp(x, y, centerXX, centerYY, rotation) {
let xFromC = x - centerXX;
let yFromC = y - centerYY;
let d = (xFromC ** 2 + yFromC ** 2) ** 0.5
// let orgAngle = Math.atan2(yFromC/xFromC)
let orgAngle = Math.atan2(xFromC, yFromC)
let tmp = Math.cos(rad(orgAngle - rotation)) * d
// console.log(Math.cos((-90)*(Math.PI/180)))
console.log(orgAngle)
console.log(rad(rotation))
console.log(Math.cos(orgAngle - rad(rotation)) * d)
console.log(d)
// console.log(d)
let newPointX = Math.cos(orgAngle - rad(rotation + 90)) * d + centerXX;
let newPointY = Math.sin(orgAngle - rad(rotation + 90)) * d + centerYY;
return [newPointX, newPointY]
}
function rotatePoint(x, y, rotation) {
let nCos = Math.cos(rad(rotation))
// console.log(nCos*(180/Math.PI))
// console.log(rad(rotation))
let nSin = Math.sin(rad(rotation))
let newX = x * nCos - y * nSin
let newY = y * nCos + x * nSin
return [newX, newY]
}

154
Larry the snail/js/index.js Normal file
View File

@@ -0,0 +1,154 @@
//jshint esversion:8
let c = document.getElementById("myCanvas");
let ctx = c.getContext("2d");
ctx.canvas.width = window.innerWidth;
ctx.canvas.height = window.innerHeight;
centerX = ctx.canvas.width / 2;
centerY = ctx.canvas.height / 2;
ctx.imageSmoothingEnabled = false;
let deg_per_sec = 10;
let targetFps = 60;
let frameDuration = 1000 / targetFps;
let rotation = 0; //was = j = angle
let paused = true;
render_clear();
let drawObj = null;
function createInstance(className, args) {
const classMap = {
Larry: Larry,
NewWave: NewWave,
PolyTwistColourWidth: PolyTwistColourWidth,
FloralPhyllo: FloralPhyllo,
Spiral1: Spiral1,
FloralAccident: FloralAccident,
FloralPhyllo_Accident: FloralPhyllo_Accident,
Nodal_expanding: Nodal_expanding,
Phyllotaxis:Phyllotaxis,
SquareTwist_angle:SquareTwist_angle,
EyePrototype:EyePrototype,
CircleExpand:CircleExpand,
MaryFace:MaryFace,
// Add more class constructors here as needed
};
if (classMap.hasOwnProperty(className)) {
return new classMap[className](...args);
} else {
throw new Error(`Unknown class name: ${className}`);
}
}
async function updateDrawObj() {
const shapeSelector = document.getElementById("shape-selector");
const selectedShape = shapeSelector.value;
const config = await fetchConfig(selectedShape);
if (drawObj) {
drawObj.remove(); // Remove the previous instance
}
// Initialize the instance without configuration
drawObj = createInstance(selectedShape, []);
// Set up controls and then update instance properties
drawObj.initialise(config);
// Update instance properties based on control values
config.forEach(item => {
if (item.type === "range" || item.type === "dropdown") {
const control = document.getElementById("el" + item.property);
drawObj[item.property] = control.value;
}
});
console.log(drawObj);
}
updateDrawObj();
function render() {
setTimeout(() => {
requestAnimationFrame(() => {
render_clear();
if (drawObj) {
drawObj.draw(rotation);
}
if (!paused) {
rotation += deg_per_sec / targetFps;
}
drawCenter(300)
});
render();
}, frameDuration);
}
document
.getElementById("shape-selector")
.addEventListener("change", updateDrawObj);
let toolbarShowing = true;
document.addEventListener("keydown", toggleSettings);
function manualToggleSettings(){
console.log("hi")
toolbarShowing = !toolbarShowing;
let tb = document.getElementById("toolbar");
if (toolbarShowing) {
tb.style.display = "flex";
} else {
tb.style.display = "none";
}
}
function toggleSettings(e) {
if (e.key == "p") {
toolbarShowing = !toolbarShowing;
}
if (e.code === "Space") {
paused = !paused;
}
let tb = document.getElementById("toolbar");
if (toolbarShowing) {
tb.style.display = "flex";
} else {
tb.style.display = "none";
}
}
function TogglePause() {
let pb = document.getElementById("pauseButton");
paused = !paused;
if (paused) {
pb.textContent = "Play";
} else {
pb.textContent = "Pause";
}
}
function Reset() {
rotation = 0; //was = j = angle
currentFrame = 0;
}
function ForwardFrame() {
rotation += deg_per_sec / fps; // was = j = innerRotation, now = rotation
currentFrame += 1; // was = i
}
function BackwardFrame() {
rotation -= deg_per_sec / fps; // was = j = innerRotation, now = rotation
currentFrame -= 1; // was = i
}
function ChangeDegPerSec(newValue) {
deg_per_sec = newValue;
}
window.onload = render;

View File

@@ -0,0 +1,77 @@
function rotateMatrix2d(p, angle) {
// cos0 sin0
// -sin0 cos0
const angleD = rad(angle);
const r = [
[Math.cos(angleD), Math.sin(angleD)],
[-Math.sin(angleD), Math.cos(angleD)],
];
const newPoint = [
p[0] * r[0][0] + p[1] * r[0][1],
p[0] * r[1][0] + p[1] * r[1][1],
];
return newPoint;
}
function rotateMatrix3dX(p, angle) {
// cos0 sin0
// -sin0 cos0
const angleD = rad(angle);
const r = [
[1, 0, 0],
[0, Math.cos(angleD), -Math.sin(angleD)],
[0, Math.sin(angleD), Math.cos(angleD)],
];
const newPoint = [
p[0] * r[0][0] + p[1] * r[0][1] + p[2] * r[0][2],
p[0] * r[1][0] + p[1] * r[1][1] + p[2] * r[1][2],
p[0] * r[2][0] + p[1] * r[2][1] + p[2] * r[2][2],
];
return newPoint;
}
function rotateMatrix3dY(p, angle) {
// cos0 sin0
// -sin0 cos0
const angleD = rad(angle);
const r = [
[Math.cos(angleD), 0, Math.sin(angleD)],
[0, 1, 0],
[-Math.sin(angleD), 0, Math.cos(angleD)],
];
const newPoint = [
p[0] * r[0][0] + p[1] * r[0][1] + p[2] * r[0][2],
p[0] * r[1][0] + p[1] * r[1][1] + p[2] * r[1][2],
p[0] * r[2][0] + p[1] * r[2][1] + p[2] * r[2][2],
];
return newPoint;
}
function rotateMatrix3dZ(p, angle) {
// cos0 sin0
// -sin0 cos0
const angleD = rad(angle);
const r = [
[Math.cos(angleD), -Math.sin(angleD), 0],
[Math.sin(angleD), Math.cos(angleD), 0],
[0, 0, 1],
];
const newPoint = [
p[0] * r[0][0] + p[1] * r[0][1] + p[2] * r[0][2],
p[0] * r[1][0] + p[1] * r[1][1] + p[2] * r[1][2],
p[0] * r[2][0] + p[1] * r[2][1] + p[2] * r[2][2],
];
return newPoint;
}
function projectionOrth(v) {
const p = [
[1, 0, 0],
[0, 1, 0],
];
const nPoint = [
p[0][0] * v[0] + p[0][1] * v[1] + p[0][2] * v[2],
p[1][0] * v[0] + p[1][1] * v[1] + p[1][2] * v[2],
];
return nPoint;
}

View File

@@ -0,0 +1,808 @@
class BaseShape {
constructor() {
this.controls = []; // Keep track of created elements and event listeners
this.speedMultiplier = 100;
}
initialise(config) {
for (let item of config) {
const { element, listener } = addControl(item, this);
this.controls.push({ element, listener });
}
// Add a default speed multiplier control
const { element, listener } = addControl({
type: "range",
min: 1,
max: 500,
defaultValue: 100,
property: "speedMultiplier",
}, this);
this.controls.push({ element, listener });
}
remove() {
this.controls.forEach(({ element, listener }) => {
if (element && listener) {
element.removeEventListener("input", listener);
}
if (element && element.parentElement) {
element.parentElement.removeChild(element);
const titleElement = document.getElementById("elText" + element.id.slice(2));
if (titleElement) {
titleElement.parentElement.removeChild(titleElement);
}
}
});
this.controls = [];
}
draw() {
throw new Error("Draw function not implemented");
}
}
class Larry extends BaseShape {
constructor(eatSpeed, eatDuration) {
super();
this.magnitude = 1;
this.bodyWidth = 64;
this.bodyHeight = 64;
this.headWidth = 21;
this.headHeight = 24;
this.headOffsetX = 54 - this.headWidth * this.magnitude / 2;
this.headOffsetY = this.bodyHeight * this.magnitude - 7; // Bottom of the body minus 7 pixels
this.globalX = centerX;
this.globalY = centerY;
this.localX = 0;
this.localY = 0;
this.speedMultiplier = 100;
this.isEating = false;
this.eatDuration = eatDuration;
this.eatSpeed = eatSpeed;
this.bodyImage = new Image();
this.headImage = new Image();
this.hatImage = new Image();
this.shellImage = new Image();
this.backgroundImage = new Image();
this.bodyImage.src = 'larry_photos/body.png';
this.headImage.src = 'larry_photos/head.png';
this.hatImage.src = '';
this.shellImage.src = '';
this.backgroundImage.src = '';
}
draw(timestamp) {
timestamp *= (this.speedMultiplier / 100);
// Draw background
if (this.backgroundImage.src) {
console.log("drawing background: " + this.backgroundImage.src)
ctx.drawImage(this.backgroundImage, centerX- (this.backgroundImage.width), centerY -this.backgroundImage.height,this.backgroundImage.width*2,this.backgroundImage.height*2);
}
// Draw body at its anchor point (center-bottom)
const bodyX = this.globalX - (this.bodyWidth * this.magnitude / 2);
const bodyY = this.globalY - this.bodyHeight * this.magnitude;
ctx.drawImage(this.bodyImage, bodyX, bodyY, this.bodyWidth * this.magnitude, this.bodyHeight * this.magnitude);
// Draw head aligned with body
// const headX = bodyX + this.headOffsetX;
// let headY = bodyY + this.headOffsetY - this.headHeight;
const headX = bodyX + (54 * this.magnitude - this.headWidth * this.magnitude / 2);
let headY = bodyY + (this.bodyHeight * this.magnitude - 7* this.magnitude) - this.headHeight * this.magnitude;
if (this.isEating === true) {
const eatMaxHeight = 20;
const eatingYOffset = ((Math.sin((timestamp * 2 * Math.PI * this.eatSpeed * 0.1) - Math.PI / 2) + 1) / 2) * eatMaxHeight;
headY -= eatingYOffset;
}
ctx.drawImage(this.headImage, headX, headY, this.headWidth * this.magnitude, this.headHeight * this.magnitude);
// Draw hat if any
if (this.hatImage.src) {
let hatXoffset = (this.headWidth*this.magnitude)/2 -(this.hatImage.width*this.magnitude)/2 + (2*this.magnitude);
let hatYoffset = (this.headHeight*this.magnitude) - (this.hatImage.height*this.magnitude) + (-11 * this.magnitude);
if(document.getElementById('elselectedHat').value === "cap"){
hatXoffset += this.magnitude*1.5
}
this.drawCrosshair(headX,headY,20)
ctx.drawImage(this.hatImage, headX + hatXoffset, headY + hatYoffset,this.hatImage.width*this.magnitude,this.hatImage.height*this.magnitude);
}
// Draw shell if any
if (this.shellImage.src) {
ctx.drawImage(this.shellImage, bodyX, bodyY, this.bodyWidth, this.bodyHeight);
}
}
drawCrosshair(x,y,size){
ctx.beginPath();
ctx.moveTo(x-size,y);
ctx.lineTo(x+size,y);
ctx.stroke();
ctx.beginPath();
ctx.moveTo(x,y-size);
ctx.lineTo(x,y+size);
ctx.stroke();
}
startEating() {
console.log("Larry starts eating");
console.log(this.eatDuration)
this.isEating = true;
setTimeout(() => {
this.isEating = false;
console.log("Larry stops eating");
}, this.eatDuration); // Adjust duration as needed
}
applyHat() {
const hatSelection = document.getElementById('elselectedHat').value;
if (hatSelection === "") {
this.hatImage.src = ``;
}
else {
this.hatImage.src = `larry_photos/hats/${hatSelection}.png`;
}
}
wander() {
console.log("Larry starts wandering");
// Implement wandering logic here
}
applyShell() {
const shellSelection = document.getElementById('elselectedShell').value;
this.shellImage.src = `larry_photos/shells/${shellSelection}.png`;
}
applyBackground() {
const backgroundSelection = document.getElementById('elselectedBackground').value;
this.backgroundImage.src = `larry_photos/backgrounds/${backgroundSelection}.png`;
}
}
class PolyTwistColourWidth extends BaseShape {
constructor(sides, width, line_width, depth, rotation, speedMultiplier, colour1, colour2) {
super();
this.sides = sides;
this.width = width;
this.line_width = line_width;
this.depth = depth;
this.rotation = rotation;
this.speedMultiplier = speedMultiplier;
this.colour1 = colour1;
this.colour2 = colour2;
}
draw(rotation) {
rotation *= (this.speedMultiplier / 100)
let out_angle = 0;
const innerAngle = 180 - ((this.sides - 2) * 180) / this.sides;
const scopeAngle = rotation - (innerAngle * Math.floor(rotation / innerAngle));
if (scopeAngle < innerAngle / 2) {
out_angle = innerAngle / (2 * Math.cos((2 * Math.PI * scopeAngle) / (3 * innerAngle))) - innerAngle / 2;
} else {
out_angle = -innerAngle / (2 * Math.cos(((2 * Math.PI) / 3) - ((2 * Math.PI * scopeAngle) / (3 * innerAngle)))) + (innerAngle * 3) / 2;
}
let minWidth = Math.sin(rad(innerAngle / 2)) * (0.5 / Math.tan(rad(innerAngle / 2))) * 2;
let widthMultiplier = minWidth / Math.sin(Math.PI / 180 * (90 + innerAngle / 2 - out_angle + innerAngle * Math.floor(out_angle / innerAngle)));
for (let i = 0; i < this.depth; i++) {
const fraction = i / this.depth;
const ncolour = LerpHex(this.colour1, this.colour2, fraction);
DrawPolygon(this.sides, this.width * widthMultiplier ** i, out_angle * i + this.rotation, ncolour, this.line_width);
}
}
}
class FloralPhyllo extends BaseShape {
constructor(width, depth, start, colour1, colour2) {
super();
this.width = width;
this.depth = depth;
this.start = start;
this.colour1 = colour1;
this.colour2 = colour2;
this.speedMultiplier = 500;
}
draw(rotation) {
rotation *= (this.speedMultiplier / 500)
rotation += this.start
// var c = 24; //something to do with width. but not width
var c = 1; //something to do with width. but not width
//dont make larger than 270 unless altering the number of colours in lerpedColours
for (let n = this.depth; n > 0; n -= 1) {
let colVal = waveNormal(n, this.depth)
let ncolour = LerpHex(this.colour1, this.colour2, n / this.depth);
const a = n * rotation / 1000; //137.5;
const r = c * Math.sqrt(n);
const x = r * Math.cos(a) + centerX;
const y = r * Math.sin(a) + centerY;
drawEyelid(n * 2.4 + 40, x, y, ncolour);
}
}
}
class Spiral1 extends BaseShape {
constructor(sides, width, colour) {
super();
this.sides = sides;
this.width = width;
this.colour = colour;
}
draw(rotation) {
rotation *= (this.speedMultiplier / 100)
var rot = Math.round((this.sides - 2) * 180 / this.sides * 2)
var piv = 360 / this.sides;
var stt = 0.5 * Math.PI - rad(rot) //+ rad(rotation);
var end = 0;
var n = this.width / ((this.width / 10) * (this.width / 10)) //pixel correction for mid leaf
for (let i = 1; i < this.sides + 1; i++) {
end = stt + rad(rot);
ctx.lineWidth = 5
ctx.beginPath();
ctx.arc(centerX + Math.cos(rad(90 + piv * i + rotation)) * this.width, centerY + Math.sin(rad(90 + piv * i + rotation)) * this.width, this.width, stt + rad(rotation) - (stt - end) / 2, end + rad(rotation) + rad(n), 0);
ctx.strokeStyle = this.colour;
ctx.stroke();
ctx.beginPath();
ctx.arc(centerX + Math.cos(rad(90 + piv * i - rotation)) * this.width, centerY + Math.sin(rad(90 + piv * i - rotation)) * this.width, this.width, stt - rad(rotation), end - (end - stt) / 2 + rad(n) - rad(rotation), 0);
ctx.strokeStyle = this.colour;
ctx.stroke();
stt = end + -(rad(rot - piv)) //+rad(30);
}
}
}
class FloralAccident extends BaseShape {
constructor(sides, width, colour) {
super();
this.sides = sides;
this.width = width;
this.colour = colour;
}
draw(rotation) {
rotation *= (this.speedMultiplier / 100)
var rot = Math.round((this.sides - 2) * 180 / this.sides * 2)
var piv = 360 / this.sides;
var stt = 0.5 * Math.PI - rad(rot) //+ rad(rotation);
var end = 0;
var n = this.width / ((this.width / 10) * (this.width / 10)) //pixel correction for mid leaf
for (let i = 1; i < this.sides + 1; i++) {
end = stt + rad(rot);
ctx.beginPath();
ctx.arc(centerX + Math.cos(rad(90 + piv * i + rotation)) * this.width, centerY + Math.sin(rad(90 + piv * i + rotation)) * this.width, this.width, stt - (stt - end + rad(rotation)) / 2, end + rad(n), 0);
ctx.strokeStyle = this.colour;
ctx.stroke();
ctx.beginPath();
ctx.arc(centerX + Math.cos(rad(90 + piv * i - rotation)) * this.width, centerY + Math.sin(rad(90 + piv * i - rotation)) * this.width, this.width, stt, end - (end - stt - rad(rotation)) / 2 + rad(n), 0);
ctx.strokeStyle = this.colour;
ctx.stroke();
stt = end + -(rad(rot - piv)) //+rad(30);
}
}
}
class FloralPhyllo_Accident extends BaseShape {
constructor(sides, width, colour1, colour2) {
super();
this.sides = sides;
this.width = width;
this.colour1 = colour1;
this.colour2 = colour2;
}
draw(rotation) {
rotation *= (this.speedMultiplier / 100)
var c = 24; //something to do with width. but not width
for (let n = 0; n < 300; n += 1) {
let ncolour = LerpHex(this.colour1, this.colour2, Math.cos(rad(n / 2)));
let a = n * (rotation / 1000 + 100); //137.5;
let r = c * Math.sqrt(n);
let x = r * Math.cos(a) + centerX;
let y = r * Math.sin(a) + centerY;
drawEyelidAccident(x, y);
}
}
}
class Nodal_expanding extends BaseShape {
constructor(expand, points, start, line_width, colour1, colour2, colour_change) {
super();
this.expand = expand;
this.points = points;
this.start = start;
this.line_width = line_width;
this.colour1 = colour1;
this.colour2 = colour2;
this.colour_change = colour_change
}
draw(rotation) {
rotation *= (this.speedMultiplier / 1000)
var angle = (360 / 3000 * rotation) + this.start //2000 controls speed
var length = this.expand;
for (let z = 1; z <= this.points; z++) { //why specifically 2500
ctx.beginPath();
let ncolour = LerpHex(this.colour1, this.colour2, z / this.points);
ctx.moveTo(centerX + (Math.cos(rad(angle * (z - 1) + 0)) * (length - this.expand)), centerY + (Math.sin(rad(angle * (z - 1) + 0)) * (length - this.expand)));
ctx.lineTo(centerX + (Math.cos(rad(angle * z + 0)) * length), centerY + (Math.sin(rad(angle * z + 0)) * length));
length += this.expand;
ctx.lineWidth = this.line_width;//try 1
ctx.strokeStyle = ncolour;
ctx.lineCap = "round"
// ctx.strokeStyle = colourToText(ncolour);
console.log(ncolour)
ctx.stroke();
}
}
}
class Phyllotaxis extends BaseShape {
constructor(width, start, nMax, wave, colour1, colour2) {
super();
this.width = width;
this.start = start;
this.nMax = nMax;
this.wave = wave;
this.colour1 = colour1;
this.colour2 = colour2;
}
drawWave(angle) {
angle /= 1000
const startColor = [45, 129, 252];
const endColor = [252, 3, 98];
const distanceMultiplier = 3;
const maxIterations = 200;
// angle=0;
for (let n = 0; n < maxIterations; n++) {
ctx.beginPath();
const nColor = lerpRGB(startColor, endColor, Math.cos(rad(n / 2)));
// const nAngle = n* angle ;
// const nAngle = n*angle+ Math.sin(rad(n*1+angle*4000))/1 ;
const nAngle = n * angle + Math.sin(rad(n * 1 + angle * 40000)) / 2;
const radius = distanceMultiplier * n;
const xCoord = radius * Math.cos(nAngle) + centerX;
const yCoord = radius * Math.sin(nAngle) + centerY;
ctx.arc(xCoord, yCoord, 8, 0, 2 * Math.PI);
ctx.fillStyle = colourToText(nColor);
ctx.fill();
}
}
drawSpiral(angle) {
angle /= 5000
const startColor = [45, 129, 252];
const endColor = [252, 3, 98];
const distanceMultiplier = 2;
const maxIterations = 1000;
for (let n = 0; n < maxIterations; n++) {
const nColor = lerpRGB(startColor, endColor, Math.cos(rad(n / 2)));
const nAngle = n * angle + Math.sin(angle * n * 2);
const radius = distanceMultiplier * n;
const xCoord = radius * Math.cos(nAngle) + centerX;
const yCoord = radius * Math.sin(nAngle) + centerY;
ctx.beginPath();
ctx.arc(xCoord, yCoord, 8, 0, 2 * Math.PI);
ctx.fillStyle = colourToText(nColor);
ctx.fill();
}
}
// Draw_nodal(300, 100, 31, rotation, "blue");
draw(rotation) {
rotation *= (this.speedMultiplier / 300)
rotation += this.start
const sizeMultiplier = this.nMax / (5 - 3)
if (this.wave === 1) {
this.drawWave(rotation)
}
else if (this.wave === 2) {
this.drawSpiral(rotation)
}
else {
for (let n = 0; n < this.nMax; n += 1) {
const ncolour = LerpHex(this.colour1, this.colour2, n / this.nMax);
// const ncolour = LerpHex(this.colour1, this.colour2, (n/this.nMax)**2);
const a = n * (rotation / 1000)//137.5;
const r = this.width * Math.sqrt(n);
const x = r * Math.cos(a) + centerX;
const y = r * Math.sin(a) + centerY;
ctx.beginPath();
ctx.arc(x, y, (n / sizeMultiplier) + 3, 0, 2 * Math.PI);
ctx.fillStyle = ncolour;
// ctx.fillStyle = colourToText(ncolour);
ctx.fill();
// console.log(this.c)
}
}
}
}
class SquareTwist_angle extends BaseShape {
constructor(width, line_width, colour1) {
super();
this.width = width;
this.line_width = line_width;
this.colour1 = colour1;
}
drawSquare(angle, size, colour) {
ctx.save();
ctx.translate(centerX, centerY)//-(Math.sin(rad(angle)) *centerX));
ctx.rotate(rad(angle + 180));
ctx.beginPath();
ctx.strokeStyle = colour;
ctx.lineWidth = this.line_width;
ctx.rect(-size / 2, -size / 2, size, size);
ctx.stroke();
ctx.restore();
}
// DrawSquareTwist_angle(400,0,rotation,"red")
draw(rotation) {
rotation *= (this.speedMultiplier / 100)
let out_angle = rotation;
let widthMultiplier = 1 / (2 * Math.sin(Math.PI / 180 * (130 - out_angle + 90 * Math.floor(out_angle / 90)))) + 0.5
for (let i = 0; i < 25; i++) {
this.drawSquare(rotation * i, this.width * widthMultiplier ** i, this.colour1)
}
}
}
class CircleExpand extends BaseShape {
constructor(nCircles, gap, linear, heart, colour1, colour2) {
super();
this.nCircles = nCircles;
this.gap = gap;
this.linear = linear;
this.heart = heart;
this.colour1 = colour1;
this.colour2 = colour2
}
lerpColor(a, b, amount) {
var ah = +a.replace('#', '0x'),
ar = ah >> 16, ag = ah >> 8 & 0xff, ab = ah & 0xff,
bh = +b.replace('#', '0x'),
br = bh >> 16, bg = bh >> 8 & 0xff, bb = bh & 0xff,
rr = ar + amount * (br - ar),
rg = ag + amount * (bg - ag),
rb = ab + amount * (bb - ab);
return '#' + ((1 << 24) + (rr << 16) + (rg << 8) + rb | 0).toString(16).slice(1);
}
arraySort(x, y) {
if (x.r > y.r) {
return 1;
}
if (x.r < y.r) {
return -1;
}
return 0;
}
drawHeart(w, colour) {
// var w = 200
ctx.strokeStyle = "black";
ctx.fillStyle = colour;
ctx.lineWidth = 1;
var x = centerX - w / 2;
let y = centerY - w / 2
ctx.beginPath();
ctx.moveTo(x, y + w / 4);
ctx.quadraticCurveTo(x, y, x + w / 4, y);
ctx.quadraticCurveTo(x + w / 2, y, x + w / 2, y + w / 5);
ctx.quadraticCurveTo(x + w / 2, y, x + w * 3 / 4, y);
ctx.quadraticCurveTo(x + w, y, x + w, y + w / 4);
ctx.quadraticCurveTo(x + w, y + w / 2, x + w * 3 / 4, y + w * 3 / 4);
ctx.lineTo(x + w / 2, y + w);
ctx.lineTo(x + w / 4, y + w * 3 / 4);
ctx.quadraticCurveTo(x, y + w / 2, x, y + w / 4);
ctx.stroke();
ctx.fill();
}
draw(rotation) {
rotation *= (0.9)
ctx.strokeWeight = 1;
ctx.lineWidth = 1;
let arrOfWidths = []
let arrOfco = []
let intRot;
if (this.linear) {
intRot = Math.floor(rotation * 30) / 100
}
else {
intRot = Math.sin(rad(Math.floor(rotation * 30) / 4)) + rotation / 4
}
for (let i = 0; i < this.nCircles; i++) {
const width = this.gap * ((intRot + i) % this.nCircles);
const colour = (Math.sin(rad(i * (360 / this.nCircles) - 90)) + 1) / 2
arrOfWidths.push({ r: width, c: colour });
}
let newArr = arrOfWidths.sort(this.arraySort)
for (let i = this.nCircles - 1; i >= 0; i--) {
let newColour = this.lerpColor(this.colour1, this.colour2, newArr[i].c)
if (this.heart) {
this.drawHeart(newArr[i].r, newColour)
}
else {
ctx.beginPath();
ctx.arc(centerX, centerY, newArr[i].r, 0, 2 * Math.PI);
ctx.fillStyle = newColour;
ctx.fill();
ctx.stokeStyle = "black";
ctx.stroke();
}
}
}
}
class EyePrototype extends BaseShape {
constructor(x, y, rotate, flip, width, blink_speed, draw_spiral, spiral_full, draw_pupil, draw_expand, draw_hypno, line_width, colourPupil, colourSpiral, colourExpand) {
super();
this.x = x;
this.y = y;
this.rotate = rotate;
this.flip = flip
this.width = width;
this.blink_speed = blink_speed;
this.line_width = line_width;
this.step = 0;
this.opening = true;
this.counter = 0;
this.cooldown = 0;
this.draw_spiral = draw_spiral;
this.spiral_full = spiral_full;
this.draw_pupil = draw_pupil;
this.draw_expand = draw_expand;
this.draw_hypno = draw_hypno;
this.colourPupil = colourPupil;
this.colourSpiral = colourSpiral;
this.colourExpand = colourExpand;
this.centerPulse = new CircleExpand(10, 30, 1, 0, "#2D81FC", "#FC0362")
}
drawEyelid(rotation) {
ctx.strokeStyle = "orange";
let relCenterX = centerX + this.x;
let relCenterY = centerY + this.y;
rotation *= (this.speedMultiplier / 100)
ctx.lineWidth = 1;
ctx.beginPath();
let newPoint = 0
let newPoint1 = 0
let addedRotate = this.flip ? 90 : 0
newPoint = rotatePoint(- this.width / 2, 0, this.rotate + addedRotate)
ctx.moveTo(relCenterX + newPoint[0], relCenterY + newPoint[1]);
newPoint = rotatePoint(0, - rotation / 400 * this.width, this.rotate + addedRotate)
newPoint1 = rotatePoint(this.width / 2, 0, this.rotate + addedRotate)
ctx.quadraticCurveTo(relCenterX + newPoint[0], relCenterY + newPoint[1], relCenterX + newPoint1[0], relCenterY + newPoint1[1]);
newPoint = rotatePoint(- this.width / 2, 0, this.rotate + addedRotate)
ctx.moveTo(relCenterX + newPoint[0], relCenterY + newPoint[1]);
newPoint = rotatePoint(0, + rotation / 400 * this.width, this.rotate + addedRotate)
newPoint1 = rotatePoint(this.width / 2, 0, this.rotate + addedRotate)
ctx.quadraticCurveTo(relCenterX + newPoint[0], relCenterY + newPoint[1], relCenterX + newPoint1[0], relCenterY + newPoint1[1]);
ctx.stroke();
}
eyelidCut(rotation) {
let relCenterX = centerX + this.x;
let relCenterY = centerY + this.y;
let newPoint = 0
let newPoint1 = 0
let addedRotate = this.flip ? 90 : 0
// ctx.lineWidth = 1;
let squarePath = new Path2D();
newPoint = rotatePoint(- this.width / 2, 0, this.rotate + addedRotate)
squarePath.moveTo(relCenterX + newPoint[0], relCenterY + newPoint[1]);
newPoint = rotatePoint(0, - rotation / 400 * this.width, this.rotate + addedRotate)
newPoint1 = rotatePoint(this.width / 2, 0, this.rotate + addedRotate)
squarePath.quadraticCurveTo(relCenterX + newPoint[0], relCenterY + newPoint[1], relCenterX + newPoint1[0], relCenterY + newPoint1[1]);
newPoint = rotatePoint(- this.width / 2, 0, this.rotate + addedRotate)
squarePath.moveTo(relCenterX + newPoint[0], relCenterY + newPoint[1]);
newPoint = rotatePoint(0, + rotation / 400 * this.width, this.rotate + addedRotate)
newPoint1 = rotatePoint(this.width / 2, 0, this.rotate + addedRotate)
squarePath.quadraticCurveTo(relCenterX + newPoint[0], relCenterY + newPoint[1], relCenterX + newPoint1[0], relCenterY + newPoint1[1]);
ctx.clip(squarePath);
}
drawGrowEye(step) {
// console.log(step)
ctx.strokeStyle = this.colourExpand
ctx.beginPath();
ctx.lineWidth = 5;
ctx.arc(centerX + this.x, centerY + this.y, step, 0, 2 * Math.PI);
ctx.stroke();
}
drawCircle(step) {
ctx.strokeStyle = this.colourPupil
ctx.beginPath();
ctx.lineWidth = 5;
ctx.arc(centerX + this.x, centerY + this.y, step, 0, 2 * Math.PI);
ctx.stroke();
}
drawSpiral(step) {
ctx.strokeStyle = this.colourSpiral;
let a = 1
let b = 5
ctx.moveTo(centerX, centerY);
ctx.beginPath();
let max = this.spiral_full ? this.width : this.width / 2
for (let i = 0; i < max; i++) {
let angle = 0.1 * i;
let x = centerX + (a + b * angle) * Math.cos(angle + step / 2);
let y = centerY + (a + b * angle) * Math.sin(angle + step / 2);
ctx.lineTo(x + this.x, y + this.y);
}
ctx.lineWidth = 3;
ctx.stroke();
}
stepFunc() {
if (this.cooldown != 0) {
this.cooldown--;
} else {
if (this.opening == true) {
if (this.step >= 200) {
this.cooldown = 200;
this.opening = false;
this.step -= this.blink_speed;
} else {
this.step += this.blink_speed;
}
} else {
if (this.step <= 0) {
this.opening = true;
this.step += this.blink_speed;
} else {
this.step -= this.blink_speed;
}
}
}
}
draw(rotation) {
let speedMult = 50
console.log(this.blink_speed)
let waitTime = this.blink_speed
let cap = 200
let d = waitTime * speedMult * 10
let a = cap * 2 + d
let outputRotation = Math.min(Math.abs((Math.floor(rotation * speedMult) % a) - a / 2 - d / 2), cap)
ctx.fillStyle = "black";
ctx.save();
this.drawEyelid(outputRotation);
// squareCut();
this.eyelidCut(outputRotation);
// console.log(Math.floor(this.counter % this.width / 2))
if (Math.floor(this.counter % (this.width / 4)) === 0) {
this.counter = 0;
}
ctx.fillStyle = "black";
ctx.fillRect(this.x - this.width / 2 + centerX, 0, this.width, ctx.canvas.height);
if (this.draw_expand) {
this.drawGrowEye(this.width / 4 + this.counter);
}
if (this.draw_hypno) {
this.centerPulse.draw(rotation)
}
if (this.draw_spiral) {
this.drawSpiral(rotation)
}
if (this.draw_pupil) {
this.drawCircle(this.width / 4);
}
ctx.restore();
this.stepFunc();
this.counter++;
}
}
class MaryFace extends BaseShape {
constructor(x1, y1, rotate1, width1, x2, y2, rotate2, width2) {
super();
this.x1 = x1;
this.y1 = y1;
this.rotate1 = rotate1;
this.width1 = width1;
this.x2 = x2;
this.y2 = y2;
this.rotate2 = rotate2;
this.width2 = width2;
this.eye1 = new EyePrototype(x1, y1, rotate1, 0, width1, 10, 1, 1, 0, 0, 0, 1, "#00fffb", "#00fffb", "#00fffb")
this.eye2 = new EyePrototype(x2, y2, rotate2, 0, width2, 10, 1, 1, 0, 0, 0, 1, "#00fffb", "#00fffb", "#00fffb")
// this.eye3 = new EyePrototype(112, -280, rotate2+2,1, width2, 10, 1, 1, 0, 0, 1, "#00fffb", "#00fffb", "#00fffb")
this.eye3 = new EyePrototype(110, -280, rotate2 + 2, 1, width2, 10, 1, 1, 0, 0, 0, 1, "#00fffb", "#00fffb", "#00fffb")//maybe
}
draw(rotation) {
let img = new Image();
img.src = "maryFace.png";
ctx.drawImage(img, centerX - img.width / 2, centerY - img.height / 2);
this.eye1.draw(rotation);
this.eye2.draw(rotation);
this.eye3.draw(rotation);
}
}
class NewWave extends BaseShape {
constructor(width, sides, step, lineWidth, limiter) {
super();
this.width = width
this.sides = sides;
this.step = step;
this.lineWidth = lineWidth;
this.limiter = limiter;
}
draw(rotation) {
rotation *= this.speedMultiplier / 400
ctx.lineWidth = this.lineWidth
for (let j = 0; j < this.sides; j++) {
const radRotation = rad(360 / this.sides * j)
const inverter = 1 - (j % 2) * 2
let lastX = centerX
let lastY = centerY
for (let i = 0; i < this.width; i += this.step) {
ctx.beginPath();
ctx.moveTo(lastX, lastY);
ctx.strokeStyle = colourToText(lerpRGB([255, 51, 170], [51, 170, 255], i / this.width))
const x = i
const y = (Math.sin(-i * inverter / 30 + rotation * inverter) * i / (this.limiter / 100))
const xRotated = x * Math.cos(radRotation) - y * Math.sin(radRotation)
const yRotated = x * Math.sin(radRotation) + y * Math.cos(radRotation)
lastX = centerX + xRotated;
lastY = centerY + yRotated;
ctx.lineTo(centerX + xRotated, centerY + yRotated);
ctx.stroke();
}
}
}
}

View File

@@ -0,0 +1,359 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 26.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
<!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
<!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
<!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
<!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
<!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
<!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
<!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
<!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
]>
<svg version="1.1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="750px" height="750px"
viewBox="0 0 750 750" style="enable-background:new 0 0 750 750;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
.st1{fill:#FB8604;}
.st2{fill:none;stroke:#FB8604;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{fill:none;stroke:#FB8604;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;}
.st4{fill:none;stroke:#FB8604;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1684,5.2807;}
.st5{fill:none;stroke:#FB8604;stroke-width:2.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0898,5.1496;}
.st6{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;}
.st7{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0028,7.0049;}
.st8{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0187,7.0327;}
.st9{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0037,7.0065;}
.st10{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9928,6.9873;}
.st11{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9957,6.9924;}
.st12{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9878,6.9786;}
.st13{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0054,7.0094;}
.st14{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9755,6.9571;}
.st15{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.972,6.9511;}
.st16{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0334,7.0584;}
.st17{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9725,6.9518;}
.st18{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0038,7.0066;}
.st19{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9879,6.9789;}
.st20{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9711,6.9495;}
.st21{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0154,7.027;}
.st22{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9691,6.946;}
.st23{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0146,7.0255;}
.st24{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9984,6.9972;}
.st25{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0136,7.0239;}
.st26{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0202,7.0354;}
.st27{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0512,7.0896;}
.st28{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.1218,7.2131;}
.st29{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.039,7.0682;}
.st30{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0036,7.0063;}
.st31{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0478,7.0836;}
.st32{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9687,6.9451;}
.st33{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0627,7.1098;}
.st34{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0819,7.1433;}
.st35{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9767,6.9593;}
.st36{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9929,6.9875;}
.st37{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:4.0173,7.0303;}
.st38{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.961,6.9318;}
.st39{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.947,6.9073;}
.st40{fill:none;stroke:#FB8604;stroke-width:3.25;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.9908,6.9839;}
.st41{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9966,4.9944;}
.st42{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;}
.st43{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9096,4.8493;}
.st44{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3193,5.5322;}
.st45{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9558,4.9263;}
.st46{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2618,5.4363;}
.st47{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0169,5.0281;}
.st48{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.5291,4.2151;}
.st49{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.103,5.1717;}
.st50{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9575,4.9292;}
.st51{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3365,5.5609;}
.st52{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1424,5.2373;}
.st53{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1363,5.2272;}
.st54{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7994,4.6656;}
.st55{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8999,4.8332;}
.st56{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0099,5.0165;}
.st57{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.844,3.0734;}
.st58{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9022,4.8371;}
.st59{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.0395,3.3991;}
.st60{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1923,5.3205;}
.st61{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9539,4.9232;}
.st62{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0075,5.0125;}
.st63{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3534,5.5889;}
.st64{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9667,4.9445;}
.st65{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1331,5.2219;}
.st66{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0872,5.1454;}
.st67{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8949,4.8248;}
.st68{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9725,4.9542;}
.st69{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0386,5.0643;}
.st70{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0094,5.0156;}
.st71{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0371,5.0618;}
.st72{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1062,5.177;}
.st73{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0125,5.0208;}
.st74{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9084,4.8473;}
.st75{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0296,5.0494;}
.st76{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9662,4.9437;}
.st77{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2029,5.3381;}
.st78{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9909,4.9849;}
.st79{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.4809,5.8015;}
.st80{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.4766,5.7943;}
.st81{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1471,5.2451;}
.st82{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9268,4.878;}
.st83{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9785,4.9641;}
.st84{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0427,5.0712;}
.st85{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0948,5.1579;}
.st86{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0479,5.0798;}
.st87{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1288,5.2146;}
.st88{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0295,5.0492;}
.st89{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0562,5.0937;}
.st90{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0096,5.0161;}
.st91{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0214,5.0356;}
.st92{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9114,4.8524;}
.st93{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0352,5.0587;}
.st94{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7643,4.6072;}
.st95{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.058,5.0966;}
.st96{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7966,4.661;}
.st97{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.7367,2.8946;}
.st98{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7663,4.6105;}
.st99{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.9235,3.2058;}
.st100{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0393,5.0655;}
.st101{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8203,4.7005;}
.st102{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9792,4.9653;}
.st103{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1822,5.3036;}
.st104{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0113,5.0189;}
.st105{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1551,5.2585;}
.st106{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.018,5.0301;}
.st107{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.4824,5.8041;}
.st108{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.3801,3.9668;}
.st109{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0129,5.0216;}
.st110{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.625,2.7083;}
.st111{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.9221,3.2035;}
.st112{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1124,5.1874;}
.st113{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0952,5.1586;}
.st114{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9708,4.9513;}
.st115{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.5755,4.2925;}
.st116{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0041,5.0068;}
.st117{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9986,4.9977;}
.st118{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1488,5.2479;}
.st119{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1057,5.1761;}
.st120{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9579,4.9299;}
.st121{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8749,4.7914;}
.st122{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0643,5.1071;}
.st123{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1274,5.2123;}
.st124{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1,5.1667;}
.st125{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8472,4.7454;}
.st126{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1118,5.1863;}
.st127{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0106,5.0177;}
.st128{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7458,4.5763;}
.st129{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9343,4.8906;}
.st130{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.4131,5.6885;}
.st131{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2838,5.473;}
.st132{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9369,4.8948;}
.st133{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.4913,4.1522;}
.st134{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0222,5.037;}
.st135{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1123,5.1871;}
.st136{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0602,5.1004;}
.st137{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1376,5.2294;}
.st138{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8568,4.7613;}
.st139{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.3279,3.8798;}
.st140{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:1.5312,2.552;}
.st141{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9978,4.9963;}
.st142{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3089,5.5148;}
.st143{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8474,4.7456;}
.st144{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2084,5.3473;}
.st145{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8968,4.828;}
.st146{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1168,5.1947;}
.st147{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.981,4.9683;}
.st148{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9834,4.9723;}
.st149{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0096,5.016;}
.st150{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0425,5.0708;}
.st151{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.5109,4.1848;}
.st152{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9658,4.943;}
.st153{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8709,4.7848;}
.st154{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1073,5.1789;}
.st155{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3657,5.6095;}
.st156{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.008,5.0134;}
.st157{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9888,4.9813;}
.st158{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8942,4.8236;}
.st159{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2728,5.4547;}
.st160{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.717,4.5283;}
.st161{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.053,5.0883;}
.st162{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.084,5.14;}
.st163{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0483,5.0805;}
.st164{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9472,4.9121;}
.st165{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0489,5.0815;}
.st166{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2105,5.3508;}
.st167{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1121,5.1868;}
.st168{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9144,4.8574;}
.st169{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2099,5.3498;}
.st170{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0035,5.0059;}
.st171{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0979,5.1632;}
.st172{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0377,5.0628;}
.st173{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.895,4.825;}
.st174{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8221,4.7035;}
.st175{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0558,5.0931;}
.st176{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.28,5.4666;}
.st177{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0048,5.0079;}
.st178{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8024,4.6707;}
.st179{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9867,4.9779;}
.st180{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1426,5.2376;}
.st181{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7353,4.5588;}
.st182{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.6394,4.399;}
.st183{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0205,5.0341;}
.st184{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.8833,4.8055;}
.st185{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3253,5.5422;}
.st186{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.2789,5.4648;}
.st187{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.2975,3.8292;}
.st188{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7364,4.5607;}
.st189{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9916,4.986;}
.st190{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.003,5.005;}
.st191{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9847,4.9746;}
.st192{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.1766,5.2943;}
.st193{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7665,4.6108;}
.st194{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.6685,4.4475;}
.st195{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0516,5.0859;}
.st196{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.9141,4.8569;}
.st197{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3649,5.6082;}
.st198{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.3143,5.5238;}
.st199{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.327,3.8783;}
.st200{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:2.7654,4.6089;}
.st201{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0036,5.006;}
.st202{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:3.0013,5.0021;}
.st203{fill:none;stroke:#FB8604;stroke-width:2.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st204{fill:none;stroke:#FB8604;stroke-width:3.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
</style>
<metadata>
<sfw xmlns="&ns_sfw;">
<slices></slices>
<sliceSourceBounds bottomLeftOrigin="true" height="13470.3" width="4626" x="-2000" y="-4314"></sliceSourceBounds>
</sfw>
</metadata>
<g id="FILL-BACKGROUND">
<rect class="st0" width="750" height="750"/>
</g>
<g id="N-DIMENSIONS">
</g>
<g id="N-TEXT">
</g>
<g id="_x32_D_x24_AG-DIAGRAM">
<g id="POLYLINE_00000019637509149587408630000017135930699805897140_">
<g>
<g>
<line class="st6" x1="64.63" y1="542.91" x2="66.63" y2="542.91"/>
<line class="st17" x1="73.58" y1="542.91" x2="583.55" y2="542.91"/>
<line class="st6" x1="587.02" y1="542.91" x2="589.02" y2="542.91"/>
</g>
</g>
</g>
</g>
<g id="_x32_D_x24_AG-DETAILS-DIAGRAM">
</g>
<g id="_x32_D_x24_AG-DETAILS">
</g>
<g id="_x32_D_x24_AG-ANIMALS">
<g id="POLYLINE_00000057124465893097847600000004400792138133572256_">
<path class="st203" d="M175.95,509.79c-6.98,1.19-14.84,2.26-21.88,2.95c-7.13,0.66-23.77,1.85-30.89,3.17
c-4.79,0.8-9.62,1.9-14.28,3.27c-4.03,1.18-8.09,2.6-11.92,4.33c-2.54,1.16-5.13,2.49-7.43,4.09c-2.78,1.92-5.31,4.28-7.19,7.1
c-1.04,1.57-1.92,3.29-2.34,5.14c0,0-0.03,0.14-0.03,0.14l-0.03,0.13c0,0-0.01,0.07-0.01,0.07s-0.01,0.06-0.01,0.06
s-0.01,0.06-0.01,0.06c-0.03,0.26-0.07,0.52-0.06,0.78c0,0,0,0.05,0,0.05s0,0.05,0,0.05s0,0.05,0,0.05s0,0.05,0,0.05
s0,0.05,0,0.05s0,0.02,0,0.02s0,0.02,0,0.02s0,0.02,0,0.02c0.02,0.13,0.04,0.26,0.08,0.38c0.09,0.3,0.29,0.56,0.55,0.73
c0.38,0.24,0.83,0.32,1.27,0.37c0.3,0.33,438.56-0.14,439.22,0.04c0,0,3.05-0.03,3.05-0.03s2.83-0.05,2.83-0.05l2.61-0.09
c3.51-0.16,7.14-0.43,10.56-1.31c1.4-0.34,2.8-0.81,4.16-1.28c0,0,9.84-3.51,9.84-3.51s0.98-0.37,0.98-0.37s1.01-0.39,1.01-0.39
s1.04-0.42,1.04-0.42s1.07-0.45,1.07-0.45c0.9-0.39,1.91-0.85,2.79-1.28c5.13-2.5,9.96-5.69,14.34-9.36
c7.45-6.22,13.56-13.99,18.32-22.43c3.91-6.93,7.09-14.35,9.28-22.01c3.33-11.18,3.67-24.31,5.98-35.7
c1.52-7.68,4.62-15.02,8.69-21.69c3.8-6.26,8.43-12.06,13.66-17.19c0,0,1.02-0.99,1.02-0.99s4.57-4.29,4.57-4.29
s0.79-0.76,0.79-0.76s0.38-0.37,0.38-0.37s0.37-0.37,0.37-0.37l0.36-0.37c0,0,0.34-0.36,0.34-0.36c1.12-1.2,2.17-2.53,2.92-3.99
c1.04-2,1.59-4.26,1.54-6.52c-0.03-1.86-0.48-3.69-1.16-5.41l-1.01-2.53c-0.57-1.51-1.12-3.22-0.55-4.81
c0.32-0.89,0.94-1.63,1.64-2.26c1.12-0.99,2.45-1.72,3.81-2.31c6.46-2.75,13.7-2.47,20.56-1.88c2.86,0.25,7.39,0.89,10.25,1.11
c0.62,0.04,1.27,0.07,1.89,0.05c0.72-0.03,1.47-0.12,2.12-0.46c0.58-0.3,1.02-0.83,1.25-1.45c0.3-0.8,0.29-1.68,0.15-2.52
c-0.18-1.02-0.61-2.05-1.41-2.74c-0.4-0.35-0.9-0.6-1.42-0.71c-0.55-0.12-1.13-0.13-1.7-0.12c-1.07,0.03-3.08,0.14-4.14,0.14
c-1.46,0.02-3.22-0.07-4.69-0.17c0,0-10.33-0.76-10.33-0.76c-1.4-0.11-12.11-0.53-13.77-0.6c-3.91-0.23-7.88-0.68-11.58-1.99
c-1.97-0.68-3.89-1.58-5.72-2.58c-3.08-1.64-11.58-7.14-14.66-9.04l-2.39-1.44l-3.66-2.11c0,0-0.38-0.22-0.38-0.22
s-0.37-0.23-0.37-0.23c-0.09-0.07-0.28-0.17-0.37-0.23c-0.48-0.32-0.96-0.66-1.4-1.04c-2.03-1.73-3.4-4.08-4.43-6.51
c-1.29-2.89-1.76-6.11-2.13-9.24c-0.44-3.81-0.81-9.21-1.06-13.08c-1-16.74-2.21-45.09-2.62-61.85
c-0.23-10.61-0.21-21.92,0.64-32.5c0.47-5.53,0.96-14.11,1.88-19.5c0.33-1.83,0.71-3.71,1.59-5.37c0.65-1.26,1.75-2.3,2.5-3.49
c0.35-0.57,0.55-1.2,0.43-1.88c-0.15-0.89-0.73-1.65-1.46-2.16c-0.6-0.42-1.3-0.68-2.02-0.84c-1.53-0.33-3.14-0.26-4.67,0.06
c-1,0.22-2.03,0.55-2.83,1.22c-0.53,0.44-0.9,1.06-1.08,1.73c-0.17,0.63-0.2,1.29-0.18,1.94c0.11,2.44,0.47,5,0.33,7.46
c-0.04,1.01-0.13,2.24-0.22,3.25c0,0-0.21,2.32-0.21,2.32s-7.26,68.08-7.26,68.08c-0.67,6.9-3.86,46.65-4.81,52.59
c-0.45,3.25-1.13,6.57-2.02,9.72c-0.69,2.36-2.28,7.94-3.02,10.2c-1.03,0.52-2.44,1.16-3.42,1.74c-1.58,0.97-3.14,2.04-4.59,3.19
c-1.95,1.54-3.79,3.26-5.42,5.14c-1.39,1.6-2.62,3.39-3.74,5.18l-8.61,14.2c-7.17,11.38-14.95,23.45-23.19,34.07
c-3.56,4.5-7.31,9.03-11.71,12.73c-1.93,1.6-4.05,3.05-6.38,3.99c-1.25,0.5-2.57,0.87-3.92,0.94c-1.71,0.11-3.43-0.29-4.98-1"/>
</g>
<g id="POLYLINE_00000000936520979570235080000002186263548217956789_">
<path class="st203" d="M286.34,500.59c3.59-1.43,7.67-3.52,11.3-4.85c4.16-1.52,11.23-3.24,15.55-4.45
c11.86-3.4,23.54-7.9,34.71-13.1c3.04-1.44,6.21-3.06,9.1-4.74c2.68-1.51,8.16-5.1,10.84-6.85c2.32-1.48,4.72-2.95,7.21-4.13
c2.35-1.12,4.85-2.04,7.34-2.8c3.1-0.96,6.45-1.76,9.62-2.44c11.64-2.5,34.71-6.3,46.71-8.33c3.58-0.64,7.75-1.42,11.28-2.24
c4.71-1.08,9.48-2.55,14.02-4.18c4.31-1.61,15.7-5.44,19.72-7.33c3.37-1.58,6.71-3.45,9.37-6.09c0.98-0.99,1.84-2.13,2.31-3.45
c0.32-0.87,0.46-1.81,0.38-2.74c-0.08-0.91-0.36-1.8-0.83-2.58c-0.88-1.49-2.37-2.47-3.81-3.35c-3.46-2-6.9-4.07-9.82-6.77
c-1.4-1.27-2.69-2.68-3.8-4.21c-0.86-1.19-1.63-2.5-2.28-3.82c-2.34-4.77-3.98-10.2-6.41-14.93c-3.32-6.71-7.72-12.99-12.29-18.91
c-8.12-10.26-16.82-20.44-26.36-29.41c-10.15-9.52-21.61-17.88-33.22-25.52c-8.81-5.76-18.16-11.38-27.51-16.21
c-8-4.1-16.38-7.75-25.04-10.2c-9.2-2.65-18.86-3.99-28.39-4.75c-12.59-0.95-25.46-0.97-38.05-0.07
c-8.33,0.61-16.85,1.77-24.99,3.63c-8.97,2.05-17.95,4.99-26.49,8.42c-11.43,4.64-22.66,10.26-32.72,17.41
c-8.19,5.79-15.67,12.74-22.37,20.2c-7.63,8.51-14.44,17.93-20.04,27.9c-6.47,11.5-11.46,23.99-14.17,36.92
c-5.04,23.84-2.95,49.25,6.23,71.85c3.31,8.08,7.57,15.89,12.8,22.9c3.03,4.05,6.38,7.93,10.16,11.3
c6.74,6.06,14.8,10.55,23.25,13.76c6.07,2.27,12.37,4.21,18.81,5.04c4.91,0.64,9.94,0.71,14.88,0.51c6.25-0.26,12.78-0.98,18.95-2
c11.33-1.92,22.74-4.93,32.67-10.88c6.87-4.07,12.91-9.48,18.25-15.38c4.44-4.9,8.57-10.2,12.25-15.7
c5.53-8.27,10.18-17.22,13.79-26.49c4.35-11.23,7.33-23.07,9.1-34.98c1.5-10.37,2.13-21.01,1.17-31.45
c-0.82-8.83-2.83-17.62-5.9-25.93c-1.96-5.3-4.38-10.53-7.13-15.47c-2.46-4.4-5.24-8.73-8.53-12.56
c-2.38-2.78-5.07-5.33-7.98-7.55c-4.66-3.55-9.91-6.35-15.31-8.6c-8.93-3.67-18.52-5.89-28.18-6.27
c-9.78-0.35-19.62,1.25-28.97,4.09c-15.4,4.72-30.1,12.79-41.01,24.8c-3.27,3.61-6.18,7.62-8.56,11.87
c-2.82,5.02-4.98,10.45-6.53,15.99c-2.28,8.25-3.31,16.96-2.33,25.49c0.55,4.75,1.71,9.49,3.65,13.87c1.5,3.38,3.5,6.57,6.1,9.21
c2.38,2.43,5.25,4.36,8.36,5.71c4.79,2.08,10.07,2.88,15.27,2.85c4.91-0.04,9.85-0.83,14.57-2.17
c6.94-1.98,13.53-5.34,19.04-10.04c3.8-3.22,7.05-7.08,9.83-11.21c3.3-4.93,6.02-10.32,8.05-15.89
c4.42-12.06,5.49-26.15-0.53-37.86c-1.85-3.57-4.39-6.81-7.55-9.3c-2.62-2.08-5.69-3.61-8.92-4.46
c-4.41-1.18-9.07-1.25-13.58-0.71c-4.75,0.59-9.46,1.83-13.89,3.64c-5.75,2.37-11.21,5.83-15.11,10.74
c-4.36,5.44-6.62,12.44-6.71,19.38c-0.01,2.8,0.34,5.65,1.42,8.25c1.01,2.49,2.79,4.68,5.11,6.06c1.92,1.16,4.14,1.78,6.37,2
c2.87,0.29,5.79-0.06,8.54-0.89c4.86-1.46,9.13-4.55,12.46-8.34c1.75-2.01,3.26-4.26,4.34-6.7c0.98-2.22,1.59-4.61,1.78-7.02
c0.26-3.43-0.23-7.07-2.09-10.02c-1.01-1.59-2.46-2.88-4.15-3.71c-1.46-0.72-3.08-1.12-4.7-1.28c-1.75-0.18-3.54-0.1-5.27,0.23
c-2.11,0.4-4.17,1.18-5.93,2.42c-1.77,1.26-3.2,2.95-4.28,4.82c-0.84,1.47-1.5,3.06-1.84,4.72c-0.27,1.35-0.31,2.81,0.22,4.11
c0.83,2.08,3.06,3.35,5.25,3.31c1.76-0.01,3.41-0.87,4.71-2.01c1.37-1.21,2.44-2.84,2.76-4.66c0.22-1.28,0.09-2.74-0.82-3.73
c-0.78-0.85-1.97-1.17-3.09-1.28"/>
</g>
<g id="POLYLINE_00000115514922511656778460000013334750149281772423_">
<path class="st203" d="M575.37,330.46c-1.99-3.36-3.79-7.59-5.3-11.22c-5.9-14.35-13.05-32.31-18.14-46.9
c-3.47-9.9-7.06-21.35-9.99-31.45c-1.27-4.59-3.15-10.91-4.05-15.54c-0.14-0.79-0.27-1.61-0.3-2.42
c-0.03-0.78,0.09-1.56,0.27-2.31c0.38-1.65,1.26-3.33,1.38-5.03c0.04-0.58-0.04-1.18-0.3-1.69c-0.64-1.21-2.01-1.82-3.32-1.99
c-1.19-0.15-2.41-0.01-3.56,0.32c-1.45,0.41-2.82,1.16-3.87,2.25c-0.74,0.76-1.29,1.74-1.22,2.83c0.03,0.67,0.26,1.32,0.54,1.92
c0.49,1.02,1.36,2.37,1.86,3.38c0.42,0.83,0.77,1.72,1.03,2.61c5.66,23.15,22.56,90.21,26.9,112.73c0.89,4.88,1.56,9.9,1.43,14.87
"/>
</g>
</g>
<g id="_x32_D_x24_AG-OUTLINE">
<g id="POLYLINE_00000154409289530670023290000013535996489216676241_">
<path class="st204" d="M175.95,509.79c-6.98,1.19-14.84,2.26-21.88,2.95c-7.13,0.66-23.77,1.85-30.89,3.17
c-4.79,0.8-9.62,1.9-14.28,3.27c-4.03,1.18-8.09,2.6-11.92,4.33c-2.54,1.16-5.13,2.49-7.43,4.09c-2.78,1.92-5.31,4.28-7.19,7.1
c-1.04,1.57-1.92,3.29-2.34,5.14c0,0-0.03,0.14-0.03,0.14l-0.03,0.13c0,0-0.01,0.07-0.01,0.07s-0.01,0.06-0.01,0.06
s-0.01,0.06-0.01,0.06c-0.03,0.26-0.07,0.52-0.06,0.78c0,0,0,0.05,0,0.05s0,0.05,0,0.05s0,0.05,0,0.05s0,0.05,0,0.05
s0,0.05,0,0.05s0,0.02,0,0.02s0,0.02,0,0.02s0,0.02,0,0.02c0.02,0.13,0.04,0.26,0.08,0.38c0.09,0.3,0.29,0.56,0.55,0.73
c0.38,0.24,0.83,0.32,1.27,0.37c0.3,0.33,438.56-0.14,439.22,0.04c0,0,3.05-0.03,3.05-0.03s2.83-0.05,2.83-0.05l2.61-0.09
c3.51-0.16,7.14-0.43,10.56-1.31c1.4-0.34,2.8-0.81,4.16-1.28c0,0,9.84-3.51,9.84-3.51s0.98-0.37,0.98-0.37s1.01-0.39,1.01-0.39
s1.04-0.42,1.04-0.42s1.07-0.45,1.07-0.45c0.9-0.39,1.91-0.85,2.79-1.28c5.13-2.5,9.96-5.69,14.34-9.36
c7.45-6.22,13.56-13.99,18.32-22.43c3.91-6.93,7.09-14.35,9.28-22.01c3.33-11.18,3.67-24.31,5.98-35.7
c1.52-7.68,4.62-15.02,8.69-21.69c3.8-6.26,8.43-12.06,13.66-17.19c0,0,1.02-0.99,1.02-0.99s4.57-4.29,4.57-4.29
s0.79-0.76,0.79-0.76s0.38-0.37,0.38-0.37s0.37-0.37,0.37-0.37l0.36-0.37c0,0,0.34-0.36,0.34-0.36c1.12-1.2,2.17-2.53,2.92-3.99
c1.04-2,1.59-4.26,1.54-6.52c-0.03-1.86-0.48-3.69-1.16-5.41l-1.01-2.53c-0.57-1.51-1.12-3.22-0.55-4.81
c0.32-0.89,0.94-1.63,1.64-2.26c1.12-0.99,2.45-1.72,3.81-2.31c6.46-2.75,13.7-2.47,20.56-1.88c2.86,0.25,7.39,0.89,10.25,1.11
c0.62,0.04,1.27,0.07,1.89,0.05c0.72-0.03,1.47-0.12,2.12-0.46c0.58-0.3,1.02-0.83,1.25-1.45c0.3-0.8,0.29-1.68,0.15-2.52
c-0.18-1.02-0.61-2.05-1.41-2.74c-0.4-0.35-0.9-0.6-1.42-0.71c-0.55-0.12-1.13-0.13-1.7-0.12c-1.07,0.03-3.08,0.14-4.14,0.14
c-1.46,0.02-3.22-0.07-4.69-0.17c0,0-10.33-0.76-10.33-0.76c-1.4-0.11-12.11-0.53-13.77-0.6c-3.91-0.23-7.88-0.68-11.58-1.99
c-1.97-0.68-3.89-1.58-5.72-2.58c-3.08-1.64-11.58-7.14-14.66-9.04l-2.39-1.44l-3.66-2.11c0,0-0.38-0.22-0.38-0.22
s-0.37-0.23-0.37-0.23c-0.09-0.07-0.28-0.17-0.37-0.23c-0.48-0.32-0.96-0.66-1.4-1.04c-2.03-1.73-3.4-4.08-4.43-6.51
c-1.29-2.89-1.76-6.11-2.13-9.24c-0.44-3.81-0.81-9.21-1.06-13.08c-1-16.74-2.21-45.09-2.62-61.85
c-0.23-10.61-0.21-21.92,0.64-32.5c0.47-5.53,0.96-14.11,1.88-19.5c0.33-1.83,0.71-3.71,1.59-5.37c0.65-1.26,1.75-2.3,2.5-3.49
c0.35-0.57,0.55-1.2,0.43-1.88c-0.15-0.89-0.73-1.65-1.46-2.16c-0.6-0.42-1.3-0.68-2.02-0.84c-1.53-0.33-3.14-0.26-4.67,0.06
c-1,0.22-2.03,0.55-2.83,1.22c-0.53,0.44-0.9,1.06-1.08,1.73c-0.17,0.63-0.2,1.29-0.18,1.94c0.11,2.44,0.47,5,0.33,7.46
c-0.04,1.01-0.13,2.24-0.22,3.25c0,0-0.21,2.32-0.21,2.32s-7.26,68.08-7.26,68.08c-0.71,7.27-3.84,46.7-4.87,53.03
c-0.33,2.26-0.77,4.56-1.34,6.77c-2.06-3.34-3.81-7.59-5.34-11.23c-5.9-14.35-13.05-32.31-18.14-46.9
c-4.9-14.18-9.7-29.49-13.4-44.04c-0.41-1.84-0.92-3.75-0.94-5.64c0-0.82,0.16-1.64,0.37-2.43c0.36-1.32,1.01-2.77,1.22-4.12
c0.09-0.58,0.1-1.2-0.07-1.77c-0.18-0.61-0.59-1.13-1.09-1.51c-0.96-0.73-2.2-1-3.39-0.99c-1.52,0.01-3.05,0.4-4.39,1.11
c-0.91,0.49-1.76,1.12-2.41,1.93c-0.32,0.4-0.59,0.86-0.74,1.36c-0.14,0.47-0.16,0.97-0.09,1.45c0.13,0.86,0.53,1.65,0.95,2.4
c0.84,1.44,1.8,3.05,2.28,4.64c0.32,0.99,0.71,2.52,0.98,3.54c0,0,19.65,80.58,19.65,80.58c2.4,10.49,5.72,23.63,7.26,34.25
c0.44,3.2,0.67,6.49,0.6,9.72c-1.54,1.71-2.89,3.65-4.11,5.6l-8.61,14.2c-7.17,11.38-14.95,23.45-23.19,34.07
c-3.56,4.5-7.31,9.03-11.71,12.73c-1.93,1.6-4.05,3.05-6.38,3.99c-1.25,0.5-2.57,0.87-3.92,0.94c-1.71,0.11-3.43-0.29-4.98-1
c0-1.32-0.46-2.64-1.27-3.68c-0.9-1.16-2.16-1.98-3.39-2.74c-2.81-1.63-5.67-3.32-8.16-5.35c-2.95-2.37-5.55-5.24-7.3-8.61
c-1.58-2.96-3.02-6.87-4.27-10.02c-1.04-2.59-2.26-5.23-3.57-7.69c-4.71-8.83-11.05-16.88-17.42-24.55
c-7.48-8.92-15.46-17.79-24.24-25.46c-9.99-8.81-21.12-16.68-32.31-23.88c-13.65-8.62-27.87-16.98-43.14-22.39
c-16.82-5.94-34.94-7.28-52.66-7.48c-14.26-0.04-28.75,0.82-42.73,3.76c-9.81,2.07-19.57,5.21-28.87,8.94
c-8.19,3.31-16.39,7.22-23.99,11.73c-15.4,9.05-28.54,21.67-39.34,35.83c-14.36,18.85-24.76,41.16-27.67,64.8
c-3.43,27.23,2.05,55.91,16.83,79.19c3.5,5.44,7.51,10.63,12.15,15.16C167.92,504.27,171.83,507.26,175.95,509.79z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 461 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 727 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 715 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 808 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB