Compare commits

...

7 Commits

Author SHA1 Message Date
VogelT ba420d91aa Images SVG
2 months ago
VogelT 7fa6a4c531 Update Config
2 months ago
VogelT 03ce5a99e1 Update
2 months ago
VogelT 20f00b0abd Update
10 months ago
VogelT 0715ccb3e9 Update
10 months ago
VogelT 2f02138e39 Next level
11 months ago
VogelT 878a44b78d Last Version
11 months ago

@ -0,0 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8

@ -1,4 +1,14 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.codeComplete.argumentPrefixes=
org.eclipse.jdt.core.codeComplete.argumentSuffixes=
org.eclipse.jdt.core.codeComplete.fieldPrefixes=m_,i_
org.eclipse.jdt.core.codeComplete.fieldSuffixes=
org.eclipse.jdt.core.codeComplete.localPrefixes=
org.eclipse.jdt.core.codeComplete.localSuffixes=
org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=m_,i_
org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
org.eclipse.jdt.core.compiler.codegen.targetPlatform=21

@ -0,0 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.ui.exception.name=e
org.eclipse.jdt.ui.gettersetter.use.is=false
org.eclipse.jdt.ui.keywordthis=false
org.eclipse.jdt.ui.overrideannotation=true

@ -4,7 +4,7 @@
<groupId>de.tvo</groupId>
<artifactId>webportal</artifactId>
<packaging>war</packaging>
<version>0.0.1</version>
<version>1</version>
<name>webportal Maven Webapp</name>
<url>http://maven.apache.org</url>
@ -24,8 +24,11 @@
</repository>
</repositories>
<properties>
<properties>
<!-- This is the CaptainCasa version to be used. -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!-- Tomcat version of CaptainCasa -->
<tomcat.version>10.1.18</tomcat.version>
<!-- This is the CaptainCasa version to be used. -->
<cc.version>20250128</cc.version>
</properties>
@ -38,9 +41,67 @@
https://github.com/amybytes/nanoleaf-aurora
-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.1.3</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core-jakarta</artifactId>
<version>5.6.15.Final</version>
</dependency>
<dependency>
<groupId>jakarta.persistence</groupId>
<artifactId>jakarta.persistence-api</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>1.3.3</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient</artifactId>
<version>0.16.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.prometheus/simpleclient_servlet -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet_jakarta</artifactId>
<version>0.16.0</version>
</dependency>
<dependency>
<groupId>jakarta.servlet</groupId>
<artifactId>jakarta.servlet-api</artifactId>
<version>6.0.0</version>
<scope>
provided</scope>
</dependency>
<dependency>
<groupId>io.github.rowak</groupId>
<artifactId>nanoleaf-api</artifactId>
@ -52,7 +113,6 @@
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.eclnt</groupId>
<artifactId>eclntjsfserverRISC_jakarta</artifactId>

@ -0,0 +1,32 @@
package de.examples;
import de.tvo.database.tables.NLCONNECT.Nlconnect;
import de.tvo.database.tables.NLCONNECT.NlconnectWorker;
import de.tvo.nanoleaf.enums.NanoTypeEnum;
public class NanoDBTest {
public NanoDBTest() {
Nlconnect nlconnect = new Nlconnect();
nlconnect.setNchostname("Canvas-72FA.fritz.box");
nlconnect.setNcipadress("192.168.178.141");
nlconnect.setNcport(16021);
nlconnect.setNccountpanel(15);
nlconnect.setNctoken("LAG28BQWrXK2p79NbHMQsvcYYCN1TcD4");
nlconnect.setNctype(NanoTypeEnum.CANVAS);
try {
NlconnectWorker worker = new NlconnectWorker();
worker.insertNlconnect(nlconnect);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new NanoDBTest();
}
}

@ -0,0 +1,59 @@
package de.examples;
import de.tvo.nanoleaf.oclasses.MatrixInfo;
import de.tvo.tools.StringUtil;
public class StringTesterClass {
public StringTesterClass() {
String ref = "#{d.PanelConfigBean.paneRepeatList[1].panelInfoList[2].panelID}";
MatrixInfo info = createMatrixInfo(ref);
}
public static void main(String[] args) {
new StringTesterClass();
}
private MatrixInfo createMatrixInfo(String ref) {
MatrixInfo matrixInfo = null;
// #{d.PanelConfigBean.paneRepeatList[1].panelInfoList[2].panelID}
int x = -1;
int y = -1;
int lastPointStart = 0;
int lastPointEnde = 0;
String lastString = "";
int counterStart = 0;
int counterEnde = 0;
counterStart = StringUtil.getCountLetter(ref, '[');
counterEnde = StringUtil.getCountLetter(ref, ']');
if (counterStart == counterEnde) {
for (int p = 0; p < counterStart; p++) {
lastPointStart = ref.indexOf("[");
lastPointEnde = ref.indexOf("]");
if (x == -1) {
lastString = ref.substring(lastPointStart +1, lastPointEnde);
x = Integer.parseInt(lastString);
//System.out.println("X: " + x);
} else {
lastString = ref.substring(lastPointStart +1, lastPointEnde);
y = Integer.parseInt(lastString);
//System.out.println("Y: " + y);
}
ref = ref.substring(lastPointEnde +1);
//System.out.println(ref);
}
matrixInfo = new MatrixInfo(x, y);
}
return matrixInfo;
}
}

@ -0,0 +1,266 @@
package de.examples.components;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import org.eclnt.editor.annotations.CCGenClass;
import org.eclnt.jsfserver.defaultscreens.Statusbar;
import org.eclnt.jsfserver.elements.events.BaseActionEventDrop;
import org.eclnt.jsfserver.elements.events.BaseActionEventInvoke;
import org.eclnt.jsfserver.pagebean.PageBean;
@CCGenClass (expressionBase="#{d.DragDropPaneBean}")
public class DragDropPaneBean
extends PageBean
implements Serializable
{
public void onDropSendPaneTarget(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
if (event instanceof BaseActionEventDrop)
{
Statusbar.outputSuccess("Drop-Event was processed: " + event.getClass().getName());
BaseActionEventDrop baed = (BaseActionEventDrop)event;
String dragInfo = baed.getDragInfo();
System.out.println(baed.getSourceReference());
if (dragInfo.startsWith("NANOLEAF:"))
{
String nanoID = dragInfo.substring("NANOLEAF:".length());
System.out.println("NanoLeaf ID: " + nanoID);
int paneID = 0;
try {
//
paneID = getPaneIDSourceMap().get(nanoID);
//
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Pane ID " + paneID);
//
PaneInfoTest paneInfoTest = getPanelSourceList().get(paneID);
int posX = 1;
int posY = 2;
getPaneRepeatList().get(posX).getPaneInfoList().set(posY, paneInfoTest);
System.out.println("Ziel: ");
System.out.println("Drop: " + dragInfo);
}
}
}
HashMap<String, Integer> m_paneIDSourceMap = null;
public HashMap<String, Integer> getPaneIDSourceMap() {
if (m_paneIDSourceMap == null) {
m_paneIDSourceMap = new HashMap<String, Integer>();
}
return m_paneIDSourceMap;
}
int m_yMatrix = 7;
public int getYMatrix() { return m_yMatrix; }
public void setYMatrix(int value) { this.m_yMatrix = value; }
int m_xMatrix = 7;
public int getXMatrix() { return m_xMatrix; }
public void setXMatrix(int value) { this.m_xMatrix = value; }
int m_countPanels = 15;
public int getCountPanels() { return m_countPanels; }
public void setCountPanels(int value) { this.m_countPanels = value; }
List<PaneRepeat> m_paneRepeatList = new ArrayList<PaneRepeat>();
public List<PaneRepeat> getPaneRepeatList() { return m_paneRepeatList; }
List<PaneInfoTest> m_panelSourceList = new ArrayList<PaneInfoTest>();
public List<PaneInfoTest> getPanelSourceList() { return m_panelSourceList; }
// ------------------------------------------------------------------------
// inner classes
// ------------------------------------------------------------------------
public class PaneRepeat {
private int i_paneRepeatID = 0;
private List<PaneInfoTest> i_paneInfoList = null;
public int getPaneRepeatID() {
return i_paneRepeatID;
}
public void setPaneRepeatID(int paneRepeatID) {
i_paneRepeatID = paneRepeatID;
}
public List<PaneInfoTest> getPaneInfoList() {
return i_paneInfoList;
}
public void setPaneInfoList(List<PaneInfoTest> paneInfoList) {
i_paneInfoList = paneInfoList;
}
}
public class PaneInfoTest {
private int i_paneID = 0;
private String i_color = null;
private String i_border = null;
private String i_reference = null;
Integer i_nanoleafID;
String i_drangsendSource;
public int getPaneID() { return i_paneID; }
public void setPaneID(int paneID) { i_paneID = paneID; }
public String getColor() { return i_color; }
public void setColor(String color) {
i_color = color;
createBorder();
}
public String getBorder() { return i_border; }
public void setBorder(String border) { i_border = border; }
public String getReference() { return i_reference; }
public void setReference(String reference) { i_reference = reference; }
public Integer getNanoleafID() { return i_nanoleafID; }
public void setNanoleafID(Integer value) { this.i_nanoleafID = value; }
public String getDrangsendSource() { return i_drangsendSource; }
public void setDrangsendSource(String value) { this.i_drangsendSource = value; }
public void createBorder() {
String border = "left:1;right:1;top:1;bottom:1;color:" + getColor();
setBorder(border);
}
public PaneInfoTest(int paneID) {
this.i_paneID = paneID;
}
}
/* Listener to the user of the page bean. */
public interface IListener extends Serializable
{
}
// ------------------------------------------------------------------------
// members
// ------------------------------------------------------------------------
private IListener m_listener;
// ------------------------------------------------------------------------
// constructors & initialization
// ------------------------------------------------------------------------
public DragDropPaneBean() {
createSourcePanels(getCountPanels());
try {
createDynTargetPanels(getXMatrix(), getYMatrix());
} catch (Exception e) {
e.printStackTrace();
}
}
private void createDynTargetPanels(int matrixX, int matrixY) throws Exception {
System.out.println("createDynTargetPanels: " + matrixX + "-" + matrixY);
List<PaneInfoTest> paneInfoList = null;
PaneRepeat paneRepeat = new PaneRepeat();
int panelID = 0;
for (int x = 0; x < matrixX; x++) {
paneInfoList = new ArrayList<PaneInfoTest>();
paneRepeat = new PaneRepeat();
for (int y = 0; y < matrixY; y++) {
PaneInfoTest paneInfoTest = new PaneInfoTest(panelID);
paneInfoTest.setReference("REF_XY|" + x + "|" + y);
paneInfoTest.setColor("#a5a5a5");
paneInfoTest.setNanoleafID(panelID);
// paneInfoTest.setDrangsendSource("#{d.DragDropPaneBean.onDragSendPaneSource}");
paneInfoList.add(paneInfoTest);
panelID++;
}
paneRepeat.setPaneRepeatID(x);
paneRepeat.setPaneInfoList(paneInfoList);
getPaneRepeatList().add(paneRepeat);
}
}
private void createSourcePanels(int countPanels) {
ThreadLocalRandom random = ThreadLocalRandom.current();
for (int p = 0; p < countPanels; p++) {
PaneInfoTest paneInfoTest = null;
Integer randomID = random.nextInt(100000, 999999);
paneInfoTest = new PaneInfoTest(p);
paneInfoTest.setNanoleafID(randomID);
paneInfoTest.setColor("#a5a5a5");
paneInfoTest.setDrangsendSource("NANOLEAF:" + randomID);
getPaneIDSourceMap().put(randomID.toString(), Integer.valueOf(p));
getPanelSourceList().add(paneInfoTest);
}
}
public String getPageName() { return "/examples/componets/dragDropPane.xml"; }
public String getRootExpressionUsedInPage() { return "#{d.DragDropPaneBean}"; }
// ------------------------------------------------------------------------
// public usage
// ------------------------------------------------------------------------
/* Initialization of the bean. Add any parameter that is required within your scenario. */
public void prepare(IListener listener)
{
m_listener = listener;
}
// ------------------------------------------------------------------------
// private usage
// ------------------------------------------------------------------------
}

@ -2,8 +2,11 @@
<managedpackage name="de.examples.nanoleaf"/>
<managedpackage name="de.examples.matrixboard"/>
<managedpackage name="de.examples.components"/>
<!--
<managedpackage name="de.examples.matrixboard"/>
-->
</dispatcherinfo>

@ -1,12 +0,0 @@
<dispatcherinfo>
<managedpackage name="de.games.nanoleaf.lightsswitch"/>
<managedpackage name="de.games.nanoleaf.panelconfig"/>
<managedpackage name="de.games.nanoleaf.tictactoe"/>
</dispatcherinfo>

@ -1,39 +0,0 @@
package de.games.nanoleaf.panelconfig;
public class MatrixInfo {
int m_matrixCountX = 0;
int m_matrixCountY = 0;
int m_countPanels = 1;
public MatrixInfo(int countPanels, int matrixCountX, int matrixCountY) {
this.m_countPanels = countPanels;
this.m_matrixCountX = matrixCountX;
this.m_matrixCountY = matrixCountY;
}
public int getMatrixCountX() {
return m_matrixCountX;
}
public void setMatrixCountX(int matrixCountX) {
m_matrixCountX = matrixCountX;
}
public int getMatrixCountY() {
return m_matrixCountY;
}
public void setMatrixCountY(int matrixCountY) {
m_matrixCountY = matrixCountY;
}
public int getCountPanels() {
return m_countPanels;
}
public void setCountPanels(int countPanels) {
m_countPanels = countPanels;
}
}

@ -1,73 +0,0 @@
package de.games.nanoleaf.panelconfig;
import org.eclnt.jsfserver.elements.componentnodes.COLDISTANCENode;
import org.eclnt.jsfserver.elements.componentnodes.LABELNode;
import org.eclnt.jsfserver.elements.componentnodes.PANENode;
import org.eclnt.jsfserver.elements.componentnodes.ROWDISTANCENode;
import org.eclnt.jsfserver.elements.componentnodes.ROWNode;
public class NanoPANENode extends PANENode {
private PanelInfo m_panelInfo = null;
public PanelInfo getPanelInfo() {
return m_panelInfo;
}
public void setPanelInfo(PanelInfo panelInfo) {
m_panelInfo = panelInfo;
}
public NanoPANENode(PanelInfo panelInfo) {
this.m_panelInfo = panelInfo;
createInnerPane();
}
private void createInnerPane() {
this.setDragsend("NANOLEAF:ID_" + getPanelInfo().getPanelID());
this.setHeight(80);
this.setWidth(80);
this.setBorder("left:2;right:2;top:2;bottom:2;color:#ff0000");
ROWDISTANCENode rowdistanceNode = new ROWDISTANCENode();
this.addSubNode(rowdistanceNode);
ROWNode row = new ROWNode();
COLDISTANCENode coldistanceNode = new COLDISTANCENode();
row.addSubNode(coldistanceNode);
LABELNode labelPaneID = new LABELNode();
labelPaneID.setText("ID: " + getPanelInfo().getPanelID());
row.addSubNode(labelPaneID);
this.addSubNode(row);
row = new ROWNode();
coldistanceNode = new COLDISTANCENode();
row.addSubNode(coldistanceNode);
labelPaneID = new LABELNode();
labelPaneID.setText("Nano ID: ");
row.addSubNode(labelPaneID);
this.addSubNode(row);
row = new ROWNode();
coldistanceNode = new COLDISTANCENode();
row.addSubNode(coldistanceNode);
labelPaneID = new LABELNode();
if (getPanelInfo().getPanelNanoleafID() == null) {
labelPaneID.setText("unbek.");
} else {
labelPaneID.setText(getPanelInfo().getPanelNanoleafID());
}
row.addSubNode(labelPaneID);
this.addSubNode(row);
}
}

@ -1,217 +0,0 @@
package de.games.nanoleaf.panelconfig;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.eclnt.editor.annotations.CCGenClass;
import org.eclnt.jsfserver.base.faces.event.ActionEvent;
import org.eclnt.jsfserver.defaultscreens.Statusbar;
import org.eclnt.jsfserver.elements.componentnodes.COLDISTANCENode;
import org.eclnt.jsfserver.elements.componentnodes.LABELNode;
import org.eclnt.jsfserver.elements.componentnodes.PANENode;
import org.eclnt.jsfserver.elements.componentnodes.ROWNode;
import org.eclnt.jsfserver.elements.events.BaseActionEventDrop;
import org.eclnt.jsfserver.elements.events.BaseActionEventInvoke;
import org.eclnt.jsfserver.elements.impl.DYNAMICCONTENTBinding;
import org.eclnt.jsfserver.elements.impl.ROWDYNAMICCONTENTBinding;
import org.eclnt.jsfserver.pagebean.PageBean;
@CCGenClass (expressionBase="#{d.PanelConfigBean}")
public class PanelConfigBean extends PageBean implements Serializable {
ROWDYNAMICCONTENTBinding m_dynMatrixPanels = new ROWDYNAMICCONTENTBinding();
public ROWDYNAMICCONTENTBinding getDynMatrixPanels() { return m_dynMatrixPanels; }
public void onPanelsOff(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {}
public void onPanelsOn(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {}
String m_nanoleafToken = "LAG28BQWrXK2p79NbHMQsvcYYCN1TcD4";
public String getNanoleafToken() { return m_nanoleafToken; }
public void setNanoleafToken(String value) { this.m_nanoleafToken = value; }
int m_port = 16021;
public int getPort() { return m_port; }
public void setPort(int value) { this.m_port = value; }
String m_ipAdresse = "192.168.178.141";
public String getIpAdresse() { return m_ipAdresse; }
public void setIpAdresse(String value) { this.m_ipAdresse = value; }
String m_hostname = "Canvas-72FA.fritz.box";
public String getHostname() { return m_hostname; }
public void setHostname(String value) { this.m_hostname = value; }
private List<NanoPANENode> m_nanoPaneNodeList = null;
public List<NanoPANENode> getNanoPaneNodeList() {
if (m_nanoPaneNodeList == null) {
m_nanoPaneNodeList = new ArrayList<NanoPANENode>();
}
return m_nanoPaneNodeList;
}
public NanoPANENode getNanoPaneNode(int id) {
return getNanoPaneNodeList().get(id);
}
DYNAMICCONTENTBinding m_dynPanelList = new DYNAMICCONTENTBinding();
public DYNAMICCONTENTBinding getDynPanelList() { return m_dynPanelList; }
public void onPanelsCreate(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
createPanelsList(getAnzahlPanels());
}
public void onCheckAndCreate(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
createPanelMatrix(getAnzahlPanels(), getMatrixX(), getMatrixY());
}
int m_matrixY = 3;
public int getMatrixY() { return m_matrixY; }
public void setMatrixY(int value) { this.m_matrixY = value; }
int m_matrixX = 3;
public int getMatrixX() { return m_matrixX; }
public void setMatrixX(int value) { this.m_matrixX = value; }
int m_anzahlPanels = 1;
public int getAnzahlPanels() { return m_anzahlPanels; }
public void setAnzahlPanels(int value) { this.m_anzahlPanels = value; }
int m_anzahlPanelsMax = 0;
public int getAnzahlPanelsMax() { return m_anzahlPanelsMax; }
public void setAnzahlPanelsMax(int value) { this.m_anzahlPanelsMax = value; }
// ------------------------------------------------------------------------
// inner classes
// ------------------------------------------------------------------------
/* Listener to the user of the page bean. */
public interface IListener extends Serializable {
}
// ------------------------------------------------------------------------
// members
// ------------------------------------------------------------------------
private IListener m_listener;
// ------------------------------------------------------------------------
// constructors & initialization
// ------------------------------------------------------------------------
public PanelConfigBean() {
createPanelsList(1);
}
private void createPanelsList(int countPanels) {
ROWNode row = new ROWNode();
COLDISTANCENode coldistanceNode = null;
PANENode paneNode = null;
PanelInfo panelInfo = null;
LABELNode labelNode = null;
for (int p = 0; p < countPanels; p++) {
panelInfo = new PanelInfo(p);
paneNode = new NanoPANENode(panelInfo);
paneNode.setHeight(60);
paneNode.setWidth(60);
paneNode.setBorder("left:2;right:2;top:2;bottom:2;color:#ff0000");
paneNode.setDragsend("Nanoleaf:" + panelInfo.getPanelID());
ROWNode rowInt = new ROWNode();
paneNode.addSubNode(rowInt);
coldistanceNode = new COLDISTANCENode();
coldistanceNode.setWidth("50%");
rowInt.addSubNode(coldistanceNode);
labelNode = new LABELNode();
labelNode.setText(panelInfo.getPanelID() + "");
rowInt.addSubNode(labelNode);
row.addSubNode(paneNode);
coldistanceNode = new COLDISTANCENode();
coldistanceNode.setWidth(20);
row.addSubNode(coldistanceNode);
}
getDynPanelList().setContentNode(row);
}
private void createPanelMatrix(int anzahlPanels, int matrixX, int matrixY) {
int anzahlPanelMatrix = 0;
anzahlPanelMatrix = matrixX * matrixY;
//List<ComponentNode> componentNodeList = new ArrayList<ComponentNode>();
ROWNode row = null;
PANENode rootPaneNode = new PANENode();
rootPaneNode.setRowdistance("5");
PANENode paneNode = null;
COLDISTANCENode coldistanceNode = null;
for (int x = 0; x < matrixX; x++) {
row = new ROWNode();
for (int y = 0; y < matrixY; y++) {
paneNode = new PANENode();
paneNode.setWidth(50);
paneNode.setHeight(50);
paneNode.setBorder("left:2;right:2;top:2;bottom:2;color:#000000");
paneNode.setDropreceive("NANOLEAF");
paneNode.setReference("REF_XY:" + x + "|" + y);
paneNode.setActionListener("#{d.PanelConfigBean.onCashierActions}");
coldistanceNode = new COLDISTANCENode();
coldistanceNode.setWidth(5);
row.addSubNode(paneNode);
row.addSubNode(coldistanceNode);
}
rootPaneNode.addSubNode(row);
}
getDynMatrixPanels().setContentNode(rootPaneNode);
}
public void onCashierActions(ActionEvent event) {
if (event instanceof BaseActionEventDrop)
{
Statusbar.outputSuccess("Drop-Event was processed: " + event.getClass().getName());
BaseActionEventDrop baed = (BaseActionEventDrop)event;
String dragInfo = baed.getDragInfo();
if (dragInfo.startsWith("NANOLEAF:"))
{
System.out.println("Ziel: ");
System.out.println("Drop: " + dragInfo);
}
}
else if (event instanceof BaseActionEventInvoke)
{
Statusbar.outputSuccess("Cashier Icon was pressed!");
}
}
public String getPageName() { return "/games/nanoleaf/panelconfig/panelconfig.xml"; }
public String getRootExpressionUsedInPage() { return "#{d.PanelConfigBean}"; }
// ------------------------------------------------------------------------
// public usage
// ------------------------------------------------------------------------
/* Initialization of the bean. Add any parameter that is required within your scenario. */
public void prepare(IListener listener)
{
m_listener = listener;
}
// ------------------------------------------------------------------------
// private usage
// ------------------------------------------------------------------------
}

@ -1,54 +0,0 @@
package de.games.nanoleaf.tictactoe;
import java.io.Serializable;
import org.eclnt.editor.annotations.CCGenClass;
import org.eclnt.jsfserver.pagebean.PageBean;
import org.eclnt.jsfserver.base.faces.event.ActionEvent;
@CCGenClass (expressionBase="#{d.TicTacToeBean}")
public class TicTacToeBean
extends PageBean
implements Serializable
{
// ------------------------------------------------------------------------
// inner classes
// ------------------------------------------------------------------------
/* Listener to the user of the page bean. */
public interface IListener extends Serializable
{
}
// ------------------------------------------------------------------------
// members
// ------------------------------------------------------------------------
private IListener m_listener;
// ------------------------------------------------------------------------
// constructors & initialization
// ------------------------------------------------------------------------
public TicTacToeBean()
{
}
public String getPageName() { return "/games/nanoleaf/tictactoe/tictactoe.xml"; }
public String getRootExpressionUsedInPage() { return "#{d.TicTacToeBean}"; }
// ------------------------------------------------------------------------
// public usage
// ------------------------------------------------------------------------
/* Initialization of the bean. Add any parameter that is required within your scenario. */
public void prepare(IListener listener)
{
m_listener = listener;
}
// ------------------------------------------------------------------------
// private usage
// ------------------------------------------------------------------------
}

@ -1,4 +1,4 @@
package de.games.nanoleaf.lightsswitch;
package de.nanoleaf.games.lightswitch;
import java.io.Serializable;
import java.util.ArrayList;
@ -76,7 +76,7 @@ public class LightsOnOffBean
random = null;
m_countSteps = 0;
m_colorButton1 = null;
m_colorButton2= null;
m_colorButton2 = null;
m_colorButton3 = null;
m_colorButton4 = null;
m_colorButton5 = null;
@ -397,7 +397,7 @@ public class LightsOnOffBean
}
@Override
public String getPageName() { return "/games/nanoleaf/lightswitch/lightsOnOff.jsp"; }
public String getPageName() { return "/nanoleaf/games/lightswitch/lightsOnOff.jsp"; }
@Override
public String getRootExpressionUsedInPage() { return "#{d.LightsOnOffBean}"; }

@ -0,0 +1,119 @@
package de.nanoleaf.games.tictactoe;
import java.util.ArrayList;
import java.util.List;
public class CheckTicTacToe {
private class Fields {
List<Integer> fieldsList = null;
public List<Integer> getFieldsList() {
return fieldsList;
}
public Fields(int field1, int field2, int field3) {
fieldsList = new ArrayList<Integer>();
fieldsList.add(field1);
fieldsList.add(field2);
fieldsList.add(field3);
}
}
List<Fields> m_checkList = null;
public List<Fields> getCheckList() {
if (m_checkList == null) {
m_checkList = new ArrayList<Fields>();
}
return m_checkList;
}
public CheckTicTacToe() {
initCheckList();
}
private void initCheckList() {
/**
* ###
* ###
* ###
*
*/
getCheckList().add(new Fields(1, 2, 3));
getCheckList().add(new Fields(4, 5, 6));
getCheckList().add(new Fields(7, 8, 9));
getCheckList().add(new Fields(1, 4, 7));
getCheckList().add(new Fields(2, 5, 6));
getCheckList().add(new Fields(3, 6, 9));
getCheckList().add(new Fields(1, 5, 9));
getCheckList().add(new Fields(3, 5, 7));
}
public boolean checkFinal(int[] playerArray) {
boolean finish = false;
Integer playerlast = 0;
boolean next = false;
//System.out.println("Start Check...");
List<Integer> playerList = new ArrayList<Integer>();
for (Fields fields: getCheckList()) {
next = false;
finish = false;
playerList = new ArrayList<Integer>();
//System.out.println("List: " + fields.getFieldsList().toString());
for (int f = 0; f < fields.getFieldsList().size(); f++) {
int field = fields.getFieldsList().get(f).intValue();
int player = playerArray[field];
//System.out.println("Find Player: " + player);
if (player == 0) {
next = true;
finish = false;
//System.out.println("NEXT");
} else {
if (f == 0) {
playerlast = player;
playerList.add(playerlast);
} else {
if (playerlast == player) {
playerList.add(playerlast);
} else {
next = true;
}
}
}
if (next) {
break;
}
}
if (next == false) {
//System.out.println("FINISH");
finish = true;
//System.out.println("List: " + fields.getFieldsList().toString());
break;
}
}
return finish;
}
}

@ -0,0 +1,325 @@
package de.nanoleaf.games.tictactoe;
import java.io.Serializable;
import org.eclnt.editor.annotations.CCGenClass;
import org.eclnt.jsfserver.base.faces.event.ActionEvent;
import org.eclnt.jsfserver.pagebean.PageBean;
import de.tools.ReflectClass;
@CCGenClass (expressionBase="#{d.TicTacToeBean}")
public class TicTacToeBean extends PageBean implements Serializable {
int[] playerArray = new int[10];
String m_colorButton1;
public String getColorButton1() { return m_colorButton1; }
public void setColorButton1(String value) { this.m_colorButton1 = value; }
String m_colorButton2;
public String getColorButton2() { return m_colorButton2; }
public void setColorButton2(String value) { this.m_colorButton2 = value; }
String m_colorButton3;
public String getColorButton3() { return m_colorButton3; }
public void setColorButton3(String value) { this.m_colorButton3 = value; }
String m_colorButton4;
public String getColorButton4() { return m_colorButton4; }
public void setColorButton4(String value) { this.m_colorButton4 = value; }
String m_colorButton5;
public String getColorButton5() { return m_colorButton5; }
public void setColorButton5(String value) { this.m_colorButton5 = value; }
String m_colorButton6;
public String getColorButton6() { return m_colorButton6; }
public void setColorButton6(String value) { this.m_colorButton6 = value; }
String m_colorButton7;
public String getColorButton7() { return m_colorButton7; }
public void setColorButton7(String value) { this.m_colorButton7 = value; }
String m_colorButton8;
public String getColorButton8() { return m_colorButton8; }
public void setColorButton8(String value) { this.m_colorButton8 = value; }
String m_colorButton9;
public String getColorButton9() { return m_colorButton9; }
public void setColorButton9(String value) { this.m_colorButton9 = value; }
boolean m_enabledButton1;
public boolean getEnabledButton1() { return m_enabledButton1; }
public void setEnabledButton1(boolean value) { this.m_enabledButton1 = value; }
boolean m_enabledButton2;
public boolean getEnabledButton2() { return m_enabledButton2; }
public void setEnabledButton2(boolean value) { this.m_enabledButton2 = value; }
boolean m_enabledButton3;
public boolean getEnabledButton3() { return m_enabledButton3; }
public void setEnabledButton3(boolean value) { this.m_enabledButton3 = value; }
boolean m_enabledButton4;
public boolean getEnabledButton4() { return m_enabledButton4; }
public void setEnabledButton4(boolean value) { this.m_enabledButton4 = value; }
boolean m_enabledButton5;
public boolean getEnabledButton5() { return m_enabledButton5; }
public void setEnabledButton5(boolean value) { this.m_enabledButton5 = value; }
boolean m_enabledButton6;
public boolean getEnabledButton6() { return m_enabledButton6; }
public void setEnabledButton6(boolean value) { this.m_enabledButton6 = value; }
boolean m_enabledButton7;
public boolean getEnabledButton7() { return m_enabledButton7; }
public void setEnabledButton7(boolean value) { this.m_enabledButton7 = value; }
boolean m_enabledButton8;
public boolean getEnabledButton8() { return m_enabledButton8; }
public void setEnabledButton8(boolean value) { this.m_enabledButton8 = value; }
boolean m_enabledButton9;
public boolean getEnabledButton9() { return m_enabledButton9; }
public void setEnabledButton9(boolean value) { this.m_enabledButton9 = value; }
private void changeColor() {
if (getLightPlayerNext().equals(getLightPlayer1())) {
setLightPlayerNext(getLightPlayer2());
setNextPlayer(2);
} else {
setLightPlayerNext(getLightPlayer1());
setNextPlayer(1);
}
}
public void onButton1(ActionEvent event) {
if (getEnabledButton1() == true) {
setColorButton1(getLightPlayerNext());
setEnabledButton1(false);
playerArray[1] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton2(ActionEvent event) {
if (getEnabledButton2() == true) {
setColorButton2(getLightPlayerNext());
setEnabledButton2(false);
playerArray[2] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton3(ActionEvent event) {
if (getEnabledButton3() == true) {
setColorButton3(getLightPlayerNext());
setEnabledButton3(false);
playerArray[3] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton4(ActionEvent event) {
if (getEnabledButton4() == true) {
setColorButton4(getLightPlayerNext());
setEnabledButton4(false);
playerArray[4] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton5(ActionEvent event) {
if (getEnabledButton5() == true) {
setColorButton5(getLightPlayerNext());
setEnabledButton5(false);
playerArray[5] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton6(ActionEvent event) {
if (getEnabledButton6() == true) {
setColorButton6(getLightPlayerNext());
setEnabledButton6(false);
playerArray[6] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton7(ActionEvent event) {
if (getEnabledButton7() == true) {
setColorButton7(getLightPlayerNext());
setEnabledButton7(false);
playerArray[7] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton8(ActionEvent event) {
if (getEnabledButton8() == true) {
setColorButton8(getLightPlayerNext());
setEnabledButton8(false);
playerArray[8] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public void onButton9(ActionEvent event) {
if (getEnabledButton9() == true) {
setColorButton9(getLightPlayerNext());
setEnabledButton9(false);
playerArray[9] = getNextPlayer();
changeColor();
}
resultTextSetter();
}
public String m_lightPlayer1 = "#66FF00";
public String getLightPlayer1() { return m_lightPlayer1; }
public String m_lightPlayer2 = "#FF0000";
public String getLightPlayer2() { return m_lightPlayer2; }
public String m_lightPlayerNext = "#66FF00";
public void setLightPlayerNext(String lightPlayerNext) { m_lightPlayerNext = lightPlayerNext; }
public String getLightPlayerNext() { return m_lightPlayerNext; }
public int m_nextPlayer = 1;
public int getNextPlayer() { return m_nextPlayer; }
public void setNextPlayer(int nextPlayer) { m_nextPlayer = nextPlayer; }
String m_resultText;
public String getResultText() { return m_resultText; }
public void setResultText(String value) { this.m_resultText = value; }
public void onReset(ActionEvent event) {
enabledAllButtons(true);
playerArray = new int[10];
for (int i = 0; i < 10; i++) {
playerArray[i] = 0;
}
m_colorButton1 = null;
m_colorButton2 = null;
m_colorButton3 = null;
m_colorButton4 = null;
m_colorButton5 = null;
m_colorButton6 = null;
m_colorButton7 = null;
m_colorButton8 = null;
m_colorButton9 = null;
setNextPlayer(1);
setLightPlayerNext(getLightPlayer1());
resultTextSetter();
}
private void enabledAllButtons(boolean enabled) {
for (int i = 1; i <= 9; i++) {
getReflectClass().setMethod("setEnabledButton" + i, enabled);
}
}
CheckTicTacToe m_checkTicTacToe = new CheckTicTacToe();
public CheckTicTacToe getCheckTicTacToe() {
return m_checkTicTacToe;
}
private boolean checkFinish() {
boolean finish = false;
finish = getCheckTicTacToe().checkFinal(playerArray);
return finish;
}
ReflectClass m_reflectClass;
public ReflectClass getReflectClass() { return m_reflectClass; }
private void resultTextSetter() {
if (checkFinish()) {
m_resultText = " GEWONNEN. :-)";
enabledAllButtons(false);
} else {
m_resultText = "Player "+ getNextPlayer();
}
}
// ------------------------------------------------------------------------
// inner classes
// ------------------------------------------------------------------------
/* Listener to the user of the page bean. */
public interface IListener extends Serializable
{
}
// ------------------------------------------------------------------------
// members
// ------------------------------------------------------------------------
private IListener m_listener;
// ------------------------------------------------------------------------
// constructors & initialization
// ------------------------------------------------------------------------
public TicTacToeBean() {
m_reflectClass = new ReflectClass(this);
onReset(null);
}
public TicTacToeBean(String lightPlayer1, String lightPlayer2) {
this.m_lightPlayer1 = lightPlayer1;
this.m_lightPlayer2 = lightPlayer2;
m_reflectClass = new ReflectClass(this);
onReset(null);
}
public String getPageName() { return "/nanoleaf/games/tictactoe/tictactoe.xml"; }
public String getRootExpressionUsedInPage() { return "#{d.TicTacToeBean}"; }
// ------------------------------------------------------------------------
// public usage
// ------------------------------------------------------------------------
/* Initialization of the bean. Add any parameter that is required within your scenario. */
public void prepare(IListener listener)
{
m_listener = listener;
}
// ------------------------------------------------------------------------
// private usage
// ------------------------------------------------------------------------
}

@ -0,0 +1,10 @@
<dispatcherinfo>
<managedpackage name="de.nanoleaf.games.lightswitch"/>
<managedpackage name="de.nanoleaf.tools.panelconfig"/>
<managedpackage name="de.nanoleaf.games.tictactoe"/>
</dispatcherinfo>

@ -0,0 +1,9 @@
package de.nanoleaf.server;
public class ChangeColorMod {
public ChangeColorMod() {
// TODO Auto-generated constructor stub
}
}

@ -0,0 +1,45 @@
package de.nanoleaf.server;
import io.github.rowak.nanoleafapi.Color;
public enum ColorEnum {
BLACK(Color.BLACK),
WHITE(Color.WHITE),
RED(Color.RED),
GREEN(Color.GREEN),
BLUE(Color.BLUE),
MAGENTA(Color.MAGENTA),
YELLOW(Color.YELLOW),
CYAN(Color.CYAN),
GRAY(Color.GRAY),
LIGHT_GRAY(Color.LIGHT_GRAY),
DARK_GRAY(Color.DARK_GRAY),
PINK(Color.PINK),
ORANGE(Color.ORANGE),
;
private Color m_color;
public Color getColor() { return m_color; }
ColorEnum(Color color) {
this.m_color = color;
}
}

@ -0,0 +1,14 @@
package de.nanoleaf.server;
public enum ColorModEnum {
NANOLEAF_LIGHT_SWITCH_PANEL_9_GAME,
NANOLEAF_TIC_TAC_TOE_PANEL_9_GAME,
NANOLEAF_ON_OFF_TEST,
;
}

@ -0,0 +1,3 @@
Funktionen Nanoleaf Server
-

@ -0,0 +1,209 @@
package de.nanoleaf.server;
import java.io.IOException;
import java.util.List;
import io.github.rowak.nanoleafapi.Color;
import io.github.rowak.nanoleafapi.NanoleafDevice;
import io.github.rowak.nanoleafapi.NanoleafException;
import io.github.rowak.nanoleafapi.Panel;
import io.github.rowak.nanoleafapi.event.DetailedTouchEvent;
import io.github.rowak.nanoleafapi.event.NanoleafTouchEventListener;
import io.github.rowak.nanoleafapi.event.TouchEvent;
public class NanoleafDeviceServer {
private String m_nanoleafHostname = "Canvas-72FA.fritz.box";
public String getNanoleafHostname() { return m_nanoleafHostname; }
private String m_nanoleafHostIP = "";
public String getNanoleafHostIP() { return m_nanoleafHostIP; }
private int m_nanoleafPort = 16021;
public int getNanoleafPort() { return m_nanoleafPort; }
private String m_nanoleafApiLevel = "v1";
public String getNanoleafApiLevel() { return m_nanoleafApiLevel; }
private String m_nanoleafAccessToken = "LAG28BQWrXK2p79NbHMQsvcYYCN1TcD4";
public String getNanoleafAccessToken() { return m_nanoleafAccessToken; }
private NanoleafDevice m_nanoleafDevice = null;
public NanoleafDevice getNanoleafDevice() { return m_nanoleafDevice; }
private int m_nanoleafTouchTimer = 50;
public int getNanoleafTouchTimer() { return m_nanoleafTouchTimer; }
public void setNanoleafTouchTimer(int nanoleafTouchTimer) { m_nanoleafTouchTimer = nanoleafTouchTimer; }
private Integer m_nanoleafLastID = null;
public Integer getNanoleafLastID() { return m_nanoleafLastID; }
public void setNanoleafLastID(Integer nanoleafLastID) { m_nanoleafLastID = nanoleafLastID; }
private List<Panel> m_nanoLeafPanels = null;
public List<Panel> getNanoLeafPanels() { return m_nanoLeafPanels; }
public NanoleafDeviceServer() {
}
public NanoleafDeviceServer(String nanoleafHostname, String nanoleafHostIP, int nanoleafPort, String nanoleafAccessToken) {
this.m_nanoleafHostname = nanoleafHostname;
this.m_nanoleafHostIP = nanoleafHostIP;
this.m_nanoleafPort = nanoleafPort;
this.m_nanoleafAccessToken = nanoleafAccessToken;
}
public boolean deConnectNanoLeaf() throws NanoleafException, IOException {
boolean finish = false;
try {
getNanoleafDevice().closeEventListeners();
getNanoleafDevice().closeTouchEventListeners();
getNanoleafDevice().closeAsync();
m_nanoleafDevice = null;
getNanoLeafPanels().clear();
finish = true;
} catch (Exception e) {
throw e;
}
return finish;
}
public boolean connectNanoLeaf() throws NanoleafException, IOException {
boolean connected = false;
try {
m_nanoleafDevice = NanoleafDevice.createDevice(getNanoleafHostname(), getNanoleafPort(), getNanoleafAccessToken());
if (m_nanoleafDevice != null) {
connected = true;
refreshPanels();
}
} catch (Exception e) {
throw e;
}
return connected;
}
private void refreshPanels() throws NanoleafException, IOException {
if (getNanoleafDevice() != null) {
m_nanoLeafPanels = getNanoleafDevice().getPanels();
}
}
private boolean checkLastIdActiv(Integer lastID) {
if (getNanoleafLastID() == null) {
return false;
}
return getNanoleafLastID().equals(lastID);
}
public void startNanoLeafEvent() {
try {
getNanoleafDevice().setColor(Color.BLACK);
getNanoleafDevice().enableExternalStreaming();
getNanoleafDevice().enableTouchEventStreaming(getNanoleafPort()); // You need to specify a port to listen on
getNanoleafDevice().registerTouchEventStreamingListener(new NanoleafTouchEventListener() {
@Override
public void onOpen() {
// Called when the listener is created
}
@Override
public void onClosed() {
// Called when the listener is closed
}
@Override
public void onEvent(DetailedTouchEvent[] events) {
// Called when a touch event occurs
//System.out.println("Events: " + events.length);
DetailedTouchEvent event = events[0];
Integer lastID = event.getPanelId();
//TouchEvent touch = event.getTouchType();
switch (event.getTouchType()) {
case TouchEvent.DOUBLE_TAP:
//System.out.println("DOUBLE_TAP");
break;
case TouchEvent.SINGLE_TAP:
//System.out.println("SINGLE_TAP");
if (checkLastIdActiv(lastID)) {
return;
} else {
setNanoleafLastID(lastID);
try {
getNanoleafDevice().setPanelExternalStreaming(lastID, Color.RED, 1);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("ID: " + event.getPanelId());
}
break;
case TouchEvent.HOLD:
//System.out.println("HOLD");
break;
case TouchEvent.UNKNOWN_ATTRIBUTE:
//System.out.println("UNKNOWN_ATTRIBUTE");
break;
default:
System.out.println("Unexpected value: " + event.getTouchType());
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
NanoleafDeviceServer nanoleafDeviceServer = new NanoleafDeviceServer();
try {
boolean nanoLeafActiv = nanoleafDeviceServer.connectNanoLeaf();
if (nanoLeafActiv) {
nanoleafDeviceServer.startNanoLeafEvent();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -1,4 +1,4 @@
package de.games.nanoleaf.server;
package de.nanoleaf.server.test;
import java.io.BufferedReader;
import java.io.InputStreamReader;

@ -1,4 +1,4 @@
package de.games.nanoleaf.server;
package de.nanoleaf.server.test;
import java.util.List;

@ -1,4 +1,4 @@
package de.games.nanoleaf.server;
package de.nanoleaf.server.test;
import java.util.List;

@ -1,4 +1,4 @@
package de.games.nanoleaf.server;
package de.nanoleaf.server.test;
import io.github.rowak.nanoleafapi.Aurora;

@ -1,4 +1,4 @@
package de.games.nanoleaf.server;
package de.nanoleaf.server.test;
import java.util.HashMap;
import java.util.HashSet;
@ -51,7 +51,7 @@ public class NanoleafServer {
// for (Panel panel: panelList) {
// System.out.println("Panel: " + panel.getId());
// }
device.setColor(Color.WHITE);
device.setColor(Color.BLACK);
device.enableTouchEventStreaming(port); // You need to specify a port to listen on
device.registerTouchEventStreamingListener(new NanoleafTouchEventListener() {

@ -0,0 +1,719 @@
package de.nanoleaf.tools.panelconfig;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.eclnt.editor.annotations.CCGenClass;
import org.eclnt.jsfserver.base.faces.event.ActionEvent;
import org.eclnt.jsfserver.defaultscreens.OKPopup;
import org.eclnt.jsfserver.defaultscreens.Statusbar;
import org.eclnt.jsfserver.elements.componentnodes.PANENode;
import org.eclnt.jsfserver.elements.events.BaseActionEventDrop;
import org.eclnt.jsfserver.elements.events.BaseActionEventInvoke;
import org.eclnt.jsfserver.elements.impl.ROWDYNAMICCONTENTBinding;
import org.eclnt.jsfserver.elements.impl.ROWDYNAMICCONTENTBinding.ComponentNode;
import org.eclnt.jsfserver.elements.util.ValidValuesBinding;
import de.nanoleaf.server.ColorEnum;
import de.nanoleaf.server.NanoleafDeviceServer;
import de.tvo.database.tables.NLCONNECT.Nlconnect;
import de.tvo.database.tables.NLCONNECT.NlconnectWorker;
import de.tvo.nanoleaf.enums.NanoTypeEnum;
import de.tvo.nanoleaf.oclasses.MatrixInfo;
import de.tvo.tools.StringUtil;
import de.tvo.workplace.DefaultPageBean;
import io.github.rowak.nanoleafapi.Panel;
import io.github.rowak.nanoleafapi.ShapeType;
@CCGenClass (expressionBase="#{d.PanelConfigBean}")
public class PanelConfigBean extends DefaultPageBean implements Serializable {
public void onSave(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
Nlconnect nlconnect = new Nlconnect();
nlconnect.setNchostname("Canvas-72FA.fritz.box");
nlconnect.setNcipadress("192.168.178.141");
nlconnect.setNcport(16021);
nlconnect.setNccountpanel(15);
nlconnect.setNctoken("LAG28BQWrXK2p79NbHMQsvcYYCN1TcD4");
nlconnect.setNctype(NanoTypeEnum.CANVAS);
try {
NlconnectWorker worker = new NlconnectWorker();
worker.insertNlconnect(nlconnect);
} catch (Exception e) {
e.printStackTrace();
}
}
public void onLoad(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
}
public void onReset(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
clearAll();
}
public void onLayoutFile(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
}
private void clearAll() {
getPanelInfoListSource().clear();
getPaneRepeatList().clear();
getPanelIDPanelInfoSourceMap().clear();
setAnzahlPanels(1);
}
ValidValuesBinding m_layoutFileVV = new ValidValuesBinding();
public ValidValuesBinding getLayoutFileVV() { return m_layoutFileVV; }
String m_layoutFile;
public String getLayoutFile() { return m_layoutFile; }
public void setLayoutFile(String value) { this.m_layoutFile = value; }
public void onCheckZurodnung(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
if (getColor() == null || getColor().equals("#000000") || getColor().equals(getDefaultPanelColor())) {
OKPopup.createInstance("Start Zuordnung Farbe", "Bitte w<>hlen Sie eine Farbe f<>r die Zuordnung der Panels.");
m_startZuordnung = false;
return;
} else {
selectNextPanel();
}
}
public String getLiteral(String key) {
return getLiteral("Nanoleaf", key);
}
private void selectNextPanel() {
if (getPanelInfoListSource().size() > 0) {
getPanelInfoListSource().get(0).setColor(getColor());
} else {
setColor("#000000");
m_startZuordnung = false;
}
}
boolean m_startZuordnung;
public boolean getStartZuordnung() { return m_startZuordnung; }
public void setStartZuordnung(boolean value) { this.m_startZuordnung = value; }
final String m_defaultPanelColor = "#a5a5a5";
public String getDefaultPanelColor() { return m_defaultPanelColor; }
String m_color = "#000000";
public String getColor() { return m_color; }
public void setColor(String value) { this.m_color = value; }
ValidValuesBinding m_colorCombo = new ValidValuesBinding();
public ValidValuesBinding getColorCombo() { return m_colorCombo; }
public void onPanelSourceAction(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
//System.out.println(event);
BaseActionEventInvoke actionEvent = (BaseActionEventInvoke) event;
System.out.println("SourceAction: " + actionEvent.getSourceReference());
// PanelInfo panelInfo = getPanelIDNanoPANENodeSourceMap().get(actionEvent.getSourceReference());
//
// if (panelInfo != null) {
// Panel panel = panelInfo.getPanel();
//
// System.out.println("PanelID: " + panel.getId());
// }
}
boolean m_nanoleafConnected = false;
public boolean getNanoleafConnected() { return m_nanoleafConnected; }
public void setNanoleafConnected(boolean value) { this.m_nanoleafConnected = value; }
public void onNanoleafDeconnect(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
boolean deconnected = false;
// TODO: Pruefen: Host IP Tocken port
try {
if (getNanoleafDeviceServer() != null) {
deconnected = getNanoleafDeviceServer().deConnectNanoLeaf();
}
} catch (Exception e) {
e.printStackTrace();
}
setNanoleafConnected(false);
}
public void onNanoleafConnect(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
boolean connected = false;
// TODO: Pruefen: Host IP Tocken port
try {
m_nanoleafDeviceServer = new NanoleafDeviceServer(getHostname(), getIpAdresse(), getPort(), getNanoleafToken());
connected = m_nanoleafDeviceServer.connectNanoLeaf();
setAnzahlPanels(m_nanoleafDeviceServer.getNanoLeafPanels().size());
} catch (Exception e) {
e.printStackTrace();
}
setNanoleafConnected(true);
}
private NanoleafDeviceServer m_nanoleafDeviceServer = null;
public NanoleafDeviceServer getNanoleafDeviceServer() { return m_nanoleafDeviceServer; }
ROWDYNAMICCONTENTBinding m_dynMatrixPanels = new ROWDYNAMICCONTENTBinding();
public ROWDYNAMICCONTENTBinding getDynMatrixPanels() { return m_dynMatrixPanels; }
public void onPanelsOff(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
List<ComponentNode> componentNodes = getDynMatrixPanels().getContentNodes();
System.out.println("List: " + componentNodes.size());
List<PANENode> paneList = new ArrayList<PANENode>();
for (ComponentNode componentNode: componentNodes) {
System.out.println(componentNode);
if (componentNode instanceof PANENode) {
paneList.add((PANENode)componentNode);
}
}
}
public void onPanelsOn(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
}
String m_nanoleafToken = "LAG28BQWrXK2p79NbHMQsvcYYCN1TcD4";
public String getNanoleafToken() { return m_nanoleafToken; }
public void setNanoleafToken(String value) { this.m_nanoleafToken = value; }
int m_port = 16021;
public int getPort() { return m_port; }
public void setPort(int value) { this.m_port = value; }
String m_ipAdresse = "192.168.178.141";
public String getIpAdresse() { return m_ipAdresse; }
public void setIpAdresse(String value) { this.m_ipAdresse = value; }
String m_hostname = "Canvas-72FA.fritz.box";
public String getHostname() { return m_hostname; }
public void setHostname(String value) { this.m_hostname = value; }
// private List<NanoPANENode> m_nanoPaneNodeList = null;
// public List<NanoPANENode> getNanoPaneNodeList() {
// if (m_nanoPaneNodeList == null) {
// m_nanoPaneNodeList = new ArrayList<NanoPANENode>();
// }
// return m_nanoPaneNodeList;
// }
//
// public NanoPANENode getNanoPaneNode(int id) {
// return getNanoPaneNodeList().get(id);
// }
//
// DYNAMICCONTENTBinding m_dynPanelList = new DYNAMICCONTENTBinding();
// public DYNAMICCONTENTBinding getDynPanelList() { return m_dynPanelList; }
public void onPanelsCreate(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
List<Panel> panelList = null;
if (getNanoleafDeviceServer() != null) {
panelList = getNanoleafDeviceServer().getNanoLeafPanels();
}
getPanelInfoListSource().clear();
getPanelIDPanelInfoSourceMap().clear();
getPaneRepeatList().clear();
createPanelsList(panelList);
}
public void onCheckAndCreate(org.eclnt.jsfserver.base.faces.event.ActionEvent event) {
getPaneRepeatList().clear();
createPanelMatrix(getAnzahlPanels(), getMatrixX(), getMatrixY());
}
int m_matrixY = 3;
public int getMatrixY() { return m_matrixY; }
public void setMatrixY(int value) { this.m_matrixY = value; }
int m_matrixX = 3;
public int getMatrixX() { return m_matrixX; }
public void setMatrixX(int value) { this.m_matrixX = value; }
int m_anzahlPanels = 1;
public int getAnzahlPanels() { return m_anzahlPanels; }
public void setAnzahlPanels(int value) { this.m_anzahlPanels = value; }
int m_anzahlPanelsMax = 0;
public int getAnzahlPanelsMax() { return m_anzahlPanelsMax; }
public void setAnzahlPanelsMax(int value) { this.m_anzahlPanelsMax = value; }
// ------------------------------------------------------------------------
// inner classes
// ------------------------------------------------------------------------
/* Listener to the user of the page bean. */
public interface IListener extends Serializable {
}
// ------------------------------------------------------------------------
// members
// ------------------------------------------------------------------------
private IListener m_listener;
// ------------------------------------------------------------------------
// constructors & initialization
// ------------------------------------------------------------------------
public PanelConfigBean() {
initColorCombo();
}
private void initColorCombo() {
for (ColorEnum colorEnum: ColorEnum.values()) {
getColorCombo().addValidValue(colorEnum.name(), colorEnum.name());
}
}
Hashtable<String, PanelInfo> m_panelIDPanelInfoSourceMap = null;
public Hashtable<String, PanelInfo> getPanelIDPanelInfoSourceMap() {
if (m_panelIDPanelInfoSourceMap == null) {
m_panelIDPanelInfoSourceMap = new Hashtable<String, PanelInfo>();
}
return m_panelIDPanelInfoSourceMap;
}
// Hashtable<String, PanelInfo> m_panelIDPanelInfoTargetMap = null;
// public Hashtable<String, PanelInfo> getPanelIDPanelInfoTargetMap() {
// if (m_panelIDPanelInfoTargetMap == null) {
// m_panelIDPanelInfoTargetMap = new Hashtable<String, PanelInfo>();
// }
// return m_panelIDPanelInfoTargetMap;
// }
// public NanoPANENode createNanoLeafNanoPANENode(int listNr, Panel panel) {
// NanoPANENode nanoPANENode = null;
// PanelInfo panelInfo = new PanelInfo(listNr, panel);
// Integer panelID = panel.getId();
//
// nanoPANENode = new NanoPANENode(panelInfo);
// nanoPANENode.setActionListener("#{d.PanelConfigBean.onPanelSourceAction}");
// nanoPANENode.setInvokeevent("click");
// nanoPANENode.setHeight(60);
// nanoPANENode.setWidth(60);
// nanoPANENode.setBorder("left:2;right:2;top:2;bottom:2;color:#ff0000");
// nanoPANENode.setDragsend("NANOLEAF:" + panelID);
// nanoPANENode.setReference(panelID.toString());
//
//
//
// return nanoPANENode;
// }
private void createPanelsList(List<Panel> panelList) {
if (panelList != null && panelList.size() > 0) {
System.out.println("Panels: " + panelList.size());
} else {
panelList = new ArrayList<Panel>();
Panel panel = new Panel(58456, 1, 2, 2, ShapeType.rhythm());
panelList.add(panel);
panel = new Panel(43456, 1, 2, 2, ShapeType.rhythm());
panelList.add(panel);
}
setAnzahlPanels(panelList.size());
PanelInfo panelInfo = null;
int panelnr = 0;
for (int p = 0; p < panelList.size(); p++) {
Panel panel = panelList.get(p);
panelInfo = new PanelInfo(panelnr, panel);
panelInfo.setColor(getDefaultPanelColor());
panelnr++;
getPanelIDPanelInfoSourceMap().put(panelInfo.getPanelNanoleafID()+"", panelInfo);
getPanelInfoListSource().add(panelInfo);
}
}
private void createPanelMatrix(int anzahlPanels, int matrixX, int matrixY) {
int anzahlPanelMatrix = 0;
PanelInfo panelInfo = null;
anzahlPanelMatrix = matrixX * matrixY;
if (getAnzahlPanels() > anzahlPanelMatrix) {
OKPopup.createInstance("Matrix", "Bitte vergr<67><72>ern Sie die Matrix.");
return;
}
List<PanelInfo> paneInfoList = null;
PaneRepeat paneRepeat = new PaneRepeat();
int panelID = 0;
for (int x = 0; x < matrixX; x++) {
paneInfoList = new ArrayList<PanelInfo>();
paneRepeat = new PaneRepeat();
for (int y = 0; y < matrixY; y++) {
panelInfo = new PanelInfo();
panelInfo.setPanelID(panelID);
panelInfo.setReference("REF_XY|" + x + "|" + y);
panelInfo.setColor(getDefaultPanelColor());
panelInfo.setPanelNanoleafID(panelID);
// paneInfoTest.setDrangsendSource("#{d.DragDropPaneBean.onDragSendPaneSource}");
paneInfoList.add(panelInfo);
panelID++;
}
paneRepeat.setPaneRepeatID(x);
paneRepeat.setPanelInfoList(paneInfoList);
getPaneRepeatList().add(paneRepeat);
}
}
public void onDropPanelActions(ActionEvent event) {
if (event instanceof BaseActionEventDrop)
{
Statusbar.outputSuccess("Drop-Event was processed: " + event.getClass().getName());
BaseActionEventDrop baed = (BaseActionEventDrop)event;
String dragInfo = baed.getDragInfo();
System.out.println(baed.getSourceReference());
String ref = baed.getSourceReference();
MatrixInfo matrixInfo = createMatrixInfo(ref);
if (matrixInfo != null) {
if (dragInfo.startsWith("NANOLEAF:"))
{
String nanoLeafID = dragInfo.substring("NANOLEAF:".length());
PanelInfo panelInfo = getPanelIDPanelInfoSourceMap().get(nanoLeafID);
panelInfo.setColor(getDefaultPanelColor());
getPaneRepeatList().get(matrixInfo.getMatrixX()).getPanelInfoList().set(matrixInfo.getMatrixY(), panelInfo);
removeNanoLeafFromSource(nanoLeafID);
selectNextPanel();
System.out.println("Source: " + nanoLeafID);
System.out.println("Ziel: ");
System.out.println("Drop: " + dragInfo);
}
}
}
else if (event instanceof BaseActionEventInvoke)
{
Statusbar.outputSuccess("Cashier Icon was pressed!");
}
}
private void removeNanoLeafFromSource(String nanoLeafID) {
int aktId = 0;
int nanoID = 0;
nanoID = Integer.parseInt(nanoLeafID);
for (int p = 0; p < getPanelInfoListSource().size(); p++) {
PanelInfo panelInfo = getPanelInfoListSource().get(p);
if (panelInfo.getPanelNanoleafID() == nanoID) {
aktId = p;
}
}
getPanelInfoListSource().remove(aktId);
getPanelIDPanelInfoSourceMap().remove(nanoLeafID);
}
private MatrixInfo createMatrixInfo(String ref) {
MatrixInfo matrixInfo = null;
// #{d.PanelConfigBean.paneRepeatList[1].panelInfoList[2].panelID}
int x = -1;
int y = -1;
int lastPointStart = 0;
int lastPointEnde = 0;
String lastString = "";
int counterStart = 0;
int counterEnde = 0;
counterStart = StringUtil.getCountLetter(ref, '[');
counterEnde = StringUtil.getCountLetter(ref, ']');
if (counterStart == counterEnde) {
for (int p = 0; p < counterStart; p++) {
lastPointStart = ref.indexOf("[");
lastPointEnde = ref.indexOf("]");
if (x == -1) {
lastString = ref.substring(lastPointStart +1, lastPointEnde);
x = Integer.parseInt(lastString);
//System.out.println("X: " + x);
} else {
lastString = ref.substring(lastPointStart +1, lastPointEnde);
y = Integer.parseInt(lastString);
//System.out.println("Y: " + y);
}
ref = ref.substring(lastPointEnde +1);
//System.out.println(ref);
}
matrixInfo = new MatrixInfo(x, y);
}
return matrixInfo;
}
private List<PaneRepeat> m_paneRepeatList = null;
public List<PaneRepeat> getPaneRepeatList() {
if (m_paneRepeatList == null) {
m_paneRepeatList = new ArrayList<PaneRepeat>();
}
return m_paneRepeatList;
}
private List<PanelInfo> m_panelInfoListSource = null;
public List<PanelInfo> getPanelInfoListSource() {
if (m_panelInfoListSource == null) {
m_panelInfoListSource = new ArrayList<PanelInfo>();
}
return m_panelInfoListSource;
}
// private List<PanelInfo> m_panelInfoListTarget = null;
// public List<PanelInfo> getPanelInfoListTarget() {
// if (m_panelInfoListTarget == null) {
// m_panelInfoListTarget = new ArrayList<PanelInfo>();
// }
// return m_panelInfoListTarget;
// }
/**
* Inner Class
*/
public class PaneRepeat {
private int i_paneRepeatID = 0;
private List<PanelInfo> i_panelInfoList = null;
public int getPaneRepeatID() {
return i_paneRepeatID;
}
public void setPaneRepeatID(int paneRepeatID) {
i_paneRepeatID = paneRepeatID;
}
public List<PanelInfo> getPanelInfoList() {
return i_panelInfoList;
}
public void setPanelInfoList(List<PanelInfo> panelInfoList) {
i_panelInfoList = panelInfoList;
}
}
public class PanelInfo {
String i_reference;
public String getReference() { return i_reference; }
public void setReference(String value) { this.i_reference = value; }
String i_color;
public String getColor() { return i_color; }
public void setColor(String value) {
this.i_color = value;
createBorder();
}
String i_drangsendSource;
public String getDrangsendSource() { return i_drangsendSource; }
public void setDrangsendSource(String value) { this.i_drangsendSource = value; }
int m_panelID = 0;
int m_panelNanoleafID = 0;
int m_panelMatrixPosX = 0;
int m_panelMatrixPosY = 0;
String m_panelColor = null;
boolean m_panelActiv = true;
boolean m_panelInit = false;
Panel m_panel;
String m_border = null;
public PanelInfo() {
}
public void createBorder() {
String border = null;
if (getColor().equals(getDefaultPanelColor())) {
border = "left:1;right:1;top:1;bottom:1;color:" + getColor();
} else {
border = "left:3;right:3;top:3;bottom:3;color:" + getColor();
}
setBorder(border);
}
public PanelInfo(int panelnr, Panel panel) {
this.m_panelID = panelnr;
this.m_panel = panel;
this.m_panelNanoleafID = panel.getId();
this.m_panelMatrixPosX = panel.getX();
this.m_panelMatrixPosY = panel.getY();
this.i_drangsendSource = "NANOLEAF:" + getPanelNanoleafID();
}
public int getPanelID() {
return m_panelID;
}
public void setPanelID(int panelID) {
m_panelID = panelID;
}
public int getPanelNanoleafID() {
return m_panelNanoleafID;
}
public void setPanelNanoleafID(int panelNanoleafID) {
m_panelNanoleafID = panelNanoleafID;
}
public int getPanelMatrixPosX() {
return m_panelMatrixPosX;
}
public void setPanelMatrixPosX(int panelMatrixPosX) {
m_panelMatrixPosX = panelMatrixPosX;
}
public int getPanelMatrixPosY() {
return m_panelMatrixPosY;
}
public void setPanelMatrixPosY(int panelMatrixPosY) {
m_panelMatrixPosY = panelMatrixPosY;
}
public String getPanelColor() {
return m_panelColor;
}
public void setPanelColor(String panelColor) {
m_panelColor = panelColor;
}
public boolean getPanelActiv() {
return m_panelActiv;
}
public void setPanelActiv(boolean panelActiv) {
m_panelActiv = panelActiv;
}
public boolean getPanelInit() {
return m_panelInit;
}
public void setPanelInit(boolean panelInit) {
m_panelInit = panelInit;
}
public Panel getPanel() {
return m_panel;
}
public String getBorder() {
return m_border;
}
public void setBorder(String border) {
m_border = border;
}
}
@Override
public String getPageName() { return "/nanoleaf/tools/panelconfig/panelconfig.xml"; }
@Override
public String getRootExpressionUsedInPage() { return "#{d.PanelConfigBean}"; }
// ------------------------------------------------------------------------
// public usage
// ------------------------------------------------------------------------
/* Initialization of the bean. Add any parameter that is required within your scenario. */
public void prepare(IListener listener)
{
m_listener = listener;
}
// ------------------------------------------------------------------------
// private usage
// ------------------------------------------------------------------------
}

@ -1,18 +1,29 @@
package de.games.nanoleaf.panelconfig;
package de.nanoleaf.tools.panelconfig;
import io.github.rowak.nanoleafapi.Panel;
public class PanelInfo {
int m_panelID = 0;
String m_panelNanoleafID = null;
int m_panelNanoleafID = 0;
int m_panelMatrixPosX = 0;
int m_panelMatrixPosY = 0;
String m_panelColor = null;
boolean m_panelActiv = true;
boolean m_panelInit = false;
Panel m_panel;
String m_boarder = null;
public PanelInfo() {
}
public PanelInfo(int panelID) {
this.m_panelID = panelID;
public PanelInfo(int panelnr, Panel panel) {
this.m_panelID = panelnr;
this.m_panel = panel;
this.m_panelNanoleafID = panel.getId();
this.m_panelMatrixPosX = panel.getX();
this.m_panelMatrixPosY = panel.getY();
}
@ -24,10 +35,10 @@ public class PanelInfo {
}
public String getPanelNanoleafID() {
public int getPanelNanoleafID() {
return m_panelNanoleafID;
}
public void setPanelNanoleafID(String panelNanoleafID) {
public void setPanelNanoleafID(int panelNanoleafID) {
m_panelNanoleafID = panelNanoleafID;
}
@ -70,6 +81,18 @@ public class PanelInfo {
public void setPanelInit(boolean panelInit) {
m_panelInit = panelInit;
}
public Panel getPanel() {
return m_panel;
}
public String getBoarder() {
return m_boarder;
}
public void setBoarder(String boarder) {
m_boarder = boarder;
}

@ -0,0 +1,33 @@
package de.nanoleaf.tools.panelconfig;
import java.util.List;
import de.tools.ReflectClass;
import io.github.rowak.nanoleafapi.Color;
public class TestClass {
public TestClass() {
Color color = new Color();
ReflectClass reflectClass = new ReflectClass(color);
List<String> fieldsList = reflectClass.getAllFields();
for (String field: fieldsList) {
System.out.println(field);
}
Color farbe = Color.BLUE;
System.out.println(farbe);
}
public static void main(String[] args) {
new TestClass();
}
}

@ -216,7 +216,7 @@ public class ReflectClass {
}
public List<String> getAllFields() {
public List<String> getAllDeclaredFields() {
List<String> resultList = new ArrayList<String>();
Field[] fields = getWorkObject().getClass().getDeclaredFields();
@ -226,6 +226,16 @@ public class ReflectClass {
return resultList;
}
public List<String> getAllFields() {
List<String> resultList = new ArrayList<String>();
Field[] fields = getWorkObject().getClass().getFields();
for (Field field : fields) {
resultList.add(field.getName());
}
return resultList;
}
public String getType(String fieldname) {
String result = null;
try {

@ -0,0 +1,50 @@
package de.tvo.workplace;
import org.eclnt.jsfserver.pagebean.PageBean;
import org.eclnt.jsfserver.resources.ResourceManager;
public class DefaultPageBean extends PageBean {
public DefaultPageBean() {
// TODO Auto-generated constructor stub
}
public String getLiteral(String module, String key) {
String ausgabe = "";
try {
if (key == null)
return "";
ausgabe = ResourceManager.getRuntimeInstance().readProperty("literals" + module, key.toLowerCase());
// ausgabe = readProperty("literals" + module, name.toLowerCase());
// System.out.println("module: " + module + " key: " + key + " ausgabe: " +
// ausgabe);
// System.out.println("Language: " +
// FacesContext.getCurrentInstance().getViewRoot().getLocale());
} catch (Exception e) {
ausgabe = key;
}
if (ausgabe.equals("literalstable is not defined"))
ausgabe = key;
if (ausgabe.startsWith("{literals"))
ausgabe = key;
return ausgabe;
}
@Override
public String getPageName() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getRootExpressionUsedInPage() {
// TODO Auto-generated method stub
return null;
}
}

@ -10,7 +10,7 @@ import org.eclnt.workplace.IWorkpageDispatcher;
import org.eclnt.workplace.WorkpageDispatchedPageBean;
import org.eclnt.workplace.WorkpageStarterFactory;
import de.geis.portal.workplace.layout.DefaultLayout;
import de.tvo.workplace.layout.DefaultLayout;
import jakarta.servlet.http.HttpSession;
@CCGenClass (expressionBase="#{d.DefaultWorkplaceBean}")

@ -9,8 +9,8 @@ import org.eclnt.jsfserver.util.HttpSessionAccess;
import org.eclnt.workplace.IWorkpageDispatcher;
import org.eclnt.workplace.WorkpageDispatchedPageBean;
import de.geis.portal.workplace.layout.DefaultLayout;
import de.geis.portal.workplace.layout.LayoutManager;
import de.tvo.workplace.layout.DefaultLayout;
import de.tvo.workplace.layout.LayoutManager;
import jakarta.servlet.http.HttpSession;
@CCGenClass (expressionBase="#{d.MainPage}")

@ -1,4 +1,4 @@
package de.geis.portal.workplace.layout;
package de.tvo.workplace.layout;
import java.io.Serializable;

@ -1,4 +1,4 @@
package de.geis.portal.workplace.layout;
package de.tvo.workplace.layout;
public interface LayoutInterface {

@ -1,4 +1,4 @@
package de.geis.portal.workplace.layout;
package de.tvo.workplace.layout;
import java.io.Serializable;

@ -2,7 +2,10 @@
<managedpackage name="de.tvo.workplace"/>
<dispatcherinfoextension resource="de/nanoleaf/managedbeans.xml"/>
<dispatcherinfoextension resource="de/examples/managedbeans.xml"/>
<dispatcherinfoextension resource="de/games/managedbeans.xml"/>
</dispatcherinfo>

@ -0,0 +1,37 @@
<?xml version='1.0' encoding='UTF-8'?>
<!--
Must be set to "false" for runtime purposes - especially when using the RISC
Client: CapatainCasa uses URL rewriting for session management.
If session id cookies are passed to the browser, then multiple browser instances
will share the same session id cookie - which may have server side problems as
consequence.
hbm2ddl.auto="create-drop"
cookies='false'
-->
<Context>
<!-- MariaDB CRM Verbindung -->
<Resource name="jdbc/mariadbnl"
global="jdbc/mariadb"
auth="Container"
factory="com.zaxxer.hikari.HikariJNDIFactory"
type="javax.sql.DataSource"
maximumPoolSize="15"
minimumIdle="1"
dataSource.user="root"
dataSource.password="jhi1nPw."
show_sql="true"
hbm2ddl.auto="create-drop"
driverClassName="org.mariadb.jdbc.Driver"
testOnBorrow="true"
jdbcUrl="jdbc:mariadb://ZITNB014.de.geis-group.net:3306/nanoleafdb"
connectionTestQuery = "select 1"
allowPoolSuspension="true"
/>
</Context>

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Properties>
<Property name="logPath">${sys:catalina.home}/temp</Property>
<Property name="logPath">/temp</Property>
</Properties>
<Appenders>
<Console name="DefaultConsole">
@ -37,7 +37,7 @@
<appender-ref ref="ClassesConsole" />
<appender-ref level="INFO" ref="ClassesLog" />
</logger>
<Logger name="de.geis" level="INFO" additivity="false" includeLocation="false">
<Logger name="de.tvo" level="INFO" additivity="false" includeLocation="false">
<appender-ref ref="DefaultConsole" />
<appender-ref level="DEBUG" ref="DefaultLog" />
</Logger>
@ -45,7 +45,7 @@
<appender-ref ref="DefaultConsole" />
<appender-ref level="DEBUG" ref="DefaultLog" />
</Logger>
<Logger name="de.geis.examples" level="INFO" additivity="false" includeLocation="false">
<Logger name="de.nanoleaf" level="INFO" additivity="false" includeLocation="false">
<appender-ref ref="DefaultConsole" />
</Logger>
<Logger name="managedbeans" level="INFO" additivity="false" includeLocation="false">

@ -0,0 +1,3 @@
load=Laden
reset=Zu\u00FCcksetzen
save=Speichern

@ -0,0 +1,5 @@
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Created by cctranslate
#Tue Jul 04 07:04:10 CEST 2017

@ -0,0 +1,4 @@
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Created by cctranslate
#Tue Jul 04 07:04:10 CEST 2017

@ -0,0 +1,5 @@
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Created by cctranslate
#Tue Jul 04 07:04:10 CEST 2017

@ -0,0 +1,4 @@
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Created by cctranslate
#Tue Jul 04 07:04:10 CEST 2017

@ -0,0 +1,4 @@
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
#Created by org.eclnt.editor.resourceeditor.ResourceEditor
#Fri Aug 18 14:40:38 CEST 2017

@ -58,4 +58,12 @@
</cookie-config>
</session-config>
<resource-ref>
<description>MariaDB Verbindung</description>
<res-ref-name>jdbc/mariadbnl</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>

@ -0,0 +1,39 @@
## Properties f\u00fcr Geisportal
## Workplace Umgebung
[WORKPLACE]
TEST=true
## Anzahl der Login Versuche.
MAX_LOGIN_ATTEMPTS=8
## Send Email fail Login
SEND_EMAIL_FAIL_LOGIN=4
##
SESSION_DIFF_TIME=2
## Mail from Portal
SEND_EMAIL_FROM_PORTAL=webportal-test-admin@geis-group.de
SEND_EMAIL_TO_LOGIN=java-fehlermeldungen@geis-group.de
SEND_EMAIL_ERROR_MSG=java-fehlermeldungen@geis-group.de
##thomas.vogel@geis-group.de;markus.kirchner@geis-group.de
## Auto Logout
SESSION_AUTO_LOGOUT_TIME=60
##
RIGHTS_UPDATE_NEXT_INTERVAL=10
## Portal Messages Delete Status nach ... Tagen
MSG_DELETE_STATUS_SET=14
## Portal Messages Typen Delete Status
MSG_DELETE_TYPEN_SET=TEXT_MSG;TEXT_MSG_PUSH;EMAIL_MSG
## Portal Messages Delete from DB ... Tagen
MSG_DELETE_FROM_DB=360
## Portal Message delete from Database Activ
MSG_DELETE_FROM_DB_ACTIV=false
## LoginTyp fuer Portal
PORTAL_LOGINTYP=WEB_USER;INTRANET_USER;CLIENT_USER
## TEST PORTAL URL
PORTAL_URL_TEST=https://webportal-test.geis-group.de
## PORTAL URL
PORTAL_URL=https://webportal.geis-group.de
## SESSION_TYP fuer Hostname
SESSION_TYP=PORTAL_SESSION
[DEFAULT]

@ -0,0 +1,19 @@
<logging level="INFO"
console="false"
plaintext="false"
outputclassmethod="false">
<!--
************************************************************************
loglevel that is used if errors occur when resolving an
property-access via expression resolution. And: decision of
a stack trace is output.
Possible values for level: SEVERE, WARNING(default), INFO, FINE
Possible values for stacktrace: true/false(default)
************************************************************************
-->
<!--
<loglevelmissingpropertyget level="WARNING" stacktrace="false"/>
-->
</logging>

@ -2,5 +2,7 @@
<resource name="literals" package=""/>
<resource name="literalsTooltip" package="tooltip"/>
<resource name="literalsWorkplace" package="workplace"/>
<resource name="literalsNanoleaf" package="nanoleaf"/>
<resource name="literalsPbc" package="pbc"/>
</resources>

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="utf-8"?>
<t:layoutdefinition xmlns:t="http://www.CaptainCasa.com/controllibrary/t" >
<t:beanprocessing id="g_1" beanbinding="#{d.DragDropPaneBean}" />
<t:rowtitlebar id="g_2" />
<t:rowheader id="g_3" />
<t:rowbodypane id="g_4" >
<t:row id="g_7" >
<t:repeat id="g_8" listbinding="#{d.DragDropPaneBean.panelSourceList}" >
<t:pane id="g_9" border=".{border}" dragsend=".{drangsendSource}" height="60" reference=".{paneID}" width="60" >
<t:rowdistance id="g_13" />
<t:row id="g_10" >
<t:coldistance id="g_11" width="50%" />
<t:label id="g_12" text=".{nanoleafID}" />
</t:row>
</t:pane>
<t:coldistance id="g_14" />
</t:repeat>
</t:row>
<t:rowdistance id="g_43" height="40" />
<t:repeat id="g_45" listbinding="#{d.DragDropPaneBean.paneRepeatList}" >
<t:row id="g_47" >
<t:repeat id="g_49" listbinding=".{paneInfoList}" >
<t:pane id="g_51" actionListener="#{d.DragDropPaneBean.onDropSendPaneTarget}" border=".{border}" dragsend=".{drangsendSource}" dropreceive="NANOLEAF" height="60" reference=".{reference}" tooltip=".{reference}" width="60" >
<t:rowdistance id="g_52" />
<t:row id="g_53" >
<t:coldistance id="g_54" width="50%" />
<t:label id="g_55" text=".{nanoleafID}" />
</t:row>
</t:pane>
</t:repeat>
</t:row>
</t:repeat>
</t:rowbodypane>
</t:layoutdefinition>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<t:layoutdefinition xmlns:t="http://www.CaptainCasa.com/controllibrary/t" >
<t:beanprocessing id="g_1" beanbinding="#{d.TicTacToeBean}" />
<t:rowbodypane id="g_4" />
</t:layoutdefinition>

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M615.3 168.5c2.3 0 4.6 .7 6.6 2.2 1.9 1.4 3.1 3.3 3.8 5 1.4 3.3 1.8 7.3 1.8 11.3 0 2.2-.3 4.9-.7 7.6l0 .4-50.9 264.9 0 0c-4 22.1-8.5 39.4-13.6 51.7-5 12.1-10.9 21.6-18.6 27l0 0c-7.5 5.3-16.9 7.7-27.6 8l-3 0c-16 0-29.3-4.2-36.9-14.8-.1-.1-.1-.1-.2-.2-.1-.2-.3-.4-.5-.6l0 0c-1.8-2.4-2.5-5.2-2.9-7.4-.5-2.8-.7-6.1-.7-9.8 0-7.3 .6-13.5 2.1-18.2 1.4-4.4 4.8-10.4 12.2-10.4l1.3 .1c.2 0 .4 .1 .5 .1 .3 .1 .6 .1 .8 .2 .6 .1 1.3 .3 2.2 .6l7.6 2.2 .1 0 7.6 2.1c.9 .2 1.7 .4 2.2 .5 .4 .1 .6 .1 .7 .1 0 0 .1 0 .2-.1 .1-.1 .4-.2 .8-.6 .9-.9 2.2-2.6 3.6-5.7 2.6-5.8 4.2-14.7 4.2-27.4 0-.7-.3-3.4-1.3-8.9-.9-5.1-2.3-12.2-4.2-21.1l-56-232.9-.1-.4 0-.3c-.4-2.7-.7-5.3-.7-7.3 0-3.7 .4-7.5 1.7-10.6 .7-1.6 1.8-3.4 3.5-4.9 1.9-1.5 4.2-2.3 6.5-2.3l34.6 0c4.6 0 8.7 1.7 11.9 5l1.3 1.5c1.2 1.6 2 3.4 2.7 5.2 .9 2.4 1.5 5.1 2 8.1l30.4 161.2 23.8-160c.8-5.8 2.2-11.4 5.1-15.1 3-3.8 7.2-5.8 12-5.8l24 0zM375.1 34.6c2.6 0 5.1 .7 7.4 2.3 2.2 1.5 3.7 3.6 4.7 5.7 1.9 4 2.5 9.1 2.5 14.5l0 111.2c0 .1 0 .2 0 .3l32.4 0c2.5 0 5 .6 7.2 2.1 2.2 1.4 3.7 3.4 4.8 5.5 2 3.9 2.6 8.8 2.6 13.9l0 15.4c0 5-.6 9.8-2.6 13.7-1.1 2-2.6 4-4.8 5.4-2.2 1.4-4.7 2-7.1 2l-32.5 0 0 145.8c0 10.8 .7 19.5 2 26.2 1.4 6.9 3.1 10.9 4.7 12.9 1.2 1.5 2.2 2.5 3.1 3.2l2.2 1.4 .1 .1 2.9 .8c1.2 .2 2.6 .3 4.3 .3l20.3 0c4.5 0 8.9 1.7 11.8 5.8 2.6 3.6 3.3 8.1 3.3 12.2l0 17.2c0 4.5-.8 9.3-3.4 13.1-3 4.2-7.5 6-12.3 6l0 0-29.1 .1c-8 0-15-.6-21.2-1.7-6.7-1.3-13.4-4.1-20.1-8.1-7.2-4.4-13-10.3-17.5-17.8-4.5-7.5-7.9-17.5-10.5-29.5-2.6-12.2-3.9-26.6-3.9-43l0-144.9-13.4 0c-2.4 0-4.9-.6-7.1-2-2.2-1.4-3.7-3.4-4.8-5.4-2-3.9-2.6-8.7-2.6-13.7l0-15.4c0-5.1 .6-10 2.6-13.9 1.1-2.1 2.6-4 4.8-5.5 2.2-1.5 4.7-2.1 7.2-2.1l13.4 0 0-.6 5.2-111.2 0-.1 .3-3.9c.5-3.8 1.3-7.4 2.7-10.3 2.1-4.2 6-7.9 11.8-7.9l28.6 0zm-268 11.7c1.8 .3 3.6 .9 5.3 2.1 2.1 1.5 3.5 3.5 4.4 5.4 1.7 3.7 2.3 8.4 2.3 13.2l0 377.8c0 6.7-.6 12.6-2.4 17.1-.9 2.3-2.3 4.7-4.4 6.5-2.3 2-5.1 3-8.1 3l-43.7 0c-3 0-5.8-1.1-8.1-3.1-2.1-1.9-3.4-4.3-4.2-6.5-1.7-4.5-2.3-10.3-2.3-17l0-315.8c-4.8 1.2-8.7 2.2-11.5 2.9-1.9 .5-3.4 .8-4.4 1.1-.5 .1-.9 .2-1.2 .3-.1 0-.3 .1-.5 .1-.1 0-.2 0-.3 .1 0 0-.2 0-.3 0 0 0-.2 0-.4 0l0 0c-.1 0-.3 0-.4 0-.1 0-.2 0-.2 0-2.2 .1-4.5-.4-6.6-1.7-2.3-1.4-3.8-3.4-4.7-5.3-1.8-3.7-2.3-8.4-2.3-13l0-27.4c0-4.4 .7-8.8 2.6-12.4 2.1-3.9 5.5-6.6 9.8-7.6l75.5-19.5c1.4-.4 2.9-.5 4.4-.5l1.8 .1zm143.8-.5c1.8 .3 3.6 .9 5.2 2.1 2.1 1.5 3.5 3.5 4.4 5.4 1.7 3.7 2.2 8.4 2.2 13.2l0 377.8c0 6.7-.6 12.6-2.4 17.1-.9 2.3-2.3 4.7-4.4 6.5-2.3 2-5.1 3-8.1 3l-43.7 0c-3 0-5.8-1.1-8.1-3.1-2.1-1.9-3.4-4.3-4.2-6.5-1.7-4.5-2.3-10.3-2.3-17l0-315.8c-4.8 1.2-8.7 2.2-11.5 2.9-1.9 .5-3.4 .8-4.4 1.1-.5 .1-.9 .2-1.2 .3-.1 0-.3 .1-.5 .1-.1 0-.2 0-.3 .1-.1 0-.2 0-.3 0 0 0-.2 0-.4 0l0 0c-.1 0-.2 0-.3 0-.1 0-.2 0-.3 0-2.2 .1-4.5-.4-6.6-1.7-2.3-1.4-3.8-3.4-4.7-5.3-1.8-3.7-2.3-8.3-2.3-13l0-27.4c0-4.4 .7-8.7 2.6-12.4 2.1-3.9 5.5-6.6 9.8-7.6l75.4-19.4c1.4-.4 2.9-.5 4.4-.5l1.8 .1z"/></svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M320 96l0 320c21 0 41.8-4.1 61.2-12.2s37-19.8 51.9-34.7 26.6-32.5 34.7-51.9 12.2-40.2 12.2-61.2-4.1-41.8-12.2-61.2-19.8-37.1-34.7-51.9-32.5-26.6-51.9-34.7-40.2-12.2-61.2-12.2zM0 256L160 416 320 256 160 96 0 256zm480 0c0 21 4.1 41.8 12.2 61.2s19.8 37 34.7 51.9 32.5 26.6 51.9 34.7 40.2 12.2 61.2 12.2l0-320c-42.4 0-83.1 16.9-113.1 46.9S480 213.6 480 256z"/></svg>

After

Width:  |  Height:  |  Size: 664 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M71.8 344.3c-6.5-14.2-6.9-18.3 7.4-23.1 25.6-8 8 9.2 43.2 49.2l.3 0 0-93.9c1.2-50.2 44-92.2 97.7-92.2 53.9 0 97.7 43.5 97.7 96.8 0 63.4-60.8 113.2-128.5 93.3-10.5-4.2-2.1-31.7 8.5-28.6 53 0 89.4-10.1 89.4-64.4 0-61-77.1-89.6-116.9-44.6-23.5 26.4-17.6 42.1-17.6 157.6 50.7 31 118.3 22 160.4-20.1 24.8-24.8 38.5-58 38.5-93 0-35.2-13.8-68.2-38.8-93.3-24.8-24.8-57.8-38.5-93.3-38.5S151 163.3 126.3 188c-.3 .3-16 16.5-21.2 23.9l-.5 .6c-3.3 4.7-6.3 9.1-20.1 6.1-6.9-1.7-14.3-5.8-14.3-11.8L70.2 20c0-5 3.9-10.5 10.5-10.5L322 9.5c8.3 0 8.3 11.6 8.3 15.1 0 3.9 0 15.1-8.3 15.1l-223.2 0 0 132.9 .3 0c104.2-109.8 282.8-36 282.8 108.9 0 178.1-244.8 220.3-310.1 62.8zM135.1 83.5c-.5 4.2 4.6 24.5 14.6 20.6 124.8-47.5 202.8 40.4 209.4 40.4 4.8 0 22.8-15.3 14.3-22.8-93.2-89-234.5-57-238.3-38.2zM361.5 414.7c-110 109.9-299 60.8-332-104.2 0-12.2-30.4-7.4-28.9 3.3 24 173.4 246 256.9 381.6 121.3 6.9-7.8-12.6-28.4-20.7-20.4zM182.1 306.6c0 4 4.3 7.3 5.5 8.5 3 3 6.1 4.4 8.5 4.4 3.8 0 2.6 .2 22.3-19.5 19.6 19.3 19.1 19.5 22.3 19.5 5.4 0 18.5-10.4 10.7-18.2l-17.3-17.3 18.2-18.2c6.3-6.8-10.1-21.8-16.2-15.7L218.2 268c-18.6-18.8-18.4-19.5-21.5-19.5-5 0-18 11.7-12.4 17.3L202.5 284c-18.1 17.9-20.4 19.2-20.4 22.6z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M423.9 255.8L411 413.1c-3.3 40.7-63.9 35.1-60.6-4.9l10-122.5-41.1 2.3c10.1 20.7 15.8 43.9 15.8 68.5 0 41.2-16.1 78.7-42.3 106.5l-39.3-39.3c57.9-63.7 13.1-167.2-74-167.2-25.9 0-49.5 9.9-67.2 26L73 243.2c22-20.7 50.1-35.1 81.4-40.2l75.3-85.7-42.6-24.8-51.6 46C105.5 165.3 64.9 120 95 93.1l68-60.7c9.8-8.8 24.1-10.2 35.5-3.6 0 0 139.3 80.9 139.5 81.1 16.2 10.1 20.7 36 6.1 52.6l-58.4 66.5 106.1-5.9c18.5-1.1 33.6 14.4 32.1 32.7zM359 101.8A50.9 50.9 0 1 0 359 0 50.9 50.9 0 1 0 359 101.8zM179.6 456.5c-80.6 0-127.4-90.6-82.7-156.1L57.2 260.7C36.4 287 24 320.3 24 356.4 24 487.1 174.7 557.8 275.4 478.9l-39.7-39.7c-16 10.9-35.3 17.3-56.1 17.3z"/></svg>

After

Width:  |  Height:  |  Size: 949 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M322.1 252l0-1-51.2-65.8s-12 1.6-25 15.1c-9 9.3-242.1 239.1-243.4 240.9-7 10 1.6 6.8 15.7 1.7 .8 0 114.5-36.6 114.5-36.6 .5-.6-.1-.1 .6-.6-.4-5.1-.8-26.2-1-27.7-.6-5.2 2.2-6.9 7-8.9l92.6-33.8c.6-.8 88.5-81.7 90.2-83.3zM482.2 372.1c13.3 16.1 20.7 13.3 30.8 9.3 3.2-1.2 115.4-47.6 117.8-48.9 8-4.3-1.7-16.7-7.2-23.4-2.1-2.5-205.1-245.6-207.2-248.3-9.7-12.2-14.3-12.9-38.4-12.8-10.2 0-106.8 .5-116.5 .6-19.2 .1-32.9-.3-19.2 16.9 7.7 9.5 234.2 299.7 239.9 306.6zm152.7 1.6c-2.3-.3-24.6-4.7-38-7.2 0 0-115 50.4-117.5 51.6-16 7.3-26.9-3.2-36.7-14.6l-57.1-74c-5.4-.9-60.4-9.6-65.3-9.3-3.1 .2-9.6 .8-14.4 2.9-4.9 2.1-145.2 52.8-150.2 54.7-5.1 2-11.4 3.6-11.1 7.6 .2 2.5 2 2.6 4.6 3.5 2.7 .8 300.9 67.6 308 69.1 15.6 3.3 38.5 10.5 53.6 1.7 2.1-1.2 123.8-76.4 125.8-77.8 5.4-4 4.3-6.8-1.7-8.2z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!-- Font Awesome Free 5.15.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) --><path d="M357.45 468.2c-1.2-7.7-1.3-7.6-9.6-7.6-99.8.2-111.8-2.4-112.7-2.6-12.3-1.7-20.6-10.5-21-23.1-.1-1.6-.2-71.6-1-129.1-.1-4.7 1.6-6.4 5.9-7.5 12.5-3 24.9-6.1 37.3-9.7 4.3-1.3 6.8-.2 8.4 3.5 4.5 10.3 8.8 20.6 13.2 30.9 1.6 3.7.1 4.4-3.4 4.4-10-.2-20-.1-30.4-.1v27h116c-1.4-9.5-2.7-18.1-4-27.5-7 0-13.8.4-20.4-.1-22.6-1.6-18.3-4.4-84-158.6-8.8-20.1-27.9-62.1-36.5-89.2-4.4-14 5.5-25.4 18.9-26.6 18.6-1.7 37.5-1.6 56.2-2 20.6-.4 41.2-.4 61.8-.5 3.1 0 4-1.4 4.3-4.3 1.2-9.8 2.7-19.5 4-29.2.8-5.3 1.6-10.7 2.4-16.1L23.75 0c-3.6 0-5.3 1.1-4.6 5.3 2.2 13.2-.8.8 6.4 45.3 63.4 0 71.8.9 101.8.5 12.3-.2 37 3.5 37.7 22.1.4 11.4-1.1 11.3-32.6 87.4-53.8 129.8-50.7 120.3-67.3 161-1.7 4.1-3.6 5.2-7.6 5.2-8.5-.2-17-.3-25.4.1-1.9.1-5.2 1.8-5.5 3.2-1.5 8.1-2.2 16.3-3.2 24.9h114.3v-27.6c-6.9 0-33.5.4-35.3-2.9 5.3-12.3 10.4-24.4 15.7-36.7 16.3 4 31.9 7.8 47.6 11.7 3.4.9 4.6 3 4.6 6.8-.1 42.9.1 85.9.2 128.8 0 10.2-5.5 19.1-14.9 23.1-6.5 2.7-3.3 3.4-121.4 2.4-5.3 0-7.1 2-7.6 6.8-1.5 12.9-2.9 25.9-5 38.8-.8 5 1.3 5.7 5.3 5.7 183.2.6-30.7 0 337.1 0-2.5-15-4.4-29.4-6.6-43.7zm-174.9-205.7c-13.3-4.2-26.6-8.2-39.9-12.5a44.53 44.53 0 0 1-5.8-2.9c17.2-44.3 34.2-88.1 51.3-132.1 7.5 2.4 7.9-.8 9.4 0 9.3 22.5 18.1 60.1 27 82.8 6.6 16.7 13 33.5 19.7 50.9a35.78 35.78 0 0 1-3.9 2.1c-13.1 3.9-26.4 7.5-39.4 11.7a27.66 27.66 0 0 1-18.4 0z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M256 167.5l64.9 98.8-129.8 0 64.9-98.8zM8 256a248 248 0 1 1 496 0 248 248 0 1 1 -496 0zm396.2 82.7l-148.2-223.2-148.2 223.2 30.4 0 33.6-51.7 168.6 0 33.6 51.7 30.2 0z"/></svg>

After

Width:  |  Height:  |  Size: 477 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M482.1 32L28.7 32C5.8 32 0 37.9 0 60.9L0 451.1C0 474.4 5.8 480 28.7 480l453.4 0c24.4 0 29.9-5.2 29.9-29.7l0-388.1c0-24.6-5.4-30.2-29.9-30.2zM178.4 220.3c-27.5-20.2-72.1-8.7-84.2 23.4-4.3 11.1-9.3 9.5-17.5 8.3-9.7-1.5-17.2-3.2-22.5-5.5-28.8-11.4 8.6-55.3 24.9-64.3 41.1-21.4 83.4-22.2 125.3-4.8 40.9 16.8 34.5 59.2 34.5 128.5 2.7 25.8-4.3 58.3 9.3 88.8 1.9 4.4 .4 7.9-2.7 10.7-8.4 6.7-39.3 2.2-46.6-7.4-1.9-2.2-1.8-3.6-3.9-6.2-3.6-3.9-7.3-2.2-11.9 1-57.4 36.4-140.3 21.4-147-43.3-3.1-29.3 12.4-57.1 39.6-71 38.2-19.5 112.2-11.8 114-30.9 1.1-10.2-1.9-20.1-11.3-27.3zm286.7 222c0 15.1-11.1 9.9-17.8 9.9l-394.9 0c-7.4 0-18.2 4.8-17.8-10.7 .4-13.9 10.5-9.1 17.1-9.1 132.3-.4 264.5-.4 396.8 0 6.8 0 16.6-4.4 16.6 9.9zm3.8-340.5l0 291c0 5.7-.7 13.9-8.1 13.9-12.4-.4-27.5 7.1-36.1-5.6-5.8-8.7-7.8-4-12.4-1.2-53.4 29.7-128.1 7.1-144.4-85.2-6.1-33.4-.7-67.1 15.7-100 11.8-23.9 56.9-76.1 136.1-30.5l0-71c0-26.2-.1-26.2 26-26.2 3.1 0 6.6 .4 9.7 0 10.1-.8 13.6 4.4 13.6 14.3-.1 .2-.1 .3-.1 .5zM417.4 334.1c-19.5 47.6-72.9 43.3-90 5.2-15.1-33.3-15.5-68.2 .4-101.5 16.3-34.1 59.7-35.7 81.5-4.8 20.6 28.8 14.9 84.6 8.1 101.1zM122.6 369.4c-7.5-1.3-33-3.3-33.7-27.8-.4-13.9 7.8-23 19.8-25.8 24.4-5.9 49.3-9.9 73.7-14.7 8.9-2 7.4 4.4 7.8 9.5 1.4 33-26.1 59.2-67.6 58.8z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M159.7 237.4C108.4 308.3 43.1 348.2 14 326.6-15.2 304.9 2.8 230 54.2 159.1 105.5 88.2 170.8 48.3 199.9 69.9s11.1 96.6-40.2 167.5zm351.2-57.3c-73.8 123.4-191.9 187.7-264.5 143.6-25-15.2-41.3-41.2-49-73.8-33.6 64.8-92.8 113.8-164.1 133.2 49.8 59.3 124.1 96.9 207 96.9 150 0 271.6-123.1 271.6-274.9 .1-8.5-.3-16.8-1-25z"/></svg>

After

Width:  |  Height:  |  Size: 627 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M224.5 373.1c-25.2-31.7-40.1-59.4-45-83.2-22.5-88 112.6-88 90.1 0-5.4 24.2-20.3 52-45 83.2l-.1 0zm138.2 73.2c-42.1 18.3-83.7-10.9-119.3-50.5 103.9-130.1 46.1-200-18.8-200-54.9 0-85.2 46.5-73.3 100.5 6.9 29.2 25.2 62.4 54.4 99.5-32.5 36-60.5 52.7-85.2 54.9-50 7.4-89.1-41.1-71.3-91.1 15.1-39.2 111.7-231.2 115.9-241.6 15.8-30.1 25.6-57.4 59.4-57.4 32.3 0 43.4 25.9 60.4 59.9 36 70.6 89.4 177.5 114.8 239.1 13.2 33.1-1.4 71.3-37 86.6zm47-136.1c-128.9-274.3-136-278.2-185.1-278.2-45.5 0-64.9 31.7-84.7 72.8-106.2 212.3-116.4 242.4-117.3 245-25.2 69.3 26.7 130.2 89.6 130.2 21.7 0 60.6-6.1 112.4-62.4 58.7 63.8 101.3 62.4 112.4 62.4 62.9 .1 114.9-60.9 89.6-130.2 0-3.9-16.8-38.9-16.8-39.6l0 0z"/></svg>

After

Width:  |  Height:  |  Size: 1000 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M256 0c-139.9 0-254 112.7-256 252.1-2 141.5 112.9 258.7 254.5 259.5 43.7 .3 85.9-10.4 123.3-30.7 3.6-2 4.2-7 1.1-9.7l-24-21.2c-4.9-4.3-11.8-5.5-17.8-3-26.1 11.1-54.5 16.8-83.7 16.4-114.4-1.5-206.9-96.6-205.1-211 1.8-112.9 94.3-204.2 207.7-204.2l207.7 0 0 369-117.8-104.7c-3.8-3.4-9.7-2.7-12.7 1.3-18.9 25-49.7 40.6-83.9 38.2-47.5-3.3-85.9-41.5-89.5-88.9-4.2-56.6 40.6-103.9 96.3-103.9 50.4 0 91.9 38.8 96.2 88 .4 4.4 2.4 8.5 5.7 11.4l30.7 27.2c3.5 3.1 9 1.2 9.9-3.4 2.2-11.8 3-24.2 2.1-36.8-4.9-72-63.3-130-135.4-134.4-82.7-5.1-151.8 59.5-154 140.6-2.1 78.9 62.6 147 141.6 148.7 33 .7 63.6-9.6 88.3-27.6L495 509.4c6.6 5.8 17 1.2 17-7.7l0-492c0-5.4-4.4-9.7-9.7-9.7L256 0z"/></svg>

After

Width:  |  Height:  |  Size: 981 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M377.7 32L70.3 32C31.4 32 0 63.4 0 102.3L0 409.7C0 448.6 31.4 480 70.3 480l307.5 0c38.5 0 69.8-31.1 70.3-69.6-46-25.6-110.6-60.3-171.6-88.4-32.1 44-84.1 81-148.6 81-70.6 0-93.7-45.3-97-76.4-4-39 14.9-81.5 99.5-81.5 35.4 0 79.4 10.2 127.1 25 16.5-30.1 26.5-60.3 26.5-60.3l-178.2 0 0-16.7 92.1 0 0-31.2-109.4 0 0-19 109.4 0 0-50.4 50.9 0 0 50.4 109.4 0 0 19-109.4 0 0 31.2 88.8 0s-15.2 46.6-38.3 90.9c48.9 16.7 100 36 148.6 52.7l0-234.4c.2-38.7-31.2-70.3-69.9-70.3zM47.3 323c1 20.2 10.2 53.7 69.9 53.7 52.1 0 92.6-39.7 117.9-72.9-44.6-18.7-84.5-31.4-109.4-31.4-67.4 0-79.4 33.1-78.4 50.6z"/></svg>

After

Width:  |  Height:  |  Size: 897 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M14 325.3c2.3-4.2 5.2-4.9 9.7-2.5 10.4 5.6 20.6 11.4 31.2 16.7 40.6 20.2 83.3 35.8 127.4 46.3 20.8 5 41.9 9 63.2 11.8 31.5 4.2 63.2 6 95 5.2 17.4-.4 34.8-1.8 52.1-3.8 56.2-6.6 111.1-21 163.3-42.8 2.9-1.2 5.9-2 9.1-1.2 6.7 1.8 9 9 4.1 13.9-3 2.7-6.2 5.2-9.6 7.4-30.7 21.1-64.2 36.4-99.6 47.9-24.5 7.9-49.6 13.8-75.1 17.6-17.6 2.7-35.4 4.3-53.2 4.8-.8 0-1.7 .2-2.5 .3l-21.1 0c-.8-.1-1.7-.2-2.5-.3-3.6-.2-7.2-.3-10.7-.4-16.9-.8-33.7-2.5-50.4-5.3-27.4-4.5-54.3-11.5-80.4-20.9-53.7-19.4-103.1-48.9-145.6-87-1.8-1.6-3-3.8-4.4-5.7l0-2zM172 65.1l-4.3 .6c-13.8 1.7-26.8 6.9-38 15.1-2.4 1.7-4.6 3.5-7.1 5.4-.2-.4-.3-.9-.4-1.4-.4-2.7-.8-5.5-1.3-8.2-.7-4.6-3-6.6-7.6-6.6l-11.5 0c-6.9 0-8.2 1.3-8.2 8.2l0 209.3c0 1 0 2 .1 3 .2 3 2 4.9 4.9 5 7 .1 14.1 .1 21.1 0 2.9 0 4.7-2 5-5 .1-1 .1-2 .1-3l0-72.4c1.1 .9 1.7 1.4 2.2 1.9 17.9 14.9 38.5 19.8 61 15.4 20.4-4 34.6-16.5 43.8-34.9 7-13.9 9.9-28.7 10.3-44.1 .5-17.1-1.2-33.9-8.1-49.8-8.5-19.6-22.6-32.5-43.9-36.9-3.2-.7-6.5-1-9.8-1.5-2.8-.1-5.5-.1-8.3-.1zM124.6 107c-.1-.7 .1-1.3 .4-1.9s.8-1.1 1.3-1.4c13.7-9.5 28.8-14.5 45.6-13.2 14.9 1.1 27.1 8.4 33.5 25.9 3.9 10.7 4.9 21.8 4.9 33 0 10.4-.8 20.6-4 30.6-6.8 21.3-22.4 29.4-42.6 28.5-14-.6-26.2-6-37.4-13.9-.6-.3-1-.8-1.3-1.4s-.4-1.2-.4-1.9c.1-14.1 0-28.1 0-42.2s.1-28 0-42.1zM330.3 65.1c-1 .1-2 .3-2.9 .4-9.7 .4-19.4 1.8-28.9 4.1-6.1 1.6-12 3.8-17.9 5.8-3.6 1.2-5.4 3.8-5.3 7.7 .1 3.3-.1 6.6 0 9.9 .1 4.8 2.1 6.1 6.8 4.9 7.8-2 15.6-4.2 23.5-5.7 12.3-2.3 24.7-3.3 37.2-1.4 6.5 1 12.6 2.9 16.8 8.4 3.7 4.8 5.1 10.5 5.3 16.4 .3 8.3 .2 16.6 .3 24.9 0 .5-.1 .9-.2 1.4-.5-.1-.9 0-1.3-.1-10.5-2.6-21.2-4.2-32-4.9-11.3-.6-22.5 .1-33.3 3.9-12.9 4.5-23.3 12.3-29.4 24.9-4.7 9.8-5.4 20.2-3.9 30.7 2 14 9 24.8 21.4 31.7 11.9 6.6 24.8 7.4 37.9 5.4 15.1-2.3 28.5-8.7 40.3-18.4 .5-.4 1-.8 1.6-1.1 .6 3.8 1.1 7.4 1.8 11 .6 3.1 2.5 5.1 5.4 5.2 5.4 .1 10.9 .1 16.3 0 1.3 0 2.5-.5 3.4-1.4s1.4-2.1 1.5-3.3c.1-.9 .1-1.9 .1-2.8l0-106c0-4.3-.3-8.6-.9-12.9-1.9-12.9-7.4-23.5-19-30.4-6.7-4-14.1-6-21.8-7.1-3.6-.5-7.2-.8-10.8-1.3-3.9 .1-7.9 .1-11.9 .1zm35 127.7c0 .6-.1 1.2-.3 1.7s-.7 1-1.2 1.3c-11.2 8.1-23.5 13.5-37.4 14.9-5.7 .6-11.4 .4-16.8-1.8-3-1.1-5.6-2.9-7.8-5.2s-3.7-5.1-4.6-8.1c-2-6.3-2-13.1-.1-19.4 2.5-8.3 8.4-13 16.4-15.6 8-2.4 16.5-3.2 24.8-2.2 8.4 .7 16.6 2.3 25 3.4 1.6 .2 2.1 1 2.1 2.6-.1 4.8 0 9.5 0 14.3s-.2 9.4-.1 14.1zM625.2 322.2c-1-5-4.8-6.9-9.1-8.3-6.8-2.1-13.9-3.5-21-3.9-13.1-1.1-26.3-.5-39.2 1.9-14.3 2.7-27.9 7.3-40 15.6-1.4 .9-2.7 2.1-3.7 3.5-.4 .6-.6 1.3-.7 1.9s0 1.4 .2 2.1c.4 1.5 2.1 1.9 3.6 1.8 .7 0 1.5 0 2.2-.1 7.8-.8 15.5-1.7 23.3-2.5 11.4-1.1 22.9-1.8 34.3-.9 4.9 .4 9.7 1.3 14.4 2.7 5.1 1.4 7.4 5.2 7.6 10.4 .4 8-1.4 15.7-3.5 23.3-4.1 15.4-10 30.3-15.8 45.1-.4 1-.8 2-1 3-.5 2.9 1.2 4.8 4.1 4.1 1.8-.4 3.4-1.3 4.8-2.5 4.5-4.2 8.8-8.7 12.7-13.4 12.8-16.4 20.3-35.3 24.7-55.6 .8-3.6 1.4-7.3 2.1-10.9l0-17.3zM493.1 199c-12.9-35.7-25.8-71.4-38.7-107.2-2-5.7-4.2-11.3-6.3-16.9-1.1-2.9-3.2-4.8-6.4-4.8-7.6-.1-15.2-.2-22.9-.1-2.5 0-3.7 2-3.2 4.5 .5 2.1 1.1 4.1 1.9 6.1 19.6 48.5 39.3 97 59.1 145.5 1.7 4.1 2.1 7.6 .2 11.8-3.3 7.3-5.9 15-9.3 22.3-3 6.5-8 11.4-15.2 13.3-5 1.3-10.2 1.7-15.4 1.1-2.5-.2-5-.8-7.5-1-3.4-.2-5.1 1.3-5.2 4.8-.1 3.3-.1 6.6 0 9.9 .1 5.5 2 8 7.4 8.9 5.6 1.1 11.2 1.8 16.9 2 17.1 .4 30.7-6.5 39.5-21.4 3.5-5.9 6.6-12 9.2-18.4 23.7-59.8 47.2-119.7 70.6-179.6 .7-1.8 1.3-3.6 1.6-5.5 .4-2.8-.9-4.4-3.7-4.4-6.6-.1-13.3 0-19.9 0-1.7-.1-3.4 .3-4.7 1.3s-2.4 2.3-3 3.9c-.5 1.4-1.1 2.7-1.6 4.1l-34.8 100c-2.5 7.2-5.1 14.5-7.7 22.2-.4-1.1-.6-1.7-.9-2.4z"/></svg>

After

Width:  |  Height:  |  Size: 3.7 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M257.7 162.7c-48.7 1.8-169.5 15.5-169.5 117.5 0 109.5 138.3 114 183.5 43.2 6.5 10.2 35.4 37.5 45.3 46.8l56.8-56s-32.3-25.3-32.3-52.8l0-147.1C341.5 89 317 32 229.2 32 141.2 32 94.5 87 94.5 136.3l73.5 6.8c16.3-49.5 54.2-49.5 54.2-49.5 40.7-.1 35.5 29.8 35.5 69.1zm0 86.8c0 80-84.2 68-84.2 17.2 0-47.2 50.5-56.7 84.2-57.8l0 40.6zM393.7 413c-7.7 10-70 67-174.5 67S34.7 408.5 10.2 379c-6.8-7.7 1-11.3 5.5-8.3 73.3 44.5 187.8 117.8 372.5 30.3 7.5-3.7 13.3 2 5.5 12zm39.8 2.2c-6.5 15.8-16 26.8-21.2 31-5.5 4.5-9.5 2.7-6.5-3.8s19.3-46.5 12.7-55c-6.5-8.3-37-4.3-48-3.2-10.8 1-13 2-14-.3-2.3-5.7 21.7-15.5 37.5-17.5 15.7-1.8 41-.8 46 5.7 3.7 5.1 0 27.1-6.5 43.1z"/></svg>

After

Width:  |  Height:  |  Size: 963 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M240.2 32c-61.9 0-131.5 16.9-184.2 55.4-5.1 3.1-9.1 9.2-7.2 19.4 1.1 5.1 5.1 27.4 10.2 39.6 4.1 10.2 14.2 10.2 20.3 6.1 32.5-22.3 96.5-47.7 152.3-47.7 57.9 0 58.9 28.4 58.9 73.1l0 38.5C203.1 227.7 78.3 251 46.8 264.2 11.3 280.5 16.4 357.7 16.4 376S31.6 480 141.3 480c47.8 0 113.7-20.7 153.3-42.1l0 25.4c0 3 2.1 8.2 6.1 9.1 3.1 1 50.7 2 59.9 2s62.5 .3 66.5-.7c4.1-1 5.1-6.1 5.1-9.1l0-296.6c-.1-80.3-57.9-136-192-136zm50.2 348c-21.4 13.2-48.7 24.4-79.1 24.4-52.8 0-58.9-33.5-59-44.7 0-12.2-3-42.7 18.3-52.9 24.3-13.2 75.1-29.4 119.8-33.5l0 106.7z"/></svg>

After

Width:  |  Height:  |  Size: 855 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M420.5 253.9a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm-265.1 0a24 24 0 1 1 0 48 24 24 0 1 1 0-48zm273.7-96.5l47.9-83c.8-1.1 1.3-2.4 1.5-3.8s.2-2.7-.1-4.1-.9-2.6-1.7-3.7-1.8-2-3-2.7-2.5-1.1-3.9-1.3-2.7 0-4 .4-2.5 1.1-3.6 1.9-1.9 2-2.5 3.2l-48.5 84.1c-38.8-17.4-80.8-26.4-123.3-26.4s-84.5 9-123.3 26.4L116.2 64.4c-.6-1.2-1.5-2.3-2.5-3.2s-2.3-1.5-3.6-1.9-2.7-.5-4-.4-2.7 .6-3.9 1.3-2.2 1.6-3 2.7-1.4 2.4-1.7 3.7-.3 2.7-.1 4.1 .8 2.6 1.5 3.8l47.9 83C64.5 202.2 8.2 285.5 0 384l576 0c-8.2-98.5-64.5-181.8-146.9-226.6z"/></svg>

After

Width:  |  Height:  |  Size: 817 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M315.6 215.4c11.7-32.6 45.4-126.9 45.4-157.1 0-26.6-15.7-48.9-43.7-48.9-44.6 0-84.6 131.7-97.1 163.1-9.7-28.5-55.1-172.5-95.1-172.5-31.1 0-45.7 22.9-45.7 51.7 0 35.3 34.2 126.8 46.6 162-6.3-2.3-13.1-4.3-20-4.3-23.4 0-48.3 29.1-48.3 52.6 0 8.9 4.9 21.4 8 29.7-36.9 10-51.1 34.6-51.1 71.7-.1 72.2 68.3 148.6 164.5 148.6 118 0 191.4-88.6 191.4-202.9 0-43.1-6.9-82-54.9-93.7zM280.2 108c4-12.3 21.1-64.3 37.1-64.3 8.6 0 10.9 8.9 10.9 16 0 19.1-38.6 124.6-47.1 148l-34-6 33.1-93.7zM110.8 48.3c0-11.9 14.5-45.7 46.3 47.1l34.6 100.3c-15.6-1.3-27.7-3-35.4 1.4-10.9-28.8-45.5-119.7-45.5-148.8zM108.5 244c29.3 0 67.1 94.6 67.1 107.4 0 5.1-4.9 11.4-10.6 11.4-20.9 0-76.9-76.9-76.9-97.7 .1-7.7 12.7-21.1 20.4-21.1zM292.8 430.3c-29.1 32-66.3 48.6-109.7 48.6-59.4 0-106.3-32.6-128.9-88.3-17.1-43.4 3.8-68.3 20.6-68.3 11.4 0 54.3 60.3 54.3 73.1 0 4.9-7.7 8.3-11.7 8.3-16.1 0-22.4-15.5-51.1-51.4-29.7 29.7 20.5 86.9 58.3 86.9 26.1 0 43.1-24.2 38-42 3.7 0 8.3 .3 11.7-.6 1.1 27.1 9.1 59.4 41.7 61.7 0-.9 2-7.1 2-7.4 0-17.4-10.6-32.6-10.6-50.3 0-28.3 21.7-55.7 43.7-71.7 8-6 17.7-9.7 27.1-13.1 9.7-3.7 20-8 27.4-15.4-1.1-11.2-5.7-21.1-16.9-21.1-27.7 0-120.6 4-120.6-39.7 0-6.7 .1-13.1 17.4-13.1 32.3 0 114.3 8 138.3 29.1 18.1 16.1 24.3 113.2-31 174.7zm-98.6-126c9.7 3.1 19.7 4 29.7 6-7.4 5.4-14 12-20.3 19.1-2.8-8.5-6.2-16.8-9.4-25.1z"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M640 238.2l-3.2 28.2-34.5 2.3-2 18.1 34.5-2.3-3.2 28.2-34.4 2.2-2.3 20.1 34.4-2.2-3 26.1-64.7 4.1 12.7-113.2-47.3 115.4-31.9 2-23.8-117.8 30.3-2 13.6 79.4 31.7-82.4 93.1-6.2zM426.8 371.5l28.3-1.8 12.9-120.1-28.4 1.9-12.8 120zM162 388.1l-19.4-36-3.5 37.4-28.2 1.7 2.7-29.1c-11 18-32 34.3-56.9 35.8-32.8 2-59.7-20.9-56.4-58.2 2.6-29.3 26.7-62.8 67.5-65.4 37.7-2.4 47.6 23.2 51.3 28.8l2.8-30.8 38.9-2.5c20.1-1.3 38.7 3.7 42.5 23.7l2.6-26.6 64.8-4.2-2.7 27.9-36.4 2.4-1.7 17.9 36.4-2.3-2.7 27.9-36.4 2.3-1.9 19.9 36.3-2.3-2.1 20.8 55-117.2 23.8-1.6 32.1 110.6 8.9-85.6-22.3 1.4 2.9-27.9 75-4.9-3 28-24.3 1.6-9.7 91.9-58 3.7-4.3-15.6-39.4 2.5-8 16.3-126.2 7.7zm-44.3-70.2l-26.4 1.7c-6.7-12.4-14.4-16.6-26.3-15.8-19 1.2-33.3 17.5-34.6 33.3-1.4 16 7.3 32.5 28.7 31.2 12.8-.8 21.3-8.6 28.9-18.9l27-1.7 2.7-29.8zm56.1-7.7c1.2-12.9-7.6-13.6-26.1-12.4L145 326.3c14.2-.9 27.5-2.1 28.8-16.1zM194.9 381l5.8-60c-5 13.5-14.7 21.1-27.9 26.6L194.9 381zm135.4-45l-7.9-37.8-15.8 39.3 23.7-1.5zM160.2 261.4l-4.3-17.5-39.6 2.6-8.1 18.2-31.9 2.1 57-121.9 23.9-1.6 30.7 102 9.9-104.7 27-1.8 37.8 63.6 6.5-66.6 28.5-1.9-4 41.2c7.4-13.5 22.9-44.7 63.6-47.5 40.5-2.8 52.4 29.3 53.4 30.3l3.3-32 39.3-2.7c12.7-.9 27.8 .3 36.3 9.7l-4.4-11.9 32.2-2.2 12.9 43.2 23-45.7 31-2.2-43.6 78.4-4.8 44.3-28.4 1.9 4.8-44.3-15.8-43c1 22.3-9.2 40.1-32 49.6l25.2 38.8-36.4 2.4-19.2-36.8-4 38.3-28.4 1.9 3.3-31.5c-6.7 9.3-19.7 35.4-59.6 38-26.2 1.7-45.6-10.3-55.4-39.2l-4 40.3-25 1.6-37.6-63.3-6.3 66.2-56.8 3.7zm276.6-82.1c10.2-.7 17.5-2.1 21.6-4.3 4.5-2.4 7-6.4 7.6-12.1 .6-5.3-.6-8.8-3.4-10.4-3.6-2.1-10.6-2.8-22.9-2l-2.9 28.8zM327.7 214c5.6 5.9 12.7 8.5 21.3 7.9 4.7-.3 9.1-1.8 13.3-4.1 5.5-3 10.6-8 15.1-14.3l-34.2 2.3 2.4-23.9 63.1-4.3 1.2-12-31.2 2.1c-4.1-3.7-7.8-6.6-11.1-8.1-4-1.7-8.1-2.8-12.2-2.5-8 .5-15.3 3.6-22 9.2-7.7 6.4-12 14.5-12.9 24.4-1.1 9.6 1.4 17.3 7.2 23.3zm-201.3 8.2l23.8-1.6-8.3-37.6-15.5 39.2z"/></svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M185.7 268.1l76.2 0-38.1-91.6-38.1 91.6zM223.8 32L16 106.4 47.8 382.1 223.8 480 399.8 382.1 431.6 106.4 223.8 32zM354 373.8l-48.6 0-26.2-65.4-110.6 0-26.2 65.4-48.7 0 130.1-292.3 130.2 292.3z"/></svg>

After

Width:  |  Height:  |  Size: 502 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M400 32L48 32C21.5 32 0 53.5 0 80L0 432c0 26.5 21.5 48 48 48l352 0c26.5 0 48-21.5 48-48l0-352c0-26.5-21.5-48-48-48zM127 384.5c-5.5 9.6-17.8 12.8-27.3 7.3-9.6-5.5-12.8-17.8-7.3-27.3l14.3-24.7c16.1-4.9 29.3-1.1 39.6 11.4L127 384.5zm138.9-53.9L84 330.6c-11 0-20-9-20-20s9-20 20-20l51 0 65.4-113.2-20.5-35.4c-5.5-9.6-2.2-21.8 7.3-27.3 9.6-5.5 21.8-2.2 27.3 7.3l8.9 15.4 8.9-15.4c5.5-9.6 17.8-12.8 27.3-7.3 9.6 5.5 12.8 17.8 7.3 27.3l-85.8 148.6 62.1 0c20.2 0 31.5 23.7 22.7 40zm98.1 0l-29 0 19.6 33.9c5.5 9.6 2.2 21.8-7.3 27.3-9.6 5.5-21.8 2.2-27.3-7.3-32.9-56.9-57.5-99.7-74-128.1-16.7-29-4.8-58 7.1-67.8 13.1 22.7 32.7 56.7 58.9 102l52 0c11 0 20 9 20 20 0 11.1-9 20-20 20z"/></svg>

After

Width:  |  Height:  |  Size: 981 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M255.9 120.9l9.1-15.7c5.6-9.8 18.1-13.1 27.9-7.5s13.1 18.1 7.5 27.9l-87.5 151.5 63.3 0c20.5 0 32 24.1 23.1 40.8l-185.5 0c-11.3 0-20.4-9.1-20.4-20.4s9.1-20.4 20.4-20.4l52 0 66.6-115.4-20.8-36.1c-5.6-9.8-2.3-22.2 7.5-27.9 9.8-5.6 22.2-2.3 27.9 7.5l8.9 15.7zm-78.7 218l-19.6 34c-5.6 9.8-18.1 13.1-27.9 7.5s-13.1-18.1-7.5-27.9l14.6-25.2c16.4-5.1 29.8-1.2 40.4 11.6zm168.9-61.7l53.1 0c11.3 0 20.4 9.1 20.4 20.4S410.5 318 399.2 318l-29.5 0 19.9 34.5c5.6 9.8 2.3 22.2-7.5 27.9-9.8 5.6-22.2 2.3-27.9-7.5-33.5-58.1-58.7-101.6-75.4-130.6-17.1-29.5-4.9-59.1 7.2-69.1 13.4 23 33.4 57.7 60.1 104zM256 8a248 248 0 1 0 0 496 248 248 0 1 0 0-496zM40 256a216 216 0 1 1 432 0 216 216 0 1 1 -432 0z"/></svg>

After

Width:  |  Height:  |  Size: 990 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M42.1 239.1c22.2 0 29 2.8 33.5 14.6l.8 0 0-22.9c0-11.3-4.8-15.4-17.9-15.4-11.3 0-14.4 2.5-15.1 12.8l-38.6 0c.3-13.9 1.5-19.1 5.8-24.4 7.3-8.8 18.9-11.8 46.1-11.8 33 0 47.1 5 53.9 18.9 2 4.3 4 15.6 4 23.7l0 76.3-38.3 0 1.3-19.1-1 0c-5.3 15.6-13.6 20.4-35.5 20.4-30.3 0-41.1-10.1-41.1-37.3 0-25.2 12.3-35.8 42.1-35.8zm17.1 48.1c13.1 0 16.9-3 16.9-13.4 0-9.1-4.3-11.6-19.6-11.6-13.1 0-17.9 3-17.9 12.1-.1 10.4 3.7 12.9 20.6 12.9zM137 192.3l38.3 0-1.5 20.6 .8 0c9.1-17.1 15.9-20.9 37.5-20.9 14.4 0 24.7 3 31.5 9.1 9.8 8.6 12.8 20.4 12.8 48.1 0 30-3 43.1-12.1 52.9-6.8 7.3-16.4 10.1-33.2 10.1-20.4 0-29.2-5.5-33.8-21.2l-.8 0 0 70.3-39.5 0 0-169zM217.9 253c0-27.5-3.3-32.5-20.7-32.5-16.9 0-20.7 5-20.7 28.7 0 28 3.5 33.5 21.2 33.5 16.4 0 20.2-5.6 20.2-29.7zm57.9-60.7l38.3 0-1.5 20.6 .8 0c9.1-17.1 15.9-20.9 37.5-20.9 14.4 0 24.7 3 31.5 9.1 9.8 8.6 12.8 20.4 12.8 48.1 0 30-3 43.1-12.1 52.9-6.8 7.3-16.4 10.1-33.3 10.1-20.4 0-29.2-5.5-33.8-21.2l-.8 0 0 70.3-39.5 0 0-169 .1 0zM356.7 253c0-27.5-3.3-32.5-20.7-32.5-16.9 0-20.7 5-20.7 28.7 0 28 3.5 33.5 21.2 33.5 16.4 0 20.2-5.6 20.2-29.7zm53.8-3.8c0-25.4 3.3-37.8 12.3-45.8 8.8-8.1 22.2-11.3 45.1-11.3 42.8 0 55.7 12.8 55.7 55.7l0 11.1-75.3 0c-.3 2-.3 4-.3 4.8 0 16.9 4.5 21.9 20.1 21.9 13.9 0 17.9-3 17.9-13.9l37.5 0 0 2.3c0 9.8-2.5 18.9-6.8 24.7-7.3 9.8-19.6 13.6-44.3 13.6-27.5 0-41.6-3.3-50.6-12.3-8.5-8.5-11.3-21.3-11.3-50.8zm76.4-11.6c-.3-1.8-.3-3.3-.3-3.8 0-12.3-3.3-14.6-19.6-14.6-14.4 0-17.1 3-18.1 15.1l-.3 3.3 38.3 0zm55.6-45.3l38.3 0-1.8 19.9 .7 0c6.8-14.9 14.4-20.2 29.7-20.2 10.8 0 19.1 3.3 23.4 9.3 5.3 7.3 6.8 14.4 6.8 34 0 1.5 0 5 .2 9.3l-35 0c.3-1.8 .3-3.3 .3-4 0-15.4-2-19.4-10.3-19.4-6.3 0-10.8 3.3-13.1 9.3-1 3-1 4.3-1 12.3l0 68-38.3 0 0-118.5 .1 0z"/></svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M116.9 158.5c-7.5 8.9-19.5 15.9-31.5 14.9-1.5-12 4.4-24.8 11.3-32.6 7.5-9.1 20.6-15.6 31.3-16.1 1.2 12.4-3.7 24.7-11.1 33.8zm10.9 17.2c-17.4-1-32.3 9.9-40.5 9.9-8.4 0-21-9.4-34.8-9.1-17.9 .3-34.5 10.4-43.6 26.5-18.8 32.3-4.9 80 13.3 106.3 8.9 13 19.5 27.3 33.5 26.8 13.3-.5 18.5-8.6 34.5-8.6 16.1 0 20.8 8.6 34.8 8.4 14.5-.3 23.6-13 32.5-26 10.1-14.8 14.3-29.1 14.5-29.9-.3-.3-28-10.9-28.3-42.9-.3-26.8 21.9-39.5 22.9-40.3-12.5-18.6-32-20.6-38.8-21.1zm100.4-36.2l0 194.9 30.3 0 0-66.6 41.9 0c38.3 0 65.1-26.3 65.1-64.3s-26.4-64-64.1-64l-73.2 0zM258.5 165l34.9 0c26.3 0 41.3 14 41.3 38.6s-15 38.8-41.4 38.8l-34.8 0 0-77.4zM420.7 335.9c19 0 36.6-9.6 44.6-24.9l.6 0 0 23.4 28 0 0-97c0-28.1-22.5-46.3-57.1-46.3-32.1 0-55.9 18.4-56.8 43.6l27.3 0c2.3-12 13.4-19.9 28.6-19.9 18.5 0 28.9 8.6 28.9 24.5l0 10.8-37.8 2.3c-35.1 2.1-54.1 16.5-54.1 41.5 .1 25.2 19.7 42 47.8 42zm8.2-23.1c-16.1 0-26.4-7.8-26.4-19.6 0-12.3 9.9-19.4 28.8-20.5l33.6-2.1 0 11c0 18.2-15.5 31.2-36 31.2zm102.5 74.6c29.5 0 43.4-11.3 55.5-45.4l53.1-149-30.8 0-35.6 115.1-.6 0-35.6-115.1-31.6 0 51.2 141.9-2.8 8.6c-4.6 14.6-12.1 20.3-25.5 20.3-2.4 0-7-.3-8.9-.5l0 23.4c1.8 .4 9.3 .7 11.6 .7z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M319.1 268.7c-.2-36.7 16.4-64.4 50-84.8-18.8-26.9-47.2-41.7-84.7-44.6-35.5-2.8-74.3 20.7-88.5 20.7-15 0-49.4-19.7-76.4-19.7-55.8 .9-115.1 44.5-115.1 133.2 0 26.2 4.8 53.3 14.4 81.2 12.8 36.7 59 126.7 107.2 125.2 25.2-.6 43-17.9 75.8-17.9 31.8 0 48.3 17.9 76.4 17.9 48.6-.7 90.4-82.5 102.6-119.3-65.2-30.7-61.7-90-61.7-91.9zM262.5 104.5c27.3-32.4 24.8-61.9 24-72.5-24.1 1.4-52 16.4-67.9 34.9-17.5 19.8-27.8 44.3-25.6 71.9 26.1 2 49.9-11.4 69.5-34.3z"/></svg>

After

Width:  |  Height:  |  Size: 759 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M2.1 377.4l43 74.3c4.3 8.5 10.8 15.7 18.9 20.7s17.4 7.6 27 7.6l285.4 0-59.2-102.6-315.1 0zM501.9 350L335.7 59.3c-4.4-8.2-10.9-15.1-18.9-20S299.7 32 290.4 32l-88.4 0 257.3 447.6 40.7-70.5c1.9-3.2 21-29.7 2-59.1zM275.2 304.5l-115.5-200-115.5 200 231 0z"/></svg>

After

Width:  |  Height:  |  Size: 561 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M517.5 309.2c38.8-40 58.1-80 58.5-116.1 .8-65.5-59.4-118.2-169.4-135-128.7-19.7-288.5 15.5-406.6 82.4 52-26.5 110.6-48.2 170.7-58.2 74.5-20.5 153-25.4 221.3-14.8 152.5 23.8 196.8 127.5 98.8 231.7-10.2 10.8-22 21.1-35 30.6L304.9 103.4 114.7 388.9c-65.6-29.4-76.5-90.2-19.1-151.2 20.8-22.2 48.3-41.9 79.5-58.1 20-12.2 39.7-22.6 62-30.7-65.1 20.3-122.7 52.9-161.6 92.9-27.7 28.6-41.4 57.1-41.7 82.9-.5 35.1 23.4 65.1 68.4 83l-34.5 51.7 101.6 0 22-34.4c22.2 1 45.3 0 68.6-2.7l-22.8 37.1 135.5 0-32.6-53.1c18.6-5.3 36.9-11.5 54.5-18.7l45.9 71.8 101.6 0-73.4-110.4c18.5-12.1 35-25.5 48.9-39.8zM329.9 389.7l-25-40.6-32.7 53.3c-23.4 3.5-46.7 5.1-69.2 4.4l101.9-159.3 78.7 123c-17.2 7.4-35.3 13.9-53.7 19.2z"/></svg>

After

Width:  |  Height:  |  Size: 1009 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M152.2 236.4c-7.7-8.2-19.7-7.7-24.8 2.8L1.6 490.2c-5 10 2.4 21.7 13.4 21.7l175 0c5.8 .1 11-3.2 13.4-8.4 37.9-77.8 15.1-196.3-51.2-267.1zM244.4 8.1c-122.3 193.4-8.5 348.6 65 495.5 2.5 5.1 7.7 8.4 13.4 8.4L497 512c11.2 0 18.4-11.8 13.4-21.7 0 0-234.5-470.6-240.4-482.3-5.3-10.6-18.8-10.8-25.6 .1z"/></svg>

After

Width:  |  Height:  |  Size: 605 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M640 199.9l0 54-320 200-320-199.9 0-54 320 200 320-200.1zm-194.5 72l47.1-29.4c-37.2-55.8-100.7-92.6-172.7-92.6s-135.5 36.7-172.6 92.4l.3 0c2.5-2.3 5.1-4.5 7.7-6.7 89.7-74.4 219.4-58.1 290.2 36.3zM225.4 290.7c16.9-11.9 36.5-18.7 57.4-18.7 34.4 0 65.2 18.4 86.4 47.6l45.4-28.4c-20.9-29.9-55.6-49.5-94.8-49.5-38.9 0-73.4 19.4-94.4 49zM103.6 161.1C235.4 56.8 421.8 84.7 521.1 223.2l.7 1 48.8-30.4c-53.5-81.7-145.8-135.7-250.7-135.7-103.5 0-196.6 53.5-250.5 135.6 9.9-10.5 22.7-23.5 34.2-32.6z"/></svg>

After

Width:  |  Height:  |  Size: 799 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M318.4 16l-161 480 77.5 0 25.4-81.4 119.5 0 25.2 81.4 77.5 0-164.1-480zM278.1 357.9l41.2-130.4 1.5 0 40.9 130.4-83.6 0zM640 405L630 373.6 462.1 358 481.5 414.5 640 405zM177.9 358L10 373.7 0 405 158.5 414.4 177.9 358z"/></svg>

After

Width:  |  Height:  |  Size: 527 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M453.2 32l-312 0C102.3 32 65 63.2 57.9 101.7L1.3 410.3C-5.8 448.8 20 480 59 480l312 0c38.9 0 76.2-31.2 83.3-69.7L511 101.8C518 63.2 492.2 32 453.2 32zM395 379.3l-32 13.5-115.4-110c-14.7 10-29.2 19.5-41.7 27.1l22.1 64.2-17.9 12.7-40.6-61-52.4-48.1 15.7-15.4 58 31.1c9.3-10.5 20.8-22.6 32.8-34.9l-20.5-29.6-68.8-99.8 18.8-28.9 8.9-4.8 103.1 112.4 4.9 4.5c19.4-18.8 33.8-32.4 33.8-32.4 7.7-6.5 21.5-2.9 30.7 7.9 9 10.5 10.6 24.7 2.7 31.3-1.8 1.3-15.5 11.4-35.3 25.6l4.5 7.3 94.9 119.4-6.3 7.9z"/></svg>

After

Width:  |  Height:  |  Size: 801 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M107.2 283.5l-19-41.8-52.1 0-19 41.8-17.1 0 62.2-131.4 62.2 131.4-17.2 0zm-45-98.1l-19.6 42.5 39.2 0-19.6-42.5zM174.9 287.8l-62.2-131.4 17.1 0 45.1 96 45.1-96 17 0-62.1 131.4zm80.6-4.3l0-127.1 15.5 0 0 127.1-15.5 0zM464.6 167.9l0 115.6-17.3 0 0-115.6-41.2 0 0-11.5 99.6 0 0 11.5-41.1 0zM640 218.8c0 9.2-1.7 17.8-5.1 25.8s-8.2 15.1-14.2 21.1-13.1 10.8-21.1 14.2-16.6 5.1-25.8 5.1-17.8-1.7-25.8-5.1-15.1-8.2-21.1-14.2-10.8-13-14.2-21.1c-3.4-8-5.1-16.6-5.1-25.8s1.7-17.8 5.1-25.8 8.2-15.1 14.2-21.1 13-8.4 21.1-11.9c8-3.4 16.6-5.1 25.8-5.1s17.8 1.7 25.8 5.1 15.1 5.8 21.1 11.9c6 6 10.7 13.1 14.2 21.1 3.4 8 5.1 16.6 5.1 25.8zm-15.5 0c0-7.3-1.3-14-3.9-20.3s-6.2-11.7-10.8-16.3-10-8.2-16.2-10.9-12.8-4-19.8-4-13.6 1.3-19.8 4-11.6 6.3-16.2 10.9-8.2 10-10.8 16.3-3.9 13.1-3.9 20.3c0 7.3 1.3 14 3.9 20.3s6.2 11.7 10.8 16.3 10 8.2 16.2 10.9 12.8 4 19.8 4 13.6-1.3 19.8-4 11.6-6.3 16.2-10.9 8.2-10 10.8-16.3 3.9-13.1 3.9-20.3zm-94.8 96.7l0-6.3 88.9-10-242.9 13.4c.6-2.2 1.1-4.6 1.4-7.2 .3-2 .5-4.2 .6-6.5l64.8-8.1-64.9 1.9c0-.4-.1-.7-.1-1.1-2.8-17.2-25.5-23.7-25.5-23.7l-1.1-26.3 23.8 0 19 41.8 17.1 0-62.2-131.4-62.2 131.4 17.1 0 19-41.8 23.6 0-1.1 26.4s-22.7 6.5-25.5 23.7c-.1 .3-.1 .7-.1 1.1l-64.9-1.9 64.8 8.1c.1 2.3 .3 4.4 .6 6.5 .3 2.6 .8 5 1.4 7.2l-242.9-13.5 88.9 10 0 6.3c-5.9 .9-10.5 6-10.5 12.2 0 6.8 5.6 12.4 12.4 12.4s12.4-5.6 12.4-12.4c0-6.2-4.6-11.3-10.5-12.2l0-5.8 80.3 9 0 5.4c-5.7 1.1-9.9 6.2-9.9 12.1 0 6.8 5.6 10.2 12.4 10.2s12.4-3.4 12.4-10.2c0-6-4.3-11-9.9-12.1l0-4.9 28.4 3.2 0 23.7-5.9 0 0 13.9 5.9 0 0-6.6 5 0 0 6.6 5.9 0 0-13.8-5.9 0 0-23.2 38.3 4.3c8.1 11.4 19 13.6 19 13.6l-.1 6.7-5.1 .2-.1 12.1 4.1 0 .1-5 5.2 0 .1 5 4.1 0-.1-12.1-5.1-.2-.1-6.7s10.9-2.1 19-13.6l38.3-4.3 0 23.2-5.9 0 0 13.8 5.9 0 0-6.6 5 0 0 6.6 5.9 0 0-13.8-5.9 0 0-23.7 28.4-3.2 0 4.9c-5.7 1.1-9.9 6.2-9.9 12.1 0 6.8 5.6 10.2 12.4 10.2s12.4-3.4 12.4-10.2c0-6-4.3-11-9.9-12.1l0-5.4 80.3-9 0 5.8c-5.9 .9-10.5 6-10.5 12.2 0 6.8 5.6 12.4 12.4 12.4s12.4-5.6 12.4-12.4c-.2-6.3-4.7-11.4-10.7-12.3zM328.9 227.9l19.6-42.5 19.6 42.5-17.9 0-1.7-40.3-1.7 40.3-17.9 0z"/></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M180.4 203c-.7 22.6 10.6 32.7 10.9 39-.1 1.3-.6 2.5-1.3 3.6s-1.7 2-2.8 2.6l-12.8 9c-1.7 1.2-3.6 1.8-5.6 1.9-.4 0-8.2 1.8-20.5-25.6-7.5 9.4-17 16.9-27.9 22s-22.7 7.7-34.7 7.5c-16.3 .9-60.4-9.2-58.1-56.2-1.6-38.3 34.1-62.1 70.9-60 7.1 0 21.6 .4 47 6.3l0-15.6c2.7-26.5-14.7-47-44.8-43.9-2.4 0-19.4-.5-45.8 10.1-7.4 3.4-8.3 2.8-10.8 2.8-7.4 0-4.4-21.5-2.9-24.2 5.2-6.4 35.9-18.4 65.9-18.2 20.1-1.8 40.1 4.4 55.7 17.3 6.3 7.1 11.2 15.4 14.2 24.4s4.2 18.5 3.5 28l0 69.3zM94 235.4c32.4-.5 46.2-20 49.3-30.5 2.5-10.1 2.1-16.4 2.1-27.4-9.7-2.3-23.6-4.9-39.6-4.9-15.2-1.1-42.8 5.6-41.7 32.3-1.2 16.8 11.1 31.4 30 30.5zm170.9 23.1c-7.9 .7-11.5-4.9-12.7-10.4L202.4 83.4c-1-2.8-1.6-5.6-1.9-8.6-.2-1.2 .1-2.4 .8-3.4s1.8-1.6 3-1.8c.2 0-2.1 0 22.2 0 8.8-.9 11.6 6 12.6 10.4L274.9 220.8 308.1 80c.5-3.2 2.9-11.1 12.8-10.2l17.2 0c2.2-.2 11.1-.5 12.7 10.4L384.1 222.7 421 80.1c.5-2.2 2.7-11.4 12.7-10.4l19.7 0c.9-.1 6.2-.8 5.3 8.6-.4 1.8 3.4-10.7-52.8 169.9-1.1 5.5-4.8 11.1-12.7 10.4l-18.7 0c-10.9 1.2-12.5-9.7-12.7-10.7l-33.2-137.1-32.8 137c-.2 1.1-1.7 11.9-12.7 10.7l-18.3 0 0 0zm273.5 5.6c-5.9 0-33.9-.3-57.4-12.3-2.3-1-4.3-2.6-5.7-4.8s-2.1-4.6-2.1-7.1l0-10.7c0-8.5 6.2-6.9 8.8-5.9 10 4.1 16.5 7.1 28.8 9.6 36.7 7.5 52.8-2.3 56.7-4.5 13.2-7.8 14.2-25.7 5.3-34.9-10.5-8.8-15.5-9.1-53.1-21-4.6-1.3-43.7-13.6-43.8-52.4-.6-28.2 25-56.2 69.5-56 12.7 0 46.4 4.1 55.6 15.6 1.4 2.1 2 4.6 1.9 7l0 10.1c0 4.4-1.6 6.7-4.9 6.7-7.7-.9-21.4-11.2-49.2-10.8-6.9-.4-39.9 .9-38.4 25-.4 19 26.6 26.1 29.7 26.9 36.5 11 48.6 12.8 63.1 29.6 17.1 22.2 7.9 48.3 4.3 55.4-19.1 37.5-68.4 34.4-69.3 34.4zm40.2 104.9c-70 51.7-171.7 79.2-258.5 79.2-117.1 .8-230.3-42.3-317.3-120.7-6.5-5.9-.8-14 7.2-9.5 96.5 55.2 205.7 84.2 316.9 84.1 83-.4 165.1-17.3 241.6-49.5 11.8-5 21.8 7.8 10.1 16.4zm29.2-33.3c-9-11.5-59.3-5.4-81.8-2.7-6.8 .8-7.9-5.1-1.8-9.5 40.1-28.2 105.9-20.1 113.4-10.6 7.5 9.5-2.1 75.4-39.6 106.9-5.8 4.9-11.3 2.3-8.7-4.1 8.4-21.3 27.4-68.5 18.4-80z"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M256 8a248 248 0 1 0 0 496 248 248 0 1 0 0-496zm48.2 326.1l-181 0 84.7-156.1 181 0-84.7 156.1z"/></svg>

After

Width:  |  Height:  |  Size: 405 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M448.8 225.6c26.9 .2 35.6-7.4 38.9-12.4 12.5-16.3-7.1-47.6-52.8-71.3 17.8-33.6 30.1-63.7 36.3-85.3 3.4-11.8 1.1-19 .5-20.3-1.7 10.5-15.8 48.5-48.2 100-25-11.2-56.5-20.1-93.8-23.8-8.9-16.9-34.9-63.9-60.5-88.9-16.8-16.5-30.3-22.6-40.8-23.5l0 0c-13.8-1.6-22.7 5.8-27.4 11-17.2 18.5-24.3 48.9-25 84.1-7.2-12.3-17.2-24.6-28.5-25.9l-.2 0c-20.7-3.5-38.4 29.2-36 81.3-38.4 1.4-71 5.8-93 11.2-9.9 2.4-16.2 7.3-17.8 9.7 1-.4 22.4-9.2 111.6-9.2 5.2 53 29.8 101.8 26 93.2-9.7 15.4-38.2 62.4-47.3 97.7-5.9 22.9-4.4 37.6 .2 47.1 5.6 12.8 16.4 16.7 23.2 18.3 25 5.7 55.4-3.6 86.7-21.1-7.5 12.8-13.9 28.5-9.1 39.3 7.3 19.6 44.5 18.7 88.4-9.4 20.2 32.2 40.1 57.9 55.7 74.1 2.6 2.8 5.5 5.2 8.8 7.1 5.1 3.2 8.6 3.4 8.6 3.4-8.2-6.7-34-38-62.5-91.8 22.2-16 45.7-38.9 67.5-69.3 122.8 4.6 143.3-24.8 148-31.6 14.7-19.9 3.4-57.4-57.3-93.7zM371 331.8c23.8-37.7 30.3-67.8 29.4-92.3 27.9 17.6 47.2 37.6 49.1 58.8 1.1 12.9-8.1 29.1-78.5 33.5zM217.1 387.7c9.8-6.2 19.5-13.1 29.2-20.5 6.7 13.3 13.6 26.1 20.6 38.2-40.6 21.9-68.8 12.8-49.8-17.7zm215-171.3c-10.3-5.3-21.2-10.3-32.4-15 7.9-12.1 15.5-24.4 22.7-36.9 39.1 24.1 45.9 53.2 9.6 51.9zM279.4 398c-5.5-11.4-11-23.5-16.5-36.4 43.2 1.3 62.4-18.7 63.3-20.4 0 .1-25 15.6-62.5 12.2 30.6-25.6 59.1-53.7 85.1-84 8.7-10.2 17-20.6 24.9-31.1-.4-.3-1.5-3-16.5-12-51.7 60.3-102.3 98-132.8 115.9-20.6-11.2-40.8-31.8-55.7-61.5-20-39.9-30-82.4-31.6-116.1 12.3 .9 25.3 2.2 38.8 3.9-22.3 36.8-14.4 63-13.5 64.2 0-.1-1-29.2 20.1-59.6 9 52.5 24 103.8 44.7 152.8 .9-.4 1.8 .9 18.7-8.2-26.3-74.5-33.8-138.2-34-173.4 20-12.4 48.2-19.8 81.6-17.8 44.6 2.7 86.4 15.2 116.3 30.7-7.1 10.4-14.9 21.3-23.3 32.5-20.7-37.7-47.3-43.9-48.9-43.7 .1 0 25.9 14.1 41.5 47.2-37.5-13.8-76.1-24.4-115.3-31.7-13.1-2.4-26.2-4.4-39.4-6-.1 .4-1.8 1.8-2.2 20.3 77.9 14.5 136.6 39.9 167.2 57.2 .7 23.6-7 51.6-25.4 79.6-24.6 37.3-56.4 67.2-84.8 85.4zm27.4-287c-44.6-1.7-73.6 7.4-94.7 20.7 2-52.3 21.3-76.4 38.2-75.3 16.9-4.2 54.9 52.2 56.5 54.6zm-130.7 3.1c.5 12.1 1.6 24.6 3.2 37.3-14.6-.9-28.7-1.3-42.4-1.3-.1 3.2-.1-51 24.7-49.6l.1 0c5.8 1.1 10.6 6.9 14.4 13.6zm-28.1 162c20.8 39.7 43.3 60.6 65.3 72.3-46.8 24.8-77.5 20-84.9 4.5-.2-.2-11.1-15.3 19.7-76.8l0 0z"/></svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M155.3 318.4c17.2 0 31.2-6.1 31.2-25.4 0-19.7-11.7-27.4-30.3-27.5l-46 0 0 52.9 45.1 0zm-5.4-129.6l-39.6 0 0 44.8 42.7 0c15.1 0 25.8-6.6 25.8-22.9 0-17.7-13.7-21.9-28.9-21.9zm129.5 74.8l62.2 0c-1.7-18.5-11.3-29.7-30.5-29.7-18.3 0-30.5 11.4-31.7 29.7zM384 32L64 32C28.7 32 0 60.7 0 96L0 416c0 35.3 28.7 64 64 64l320 0c35.3 0 64-28.7 64-64l0-320c0-35.3-28.7-64-64-64zM349.5 185l-77.8 0 0-18.9 77.8 0 0 18.9zM193.7 243.7c23.6 6.7 35 27.5 35 51.6 0 39-32.7 55.7-67.6 55.9l-93.1 0 0-192 90.5 0c32.9 0 61.4 9.3 61.4 47.5 0 19.3-9 28.8-26.2 37zm118.7-38.6c43.5 0 67.6 34.3 67.6 75.4 0 1.6-.1 3.3-.2 5 0 .8-.1 1.5-.1 2.2l-100.2 0c0 22.2 11.7 35.3 34.1 35.3 11.6 0 26.5-6.2 30.2-18.1l33.7 0c-10.4 31.9-31.9 46.8-65.1 46.8-43.8 0-71.1-29.7-71.1-73 0-41.8 28.7-73.6 71.1-73.6z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M232 237.2c31.8-15.2 48.4-38.2 48.4-74 0-70.6-52.6-87.8-113.3-87.8l-167.1 0 0 354.4 171.8 0c64.4 0 124.9-30.9 124.9-102.9 0-44.5-21.1-77.4-64.7-89.7zM77.9 135.9l73.1 0c28.1 0 53.4 7.9 53.4 40.5 0 30.1-19.7 42.2-47.5 42.2l-79 0 0-82.7zm83.3 233.7l-83.3 0 0-97.6 84.9 0c34.3 0 56 14.3 56 50.6 0 35.8-25.9 47-57.6 47zM519.7 128.9l-143.7 0 0-34.9 143.7 0 0 34.9zM576 305.2c0-75.9-44.4-139.2-124.9-139.2-78.2 0-131.3 58.8-131.3 135.8 0 79.9 50.3 134.7 131.3 134.7 61.3 0 101-27.6 120.1-86.3l-62.2 0c-6.7 21.9-34.3 33.5-55.7 33.5-41.3 0-63-24.2-63-65.3l185.1 0c.3-4.2 .6-8.7 .6-13.2zM390.4 274c2.3-33.7 24.7-54.8 58.5-54.8 35.4 0 53.2 20.8 56.2 54.8l-114.7 0z"/></svg>

After

Width:  |  Height:  |  Size: 964 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M488.6 104.1c16.7 18.1 24.4 39.7 23.3 65.7l0 202.4c-.4 26.4-9.2 48.1-26.5 65.1-17.2 17-39.1 25.9-65.5 26.7L92 464c-26.4-.8-48.2-9.8-65.3-27.2-17.1-17.4-26-40.3-26.7-68.6L0 169.8c.8-26 9.7-47.6 26.7-65.7 17.1-16.3 38.8-25.3 65.3-26.1l29.4 0-25.4-25.8c-5.7-5.7-8.6-13-8.6-21.8s2.9-16.1 8.6-21.8 13-8.6 21.9-8.6 16.1 2.9 21.9 8.6l73.3 69.4 88 0 74.5-69.4C381.7 2.9 389.2 0 398 0s16.1 2.9 21.9 8.6c5.7 5.7 8.6 13 8.6 21.8s-2.9 16.1-8.6 21.8L394.6 78 423.9 78c26.4 .8 48 9.8 64.7 26.1zm-38.8 69.7c-.4-9.6-3.7-17.4-10.7-23.5-5.2-6.1-14-9.4-22.7-9.8l-320.4 0c-9.6 .4-17.4 3.7-23.6 9.8-6.1 6.1-9.4 13.9-9.8 23.5l0 194.4c0 9.2 3.3 17 9.8 23.5s14.4 9.8 23.6 9.8l320.4 0c9.2 0 17-3.3 23.3-9.8s9.7-14.3 10.1-23.5l0-194.4zM185.5 216.5c6.3 6.3 9.7 14.1 10.1 23.2l0 33.3c-.4 9.2-3.7 16.9-9.8 23.2-6.2 6.3-14 9.5-23.6 9.5s-17.5-3.2-23.6-9.5-9.4-14-9.8-23.2l0-33.3c.4-9.1 3.8-16.9 10.1-23.2s13.2-9.6 23.3-10c9.2 .4 17 3.7 23.3 10zm191.5 0c6.3 6.3 9.7 14.1 10.1 23.2l0 33.3c-.4 9.2-3.7 16.9-9.8 23.2s-14 9.5-23.6 9.5-17.4-3.2-23.6-9.5c-7-6.3-9.4-14-9.7-23.2l0-33.3c.3-9.1 3.7-16.9 10-23.2s14.1-9.6 23.3-10c9.2 .4 17 3.7 23.3 10z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M416 32L32 32C14.4 32 0 46.4 0 64L0 448c0 17.6 14.4 32 32 32l384 0c17.6 0 32-14.4 32-32l0-384c0-17.6-14.4-32-32-32zM352 289.4c0 49.4-11.4 82.6-103.8 82.6l-16.9 0c-44.1 0-62.4-14.9-70.4-38.8l-.9 0 0 34.8-64 0 0-232 64 0 0 74.7 1.1 0c4.6-30.5 39.7-38.8 69.7-38.8l17.3 0c92.4 0 103.8 33.1 103.8 82.5l0 35 .1 0zm-64-28.9l0 22.9c0 21.7-3.4 33.8-38.4 33.8l-45.3 0c-28.9 0-44.1-6.5-44.1-35.7l0-19c0-29.3 15.2-35.7 44.1-35.7l45.3 0c35-.2 38.4 12 38.4 33.7z"/></svg>

After

Width:  |  Height:  |  Size: 759 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M22.2 32c-2.1 0-4.2 .4-6.1 1.1s-3.7 1.9-5.2 3.4-2.7 3.2-3.5 5.1-1.3 4-1.3 6.1c0 .9 .1 1.9 .2 2.8L74.1 462.7c.8 5.1 3.4 9.7 7.3 13s8.8 5.2 14 5.2l325.7 0c3.8 .1 7.5-1.3 10.5-3.7s4.9-5.9 5.5-9.7L505 50.7c.7-4.2-.3-8.4-2.8-11.9s-6.2-5.7-10.4-6.4c-.9-.1-1.9-.2-2.8-.2L22.2 32zM308.1 329.8l-104 0-28.1-147 157.3 0-25.2 147z"/></svg>

After

Width:  |  Height:  |  Size: 629 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M8 256a248 248 0 1 1 496 0 248 248 0 1 1 -496 0zm354.3-35.3c4.9-33-20.2-50.7-54.6-62.6l11.1-44.7-27.2-6.8-10.9 43.5c-7.2-1.8-14.5-3.5-21.8-5.1l10.9-43.8-27.2-6.8-11.2 44.7c-5.9-1.3-11.7-2.7-17.4-4.1l0-.1-37.5-9.4-7.2 29.1s20.2 4.6 19.8 4.9c11 2.8 13 10 12.7 15.8l-12.7 50.9c.8 .2 1.7 .5 2.8 .9-.9-.2-1.9-.5-2.9-.7l-17.8 71.3c-1.3 3.3-4.8 8.4-12.5 6.5 .3 .4-19.8-4.9-19.8-4.9l-13.5 31.1 35.4 8.8c6.6 1.7 13 3.4 19.4 5l-11.3 45.2 27.2 6.8 11.2-44.7c7.2 2 14.4 3.8 21.7 5.6l-11.1 44.5 27.2 6.8 11.3-45.1c46.4 8.8 81.3 5.2 96-36.7 11.8-33.8-.6-53.3-25-66 17.8-4.1 31.2-15.8 34.7-39.9zm-62.2 87.2c-8.4 33.8-65.3 15.5-83.8 10.9l14.9-59.9c18.4 4.6 77.6 13.7 68.8 49zm8.4-87.7c-7.7 30.7-55 15.1-70.4 11.3l13.5-54.3c15.4 3.8 64.8 11 56.8 43z"/></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M86.5 67.2c95.4-89.2 246.1-91.2 343.1 3.8 14.3 14.1-6.4 37.1-22.4 21.5-84.8-82.4-215.8-80.3-298.9-3.2-16.3 15.1-36.5-8.3-21.8-22.1zm98.9 418.6c19.3 5.7 29.3-23.6 7.9-30-112.2-33.9-175.8-149.7-147.5-261 5-19.6-24.9-28.1-30.2-7.1-32.1 127.4 41.1 259.8 169.8 298.1zm148.1-2c121.9-40.2 192.9-166.9 164.4-291-4.5-19.7-34.9-13.8-30 7.9 24.2 107.7-37.1 217.9-143.2 253.4-21.2 7-10.4 36 8.8 29.7zm-62.9-79l.2-71.8c0-8.2-6.6-14.8-14.8-14.8s-14.8 6.7-14.8 14.8l-.2 71.8c0 8.2 6.6 14.8 14.8 14.8s14.8-6.6 14.8-14.8zm71-269c2.1 90.9 4.7 131.9-85.5 132.5-92.5-.7-86.9-44.3-85.5-132.5 0-21.8-32.5-19.6-32.5 0l0 71.6c0 69.3 60.7 90.9 118 90.1 57.3 .8 118-20.8 118-90.1l0-71.6c0-19.6-32.5-21.8-32.5 0z"/></svg>

After

Width:  |  Height:  |  Size: 996 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M0 32l0 448 448 0 0-448-448 0zM316.5 357.2l-92.5 88.7-92.5-88.7 64.5-184-64.5-86.6 184.9 0-64.4 86.6 64.5 184z"/></svg>

After

Width:  |  Height:  |  Size: 421 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M166 116.9c0 23.4-16.4 49.1-72.5 49.1l-70.1 0 21-88.8 67.8 0c42.1 0 53.8 23.3 53.8 39.7zM292.2 77.2l-67.8 0-18.7 88.8 70.1 0c53.8 0 70.1-25.7 70.1-49.1 .1-16.4-11.6-39.7-53.7-39.7zM88.8 208.1l-67.8 0-21 88.8 70.1 0c56.1 0 72.5-23.4 72.5-49.1 0-16.3-11.7-39.7-53.8-39.7zm180.1 0l-67.8 0-18.7 88.8 70.1 0c53.8 0 70.1-23.4 70.1-49.1 0-16.3-11.7-39.7-53.7-39.7zm189.3-53.8l-67.8 0-18.7 88.8 70.1 0c53.8 0 70.1-23.4 70.1-49.1 .1-16.3-11.6-39.7-53.7-39.7zm-28 137.9l-67.8 0-18.7 88.8 70.1 0c56.1 0 70.1-23.4 70.1-49.1 0-16.3-11.6-39.7-53.7-39.7zM240.8 346l-67.8 0-18.7 88.8 70.1 0c56.1 0 70.1-25.7 70.1-49.1 .1-16.3-11.6-39.7-53.7-39.7z"/></svg>

After

Width:  |  Height:  |  Size: 941 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M446.6 222.7c-1.8-8-6.8-15.4-12.5-18.5-1.8-1-13-2.2-25-2.7-20.1-.9-22.3-1.3-28.7-5-10.1-5.9-12.8-12.3-12.9-29.5-.1-33-13.8-63.7-40.9-91.3-19.3-19.7-40.9-33-65.5-40.5-5.9-1.8-19.1-2.4-63.3-2.9-69.4-.8-84.8 .6-108.4 10-43.5 17.2-74.7 53.8-86.1 100.6-2.1 8.8-2.6 22.9-3.1 103.9-.6 101.5 .1 116.4 6.4 136.5 15.6 49.6 59.9 86.3 104.4 94.3 14.8 2.7 197.3 3.3 216 .8 32.5-4.4 58-17.5 81.9-41.9 17.3-17.7 28.1-36.8 35.2-62.1 4.9-17.6 4.5-142.8 2.5-151.7zM124.5 159.1c7.8-7.9 10-8.2 58.8-8.2 43.9 0 45.4 .1 51.8 3.4 9.3 4.7 13.4 11.3 13.4 21.9 0 9.5-3.8 16.2-12.3 21.6-4.6 2.9-7.3 3.1-50.3 3.3-26.5 .2-47.7-.4-50.8-1.2-16.6-4.7-22.8-28.5-10.6-40.8zM316.3 358.9l-14.9 2.4-77.5 .9c-68.1 .8-87.3-.4-90.9-2-7.1-3.1-13.8-11.7-14.9-19.4-1.1-7.3 2.6-17.3 8.2-22.4 7.1-6.4 10.2-6.6 97.3-6.7 89.6-.1 89.1-.1 97.6 7.8 12.1 11.3 9.5 31.2-4.9 39.4z"/></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M162.4 196c4.8-4.9 6.2-5.1 36.4-5.1 27.2 0 28.1 .1 32.1 2.1 5.8 2.9 8.3 7 8.3 13.6 0 5.9-2.4 10-7.6 13.4-2.8 1.8-4.5 1.9-31.1 2.1-16.4 .1-29.5-.2-31.5-.8-10.3-2.9-14.1-17.7-6.6-25.3zm61.4 94.5c-53.9 0-55.8 .2-60.2 4.1-3.5 3.1-5.7 9.4-5.1 13.9 .7 4.7 4.8 10.1 9.2 12 2.2 1 14.1 1.7 56.3 1.2l47.9-.6 9.2-1.5c9-5.1 10.5-17.4 3.1-24.4-5.3-4.7-5-4.7-60.4-4.7zM447.2 420.6c-3.5 28.4-23 50.4-51.1 57.5-7.2 1.8-9.7 1.9-172.9 1.8-157.8 0-165.9-.1-172-1.8-8.4-2.2-15.6-5.5-22.3-10-5.6-3.8-13.9-11.8-17-16.4-3.8-5.6-8.2-15.3-10-22S0 420.3 0 256.3c0-163.1 0-166.6 1.8-173.7 6.3-24.7 25.9-43.6 51.2-49.2 7.3-1.6 332.1-1.9 340-.3 21.2 4.3 37.9 17.1 47.6 36.4 7.7 15.3 7-1.5 7.3 180.6 .2 115.8 0 164.5-.7 170.5zM361.8 235.4c-1.1-5-4.2-9.6-7.7-11.5-1.1-.6-8-1.3-15.5-1.7-12.4-.6-13.8-.8-17.8-3.1-6.2-3.6-7.9-7.6-8-18.3 0-20.4-8.5-39.4-25.3-56.5-12-12.2-25.3-20.5-40.6-25.1-3.6-1.1-11.8-1.5-39.2-1.8-42.9-.5-52.5 .4-67.1 6.2-27 10.7-46.3 33.4-53.4 62.4-1.3 5.4-1.6 14.2-1.9 64.3-.4 62.8 0 72.1 4 84.5 9.7 30.7 37.1 53.4 64.6 58.4 9.2 1.7 122.2 2.1 133.7 .5 20.1-2.7 35.9-10.8 50.7-25.9 10.7-10.9 17.4-22.8 21.8-38.5 3.2-10.9 2.9-88.4 1.7-93.9z"/></svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M407.8 294.7c-3.3-.4-6.7-.8-10-1.3 3.4 .4 6.7 .9 10 1.3zM288 227.1C261.9 176.4 190.9 81.9 124.9 35.3 61.6-9.4 37.5-1.7 21.6 5.5 3.3 13.8 0 41.9 0 58.4S9.1 194 15 213.9c19.5 65.7 89.1 87.9 153.2 80.7 3.3-.5 6.6-.9 10-1.4-3.3 .5-6.6 1-10 1.4-93.9 14-177.3 48.2-67.9 169.9 120.3 124.6 164.8-26.7 187.7-103.4 22.9 76.7 49.2 222.5 185.6 103.4 102.4-103.4 28.1-156-65.8-169.9-3.3-.4-6.7-.8-10-1.3 3.4 .4 6.7 .9 10 1.3 64.1 7.1 133.6-15.1 153.2-80.7 5.9-19.9 15-138.9 15-155.5s-3.3-44.7-21.6-52.9c-15.8-7.1-40-14.9-103.2 29.8-66.1 46.6-137.1 141.1-163.2 191.8z"/></svg>

After

Width:  |  Height:  |  Size: 864 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M164.9 260L257.5 156.7 111.6 0 111.6 206.3 25.4 120.2-6 151.6 102.1 260-6 368.4 25.4 399.8 111.6 313.7 114.3 512 262.8 363.4 164.9 260zm40.9-103l-50 50-.3-100.3 50.3 50.3zm-50 156l50 50-50.3 50.3 .3-100.3z"/></svg>

After

Width:  |  Height:  |  Size: 516 B

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"><!--! Font Awesome Free 7.0.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc. --><path fill="currentColor" d="M260.6 171.1l-42.9 42.9-.3-86 43.2 43.1zM217.4 390.9l43.1-43.1-42.9-42.9-.2 86zM384 259.4C384 465 312.1 512 198.9 512S0 465 0 259.4 83.4 0 196.6 0 384 53.9 384 259.4zm-158.5 0l79.4-88.6-125.1-134.3 0 176.9-73.8-73.8-27 26.9 92.7 93-92.7 93 26.9 26.9 73.8-73.8 2.3 170 127.4-127.5-83.9-88.7z"/></svg>

After

Width:  |  Height:  |  Size: 601 B

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

Loading…
Cancel
Save