actualizar repo

This commit is contained in:
M0 committed 2023-10-13 23:14:29 -04:00
1 parent 870823650c
commit ab97b2e7b8
735 files changed
+1250 -2164077

No files matched your search

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 874 KiB

@@ -1,10 +0,0 @@
pirometro
termocupla tipo k
relay de 5v
motor con reductor
control de velocidad para el motor,.
fuente 12 v 5 amp
hotend preparado
piezas imprimibles.
@@ -1,38 +0,0 @@
\* These parts are not tested by me because I did not buy them. I replaced them with things I already had.
| Qty | Name | Aliexpress (for reference) |
| ------ | --------------------------------------------------------------------------------------------- | ------------------------------------------ |
| | ----------- **Bottle Cutter** ------------ | |
| 2 | Bearing 8x22x7 mm 608ZZ | https://s.click.aliexpress.com/e/_DDu60K3 |
| \*2 | M8 Hex Bolt 60mm Full Thread (instead I use 8mm rod thereaded cut to 41 and 47mm) | https://s.click.aliexpress.com/e/_DF8rC8x |
| \*3(5) | Hex Nut M8 | https://s.click.aliexpress.com/e/_DdAzvUJ |
| \*1 | Hexagonal Bolt Partial Thread M8 40mm DIN931 | https://s.click.aliexpress.com/e/_DCCHxur |
| \*3 | Flat Washer M8 16x1x1.5 | https://s.click.aliexpress.com/e/_DdBx3SF |
| \*2 | M8 Hex Nylon Insert Lock Nut Self-locking Locknut | https://s.click.aliexpress.com/e/_At5Tpj |
| \*1 | Threaded Rod 6mm (>=48cm) (any 6mm rod will work, I used a carbon fiber rod from a kite) | https://s.click.aliexpress.com/e/_DEQQjrz |
| | ----------- **Electronics** -------------- | |
| 1 | Power Supply 12v 5A | https://s.click.aliexpress.com/e/_DEF56Ef |
| 1 | Wemos D1 MINI V3.0.0 | https://s.click.aliexpress.com/e/_9GGvad |
| 1 | Mini DC-DC 12-24V To 5V 3A Step Down | https://s.click.aliexpress.com/e/_A8abPX |
| 1 | Mini Micro Limit Switch Roller Lever Arm | https://s.click.aliexpress.com/e/_DdlHBbr |
| 1 | A4988 DRV8825 Stepper Motor Driver With Heat sink | https://s.click.aliexpress.com/e/_AMKH4t |
| 1 | Nema 17 stepper motor 42 motor height 38mm 1.2A D shaped shaft | https://s.click.aliexpress.com/e/_AfngLT |
| 1 | IRLZ44N MOSFET | https://s.click.aliexpress.com/e/_Dk1JsKh |
| 1 | Hotend MK8 Extrusion Aluminum Block 20x20x10mm with Thermistor Ceramic and Heater 12V 40W | https://s.click.aliexpress.com/e/_9QSRwl |
| 1 | capacitor 100uf 16V | https://s.click.aliexpress.com/e/_DkEQAV5 |
| 3 | pin header | https://s.click.aliexpress.com/e/_DEzMmjj |
| 3 | terminal blocks 2P | https://s.click.aliexpress.com/e/_DdfJlAb |
| 2 | 10K ohms resistors | https://s.click.aliexpress.com/e/_DBcOxjR |
| \*50cm | 2 wire cable for limit switch, digital signal | https://s.click.aliexpress.com/e/_Dlnn1bd |
| \*50cm | 2 wire cable for 5A+ | https://s.click.aliexpress.com/e/_Dlnn1bdd |
| 1 | 10A 250V Inlet Module Plug Rocker Switch Male Power Socket 3 Pin IEC320 C14 switch + Fuse New | https://s.click.aliexpress.com/e/_DmuNpxf |
| | ----------- **Hardware** ---------------- | |
| 18 | Screw M2 x 16mm (100pcs) (union between large gears and pulley) | https://s.click.aliexpress.com/e/_Dcg0sln |
| 1 | MK8 Brass Nozzle 0.4MM | https://s.click.aliexpress.com/e/_ANswWD |
| 4 | Bearing 8x22x7 mm 608ZZ | https://s.click.aliexpress.com/e/_DDu60K3 |
| 1 | Stainless Steel 90 Degree Angle Bracket Corner 20x20mm | https://s.click.aliexpress.com/e/_ACOtVF |
| \*2 | M8 x 100mm A2 Hex Head Screw Bolt (instead I use 2x 8mm rod thereaded cut to 10cm) | https://s.click.aliexpress.com/e/_AY2LNb |
| \*2(4) | M8 Hex Nylon Insert Lock Nut Self-locking Locknut | https://s.click.aliexpress.com/e/_At5Tpj |
| \*1 | M3 8mm Bolt for the motor gear | https://s.click.aliexpress.com/e/_DelUMSF |
| \*3 | M3 14mm Bolt for motor mount | https://s.click.aliexpress.com/e/_DelUMSF |
| \*50cm | Paracord 2mm(nylon string) (I used polyester thread for kite handles) | https://s.click.aliexpress.com/e/_99oV2Hv |
| \*1 | 1.7mm drill bit | https://s.click.aliexpress.com/e/_DD1SYVV |
@@ -1,9 +0,0 @@
# How to flash the firmware
- Install this https://github.com/esphome/esphome-flasher
- Open esphome-flasher
- Select your serial port where you have connected the wemos
- Go to browser and search and open petalot.ino.d1_mini.bin
- Press Flash ESP
- Connect your phone to the WIFI "PETALOT-XXXXXX" and browser to 192.168.4.1 (If the page does not load try deactivating your mobile data connection)
- (optional) Enter SSID, password, IP address, gateway and subnet for your local WIFI
- (optional) Open the IP address used in the previous step in your browser
@@ -1,195 +0,0 @@
#include <ArduinoJson.h>
#include "FS.h"
String msg;
String status;
double To;
int Vo = 0;
int Tm;
double Kp;
double Ki;
double Kd;
double Max;
String LocalIP;
String Gateway;
String Subnet;
int R1;
char ssid[64];
char password[64];
String ifttt_event_name = "petalot_stopped";
String ifttt_api_key = "";
StaticJsonDocument<512> doc;
const char *confFile = "/config.json";
String printConf() {
String confString;
serializeJson(doc, confString);
return confString;
}
void saveConfiguration() {
SPIFFS.remove("/config.json");
File file = SPIFFS.open("/config.json", "w");
if (!file) {
msg = "Failed to create file";
return;
}
doc["To"] = To;
doc["Vo"] = Vo;
doc["Tm"] = Tm;
doc["Kp"] = Kp;
doc["Ki"] = Ki;
doc["Kd"] = Kd;
doc["Max"] = Max;
doc["ssid"] = ssid;
doc["password"] = password;
doc["LocalIP"] = LocalIP;
doc["Subnet"] = Subnet;
doc["Gateway"] = Gateway;
doc["R1"] = R1;
doc["ifttt_event_name"] = ifttt_event_name;
doc["ifttt_api_key"] = ifttt_api_key;
if (serializeJson(doc, file) == 0) {
msg = "Failed to write to file";
}
Serial.println(printConf());
file.close();
analogWrite(PIN_HEATER, 0);
ESP.restart();
}
void resetConfiguration(){
Serial.println("reset");
strcpy(ssid, "");
strcpy(password, "");
To = 220;
Vo = 40;
Tm = 230;
Kp = 23.0;
Ki = 0.043;
Kd = 160.0;
Max = 200;
LocalIP = "";
Subnet = "255.255.255.0";
Gateway = "";
R1 = 10000;
ifttt_event_name = "";
ifttt_api_key = "";
saveConfiguration();
}
void readConfigurationSerial(){
StaticJsonDocument<512> docInput;
if (Serial.available() > 0)
{
// Deserialize the JSON document
DeserializationError error = deserializeJson(docInput, Serial);
if (error)
{
Serial.println(F("deserializeJson() failed: "));
Serial.println(error.c_str());
return;
} else {
//Serial.println("json ok");
doc=docInput;
//serializeJson(doc,Serial);
File file = SPIFFS.open("/config.json", "w");
if (!file) {
msg = "Failed to create file";
return;
}
if (serializeJson(doc, file) == 0) {
msg = "Failed to write to file";
}
file.close();
Serial.println("Configuration updated, restarting...");
analogWrite(PIN_HEATER, 0);
ESP.restart();
}
}
}
void loadConfiguration(bool reset=false) {
File file = SPIFFS.open("/config.json", "r");
if (!file) {
msg = "Failed to open /config.json";
Serial.println("Failed to open /config.json");
resetConfiguration();
analogWrite(PIN_HEATER, 0);
ESP.restart();
}
DeserializationError error = deserializeJson(doc, file);
if (error) {
msg = "Failed to read file, using default configuration";
Serial.println("Failed to read file, using default configuration");
resetConfiguration();
return;
}
file.close();
strlcpy(ssid,
doc["ssid"] | "",
sizeof(ssid));
strlcpy(password,
doc["password"] | "",
sizeof(password));
To = doc["To"] | 220;
//To = Tco;
Vo = doc["Vo"] | 40;
//Vo = Vco;
Tm = doc["Tm"] | 230;
Kp = doc["Kp"]?doc["Kp"].as<double>():23.0;
Ki = doc["Ki"]?doc["Ki"].as<double>():0.043;
Kd = doc["Kd"]?doc["Kd"].as<double>():160.0;
Max = doc["Max"]?doc["Max"].as<double>():200;
LocalIP = doc["LocalIP"] | "";
Subnet = doc["Subnet"] | "255.255.255.0";
Gateway = doc["Gateway"] | "";
R1 = doc["R1"] | 10000;
ifttt_event_name = doc["ifttt_event_name"] | "";
ifttt_api_key = doc["ifttt_api_key"] | "";
Serial.println();
Serial.println("To:Temperature");
Serial.println("Vo:Speed");
Serial.println("Tm:Maximum Temperature");
Serial.println("Kp:Kp");
Serial.println("Ki:Ki");
Serial.println("Kd:Kd");
Serial.println("R1:R1");
Serial.println("Max:Maximum value for MOSFET (0-255)");
Serial.println("ssid:SSID");
Serial.println("password:SSID Password");
Serial.println("LocalIP:IP address");
Serial.println("Subnet:Subnet");
Serial.println("Gateway:Gateway");
Serial.println("ifttt_event_name:IFTTT Event Name");
Serial.println("ifttt_api_key:IFTTT API Key");
Serial.println(printConf());
}
void initConf() {
if (!SPIFFS.begin()) {
msg = "Error mounting the file system";
return;
}
loadConfiguration();
}
@@ -1,118 +0,0 @@
#include <PID_v1.h>
double T; //current temp
bool F = false;
bool Fc = false;
bool Fi = false;
double Output; //pid output
PID myPID(&T, &Output, &To, Kp, Ki, Kd, DIRECT);
double tempLastSample;
double tempLastFilament;
double tempLastNoFilament;
double tempLastStart;
//thermistor
float logR2, R2;
//steinhart-hart coeficients for thermistor
float c1 = 0.8438162826e-03, c2 = 2.059601750e-04, c3 = 0.8615484887e-07;
double Thermistor(float Volts) {
R2 = R1 * (1023.0 / (float)Volts - 1.0); //calculate resistance on thermistor
logR2 = log(R2);
T = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2)); // temperature in Kelvin
T = T - 273.15; //convert Kelvin to Celcius
return T;
}
void start(){
if (tempLastStart==0){
status = "working";
V = Vo;
tempLastStart = millis();
if (tempLastStart==0) tempLastStart = 1;
}
}
void stop(){
status = "stopped";
V = 0;
tempLastStart = 0;
ifttt();
}
void initHotend(){
myPID.SetTunings(Kp, Ki, Kd);
myPID.SetOutputLimits(0,Max);
pinMode(LED_BUILTIN , OUTPUT);
pinMode(PIN_FILAMENT , INPUT);
if (status=="") start();
}
void hotendReadTempTask() {
if (status == "stopped" && myPID.GetMode() == AUTOMATIC){
myPID.SetMode(MANUAL);
Output = 0;
}
if (status == "working" && myPID.GetMode() != AUTOMATIC){
myPID.SetMode(AUTOMATIC);
}
if (millis() >= tempLastSample + 100)
{
Thermistor(analogRead(PIN_THERMISTOR)); //Volt to temp, update T
if (T > Tm || isnan(T)){
Output = 0;
} else {
myPID.Compute();
}
if (status == "working"){
start();
if (T > 150 || T > To + 20 ) {
digitalWrite(LED_BUILTIN , LOW);// target temperature ready
} else {
digitalWrite(LED_BUILTIN , !digitalRead(LED_BUILTIN));//reaching tarjet temp
}
} else {
digitalWrite(LED_BUILTIN , HIGH);
}
analogWrite(PIN_HEATER, Output);
Fc = digitalRead(PIN_FILAMENT);
if (Fc && !F) {
tempLastFilament = millis();
start();
}
if (!Fc && F) {
tempLastFilament = 0;
tempLastNoFilament = millis();
}
F = Fc;
if (Fc && tempLastFilament > 0 && millis() >= tempLastFilament + 3*1000){
Fi = true;
}
if (!Fc && Fi && tempLastNoFilament > 0 && millis() >= tempLastNoFilament + 500) { // no filament
stop();
tempLastNoFilament = 0;
Fi = false;
}
if (!Fc && !Fi && tempLastStart > 0 && millis() >= tempLastStart + 5*60*1000) { // no filament for 5 min
stop();
}
tempLastSample = millis();
}
}
@@ -1,38 +0,0 @@
#include <ArduinoOTA.h>
bool debugMode = false;
void initOTA() {
ArduinoOTA.onStart([]() {
String type;
if (ArduinoOTA.getCommand() == U_FLASH) {
type = "sketch";
} else {
type = "filesystem";
}
Serial.println("Start updating " + type);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd");
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) {
Serial.println("Auth Failed");
} else if (error == OTA_BEGIN_ERROR) {
Serial.println("Begin Failed");
} else if (error == OTA_CONNECT_ERROR) {
Serial.println("Connect Failed");
} else if (error == OTA_RECEIVE_ERROR) {
Serial.println("Receive Failed");
} else if (error == OTA_END_ERROR) {
Serial.println("End Failed");
}
});
ArduinoOTA.begin();
}
@@ -1,27 +0,0 @@
#include "pins.hpp"
#include "conf.hpp"
#include "wifi.hpp"
#include "stepper.hpp"
#include "hotend.hpp"
#include "server.hpp"
#include "ota.hpp"
void setup() {
Serial.begin(115200);
delay(1000);
initConf();
initWiFi();
initOTA();
initHotend();
initStepper();
InitServer();
}
void loop() {
wifiTask();
server.handleClient();
hotendReadTempTask();
stepperRunTask();
ArduinoOTA.handle();
readConfigurationSerial();
}
@@ -1,9 +0,0 @@
#define PIN_EN D1
#define PIN_STEP D2
#define PIN_DIR D3
#define PIN_THERMISTOR A0
#define PIN_HEATER D0
//v1 and v1.1
#define PIN_FILAMENT D7
@@ -1,391 +0,0 @@
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
static const char PROGMEM INDEX_HTML[] = R"rawliteral(
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script>
(()=>{var Pw=Object.create;var ii=Object.defineProperty;var Dw=Object.getOwnPropertyDescriptor;var qw=Object.getOwnPropertyNames;var Iw=Object.getPrototypeOf,Rw=Object.prototype.hasOwnProperty;var Ml=r=>ii(r,"__esModule",{value:!0});var Fn=r=>{if(typeof require!="undefined")return require(r);throw new Error('Dynamic require of "'+r+'" is not supported')};var A=(r,e)=>()=>(r&&(e=r(r=0)),e);var v=(r,e)=>()=>(e||r((e={exports:{}}).exports,e),e.exports),Ce=(r,e)=>{Ml(r);for(var t in e)ii(r,t,{get:e[t],enumerable:!0})},Mw=(r,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of qw(e))!Rw.call(r,i)&&i!=="default"&&ii(r,i,{get:()=>e[i],enumerable:!(t=Dw(e,i))||t.enumerable});return r},J=r=>Mw(Ml(ii(r!=null?Pw(Iw(r)):{},"default",r&&r.__esModule&&"default"in r?{get:()=>r.default,enumerable:!0}:{value:r,enumerable:!0})),r);var m,l=A(()=>{m={platform:"",env:{},versions:{node:"14.17.6"}}});var Fw,ae,Ge=A(()=>{l();Fw=0,ae={readFileSync:r=>self[r]||"",statSync:()=>({mtimeMs:Fw++})}});var Nn=v((kO,Nl)=>{l();"use strict";var Fl=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,t){if(this.cache.set(e,t),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let t=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,t),t}}set(e,t){return this.cache.has(e)?this.cache.set(e,t):this._set(e,t),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let t=this.cache.delete(e);return t&&this._size--,this.oldCache.delete(e)||t}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[t]=e;this.cache.has(t)||(yield e)}}get size(){let e=0;for(let t of this.oldCache.keys())this.cache.has(t)||e++;return Math.min(this._size+e,this.maxSize)}};Nl.exports=Fl});var Ll,Bl=A(()=>{l();Ll=r=>r&&r._hash});function ni(r){return Ll(r,{ignoreUnknown:!0})}var $l=A(()=>{l();Bl()});var zl={};Ce(zl,{default:()=>ie});var ie,lt=A(()=>{l();ie={resolve:r=>r,extname:r=>"."+r.split(".").pop()}});var yt,si=A(()=>{l();yt={}});function jl(r){let e=ae.readFileSync(r,"utf-8"),t=yt(e);return{file:r,requires:t}}function Ln(r){let t=[jl(r)];for(let i of t)i.requires.filter(n=>n.startsWith("./")||n.startsWith("../")).forEach(n=>{try{let s=ie.dirname(i.file),a=yt.sync(n,{basedir:s}),o=jl(a);t.push(o)}catch(s){}});return t}var Vl=A(()=>{l();Ge();lt();si();si()});function ut(r){if(r=`${r}`,r==="0")return"0";if(/^[+-]?(\d+|\d*\.\d+)(e[+-]?\d+)?(%|\w+)?$/.test(r))return r.replace(/^[+-]?/,t=>t==="-"?"":"-");let e=["var","calc","min","max","clamp"];for(let t of e)if(r.includes(`${t}(`))return`calc(${r} * -1)`}var ai=A(()=>{l()});var Ul,Wl=A(()=>{l();Ul=["preflight","container","accessibility","pointerEvents","visibility","position","inset","isolation","zIndex","order","gridColumn","gridColumnStart","gridColumnEnd","gridRow","gridRowStart","gridRowEnd","float","clear","margin","boxSizing","display","aspectRatio","height","maxHeight","minHeight","width","minWidth","maxWidth","flex","flexShrink","flexGrow","flexBasis","tableLayout","borderCollapse","borderSpacing","transformOrigin","translate","rotate","skew","scale","transform","animation","cursor","touchAction","userSelect","resize","scrollSnapType","scrollSnapAlign","scrollSnapStop","scrollMargin","scrollPadding","listStylePosition","listStyleType","appearance","columns","breakBefore","breakInside","breakAfter","gridAutoColumns","gridAutoFlow","gridAutoRows","gridTemplateColumns","gridTemplateRows","flexDirection","flexWrap","placeContent","placeItems","alignContent","alignItems","justifyContent","justifyItems","gap","space","divideWidth","divideStyle","divideColor","divideOpacity","placeSelf","alignSelf","justifySelf","overflow","overscrollBehavior","scrollBehavior","textOverflow","whitespace","wordBreak","borderRadius","borderWidth","borderStyle","borderColor","borderOpacity","backgroundColor","backgroundOpacity","backgroundImage","gradientColorStops","boxDecorationBreak","backgroundSize","backgroundAttachment","backgroundClip","backgroundPosition","backgroundRepeat","backgroundOrigin","fill","stroke","strokeWidth","objectFit","objectPosition","padding","textAlign","textIndent","verticalAlign","fontFamily","fontSize","fontWeight","textTransform","fontStyle","fontVariantNumeric","lineHeight","letterSpacing","textColor","textOpacity","textDecoration","textDecorationColor","textDecorationStyle","textDecorationThickness","textUnderlLine truncated
In order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}return t=r[Symbol.iterator](),t.next.bind(t)}function pb(r,e){if(!!r){if(typeof r=="string")return pu(r,e);var t=Object.prototype.toString.call(r).slice(8,-1);if(t==="Object"&&r.constructor&&(t=r.constructor.name),t==="Map"||t==="Set")return Array.from(r);if(t==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return pu(r,e)}}function pu(r,e){(e==null||e>r.length)&&(e=r.length);for(var t=0,i=new Array(e);t<e;t++)i[t]=r[t];return i}function du(r,e){for(var t=0;t<e.length;t++){var i=e[t];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(r,i.key,i)}}function db(r,e,t){return e&&du(r.prototype,e),t&&du(r,t),r}function hb(r,e){r.prototype=Object.create(e.prototype),r.prototype.constructor=r,Un(r,e)}function Un(r,e){return Un=Object.setPrototypeOf||function(i,n){return i.__proto__=n,i},Un(r,e)}var mb=function(r){hb(e,r);function e(i){var n;return n=r.call(this,i)||this,n.nodes||(n.nodes=[]),n}var t=e.prototype;return t.append=function(n){return n.parent=this,this.nodes.push(n),this},t.prepend=function(n){return n.parent=this,this.nodes.unshift(n),this},t.at=function(n){return this.nodes[n]},t.index=function(n){return typeof n=="number"?n:this.nodes.indexOf(n)},t.removeChild=function(n){n=this.index(n),this.at(n).parent=void 0,this.nodes.splice(n,1);var s;for(var a in this.indexes)s=this.indexes[a],s>=n&&(this.indexes[a]=s-1);return this},t.removeAll=function(){for(var n=cb(this.nodes),s;!(s=n()).done;){var a=s.value;a.parent=void 0}return this.nodes=[],this},t.empty=function(){return this.removeAll()},t.insertAfter=function(n,s){s.parent=this;var a=this.index(n);this.nodes.splice(a+1,0,s),s.parent=this;var o;for(var u in this.indexes)o=this.indexes[u],a<=o&&(this.indexes[u]=o+1);return this},t.insertBefore=function(n,s){s.parent=this;var a=this.index(n);this.nodes.splice(a,0,s),s.parent=this;var o;for(var u in this.indexes)o=this.indexes[u],o<=a&&(this.indexes[u]=o+1);return this},t._findChildAtPosition=function(n,s){var a=void 0;return this.each(function(o){if(o.atPosition){var u=o.atPosition(n,s);if(u)return a=u,!1}else if(o.isAtPosition(n,s))return a=o,!1}),a},t.atPosition=function(n,s){if(this.isAtPosition(n,s))return this._findChildAtPosition(n,s)||this},t._inferEndPosition=function(){this.last&&this.last.source&&this.last.source.end&&(this.source=this.source||{},this.source.end=this.source.end||{},Object.assign(this.source.end,this.last.source.end))},t.each=function(n){this.lastEach||(this.lastEach=0),this.indexes||(this.indexes={}),this.lastEach++;var s=this.lastEach;if(this.indexes[s]=0,!!this.length){for(var a,o;this.indexes[s]<this.length&&(a=this.indexes[s],o=n(this.at(a),a),o!==!1);)this.indexes[s]+=1;if(delete this.indexes[s],o===!1)return!1}},t.walk=function(n){return this.each(function(s,a){var o=n(s,a);if(o!==!1&&s.length&&(o=s.walk(n)),o===!1)return!1})},t.walkAttributes=function(n){var s=this;return this.walk(function(a){if(a.type===Be.ATTRIBUTE)return n.call(s,a)})},t.walkClasses=function(n){var s=this;return this.walk(function(a){if(a.type===Be.CLASS)return n.call(s,a)})},t.walkCombinators=function(n){var s=this;return this.walk(function(a){if(a.type===Be.COMBINATOR)return n.call(s,a)})},t.walkComments=function(n){var s=this;return this.walk(function(a){if(a.type===Be.COMMENT)return n.call(s,a)})},t.walkIds=function(n){var s=this;return this.walk(function(a){if(a.type===Be.ID)return n.call(s,a)})},t.walkNesting=function(n){var s=this;return this.walk(function(a){if(a.type===Be.NESTING)return n.call(s,a)})},t.walkPseudos=function(n){var s=this;return this.walk(function(a){if(a.type===Be.PSEUDO)return n.call(s,a)})},t.walkTags=function(n){var s=this;return this.walk(function(a){if(a.type===Be.TAG)return n.call(s,a)})},t.walkUniversals=function(n){var s=this;return this.walk(function(a){if(a.type===Be.UNIVERSAL)return n.call(s,a)})},t.split=function(n){var s=this,a=[];return this.reduce(function(o,u,c){var f=n.call(s,u);return a.push(u),f?(o.push(a),a=[]):c===s.length-1&&o.push(a),o},[])},t.map=function(n){return this.nodes.map(n)},t.reduce=function(n,s){return this.nodes.reduce(n,s)},t.every=function(n){return this.nodes.every(n)},t.some=function(n){return this.nodes.some(n)},t.filter=function(n){return this.nodes.filter(n)},t.sort=function(n){return this.nodes.sort(n)},t.toString=function(){return this.map(String).join("")},db(e,[{key:"first",get:function(){return this.at(0)}},{key:"last",get:function(){return this.at(this.length-1)}},{key:"length",get:function(){return this.nodes.length}}]),e}(lb.default);ir.default=mb;hu.exports=ir.default});var Gn=v((nr,gu)=>{l();"use strict";nr.__esModule=!0;nr.default=void 0;var gb=wb(gi()),yb=te();function wb(r){return r&&r.__esModule?r:{default:r}}function mu(r,e){for(var t=0;t<e.length;t++){var i=e[t];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(r,i.keyLine truncated
`),k=w.length-1,k>0?(x=a+k,S=b-w[k].length):(x=a,S=s),D=O.comment,a=x,h=x,p=b-S):c===O.slash?(b=o,D=c,h=a,p=o-s,u=b+1):(b=Sv(t,o),D=O.word,h=a,p=b-s),u=b+1;break}e.push([D,a,o-s,h,p,o,u]),S&&(s=S,S=null),o=u}return e}});var Ku=v((vr,Xu)=>{l();"use strict";vr.__esModule=!0;vr.default=void 0;var Ov=ge(Gn()),Ss=ge(Yn()),Ev=ge(Xn()),Wu=ge(Zn()),Tv=ge(ts()),Pv=ge(ns()),Cs=ge(as()),Dv=ge(ls()),Gu=ki(hs()),qv=ge(gs()),_s=ge(ws()),Iv=ge(vs()),Rv=ge($u()),C=ki(Uu()),E=ki(xs()),Mv=ki(te()),Y=tr(),ft,As;function Hu(){if(typeof WeakMap!="function")return null;var r=new WeakMap;return Hu=function(){return r},r}function ki(r){if(r&&r.__esModule)return r;if(r===null||typeof r!="object"&&typeof r!="function")return{default:r};var e=Hu();if(e&&e.has(r))return e.get(r);var t={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in r)if(Object.prototype.hasOwnProperty.call(r,n)){var s=i?Object.getOwnPropertyDescriptor(r,n):null;s&&(s.get||s.set)?Object.defineProperty(t,n,s):t[n]=r[n]}return t.default=r,e&&e.set(r,t),t}function ge(r){return r&&r.__esModule?r:{default:r}}function Yu(r,e){for(var t=0;t<e.length;t++){var i=e[t];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(r,i.key,i)}}function Fv(r,e,t){return e&&Yu(r.prototype,e),t&&Yu(r,t),r}var Os=(ft={},ft[E.space]=!0,ft[E.cr]=!0,ft[E.feed]=!0,ft[E.newline]=!0,ft[E.tab]=!0,ft),Nv=Object.assign({},Os,(As={},As[E.comment]=!0,As));function Qu(r){return{line:r[C.FIELDS.START_LINE],column:r[C.FIELDS.START_COL]}}function Ju(r){return{line:r[C.FIELDS.END_LINE],column:r[C.FIELDS.END_COL]}}function ct(r,e,t,i){return{start:{line:r,column:e},end:{line:t,column:i}}}function vt(r){return ct(r[C.FIELDS.START_LINE],r[C.FIELDS.START_COL],r[C.FIELDS.END_LINE],r[C.FIELDS.END_COL])}function Es(r,e){if(!!r)return ct(r[C.FIELDS.START_LINE],r[C.FIELDS.START_COL],e[C.FIELDS.END_LINE],e[C.FIELDS.END_COL])}function xt(r,e){var t=r[e];if(typeof t=="string")return t.indexOf("\\")!==-1&&((0,Y.ensureObject)(r,"raws"),r[e]=(0,Y.unesc)(t),r.raws[e]===void 0&&(r.raws[e]=t)),r}function Ts(r,e){for(var t=-1,i=[];(t=r.indexOf(e,t+1))!==-1;)i.push(t);return i}function Lv(){var r=Array.prototype.concat.apply([],arguments);return r.filter(function(e,t){return t===r.indexOf(e)})}var Bv=function(){function r(t,i){i===void 0&&(i={}),this.rule=t,this.options=Object.assign({lossy:!1,safe:!1},i),this.position=0,this.css=typeof this.rule=="string"?this.rule:this.rule.selector,this.tokens=(0,C.default)({css:this.css,error:this._errorGenerator(),safe:this.options.safe});var n=Es(this.tokens[0],this.tokens[this.tokens.length-1]);this.root=new Ov.default({source:n}),this.root.errorGenerator=this._errorGenerator();var s=new Ss.default({source:{start:{line:1,column:1}}});this.root.append(s),this.current=s,this.loop()}var e=r.prototype;return e._errorGenerator=function(){var i=this;return function(n,s){return typeof i.rule=="string"?new Error(n):i.rule.error(n,s)}},e.attribute=function(){var i=[],n=this.currToken;for(this.position++;this.position<this.tokens.length&&this.currToken[C.FIELDS.TYPE]!==E.closeSquare;)i.push(this.currToken),this.position++;if(this.currToken[C.FIELDS.TYPE]!==E.closeSquare)return this.expected("closing square bracket",this.currToken[C.FIELDS.START_POS]);var s=i.length,a={source:ct(n[1],n[2],this.currToken[3],this.currToken[4]),sourceIndex:n[C.FIELDS.START_POS]};if(s===1&&!~[E.word].indexOf(i[0][C.FIELDS.TYPE]))return this.expected("attribute",i[0][C.FIELDS.START_POS]);for(var o=0,u="",c="",f=null,p=!1;o<s;){var h=i[o],d=this.content(h),y=i[o+1];switch(h[C.FIELDS.TYPE]){case E.space:if(p=!0,this.options.lossy)break;if(f){(0,Y.ensureObject)(a,"spaces",f);var k=a.spaces[f].after||"";a.spaces[f].after=k+d;var w=(0,Y.getProp)(a,"raws","spaces",f,"after")||null;w&&(a.raws.spaces[f].after=w+d)}else u=u+d,c=c+d;break;case E.asterisk:if(y[C.FIELDS.TYPE]===E.equals)a.operator=d,f="operator";else if((!a.namespace||f==="namespace"&&!p)&&y){u&&((0,Y.ensureObject)(a,"spaces","attribute"),a.spaces.attribute.before=u,u=""),c&&((0,Y.ensureObject)(a,"raws","spaces","attribute"),a.raws.spaces.attribute.before=u,c=""),a.namespace=(a.namespace||"")+d;var b=(0,Y.getProp)(a,"raws","namespace")||null;b&&(a.raws.namespace+=d),f="namespace"}p=!1;break;case E.dollar:if(f==="value"){var x=(0,Y.getProp)(a,"raws","value");a.value+="$",x&&(a.raws.value=x+"$");break}case E.caret:y[C.FIELDS.TYPE]===E.equals&&(a.operator=d,f="operator"),p=!1;break;case E.combinator:if(d==="~"&&y[C.FIELDS.TYPE]===E.equals&&(a.operator=d,f="operator"),d!=="|"){p=!1;break}y[C.FIELDS.TYPE]===E.equals?(a.operator=d,f="operator"):!a.namespace&&!a.attribute&&(a.namespace=!0),p=!1;break;case E.word:if(y&&this.content(y)==="|"&&i[o+2]&&i[o+2][C.FIELDS.TYPE]!==E.equals&&!a.operator&&!a.namespace)a.namespace=d,f="namespace";else if(!a.attribute||f==="attribute"&&!p){u&&((0,Y.ensureObject)(a,"spaces","attribute"),a.spaces.attribute.before=u,u=""),c&&((0,Y.ensureObject)(a,"raws","spaces","attriLine truncated
`+d+o("^")}return" "+u(h)+c}).join(`
`)}toString(){let e=this.showSourceCode();return e&&(e=`
`+e+`
`),this.name+": "+this.message+e}};Hf.exports=Ct;Ct.default=Ct});var Pi=v((JE,ea)=>{l();"use strict";ea.exports.isClean=Symbol("isClean");ea.exports.my=Symbol("my")});var ta=v((XE,Qf)=>{l();"use strict";var Yf={colon:": ",indent:" ",beforeDecl:`
`,beforeRule:`
`,beforeOpen:" ",beforeClose:`
`,beforeComment:`
`,after:`
`,emptyBody:"",commentLeft:" ",commentRight:" ",semicolon:!1};function a1(r){return r[0].toUpperCase()+r.slice(1)}var Di=class{constructor(e){this.builder=e}stringify(e,t){if(!this[e.type])throw new Error("Unknown AST node type "+e.type+". Maybe you need to change PostCSS stringifier.");this[e.type](e,t)}document(e){this.body(e)}root(e){this.body(e),e.raws.after&&this.builder(e.raws.after)}comment(e){let t=this.raw(e,"left","commentLeft"),i=this.raw(e,"right","commentRight");this.builder("/*"+t+e.text+i+"*/",e)}decl(e,t){let i=this.raw(e,"between","colon"),n=e.prop+i+this.rawValue(e,"value");e.important&&(n+=e.raws.important||" !important"),t&&(n+=";"),this.builder(n,e)}rule(e){this.block(e,this.rawValue(e,"selector")),e.raws.ownSemicolon&&this.builder(e.raws.ownSemicolon,e,"end")}atrule(e,t){let i="@"+e.name,n=e.params?this.rawValue(e,"params"):"";if(typeof e.raws.afterName!="undefined"?i+=e.raws.afterName:n&&(i+=" "),e.nodes)this.block(e,i+n);else{let s=(e.raws.between||"")+(t?";":"");this.builder(i+n+s,e)}}body(e){let t=e.nodes.length-1;for(;t>0&&e.nodes[t].type==="comment";)t-=1;let i=this.raw(e,"semicolon");for(let n=0;n<e.nodes.length;n++){let s=e.nodes[n],a=this.raw(s,"before");a&&this.builder(a),this.stringify(s,t!==n||i)}}block(e,t){let i=this.raw(e,"between","beforeOpen");this.builder(t+i+"{",e,"start");let n;e.nodes&&e.nodes.length?(this.body(e),n=this.raw(e,"after")):n=this.raw(e,"after","emptyBody"),n&&this.builder(n),this.builder("}",e,"end")}raw(e,t,i){let n;if(i||(i=t),t&&(n=e.raws[t],typeof n!="undefined"))return n;let s=e.parent;if(i==="before"&&(!s||s.type==="root"&&s.first===e||s&&s.type==="document"))return"";if(!s)return Yf[i];let a=e.root();if(a.rawCache||(a.rawCache={}),typeof a.rawCache[i]!="undefined")return a.rawCache[i];if(i==="before"||i==="after")return this.beforeAfter(e,i);{let o="raw"+a1(i);this[o]?n=this[o](a,e):a.walk(u=>{if(n=u.raws[t],typeof n!="undefined")return!1})}return typeof n=="undefined"&&(n=Yf[i]),a.rawCache[i]=n,n}rawSemicolon(e){let t;return e.walk(i=>{if(i.nodes&&i.nodes.length&&i.last.type==="decl"&&(t=i.raws.semicolon,typeof t!="undefined"))return!1}),t}rawEmptyBody(e){let t;return e.walk(i=>{if(i.nodes&&i.nodes.length===0&&(t=i.raws.after,typeof t!="undefined"))return!1}),t}rawIndent(e){if(e.raws.indent)return e.raws.indent;let t;return e.walk(i=>{let n=i.parent;if(n&&n!==e&&n.parent&&n.parent===e&&typeof i.raws.before!="undefined"){let s=i.raws.before.split(`
`);return t=s[s.length-1],t=t.replace(/\S/g,""),!1}}),t}rawBeforeComment(e,t){let i;return e.walkComments(n=>{if(typeof n.raws.before!="undefined")return i=n.raws.before,i.includes(`
`)&&(i=i.replace(/[^\n]+$/,"")),!1}),typeof i=="undefined"?i=this.raw(t,null,"beforeDecl"):i&&(i=i.replace(/\S/g,"")),i}rawBeforeDecl(e,t){let i;return e.walkDecls(n=>{if(typeof n.raws.before!="undefined")return i=n.raws.before,i.includes(`
`)&&(i=i.replace(/[^\n]+$/,"")),!1}),typeof i=="undefined"?i=this.raw(t,null,"beforeRule"):i&&(i=i.replace(/\S/g,"")),i}rawBeforeRule(e){let t;return e.walk(i=>{if(i.nodes&&(i.parent!==e||e.first!==i)&&typeof i.raws.before!="undefined")return t=i.raws.before,t.includes(`
`)&&(t=t.replace(/[^\n]+$/,"")),!1}),t&&(t=t.replace(/\S/g,"")),t}rawBeforeClose(e){let t;return e.walk(i=>{if(i.nodes&&i.nodes.length>0&&typeof i.raws.after!="undefined")return t=i.raws.after,t.includes(`
`)&&(t=t.replace(/[^\n]+$/,"")),!1}),t&&(t=t.replace(/\S/g,"")),t}rawBeforeOpen(e){let t;return e.walk(i=>{if(i.type!=="decl"&&(t=i.raws.between,typeof t!="undefined"))return!1}),t}rawColon(e){let t;return e.walkDecls(i=>{if(typeof i.raws.between!="undefined")return t=i.raws.between.replace(/[^\s:]/g,""),!1}),t}beforeAfter(e,t){let i;e.type==="decl"?i=this.raw(e,null,"beforeDecl"):e.type==="comment"?i=this.raw(e,null,"beforeComment"):t==="before"?i=this.raw(e,null,"beforeRule"):i=this.raw(e,null,"beforeClose");let n=e.parent,s=0;for(;n&&n.type!=="root";)s+=1,n=n.parent;if(i.includes(`
`)){let a=this.raw(e,null,"indent");if(a.length)for(let o=0;o<s;o++)i+=a}return i}rawValue(e,t){let i=e[t],n=e.raws[t];return n&&n.value===i?n.raw:i}};Qf.exports=Di;Di.default=Di});var Ir=v((KE,Jf)=>{l();"use strict";var o1=ta();function ra(r,e){new o1(e).stringify(r)}Jf.exports=ra;ra.default=ra});var Rr=v((ZE,Xf)=>{l();"use strict";var{isClean:qi,my:l1}=Pi(),u1=Ti(),f1=ta(),c1=Ir();function ia(r,e){let t=new r.constructor;for(let i in r){if(!Object.prototype.hasOwnProperty.call(r,i)||i==="proxyCache")continue;let n=r[i],s=typeof n;i==="parent"&&s==="object"?e&&(t[i]=e):i==="source"?t[i]=n:Array.isArray(n)?t[i]=n.map(a=>ia(a,t)):(s==="object"&&n!==null&&(n=ia(n)),t[i]=n)}return t}var Ii=class{constructor(e={}){this.raws={},this[qi]=!1,this[l1]=!0;for(let t in e)if(t==="nodes"){this.nodes=[];for(let i of e[t])typeof i.clone=="function"?this.append(i.clone()):this.append(i)}else this[t]=e[t]}error(e,t={}){if(this.source){let{start:i,end:n}=this.rangeBy(t);return this.source.input.error(e,{line:i.line,column:i.column},{line:n.line,column:n.column},t)}return new u1(e)}warn(e,t,i){let n={node:this};for(let s in i)n[s]=i[s];return e.warn(t,n)}remove(){return this.parent&&this.parent.removeChild(this),this.parent=void 0,this}toString(e=c1){e.stringify&&(e=e.stringify);let t="";return e(this,i=>{t+=i}),t}assign(e={}){for(let t in e)this[t]=e[t];return this}clone(e={}){let t=ia(this);for(let i in e)t[i]=e[i];return t}cloneBefore(e={}){let t=this.clone(e);return this.parent.insertBefore(this,t),t}cloneAfter(e={}){let t=this.clone(e);return this.parent.insertAfter(this,t),t}replaceWith(...e){if(this.parent){let t=this,i=!1;for(let n of e)n===this?i=!0:i?(this.parent.insertAfter(t,n),t=n):this.parent.insertBefore(t,n);i||this.remove()}return this}next(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e+1]}prev(){if(!this.parent)return;let e=this.parent.index(this);return this.parent.nodes[e-1]}before(e){return this.parent.insertBefore(this,e),this}after(e){return this.parent.insertAfter(this,e),this}root(){let e=this;for(;e.parent&&e.parent.type!=="document";)e=e.parent;return e}raw(e,t){return new f1().raw(this,e,t)}cleanRaws(e){delete this.raws.before,delete this.raws.after,e||delete this.raws.between}toJSON(e,t){let i={},n=t==null;t=t||new Map;let s=0;for(let a in this){if(!Object.prototype.hasOwnProperty.call(this,a)||a==="parent"||a==="proxyCache")continue;let o=this[a];if(Array.isArray(o))i[a]=o.map(u=>typeof u=="object"&&u.toJSON?u.toJSON(null,t):u);else if(typeof o=="object"&&o.toJSON)i[a]=o.toJSON(null,t);else if(a==="source"){let u=t.get(o.input);u==null&&(u=s,t.set(o.input,s),s++),i[a]={inputId:u,start:o.start,end:o.end}}else i[a]=o}return n&&(i.inputs=[...t.keys()].map(a=>a.toJSON())),i}positionInside(e){let t=this.toString(),i=this.source.start.column,n=this.source.start.line;for(let s=0;s<e;s++)t[s]===`
`?(i=1,n+=1):i+=1;return{line:n,column:i}}positionBy(e){let t=this.source.start;if(e.index)t=this.positionInside(e.index);else if(e.word){let i=this.toString().indexOf(e.word);i!==-1&&(t=this.positionInside(i))}return t}rangeBy(e){let t={line:this.source.start.line,column:this.source.start.column},i=this.source.end?{line:this.source.end.line,column:this.source.end.column+1}:{line:t.line,column:t.column+1};if(e.word){let n=this.toString().indexOf(e.word);n!==-1&&(t=this.positionInside(n),i=this.positionInside(n+e.word.length))}else e.start?t={line:e.start.line,column:e.start.column}:e.index&&(t=this.positionInside(e.index)),e.end?i={line:e.end.line,column:e.end.column}:e.endIndex?i=this.positionInside(e.endIndex):e.index&&(i=this.positionInside(e.index+1));return(i.line<t.line||i.line===t.line&&i.column<=t.column)&&(i={line:t.line,column:t.column+1}),{start:t,end:i}}getProxyProcessor(){return{set(e,t,i){return e[t]===i||(e[t]=i,(t==="prop"||t==="value"||t==="name"||t==="params"||t==="important"||t==="text")&&e.markDirty()),!0},get(e,t){return t==="proxyOf"?e:t==="root"?()=>e.root().toProxy():e[t]}}}toProxy(){return this.proxyCache||(this.proxyCache=new Proxy(this,this.getProxyProcessor())),this.proxyCache}addToError(e){if(e.postcssNode=this,e.stack&&this.source&&/\n\s{4}at /.test(e.stack)){let t=this.source;e.stack=e.stack.replace(/\n\s{4}at /,`$&${t.input.from}:${t.start.line}:${t.start.column}$&`)}return e}markDirty(){if(this[qi]){this[qi]=!1;let e=this;for(;e=e.parent;)e[qi]=!1}}get proxyOf(){return this}};Xf.exports=Ii;Ii.default=Ii});var Mr=v((eT,Kf)=>{l();"use strict";var p1=Rr(),Ri=class extends p1{constructor(e){e&&typeof e.value!="undefined"&&typeof e.value!="string"&&(e={...e,value:String(e.value)});super(e);this.type="decl"}get variable(){return this.prop.startsWith("--")||this.prop[0]==="$"}};Kf.exports=Ri;Ri.default=Ri});var na=v((tT,Zf)=>{l();Zf.exports=function(r,e){return{generate:()=>{let t="";return r(e,i=>{t+=i}),[t]}}}});var Fr=v((rT,ec)=>{l();"use strict";var d1=Rr(),Mi=class extends d1{constructor(e){super(e);this.type="comment"}};ec.exports=Mi;Mi.default=Mi});var Ke=v((iT,uc)=>{l();"use strict";var{isClean:tc,my:rc}=Pi(),ic=Mr(),nc=Fr(),h1=Rr(),sc,sa,aa,ac;function oc(r){return r.map(e=>(e.nodes&&(e.nodes=oc(e.nodes)),delete e.source,e))}function lc(r){if(r[tc]=!1,r.proxyOf.nodes)for(let e of r.proxyOf.nodes)lc(e)}var be=class extends h1{push(e){return e.parent=this,this.proxyOf.nodes.push(e),this}each(e){if(!this.proxyOf.nodes)return;let t=this.getIterator(),i,n;for(;this.indexes[t]<this.proxyOf.nodes.length&&(i=this.indexes[t],n=e(this.proxyOf.nodes[i],i),n!==!1);)this.indexes[t]+=1;return delete this.indexes[t],n}walk(e){return this.each((t,i)=>{let n;try{n=e(t,i)}catch(s){throw t.addToError(s)}return n!==!1&&t.walk&&(n=t.walk(e)),n})}walkDecls(e,t){return t?e instanceof RegExp?this.walk((i,n)=>{if(i.type==="decl"&&e.test(i.prop))return t(i,n)}):this.walk((i,n)=>{if(i.type==="decl"&&i.prop===e)return t(i,n)}):(t=e,this.walk((i,n)=>{if(i.type==="decl")return t(i,n)}))}walkRules(e,t){return t?e instanceof RegExp?this.walk((i,n)=>{if(i.type==="rule"&&e.test(i.selector))return t(i,n)}):this.walk((i,n)=>{if(i.type==="rule"&&i.selector===e)return t(i,n)}):(t=e,this.walk((i,n)=>{if(i.type==="rule")return t(i,n)}))}walkAtRules(e,t){return t?e instanceof RegExp?this.walk((i,n)=>{if(i.type==="atrule"&&e.test(i.name))return t(i,n)}):this.walk((i,n)=>{if(i.type==="atrule"&&i.name===e)return t(i,n)}):(t=e,this.walk((i,n)=>{if(i.type==="atrule")return t(i,n)}))}walkComments(e){return this.walk((t,i)=>{if(t.type==="comment")return e(t,i)})}append(...e){for(let t of e){let i=this.normalize(t,this.last);for(let n of i)this.proxyOf.nodes.push(n)}return this.markDirty(),this}prepend(...e){e=e.reverse();for(let t of e){let i=this.normalize(t,this.first,"prepend").reverse();for(let n of i)this.proxyOf.nodes.unshift(n);for(let n in this.indexes)this.indexes[n]=this.indexes[n]+i.length}return this.markDirty(),this}cleanRaws(e){if(super.cleanRaws(e),this.nodes)for(let t of this.nodes)t.cleanRaws(e)}insertBefore(e,t){let i=this.index(e),n=e===0?"prepend":!1,s=this.normalize(t,this.proxyOf.nodes[i],n).reverse();i=this.index(e);for(let o of s)this.proxyOf.nodes.splice(i,0,o);let a;for(let o in this.indexes)a=this.indexes[o],i<=a&&(this.indexes[o]=a+s.length);return this.markDirty(),this}insertAfter(e,t){let i=this.index(e),n=this.normalize(t,this.proxyOf.nodes[i]).reverse();i=this.index(e);for(let a of n)this.proxyOf.nodes.splice(i+1,0,a);let s;for(let a in this.indexes)s=this.indexes[a],i<s&&(this.indexes[a]=s+n.length);return this.markDirty(),this}removeChild(e){e=this.index(e),this.proxyOf.nodes[e].parent=void 0,this.proxyOf.nodes.splice(e,1);let t;for(let i in this.indexes)t=this.indexes[i],t>=e&&(this.indexes[i]=t-1);return this.markDirty(),this}removeAll(){for(let e of this.proxyOf.nodes)e.parent=void 0;return this.proxyOf.nodes=[],this.markDirty(),this}replaceValues(e,t,i){return i||(i=t,t={}),this.waLine truncated
`.charCodeAt(0),Nr=" ".charCodeAt(0),ji="\f".charCodeAt(0),Vi=" ".charCodeAt(0),Ui="\r".charCodeAt(0),y1="[".charCodeAt(0),w1="]".charCodeAt(0),b1="(".charCodeAt(0),v1=")".charCodeAt(0),x1="{".charCodeAt(0),k1="}".charCodeAt(0),S1=";".charCodeAt(0),C1="*".charCodeAt(0),_1=":".charCodeAt(0),A1="@".charCodeAt(0),Wi=/[\t\n\f\r "#'()/;[\\\]{}]/g,Gi=/[\t\n\f\r !"#'():;@[\\\]{}]|\/(?=\*)/g,O1=/.[\n"'(/\\]/,bc=/[\da-f]/i;vc.exports=function(e,t={}){let i=e.css.valueOf(),n=t.ignoreErrors,s,a,o,u,c,f,p,h,d,y,k=i.length,w=0,b=[],x=[];function S(){return w}function _(q){throw e.error("Unclosed "+q,w)}function D(){return x.length===0&&w>=k}function M(q){if(x.length)return x.pop();if(w>=k)return;let F=q?q.ignoreUnclosed:!1;switch(s=i.charCodeAt(w),s){case zi:case Nr:case Vi:case Ui:case ji:{a=w;do a+=1,s=i.charCodeAt(a);while(s===Nr||s===zi||s===Vi||s===Ui||s===ji);y=["space",i.slice(w,a)],w=a-1;break}case y1:case w1:case x1:case k1:case _1:case S1:case v1:{let X=String.fromCharCode(s);y=[X,X,w];break}case b1:{if(h=b.length?b.pop()[1]:"",d=i.charCodeAt(w+1),h==="url"&&d!==ua&&d!==yc&&d!==Nr&&d!==zi&&d!==Vi&&d!==ji&&d!==Ui){a=w;do{if(f=!1,a=i.indexOf(")",a+1),a===-1)if(n||F){a=w;break}else _("bracket");for(p=a;i.charCodeAt(p-1)===$i;)p-=1,f=!f}while(f);y=["brackets",i.slice(w,a+1),w,a],w=a}else a=i.indexOf(")",w+1),u=i.slice(w,a+1),a===-1||O1.test(u)?y=["(","(",w]:(y=["brackets",u,w,a],w=a);break}case ua:case yc:{o=s===ua?"'":'"',a=w;do{if(f=!1,a=i.indexOf(o,a+1),a===-1)if(n||F){a=w+1;break}else _("string");for(p=a;i.charCodeAt(p-1)===$i;)p-=1,f=!f}while(f);y=["string",i.slice(w,a+1),w,a],w=a;break}case A1:{Wi.lastIndex=w+1,Wi.test(i),Wi.lastIndex===0?a=i.length-1:a=Wi.lastIndex-2,y=["at-word",i.slice(w,a+1),w,a],w=a;break}case $i:{for(a=w,c=!0;i.charCodeAt(a+1)===$i;)a+=1,c=!c;if(s=i.charCodeAt(a+1),c&&s!==wc&&s!==Nr&&s!==zi&&s!==Vi&&s!==Ui&&s!==ji&&(a+=1,bc.test(i.charAt(a)))){for(;bc.test(i.charAt(a+1));)a+=1;i.charCodeAt(a+1)===Nr&&(a+=1)}y=["word",i.slice(w,a+1),w,a],w=a;break}default:{s===wc&&i.charCodeAt(w+1)===C1?(a=i.indexOf("*/",w+2)+1,a===0&&(n||F?a=i.length:_("comment")),y=["comment",i.slice(w,a+1),w,a],w=a):(Gi.lastIndex=w+1,Gi.test(i),Gi.lastIndex===0?a=i.length-1:a=Gi.lastIndex-2,y=["word",i.slice(w,a+1),w,a],b.push(y),w=a);break}}return w++,y}function B(q){x.push(q)}return{back:B,nextToken:M,endOfFile:D,position:S}}});var Hi=v((uT,Sc)=>{l();"use strict";var kc=Ke(),Lr=class extends kc{constructor(e){super(e);this.type="atrule"}append(...e){return this.proxyOf.nodes||(this.nodes=[]),super.append(...e)}prepend(...e){return this.proxyOf.nodes||(this.nodes=[]),super.prepend(...e)}};Sc.exports=Lr;Lr.default=Lr;kc.registerAtRule(Lr)});var At=v((fT,Oc)=>{l();"use strict";var Cc=Ke(),_c,Ac,dt=class extends Cc{constructor(e){super(e);this.type="root",this.nodes||(this.nodes=[])}removeChild(e,t){let i=this.index(e);return!t&&i===0&&this.nodes.length>1&&(this.nodes[1].raws.before=this.nodes[i].raws.before),super.removeChild(e)}normalize(e,t,i){let n=super.normalize(e);if(t){if(i==="prepend")this.nodes.length>1?t.raws.before=this.nodes[1].raws.before:delete t.raws.before;else if(this.first!==t)for(let s of n)s.raws.before=t.raws.before}return n}toResult(e={}){return new _c(new Ac,this,e).stringify()}};dt.registerLazyResult=r=>{_c=r};dt.registerProcessor=r=>{Ac=r};Oc.exports=dt;dt.default=dt;Cc.registerRoot(dt)});var fa=v((cT,Ec)=>{l();"use strict";var Br={split(r,e,t){let i=[],n="",s=!1,a=0,o=!1,u="",c=!1;for(let f of r)c?c=!1:f==="\\"?c=!0:o?f===u&&(o=!1):f==='"'||f==="'"?(o=!0,u=f):f==="("?a+=1:f===")"?a>0&&(a-=1):a===0&&e.includes(f)&&(s=!0),s?(n!==""&&i.push(n.trim()),n="",s=!1):n+=f;return(t||n!=="")&&i.push(n.trim()),i},space(r){let e=[" ",`
`," "];return Br.split(r,e)},comma(r){return Br.split(r,[","],!0)}};Ec.exports=Br;Br.default=Br});var Yi=v((pT,Pc)=>{l();"use strict";var Tc=Ke(),E1=fa(),$r=class extends Tc{constructor(e){super(e);this.type="rule",this.nodes||(this.nodes=[])}get selectors(){return E1.comma(this.selector)}set selectors(e){let t=this.selector?this.selector.match(/,\s*/):null,i=t?t[0]:","+this.raw("between","beforeOpen");this.selector=e.join(i)}};Pc.exports=$r;$r.default=$r;Tc.registerRule($r)});var Mc=v((dT,Rc)=>{l();"use strict";var T1=Mr(),P1=xc(),D1=Fr(),q1=Hi(),I1=At(),Dc=Yi(),qc={empty:!0,space:!0};function R1(r){for(let e=r.length-1;e>=0;e--){let t=r[e],i=t[3]||t[2];if(i)return i}}var Ic=class{constructor(e){this.input=e,this.root=new I1,this.current=this.root,this.spaces="",this.semicolon=!1,this.customProperty=!1,this.createTokenizer(),this.root.source={input:e,start:{offset:0,line:1,column:1}}}createTokenizer(){this.tokenizer=P1(this.input)}parse(){let e;for(;!this.tokenizer.endOfFile();)switch(e=this.tokenizer.nextToken(),e[0]){case"space":this.spaces+=e[1];break;case";":this.freeSemicolon(e);break;case"}":this.end(e);break;case"comment":this.comment(e);break;case"at-word":this.atrule(e);break;case"{":this.emptyRule(e);break;default:this.other(e);break}this.endFile()}comment(e){let t=new D1;this.init(t,e[2]),t.source.end=this.getPosition(e[3]||e[2]);let i=e[1].slice(2,-2);if(/^\s*$/.test(i))t.text="",t.raws.left=i,t.raws.right="";else{let n=i.match(/^(\s*)([^]*\S)(\s*)$/);t.text=n[2],t.raws.left=n[1],t.raws.right=n[3]}}emptyRule(e){let t=new Dc;this.init(t,e[2]),t.selector="",t.raws.between="",this.current=t}other(e){let t=!1,i=null,n=!1,s=null,a=[],o=e[1].startsWith("--"),u=[],c=e;for(;c;){if(i=c[0],u.push(c),i==="("||i==="[")s||(s=c),a.push(i==="("?")":"]");else if(o&&n&&i==="{")s||(s=c),a.push("}");else if(a.length===0)if(i===";")if(n){this.decl(u,o);return}else break;else if(i==="{"){this.rule(u);return}else if(i==="}"){this.tokenizer.back(u.pop()),t=!0;break}else i===":"&&(n=!0);else i===a[a.length-1]&&(a.pop(),a.length===0&&(s=null));c=this.tokenizer.nextToken()}if(this.tokenizer.endOfFile()&&(t=!0),a.length>0&&this.unclosedBracket(s),t&&n){if(!o)for(;u.length&&(c=u[u.length-1][0],!(c!=="space"&&c!=="comment"));)this.tokenizer.back(u.pop());this.decl(u,o)}else this.unknownWord(u)}rule(e){e.pop();let t=new Dc;this.init(t,e[0][2]),t.raws.between=this.spacesAndCommentsFromEnd(e),this.raw(t,"selector",e),this.current=t}decl(e,t){let i=new T1;this.init(i,e[0][2]);let n=e[e.length-1];for(n[0]===";"&&(this.semicolon=!0,e.pop()),i.source.end=this.getPosition(n[3]||n[2]||R1(e));e[0][0]!=="word";)e.length===1&&this.unknownWord(e),i.raws.before+=e.shift()[1];for(i.source.start=this.getPosition(e[0][2]),i.prop="";e.length;){let c=e[0][0];if(c===":"||c==="space"||c==="comment")break;i.prop+=e.shift()[1]}i.raws.between="";let s;for(;e.length;)if(s=e.shift(),s[0]===":"){i.raws.between+=s[1];break}else s[0]==="word"&&/\w/.test(s[1])&&this.unknownWord([s]),i.raws.between+=s[1];(i.prop[0]==="_"||i.prop[0]==="*")&&(i.raws.before+=i.prop[0],i.prop=i.prop.slice(1));let a=[],o;for(;e.length&&(o=e[0][0],!(o!=="space"&&o!=="comment"));)a.push(e.shift());this.precheckMissedSemicolon(e);for(let c=e.length-1;c>=0;c--){if(s=e[c],s[1].toLowerCase()==="!important"){i.important=!0;let f=this.stringFrom(e,c);f=this.spacesFromEnd(e)+f,f!==" !important"&&(i.raws.important=f);break}else if(s[1].toLowerCase()==="important"){let f=e.slice(0),p="";for(let h=c;h>0;h--){let d=f[h][0];if(p.trim().indexOf("!")===0&&d!=="space")break;p=f.pop()[1]+p}p.trim().indexOf("!")===0&&(i.important=!0,i.raws.important=p,e=f)}if(s[0]!=="space"&&s[0]!=="comment")break}e.some(c=>c[0]!=="space"&&c[0]!=="comment")&&(i.raws.between+=a.map(c=>c[1]).join(""),a=[]),this.raw(i,"value",a.concat(e),t),i.value.includes(":")&&!t&&this.checkMissedSemicolon(e)}atrule(e){let t=new q1;t.name=e[1].slice(1),t.name===""&&this.unnamedAtrule(t,e),this.init(t,e[2]);let i,n,s,a=!1,o=!1,u=[],c=[];for(;!this.tokenizer.endOfFile();){if(e=this.tokenizer.nextToken(),i=e[0],i==="("||i==="["?c.push(i==="("?")":"]"):i==="{"&&c.length>0?c.push("}"):i===c[c.length-1]&&c.pop(),c.length===0)if(i===";"){t.source.end=this.getPosition(e[2]),this.semicolon=!0;break}else if(i==="{"){o=!0;break}else if(i==="}"){if(u.length>0){for(s=u.length-1,n=u[s];n&&n[0]==="space";)n=u[--s];n&&(t.source.end=this.getPosition(n[3]||n[2]))}this.end(e);break}else u.push(e);else u.push(e);if(this.tokenizer.endOfFile()){a=!0;break}}t.raws.between=this.spacesAndCommentsFromEnd(u),u.length?(t.raws.afterName=this.spacesAndCommentsFromStart(u),this.raw(t,"params",u),a&&(e=u[u.length-1],t.source.end=this.getPosition(e[3]||e[2]),this.spaces=t.raws.between,t.raws.between="")):(t.raws.afterName="",t.params=""),o&&(t.nodes=[],this.current=t)}end(e){this.current.nodes&&this.current.nodes.length&&(this.current.raws.semicolon=this.semicolon),this.semicolon=!1,this.current.raws.after=(this.current.raws.after||"")+this.spaces,this.spaceLine truncated
`);i=new Array(s.length);let a=0;for(let o=0,u=s.length;o<u;o++)i[o]=a,a+=s[o].length+1;this[ma]=i}t=i[i.length-1];let n=0;if(e>=t)n=i.length-1;else{let s=i.length-2,a;for(;n<s;)if(a=n+(s-n>>1),e<i[a])s=a-1;else if(e>=i[a+1])n=a+1;else{n=a;break}}return{line:n+1,col:e-i[n]+1}}error(e,t,i,n={}){let s,a,o;if(t&&typeof t=="object"){let c=t,f=i;if(typeof t.offset=="number"){let p=this.fromOffset(c.offset);t=p.line,i=p.col}else t=c.line,i=c.column;if(typeof f.offset=="number"){let p=this.fromOffset(f.offset);a=p.line,o=p.col}else a=f.line,o=f.column}else if(!i){let c=this.fromOffset(t);t=c.line,i=c.col}let u=this.origin(t,i,a,o);return u?s=new zc(e,u.endLine===void 0?u.line:{line:u.line,column:u.column},u.endLine===void 0?u.column:{line:u.endLine,column:u.endColumn},u.source,u.file,n.plugin):s=new zc(e,a===void 0?t:{line:t,column:i},a===void 0?i:{line:a,column:o},this.css,this.file,n.plugin),s.input={line:t,column:i,endLine:a,endColumn:o,source:this.css},this.file&&(Qi&&(s.input.url=Qi(this.file).toString()),s.input.file=this.file),s}origin(e,t,i,n){if(!this.map)return!1;let s=this.map.consumer(),a=s.originalPositionFor({line:e,column:t});if(!a.source)return!1;let o;typeof i=="number"&&(o=s.originalPositionFor({line:i,column:n}));let u;da(a.source)?u=Qi(a.source):u=new URL(a.source,this.map.consumer().sourceRoot||Qi(this.map.mapFile));let c={url:u.toString(),line:a.line,column:a.column,endLine:o&&o.line,endColumn:o&&o.column};if(u.protocol==="file:")if($c)c.file=$c(u);else throw new Error("file: protocol is not available in this PostCSS build");let f=s.sourceContentFor(a.source);return f&&(c.source=f),c}mapResolve(e){return/^\w+:\/\//.test(e)?e:pa(this.map.consumer().sourceRoot||this.map.root||".",e)}get from(){return this.file||this.id}toJSON(){let e={};for(let t of["hasBOM","css","file","id"])this[t]!=null&&(e[t]=this[t]);return this.map&&(e.map={...this.map},e.map.consumerCache&&(e.map.consumerCache=void 0)),e}};Vc.exports=zr;zr.default=zr;ha&&ha.registerInput&&ha.registerInput(zr)});var Ki=v((bT,Uc)=>{l();"use strict";var V1=Ke(),U1=Mc(),W1=Ji();function Xi(r,e){let t=new W1(r,e),i=new U1(t);try{i.parse()}catch(n){throw n}return i.root}Uc.exports=Xi;Xi.default=Xi;V1.registerParse(Xi)});var wa=v((xT,Yc)=>{l();"use strict";var{isClean:Ie,my:G1}=Pi(),H1=na(),Y1=Ir(),Q1=Ke(),J1=Fi(),vT=oa(),Wc=Bi(),X1=Ki(),K1=At(),Z1={document:"Document",root:"Root",atrule:"AtRule",rule:"Rule",decl:"Declaration",comment:"Comment"},ek={postcssPlugin:!0,prepare:!0,Once:!0,Document:!0,Root:!0,Declaration:!0,Rule:!0,AtRule:!0,Comment:!0,DeclarationExit:!0,RuleExit:!0,AtRuleExit:!0,CommentExit:!0,RootExit:!0,DocumentExit:!0,OnceExit:!0},tk={postcssPlugin:!0,prepare:!0,Once:!0},Ot=0;function jr(r){return typeof r=="object"&&typeof r.then=="function"}function Gc(r){let e=!1,t=Z1[r.type];return r.type==="decl"?e=r.prop.toLowerCase():r.type==="atrule"&&(e=r.name.toLowerCase()),e&&r.append?[t,t+"-"+e,Ot,t+"Exit",t+"Exit-"+e]:e?[t,t+"-"+e,t+"Exit",t+"Exit-"+e]:r.append?[t,Ot,t+"Exit"]:[t,t+"Exit"]}function Hc(r){let e;return r.type==="document"?e=["Document",Ot,"DocumentExit"]:r.type==="root"?e=["Root",Ot,"RootExit"]:e=Gc(r),{node:r,events:e,eventIndex:0,visitors:[],visitorIndex:0,iterator:0}}function ga(r){return r[Ie]=!1,r.nodes&&r.nodes.forEach(e=>ga(e)),r}var ya={},ze=class{constructor(e,t,i){this.stringified=!1,this.processed=!1;let n;if(typeof t=="object"&&t!==null&&(t.type==="root"||t.type==="document"))n=ga(t);else if(t instanceof ze||t instanceof Wc)n=ga(t.root),t.map&&(typeof i.map=="undefined"&&(i.map={}),i.map.inline||(i.map.inline=!1),i.map.prev=t.map);else{let s=X1;i.syntax&&(s=i.syntax.parse),i.parser&&(s=i.parser),s.parse&&(s=s.parse);try{n=s(t,i)}catch(a){this.processed=!0,this.error=a}n&&!n[G1]&&Q1.rebuild(n)}this.result=new Wc(e,n,i),this.helpers={...ya,result:this.result,postcss:ya},this.plugins=this.processor.plugins.map(s=>typeof s=="object"&&s.prepare?{...s,...s.prepare(this.result)}:s)}get[Symbol.toStringTag](){return"LazyResult"}get processor(){return this.result.processor}get opts(){return this.result.opts}get css(){return this.stringify().css}get content(){return this.stringify().content}get map(){return this.stringify().map}get root(){return this.sync().root}get messages(){return this.sync().messages}warnings(){return this.sync().warnings()}toString(){return this.css}then(e,t){return this.async().then(e,t)}catch(e){return this.async().catch(e)}finally(e){return this.async().then(e,e)}async(){return this.error?Promise.reject(this.error):this.processed?Promise.resolve(this.result):(this.processing||(this.processing=this.runAsync()),this.processing)}sync(){if(this.error)throw this.error;if(this.processed)return this.result;if(this.processed=!0,this.processing)throw this.getAsyncError();for(let e of this.plugins){let t=this.runOnRoot(e);if(jr(t))throw this.getAsyncError()}if(this.prepareVisitors(),this.hasListener){let e=this.result.root;for(;!e[Ie];)e[Ie]=!0,this.walkSync(e);if(this.listeners.OnceExit)if(e.type=== Line truncated
https://evilmartians.com/chronicles/postcss-8-plugin-migration`),m.env.LANG&&m.env.LANG.startsWith("cn")&&console.warn(e+`: \u91CC\u9762 postcss.plugin \u88AB\u5F03\u7528. \u8FC1\u79FB\u6307\u5357:
https://www.w3ctech.com/topic/2226`));let o=t(...a);return o.postcssPlugin=e,o.postcssVersion=new ba().version,o}let s;return Object.defineProperty(n,"postcss",{get(){return s||(s=n()),s}}),n.process=function(a,o,u){return z([n(u)]).process(a,o)},n};z.stringify=vk;z.parse=_k;z.fromJSON=xk;z.list=Ak;z.comment=r=>new ip(r);z.atRule=r=>new np(r);z.decl=r=>new tp(r);z.rule=r=>new sp(r);z.root=r=>new ap(r);z.document=r=>new rp(r);z.CssSyntaxError=yk;z.Declaration=tp;z.Container=bk;z.Processor=ba;z.Document=rp;z.Comment=ip;z.Warning=kk;z.AtRule=np;z.Result=Sk;z.Input=Ck;z.Rule=sp;z.Root=ap;z.Node=Ok;wk.registerPostcss(z);op.exports=z;z.default=z});var G,j,OT,ET,TT,PT,DT,qT,IT,RT,MT,FT,NT,LT,BT,$T,zT,jT,VT,UT,WT,GT,HT,YT,QT,JT,Ze=A(()=>{l();G=J(me()),j=G.default,OT=G.default.stringify,ET=G.default.fromJSON,TT=G.default.plugin,PT=G.default.parse,DT=G.default.list,qT=G.default.document,IT=G.default.comment,RT=G.default.atRule,MT=G.default.rule,FT=G.default.decl,NT=G.default.root,LT=G.default.CssSyntaxError,BT=G.default.Declaration,$T=G.default.Container,zT=G.default.Processor,jT=G.default.Document,VT=G.default.Comment,UT=G.default.Warning,WT=G.default.AtRule,GT=G.default.Result,HT=G.default.Input,YT=G.default.Rule,QT=G.default.Root,JT=G.default.Node});var va=v((KT,lp)=>{l();lp.exports=function(r,e,t,i,n){for(e=e.split?e.split("."):e,i=0;i<e.length;i++)r=r?r[e[i]]:n;return r===n?t:r}});function je(r){return["fontSize","outline"].includes(r)?e=>(typeof e=="function"&&(e=e({})),Array.isArray(e)&&(e=e[0]),e):r==="fontFamily"?e=>{typeof e=="function"&&(e=e({}));let t=Array.isArray(e)&&ee(e[1])?e[0]:e;return Array.isArray(t)?t.join(", "):t}:["boxShadow","transitionProperty","transitionDuration","transitionDelay","transitionTimingFunction","backgroundImage","backgroundSize","backgroundColor","cursor","animation"].includes(r)?e=>(typeof e=="function"&&(e=e({})),Array.isArray(e)&&(e=e.join(", ")),e):["gridTemplateColumns","gridTemplateRows","objectPosition"].includes(r)?e=>(typeof e=="function"&&(e=e({})),typeof e=="string"&&(e=j.list.comma(e).join(" ")),e):(e,t={})=>(typeof e=="function"&&(e=e(t)),e)}var Ur=A(()=>{l();Ze();wt()});var mp=v((r5,_a)=>{l();var{Rule:up,AtRule:Ek}=me(),fp=De();function xa(r,e){let t;try{fp(i=>{t=i}).processSync(r)}catch(i){throw r.includes(":")?e?e.error("Missed semicolon"):i:e?e.error(i.message):i}return t.at(0)}function cp(r,e){let t=!1;return r.each(i=>{if(i.type==="nesting"){let n=e.clone({});i.value!=="&"?i.replaceWith(xa(i.value.replace("&",n.toString()))):i.replaceWith(n),t=!0}else"nodes"in i&&i.nodes&&cp(i,e)&&(t=!0)}),t}function pp(r,e){let t=[];return r.selectors.forEach(i=>{let n=xa(i,r);e.selectors.forEach(s=>{if(!s)return;let a=xa(s,e);cp(a,n)||(a.prepend(fp.combinator({value:" "})),a.prepend(n.clone({}))),t.push(a.toString())})}),t}function en(r,e){let t=r.prev();for(e.after(r);t&&t.type==="comment";){let i=t.prev();e.after(t),t=i}return r}function Tk(r){return function e(t,i,n,s=n){let a=[];if(i.each(o=>{o.type==="rule"&&n?s&&(o.selectors=pp(t,o)):o.type==="atrule"&&o.nodes?r[o.name]?e(t,o,s):i[Sa]!==!1&&a.push(o):a.push(o)}),n&&a.length){let o=t.clone({nodes:[]});for(let u of a)o.append(u);i.prepend(o)}}}function ka(r,e,t){let i=new up({selector:r,nodes:[]});return i.append(e),t.after(i),i}function dp(r,e){let t={};for(let i of r)t[i]=!0;if(e)for(let i of e)t[i.replace(/^@/,"")]=!0;return t}function Pk(r){r=r.trim();let e=r.match(/^\((.*)\)$/);if(!e)return{type:"basic",selector:r};let t=e[1].match(/^(with(?:out)?):(.+)$/);if(t){let i=t[1]==="with",n=Object.fromEntries(t[2].trim().split(/\s+/).map(a=>[a,!0]));if(i&&n.all)return{type:"noop"};let s=a=>!!n[a];return n.all?s=()=>!0:i&&(s=a=>a==="all"?!1:!n[a]),{type:"withrules",escapes:s}}return{type:"unknown"}}function Dk(r){let e=[],t=r.parent;for(;t&&t instanceof Ek;)e.push(t),t=t.parent;return e}function qk(r){let e=r[hp];if(!e)r.after(r.nodes);else{let t=r.nodes,i,n=-1,s,a,o,u=Dk(r);if(u.forEach((c,f)=>{if(e(c.name))i=c,n=f,a=o;else{let p=o;o=c.clone({nodes:[]}),p&&o.append(p),s=s||o}}),i?a?(s.append(t),i.after(a)):i.after(t):r.after(t),r.next()&&i){let c;u.slice(0,n+1).forEach((f,p,h)=>{let d=c;c=f.clone({nodes:[]}),d&&c.append(d);let y=[],w=(h[p-1]||r).next();for(;w;)y.push(w),w=w.next();c.append(y)}),c&&(a||t[t.length-1]).after(c)}}r.remove()}var Sa=Symbol("rootRuleMergeSel"),hp=Symbol("rootRuleEscapes");function Ik(r){let{params:e}=r,{type:t,selector:i,escapes:n}=Pk(e);if(t==="unknown")throw r.error(`Unknown @${r.name} parameter ${JSON.stringify(e)}`);if(t==="basic"&&i){let s=new up({selector:i,nodes:r.nodes});r.removeAll(),r.append(s)}r[hp]=n,r[Sa]=n?!n("all"):t==="noop"}var Ca=Symbol("hasRootRule");_a.exports=(r={})=>{let e=dp(["media","supports","layer"],r.bubble),t=Tk(e),i=dp(["document","font-face","keyframes","-webkit-keyframes","-moz-keyframes"],r.unwrap),n=(r.rootRuleName||"at-root").replace(/^@/,""),s=r.preserveEmpty;return{postcssPlugin:"postcss-nested",Once(a){a.walkAtRules(n,o=>{Ik(o),a[Ca]=!0})},Rule(a){let o=!1, Line truncated
`).slice(1,-1).map(q=>q.trim()).map(q=>` ${q}`).join(`
`)).join(`
`);x.push(` Use \`${r.replace("[",`[${D}:`)}\` for \`${M.trim()}\``);break}N.warn([`The class \`${r}\` is ambiguous and matches multiple utilities.`,...x,`If this is content and not a class, replace it with \`${r.replace("[","&lsqb;").replace("]","&rsqb;")}\` to silence this warning.`]);continue}}u=u.map(d=>d.filter(y=>id(y[1])))}u=u.flat(),u=Array.from(_S(u,n)),u=gS(u,e),a&&(u=yS(u,n));for(let d of s)u=wS(d,u,e);for(let d of u){if(d[1].raws.tailwind={...d[1].raws.tailwind,candidate:r},d[0].collectedFormats){let y=Yr("&",...d[0].collectedFormats),k=j.root({nodes:[d[1].clone()]});k.walkRules(w=>{hn(w)||(w.selector=pn(y,{selector:w.selector,candidate:t,base:r.split(new RegExp(`\\${e?.tailwindConfig?.separator??":"}(?![^[]*\\])`)).pop(),isArbitraryVariant:d[0].isArbitraryVariant,context:e}))}),d[1]=k.nodes[0]}yield d}}}function hn(r){return r.parent&&r.parent.type==="atrule"&&r.parent.name==="keyframes"}function AS(r){if(r===!0)return e=>{hn(e)||e.walkDecls(t=>{t.parent.type==="rule"&&!hn(t.parent)&&(t.important=!0)})};if(typeof r=="string")return e=>{hn(e)||(e.selectors=e.selectors.map(t=>`${r} ${t}`))}}function mn(r,e){let t=[],i=AS(e.tailwindConfig.important);for(let n of r){if(e.notClassCache.has(n))continue;if(e.candidateRuleCache.has(n)){t=t.concat(Array.from(e.candidateRuleCache.get(n)));continue}let s=Array.from(dn(n,e));if(s.length===0){e.notClassCache.add(n);continue}e.classCache.set(n,s);let a=e.candidateRuleCache.get(n)??new Set;e.candidateRuleCache.set(n,a);for(let o of s){let[{sort:u,options:c},f]=o;if(c.respectImportant&&i){let h=j.root({nodes:[f.clone()]});h.walkRules(i),f=h.nodes[0]}let p=[u,f];a.add(p),e.ruleCache.add(p),t.push(p)}}return t}function ja(r){return r.startsWith("[")&&r.endsWith("]")}var Ba,hS,bS,gn=A(()=>{l();Ze();Ba=J(De());Da();wt();rn();Pr();Ae();rt();La();Ia();Er();wn();Fa();_r();$e();hS=(0,Ba.default)(r=>r.first.filter(({type:e})=>e==="class").pop().value);bS=/^[a-z_-]/});function OS(r){try{return yt.createHash("md5").update(r,"utf-8").digest("binary")}catch(e){return""}}function sd(r,e){let t=e.toString();if(!t.includes("@tailwind"))return!1;let i=Ma.get(r),n=OS(t),s=i!==n;return Ma.set(r,n),s}var ad=A(()=>{l();si();rt()});function Va(r){return(r>0n)-(r<0n)}var od=A(()=>{l()});function ES(r){let e=null;for(let t of r)e=e??t,e=e>t?e:t;return e}var Ua,ld=A(()=>{l();od();Ua=class{constructor(){this.offsets={defaults:0n,base:0n,components:0n,utilities:0n,variants:0n,user:0n},this.layerPositions={defaults:0n,base:1n,components:2n,utilities:3n,user:4n,variants:5n},this.reservedVariantBits=0n,this.variantOffsets=new Map}create(e){return{layer:e,parentLayer:e,arbitrary:0n,variants:0n,parallelIndex:0n,index:this.offsets[e]++,options:[]}}arbitraryProperty(){return{...this.create("utilities"),arbitrary:1n}}forVariant(e,t=0){let i=this.variantOffsets.get(e);if(i===void 0)throw new Error(`Cannot find offset for unknown variant ${e}`);return{...this.create("variants"),variants:i<<BigInt(t)}}applyVariantOffset(e,t,i){return{...e,layer:"variants",parentLayer:e.layer==="variants"?e.parentLayer:e.layer,variants:e.variants|t.variants,options:i.sort?[].concat(i,e.options):e.options,parallelIndex:ES([e.parallelIndex,t.parallelIndex])}}applyParallelOffset(e,t){return{...e,parallelIndex:BigInt(t)}}recordVariants(e,t){for(let i of e)this.recordVariant(i,t(i))}recordVariant(e,t=1){return this.variantOffsets.set(e,1n<<this.reservedVariantBits),this.reservedVariantBits+=BigInt(t),{...this.create("variants"),variants:1n<<this.reservedVariantBits}}compare(e,t){if(e.layer!==t.layer)return this.layerPositions[e.layer]-this.layerPositions[t.layer];for(let i of e.options)for(let n of t.options){if(i.id!==n.id||!i.sort||!n.sort)continue;let s=i.sort({value:i.value,modifier:i.modifier},{value:n.value,modifier:n.modifier});if(s!==0)return s}return e.variants!==t.variants?e.variants-t.variants:e.parallelIndex!==t.parallelIndex?e.parallelIndex-t.parallelIndex:e.arbitrary!==t.arbitrary?e.arbitrary-t.arbitrary:e.index-t.index}sort(e){return e.sort(([t],[i])=>Va(this.compare(t,i)))}}});function Ya(r,e){let t=r.tailwindConfig.prefix;return typeof t=="function"?t(e):t+e}function fd({type:r="any",...e}){let t=[].concat(r);return{...e,types:t.map(i=>Array.isArray(i)?{type:i[0],...i[1]}:{type:i,preferOnConflict:!1})}}function cd(r){if(r.includes("{")){if(!TS(r))throw new Error("Your { and } are unbalanced.");return r.split(/{(.*)}/gim).flatMap(e=>cd(e)).filter(Boolean)}return[r.trim()]}function TS(r){let e=0;for(let t of r)if(t==="{")e++;else if(t==="}"&&--e<0)return!1;return e===0}function PS(r,e,{before:t=[]}={}){if(t=[].concat(t),t.length<=0){r.push(e);return}let i=r.length-1;for(let n of t){let s=r.indexOf(n);s!==-1&&(i=Math.min(i,s))}r.splice(i,0,e)}function pd(r){return Array.isArray(r)?r.flatMap(e=>!Array.isArray(e)&&!ee(e)?e:Pt(e)):pd([r])}function dd(r,e){return(0,Wa.default)(i=>{let n=[];return e&&e(i),i.walkClasses(s=>{n.push(s.value)}),n}).transformSync(r)}function DS(r,e={containsNonOnDemandable:!1},t=0Line truncated
`))if(n=n.trim(),!i.has(n))if(i.add(n),Xr.get(e).has(n))for(let s of Xr.get(e).get(n))t.add(s);else{let s=e(n).filter(o=>o!=="!*"),a=new Set(s);for(let o of a)t.add(o);Xr.get(e).set(n,a)}}function XS(r,e){let t=e.offsets.sort(r),i={base:new Set,defaults:new Set,components:new Set,utilities:new Set,variants:new Set};for(let[n,s]of t)i[n.layer].add(s);return i}function no(r){return e=>{let t={base:null,components:null,utilities:null,variants:null};if(e.walkAtRules(d=>{d.name==="tailwind"&&Object.keys(t).includes(d.params)&&(t[d.params]=d)}),Object.values(t).every(d=>d===null))return e;let i=new Set([Ve]),n=new Set;mt.DEBUG&&console.time("Reading changed files");for(let{content:d,extension:y}of r.changedContent){let k=QS(r.tailwindConfig,y),w=YS(r,y);JS(k(d),w,i,n)}mt.DEBUG&&console.timeEnd("Reading changed files");let s=r.classCache.size;mt.DEBUG&&console.time("Generate rules"),mn(i,r),mt.DEBUG&&console.timeEnd("Generate rules"),mt.DEBUG&&console.time("Build stylesheet"),(r.stylesheetCache===null||r.classCache.size!==s)&&(r.stylesheetCache=XS([...r.ruleCache],r)),mt.DEBUG&&console.timeEnd("Build stylesheet");let{defaults:a,base:o,components:u,utilities:c,variants:f}=r.stylesheetCache;t.base&&(t.base.before(ht([...o,...a],t.base.source,{layer:"base"})),t.base.remove()),t.components&&(t.components.before(ht([...u],t.components.source,{layer:"components"})),t.components.remove()),t.utilities&&(t.utilities.before(ht([...c],t.utilities.source,{layer:"utilities"})),t.utilities.remove());let p=Array.from(f).filter(d=>{let y=d.raws.tailwind?.parentLayer;return y==="components"?t.components!==null:y==="utilities"?t.utilities!==null:!0});t.variants?(t.variants.before(ht(p,t.variants.source,{layer:"variants"})),t.variants.remove()):p.length>0&&e.append(ht(p,e.source,{layer:"variants"}));let h=p.some(d=>d.raws.tailwind?.parentLayer==="utilities");t.utilities&&c.size===0&&!h&&N.warn("content-problems",["No utility classes were detected in your source files. If this is unexpected, double-check the `content` option in your Tailwind CSS configuration.","https://tailwindcss.com/docs/content-configuration"]),mt.DEBUG&&(console.log("Potential classes: ",i.size),console.log("Active contexts: ",fn.size)),r.changedContent=[],e.walkAtRules("layer",d=>{Object.keys(t).includes(d.params)&&d.remove()})}}var Vd,mt,Ud,Wd,Xr,Gd=A(()=>{l();Vd=J(Nn());rt();gn();Ae();Fd();jd();mt=Te,Ud={DEFAULT:zd},Wd={DEFAULT:r=>r,svelte:r=>r.replace(/(?:^|\s)class:/g," ")};Xr=new WeakMap});function Sn(r){let e=new Map;j.root({nodes:[r.clone()]}).walkRules(s=>{(0,so.default)(a=>{a.walkClasses(o=>{let u=o.parent.toString(),c=e.get(u);c||e.set(u,c=new Set),c.add(o.value)})}).processSync(s.selector)});let i=Array.from(e.values(),s=>Array.from(s)),n=i.flat();return Object.assign(n,{groups:i})}function ao(r){return KS.astSync(r)}function Hd(r,e){let t=new Set;for(let i of r)t.add(i.split(e).pop());return Array.from(t)}function Yd(r,e){let t=r.tailwindConfig.prefix;return typeof t=="function"?t(e):t+e}function*Qd(r){for(yield r;r.parent;)yield r.parent,r=r.parent}function ZS(r,e={}){let t=r.nodes;r.nodes=[];let i=r.clone(e);return r.nodes=t,i}function e2(r){for(let e of Qd(r))if(r!==e){if(e.type==="root")break;r=ZS(e,{nodes:[r]})}return r}function t2(r,e){let t=new Map;return r.walkRules(i=>{for(let a of Qd(i))if(a.raws.tailwind?.layer!==void 0)return;let n=e2(i),s=e.offsets.create("user");for(let a of Sn(i)){let o=t.get(a)||[];t.set(a,o),o.push([{layer:"user",sort:s,important:!1},n])}}),t}function r2(r,e){for(let t of r){if(e.notClassCache.has(t)||e.applyClassCache.has(t))continue;if(e.classCache.has(t)){e.applyClassCache.set(t,e.classCache.get(t).map(([n,s])=>[n,s.clone()]));continue}let i=Array.from(dn(t,e));if(i.length===0){e.notClassCache.add(t);continue}e.applyClassCache.set(t,i)}return e.applyClassCache}function i2(r){let e=null;return{get:t=>(e=e||r(),e.get(t)),has:t=>(e=e||r(),e.has(t))}}function n2(r){return{get:e=>r.flatMap(t=>t.get(e)||[]),has:e=>r.some(t=>t.has(e))}}function Jd(r){let e=r.split(/[\s\t\n]+/g);return e[e.length-1]==="!important"?[e.slice(0,-1),!0]:[e,!1]}function Xd(r,e,t){let i=new Set,n=[];if(r.walkAtRules("apply",u=>{let[c]=Jd(u.params);for(let f of c)i.add(f);n.push(u)}),n.length===0)return;let s=n2([t,r2(i,e)]);function a(u,c,f){let p=ao(u),h=ao(c),y=ao(`.${ve(f)}`).nodes[0].nodes[0];return p.each(k=>{let w=new Set;h.each(b=>{let x=!1;b=b.clone(),b.walkClasses(S=>{S.value===y.value&&(x||(S.replaceWith(...k.nodes.map(_=>_.clone())),w.add(b),x=!0))})});for(let b of w){let x=[[]];for(let S of b.nodes)S.type==="combinator"?(x.push(S),x.push([])):x[x.length-1].push(S);b.nodes=[];for(let S of x)Array.isArray(S)&&S.sort((_,D)=>_.type==="tag"&&D.type==="class"?-1:_.type==="class"&&D.type==="tag"?1:_.type==="class"&&D.type==="pseudo"&&D.value.startsWith("::")?-1:_.type==="pseudo"&&_.value.startsWith("::")&&D.type==="class"?1:0),b.nodes=b.nodes.concat(S)}k.replaceWith(...w)}),p.toString()}let o=new Map;for(let u of n){let[c]=o.get(u.parentLine truncated
`)),!1}),e.walkRules(n=>{if(i)return!1;n.walkRules(s=>(i=!0,s.warn(t,["Nested CSS was detected, but CSS nesting has not been configured correctly.","Please enable a CSS nesting plugin *before* Tailwind in your configuration.","See how here: https://tailwindcss.com/docs/using-with-preprocessors#nesting"].join(`
`)),!1))})}}var Eh=A(()=>{l()});function Dn(r){return function(e,t){let{tailwindDirectives:i,applyDirectives:n}=ro(e);Oh()(e,t),Pn()(e,t);let s=r({tailwindDirectives:i,applyDirectives:n,registerDependency(a){t.messages.push({plugin:"tailwindcss",parent:t.opts.from,...a})},createContext(a,o){return Ja(a,o,e)}})(e,t);if(s.tailwindConfig.separator==="-")throw new Error("The '-' character cannot be used as a custom separator in JIT mode due to parsing ambiguity. Please use another character like '_' instead.");Ef(s.tailwindConfig),no(s)(e,t),Pn()(e,t),oo(s)(e,t),yh(s)(e,t),bh(s)(e,t),vo(s)(e,t),xo(s)(e,t),ko(s)(e,t)}}var Th=A(()=>{l();Md();Gd();Kd();wh();vh();kh();Ch();_h();Ah();Eh();wn();$e()});function Ph(r,e){let t=null,i=null;return r.walkAtRules("config",n=>{if(i=n.source?.input.file??e.opts.from??null,i===null)throw n.error("The `@config` directive cannot be used without setting `from` in your PostCSS config.");if(t)throw n.error("Only one `@config` directive is allowed per file.");let s=n.params.match(/(['"])(.*?)\1/);if(!s)throw n.error("A path is required when using the `@config` directive.");let a=s[2];if(ie.isAbsolute(a))throw n.error("The `@config` directive cannot be used with an absolute path.");if(t=ie.resolve(ie.dirname(i),a),!ae.existsSync(t))throw n.error(`The config file at "${a}" does not exist. Make sure the path is correct and the file exists.`);n.remove()}),t||null}var Dh=A(()=>{l();Ge();lt()});var qh=v((E3,So)=>{l();Rd();Th();rt();Dh();So.exports=function(e){return{postcssPlugin:"tailwindcss",plugins:[Te.DEBUG&&function(t){return console.log(`
`),console.time("JIT TOTAL"),t},function(t,i){e=Ph(t,i)??e;let n=to(e);if(t.type==="document"){let s=t.nodes.filter(a=>a.type==="root");for(let a of s)a.type==="root"&&Dn(n)(a,i);return}Dn(n)(t,i)},Te.DEBUG&&function(t){return console.timeEnd("JIT TOTAL"),console.log(`
`),t}].filter(Boolean)}};So.exports.postcss=!0});var Co=v((T3,Ih)=>{l();Ih.exports=()=>["and_chr 92","and_uc 12.12","chrome 92","chrome 91","edge 91","firefox 89","ios_saf 14.5-14.7","ios_saf 14.0-14.4","safari 14.1","samsung 14.0"]});var qn={};Ce(qn,{agents:()=>A2,feature:()=>O2});function O2(){return{status:"cr",title:"CSS Feature Queries",stats:{ie:{"6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","5.5":"n"},edge:{"12":"y","13":"y","14":"y","15":"y","16":"y","17":"y","18":"y","79":"y","80":"y","81":"y","83":"y","84":"y","85":"y","86":"y","87":"y","88":"y","89":"y","90":"y","91":"y","92":"y"},firefox:{"2":"n","3":"n","4":"n","5":"n","6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","12":"n","13":"n","14":"n","15":"n","16":"n","17":"n","18":"n","19":"n","20":"n","21":"n","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y","44":"y","45":"y","46":"y","47":"y","48":"y","49":"y","50":"y","51":"y","52":"y","53":"y","54":"y","55":"y","56":"y","57":"y","58":"y","59":"y","60":"y","61":"y","62":"y","63":"y","64":"y","65":"y","66":"y","67":"y","68":"y","69":"y","70":"y","71":"y","72":"y","73":"y","74":"y","75":"y","76":"y","77":"y","78":"y","79":"y","80":"y","81":"y","82":"y","83":"y","84":"y","85":"y","86":"y","87":"y","88":"y","89":"y","90":"y","91":"y","92":"y","93":"y","3.5":"n","3.6":"n"},chrome:{"4":"n","5":"n","6":"n","7":"n","8":"n","9":"n","10":"n","11":"n","12":"n","13":"n","14":"n","15":"n","16":"n","17":"n","18":"n","19":"n","20":"n","21":"n","22":"n","23":"n","24":"n","25":"n","26":"n","27":"n","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y","44":"y","45":"y","46":"y","47":"y","48":"y","49":"y","50":"y","51":"y","52":"y","53":"y","54":"y","55":"y","56":"y","57":"y","58":"y","59":"y","60":"y","61":"y","62":"y","63":"y","64":"y","65":"y","66":"y","67":"y","68":"y","69":"y","70":"y","71":"y","72":"y","73":"y","74":"y","75":"y","76":"y","77":"y","78":"y","79":"y","80":"y","81":"y","83":"y","84":"y","85":"y","86":"y","87":"y","88":"y","89":"y","90":"y","91":"y","92":"y","93":"y","94":"y","95":"y"},safari:{"4":"n","5":"n","6":"n","7":"n","8":"n","9":"y","10":"y","11":"y","12":"y","13":"y","14":"y","15":"y","9.1":"y","10.1":"y","11.1":"y","12.1":"y","13.1":"y","14.1":"y",TP:"y","3.1":"n","3.2":"n","5.1":"n","6.1":"n","7.1":"n"},opera:{"9":"n","11":"n","12":"n","15":"y","16":"y","17":"y","18":"y","19":"y","20":"y","21":"y","22":"y","23":"y","24":"y","25":"y","26":"y","27":"y","28":"y","29":"y","30":"y","31":"y","32":"y","33":"y","34":"y","35":"y","36":"y","37":"y","38":"y","39":"y","40":"y","41":"y","42":"y","43":"y","44":"y","45":"y","46":"y","47":"y","48":"y","49":"y","50":"y","51":"y","52":"y","53":"y","54":"y","55":"y","56":"y","57":"y","58":"y","60":"y","62":"y","63":"y","64":"y","65":"y","66":"y","67":"y","68":"y","69":"y","70":"y","71":"y","72":"y","73":"y","74":"y","75":"y","76":"y","77":"y","78":"y","12.1":"y","9.5-9.6":"n","10.0-10.1":"n","10.5":"n","10.6":"n","11.1":"n","11.5":"n","11.6":"n"},ios_saf:{"8":"n","9.0-9.2":"y","9.3":"y","10.0-10.2":"y","10.3":"y","11.0-11.2":"y","11.3-11.4":"y","12.0-12.1":"y","12.2-12.4":"y","13.0-13.1":"y","13.2":"y","13.3":"y","13.4-13.7":"y","14.0-14.4":"y","14.5-14.7":"y","3.2":"n","4.0-4.1":"n","4.2-4.3":"n","5.0-5.1":"n","6.0-6.1":"n","7.0-7.1":"n","8.1-8.4":"n"},op_mini:{all:"y"},android:{"3":"n","4":"n","92":"y","4.4":"y","4.4.3-4.4.4":"y","2.1":"n","2.2":"n","2.3":"n","4.1":"n","4.2-4.3":"n"},bb:{"7":"n","10":"n"},op_mob:{"10":"n","11":"n","12":"n","64":"y","11.1":"n","11.5":"n","12.1":"n"},and_chr:{"92":"y"},and_ff:{"90":"y"},ie_mob:{"10":"n","11":"n"},and_uc:{"12.12":"y"},samsung:{"4":"y","5.0-5.4":"y","6.2-6.4":"y","7.2-7.4":"y","8.2":"y","9.2":"y","10.1":"y","11.1-11.2":"y","12.0":"y","13.0":"y","14.0":"y"},and_qq:{"10.4":"y"},baidu:{"7.12":"y"},kaios:{"2.5":"y"}}}}var A2,In=A(()=>{l();A2={ie:{prefix:"ms"},edge:{prefix:"webkit",prefix_exceptions:{"12":"ms","13":"ms","14":"ms","15":"ms","16":"ms","17":"ms","18":"ms"}},firefox:{prefix:"moz"},chrome:{prefix:"webkit"},safari:{prefix:"webkit"},opera:{prefix:"webkit",prefix_exceptions:{"9":"o","11":"o","12":"o","9.5-9.6":"o","10.0-10.1":"o","10.5":"o","10.6":"o","11.1":"o","11.5":"o","11.6":"o","12.1":"o"}},ios_saf:{prefix:"webkit"},op_mini:{prefix:"o"},android:{prefix:"webkit"},bb:{prefix:"webkit"},op_mob:{prefix:"o",prefix_exceptions:{"64":"webkit"}},and_chr:{prefix:"webkit"},and_ff:{prefix:"moz"},ie_mob:{prefix:"ms"},and_uc:{prefix:"webkit",prefix_exceptions:{"12.12":"webkit"}},samsung:{prefix:"webkit"},and_qq:{prefix:"webkit"},baidu:{prefix:"webkit"},kaios:{prefix:"moz"}}});var Rh=v(()=>{l()});var ne=v((q3,st)=>{l();var{list:_o}=me();st.exports.error=function(r){let e=new Error(r);throw e.autoprefixer=!0,e};st.exports.uniq=function(r){return[...new Set(r)]};st.exports.rLine truncated
`)),e._autoprefixerCascade}maxPrefixed(e,t){if(t._autoprefixerMax)return t._autoprefixerMax;let i=0;for(let n of e)n=zh.removeNote(n),n.length>i&&(i=n.length);return t._autoprefixerMax=i,t._autoprefixerMax}calcBefore(e,t,i=""){let s=this.maxPrefixed(e,t)-zh.removeNote(i).length,a=t.raw("before");return s>0&&(a+=Array(s).fill(" ").join("")),a}restoreBefore(e){let t=e.raw("before").split(`
`),i=t[t.length-1];this.all.group(e).up(n=>{let s=n.raw("before").split(`
`),a=s[s.length-1];a.length<i.length&&(i=a)}),t[t.length-1]=i,e.raws.before=t.join(`
`)}insert(e,t,i){let n=this.set(this.clone(e),t);if(!(!n||e.parent.some(a=>a.prop===n.prop&&a.value===n.value)))return this.needCascade(e)&&(n.raws.before=this.calcBefore(i,e,t)),e.parent.insertBefore(e,n)}isAlready(e,t){let i=this.all.group(e).up(n=>n.prop===t);return i||(i=this.all.group(e).down(n=>n.prop===t)),i}add(e,t,i,n){let s=this.prefixed(e.prop,t);if(!(this.isAlready(e,s)||this.otherPrefixes(e.value,t)))return this.insert(e,t,i,n)}process(e,t){if(!this.needCascade(e)){super.process(e,t);return}let i=super.process(e,t);!i||!i.length||(this.restoreBefore(e),e.raws.before=this.calcBefore(i,e))}old(e,t){return[this.prefixed(e,t)]}};Vh.exports=jh});var Wh=v((N3,Uh)=>{l();Uh.exports=function r(e){return{mul:t=>new r(e*t),div:t=>new r(e/t),simplify:()=>new r(e),toString:()=>e.toString()}}});var Yh=v((L3,Hh)=>{l();var R2=Wh(),M2=Bt(),Oo=ne(),F2=/(min|max)-resolution\s*:\s*\d*\.?\d+(dppx|dpcm|dpi|x)/gi,N2=/(min|max)-resolution(\s*:\s*)(\d*\.?\d+)(dppx|dpcm|dpi|x)/i,Gh=class extends M2{prefixName(e,t){return e==="-moz-"?t+"--moz-device-pixel-ratio":e+t+"-device-pixel-ratio"}prefixQuery(e,t,i,n,s){return n=new R2(n),s==="dpi"?n=n.div(96):s==="dpcm"&&(n=n.mul(2.54).div(96)),n=n.simplify(),e==="-o-"&&(n=n.n+"/"+n.d),this.prefixName(e,t)+i+n}clean(e){if(!this.bad){this.bad=[];for(let t of this.prefixes)this.bad.push(this.prefixName(t,"min")),this.bad.push(this.prefixName(t,"max"))}e.params=Oo.editList(e.params,t=>t.filter(i=>this.bad.every(n=>!i.includes(n))))}process(e){let t=this.parentPrefix(e),i=t?[t]:this.prefixes;e.params=Oo.editList(e.params,(n,s)=>{for(let a of n){if(!a.includes("min-resolution")&&!a.includes("max-resolution")){s.push(a);continue}for(let o of i){let u=a.replace(F2,c=>{let f=c.match(N2);return this.prefixQuery(o,f[1],f[2],f[3],f[4])});s.push(u)}s.push(a)}return Oo.uniq(s)})}};Hh.exports=Gh});var Zh=v((B3,Kh)=>{l();var{list:L2}=me(),Qh=Kr(),B2=at(),Jh=ei(),Xh=class{constructor(e){this.props=["transition","transition-property"],this.prefixes=e}add(e,t){let i,n,s=this.prefixes.add[e.prop],a=this.ruleVendorPrefixes(e),o=a||s&&s.prefixes||[],u=this.parse(e.value),c=u.map(d=>this.findProp(d)),f=[];if(c.some(d=>d[0]==="-"))return;for(let d of u){if(n=this.findProp(d),n[0]==="-")continue;let y=this.prefixes.add[n];if(!(!y||!y.prefixes))for(i of y.prefixes){if(a&&!a.some(w=>i.includes(w)))continue;let k=this.prefixes.prefixed(n,i);k!=="-ms-transform"&&!c.includes(k)&&(this.disabled(n,i)||f.push(this.clone(n,k,d)))}}u=u.concat(f);let p=this.stringify(u),h=this.stringify(this.cleanFromUnprefixed(u,"-webkit-"));if(o.includes("-webkit-")&&this.cloneBefore(e,`-webkit-${e.prop}`,h),this.cloneBefore(e,e.prop,h),o.includes("-o-")){let d=this.stringify(this.cleanFromUnprefixed(u,"-o-"));this.cloneBefore(e,`-o-${e.prop}`,d)}for(i of o)if(i!=="-webkit-"&&i!=="-o-"){let d=this.stringify(this.cleanOtherPrefixes(u,i));this.cloneBefore(e,i+e.prop,d)}p!==e.value&&!this.already(e,e.prop,p)&&(this.checkForWarning(t,e),e.cloneBefore(),e.value=p)}findProp(e){let t=e[0].value;if(/^\d/.test(t)){for(let[i,n]of e.entries())if(i!==0&&n.type==="word")return n.value}return t}already(e,t,i){return e.parent.some(n=>n.prop===t&&n.value===i)}cloneBefore(e,t,i){this.already(e,t,i)||e.cloneBefore({prop:t,value:i})}checkForWarning(e,t){if(t.prop!=="transition-property")return;let i=!1,n=!1;t.parent.each(s=>{if(s.type!=="decl"||s.prop.indexOf("transition-")!==0)return;let a=L2.comma(s.value);if(s.prop==="transition-property"){a.forEach(o=>{let u=this.prefixes.add[o];u&&u.prefixes&&u.prefixes.length>0&&(i=!0)});return}return n=n||a.length>1,!1}),i&&n&&t.warn(e,"Replace transition-property to transition, because Autoprefixer could not support any cases of transition-property and other transition-*")}remove(e){let t=this.parse(e.value);t=t.filter(a=>{let o=this.prefixes.remove[this.findProp(a)];return!o||!o.remove});let i=this.stringify(t);if(e.value===i)return;if(t.length===0){e.remove();return}let n=e.parent.some(a=>a.prop===e.prop&&a.value===i),s=e.parent.some(a=>a!==e&&a.prop===e.prop&&a.value.length>i.length);if(n||s){e.remove();return}e.value=i}parse(e){let t=Qh(e),i=[],n=[];for(let s of t.nodes)n.push(s),s.type==="div"&&s.value===","&&(i.push(n),n=[]);return i.push(n),i.filter(s=>s.length>0)}stringify(e){if(e.length===0)return"";let t=[];for(let i of e)i[i.length-1].type!=="div"&&i.push(this.div(e)),t=t.concat(i);return t[0].type==="div"&&(t=t.slice(1)),t[t.length-1].type==="div"&&(t=t.slice(0,-2+1||void 0)),Qh.stringify({nodes:t})}clone(e,t,i){let n=[],s=!1;for(let a of i)!s&&a.type==="word"&&a.value===e?(n.push({type:"word",value:t}),s=!0):n.push(a);return n}div(e){for(let t of e)for(let i of t)if(i.type==="div"&&i.value===",")return i;return{type:"div",value:",",after:" "}}cleanOtherPrefixes(e,t){return e.filter(i=>{let n=Jh.prefix(this.findProp(i));return n===""||n===t})}cleanFromUnprefixed(e,t){let i=e.map(s=>this.findProp(s)).filter(s=>s.slice(0,t.length)===t).map(s=>this.prefixes.unprefixed(s)),n=[];for(let s of e){letLine truncated
`)&&this.reduceSpaces(n),a.removeChild(s);return}}for(let u of this.prefixes.values("remove",o)){if(!u.check||!u.check(n.value))continue;if(o=u.unprefixed,this.prefixes.group(n).down(f=>f.value.includes(o))){a.removeChild(s);return}}})}withHackValue(e){return e.prop==="-webkit-background-clip"&&e.value==="text"}disabledValue(e,t){return this.gridStatus(e,t)===!1&&e.type==="decl"&&e.prop==="display"&&e.value.includes("grid")||this.prefixes.options.flexbox===!1&&e.type==="decl"&&e.prop==="display"&&e.value.includes("flex")||e.type==="decl"&&e.prop==="content"?!0:this.disabled(e,t)}disabledDecl(e,t){if(this.gridStatus(e,t)===!1&&e.type==="decl"&&(e.prop.includes("grid")||e.prop==="justify-items"))return!0;if(this.prefixes.options.flexbox===!1&&e.type==="decl"){let i=["order","justify-content","align-items","align-content"];if(e.prop.includes("flex")||i.includes(e.prop))return!0}return this.disabled(e,t)}disabled(e,t){if(!e)return!1;if(e._autoprefixerDisabled!==void 0)return e._autoprefixerDisabled;if(e.parent){let n=e.prev();if(n&&n.type==="comment"&&Q2.test(n.text))return e._autoprefixerDisabled=!0,e._autoprefixerSelfDisabled=!0,!0}let i=null;if(e.nodes){let n;e.each(s=>{s.type==="comment"&&/(!\s*)?autoprefixer:\s*(off|on)/i.test(s.text)&&(typeof n!="undefined"?t.warn("Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.",{node:s}):n=/on/i.test(s.text))}),n!==void 0&&(i=!n)}if(!e.nodes||i===null)if(e.parent){let n=this.disabled(e.parent,t);e.parent._autoprefixerSelfDisabled===!0?i=!1:i=n}else i=!1;return e._autoprefixerDisabled=i,i}reduceSpaces(e){let t=!1;if(this.prefixes.group(e).up(()=>(t=!0,!0)),t)return;let i=e.raw("before").split(`
`),n=i[i.length-1].length,s=!1;this.prefixes.group(e).down(a=>{i=a.raw("before").split(`
`);let o=i.length-1;i[o].length>n&&(s===!1&&(s=i[o].length-n),i[o]=i[o].slice(0,-s),a.raws.before=i.join(`
`))})}displayType(e){for(let t of e.parent.nodes)if(t.prop==="display"){if(t.value.includes("flex"))return"flex";if(t.value.includes("grid"))return"grid"}return!1}gridStatus(e,t){if(!e)return!1;if(e._autoprefixerGridStatus!==void 0)return e._autoprefixerGridStatus;let i=null;if(e.nodes){let n;e.each(s=>{if(s.type==="comment"&&J2.test(s.text)){let a=/:\s*autoplace/i.test(s.text),o=/no-autoplace/i.test(s.text);typeof n!="undefined"?t.warn("Second Autoprefixer grid control comment was ignored. Autoprefixer applies control comments to the whole block, not to the next rules.",{node:s}):a?n="autoplace":o?n=!0:n=/on/i.test(s.text)}}),n!==void 0&&(i=n)}if(e.type==="atrule"&&e.name==="supports"){let n=e.params;n.includes("grid")&&n.includes("auto")&&(i=!1)}if(!e.nodes||i===null)if(e.parent){let n=this.gridStatus(e.parent,t);e.parent._autoprefixerSelfDisabled===!0?i=!1:i=n}else typeof this.prefixes.options.grid!="undefined"?i=this.prefixes.options.grid:typeof m.env.AUTOPREFIXER_GRID!="undefined"?m.env.AUTOPREFIXER_GRID==="autoplace"?i="autoplace":i=!0:i=!1;return e._autoprefixerGridStatus=i,i}};om.exports=am});var um=v((U3,lm)=>{l();lm.exports={A:{A:{"2":"J D E F A B iB"},B:{"1":"C K L G M N O R S T U V W X Y Z a P b H"},C:{"1":"0 1 2 3 4 5 6 7 8 9 g h i j k l m n o p q r s t u v w x y z AB BB CB DB EB FB GB bB HB cB IB JB Q KB LB MB NB OB PB QB RB SB TB UB VB WB XB R S T kB U V W X Y Z a P b H dB","2":"jB aB I c J D E F A B C K L G M N O d e f lB mB"},D:{"1":"0 1 2 3 4 5 6 7 8 9 m n o p q r s t u v w x y z AB BB CB DB EB FB GB bB HB cB IB JB Q KB LB MB NB OB PB QB RB SB TB UB VB WB XB R S T U V W X Y Z a P b H dB nB oB","2":"I c J D E F A B C K L G M N O d e f g h i j k l"},E:{"1":"F A B C K L G tB fB YB ZB uB vB wB","2":"I c J D E pB eB qB rB sB"},F:{"1":"0 1 2 3 4 5 6 7 8 9 G M N O d e f g h i j k l m n o p q r s t u v w x y z AB BB CB DB EB FB GB HB IB JB Q KB LB MB NB OB PB QB RB SB TB UB VB WB XB ZB","2":"F B C xB yB zB 0B YB gB 1B"},G:{"1":"7B 8B 9B AC BC CC DC EC FC GC HC IC JC KC","2":"E eB 2B hB 3B 4B 5B 6B"},H:{"1":"LC"},I:{"1":"H QC RC","2":"aB I MC NC OC PC hB"},J:{"2":"D A"},K:{"1":"Q","2":"A B C YB gB ZB"},L:{"1":"H"},M:{"1":"P"},N:{"2":"A B"},O:{"1":"SC"},P:{"1":"I TC UC VC WC XC fB YC ZC aC bC"},Q:{"1":"cC"},R:{"1":"dC"},S:{"1":"eC"}},B:4,C:"CSS Feature Queries"}});var dm=v((W3,pm)=>{l();function fm(r){return r[r.length-1]}var cm={parse(r){let e=[""],t=[e];for(let i of r){if(i==="("){e=[""],fm(t).push(e),t.push(e);continue}if(i===")"){t.pop(),e=fm(t),e.push("");continue}e[e.length-1]+=i}return t[0]},stringify(r){let e="";for(let t of r){if(typeof t=="object"){e+=`(${cm.stringify(t)})`;continue}e+=t}return e}};pm.exports=cm});var wm=v((G3,ym)=>{l();var Z2=um(),{feature:eC}=(In(),qn),{parse:tC}=me(),rC=at(),Po=dm(),iC=ke(),nC=ne(),hm=eC(Z2),mm=[];for(let r in hm.stats){let e=hm.stats[r];for(let t in e){let i=e[t];/y/.test(i)&&mm.push(r+" "+t)}}var gm=class{constructor(e,t){this.Prefixes=e,this.all=t}prefixer(){if(this.prefixerCache)return this.prefixerCache;let e=this.all.browsers.selected.filter(i=>mm.includes(i)),t=new rC(this.all.browsers.data,e,this.all.options);return this.prefixerCache=new this.Prefixes(this.all.data,t,this.all.options),this.prefixerCache}parse(e){let t=e.split(":"),i=t[0],n=t[1];return n||(n=""),[i.trim(),n.trim()]}virtual(e){let[t,i]=this.parse(e),n=tC("a{}").first;return n.append({prop:t,value:i,raws:{before:""}}),n}prefixed(e){let t=this.virtual(e);if(this.disabled(t.first))return t.nodes;let i={warn:()=>null},n=this.prefixer().add[t.first.prop];n&&n.process&&n.process(t.first,i);for(let s of t.nodes){for(let a of this.prefixer().values("add",t.first.prop))a.process(s);iC.save(this.all,s)}return t.nodes}isNot(e){return typeof e=="string"&&/not\s*/i.test(e)}isOr(e){return typeof e=="string"&&/\s*or\s*/i.test(e)}isProp(e){return typeof e=="object"&&e.length===1&&typeof e[0]=="string"}isHack(e,t){return!new RegExp(`(\\(|\\s)${nC.escapeRegexp(t)}:`).test(e)}toRemove(e,t){let[i,n]=this.parse(e),s=this.all.unprefixed(i),a=this.all.cleaner();if(a.remove[i]&&a.remove[i].remove&&!this.isHack(t,s))return!0;for(let o of a.values("remove",s))if(o.check(n))return!0;return!1}remove(e,t){let i=0;for(;i<e.length;){if(!this.isNot(e[i-1])&&this.isProp(e[i])&&this.isOr(e[i+1])){if(this.toRemove(e[i][0],t)){e.splice(i,2);continue}i+=2;continue}typeof e[i]=="object"&&(e[i]=this.remove(e[i],t)),i+=1}return e}cleanBrackets(e){return e.map(t=>typeof t!="object"?t:t.length===1&&typeof t[0]=="object"?this.cleanBrackets(t[0]):this.cleanBrackets(t))}convert(e){let t=[""];for(let i of e)t.push([`${i.prop}: ${i.value}`]),t.push(" or ");return t[t.length-1]="",t}normalize(e){if(typeof e!="object")return e;if(e=e.filter(t=>t!==""),typeof e[0]=="string"){let t=e[0].trim();if(t.includes(":")||t==="selector"||t==="not selector")return[Po.stringify(e)]}return e.map(t=>this.normalize(t))}add(e,t){return e.map(i=>{if(this.isProp(i)){let n=this.prefixed(i[0]);return n.length>1?this.convert(n):i}return typeof i=="Line truncated
Replace Autoprefixer \`browsers\` option to Browserslist config.
Use \`browserslist\` key in \`package.json\` or \`.browserslistrc\` file.
Using \`browsers\` option can cause errors. Browserslist config can
be used for Babel, Autoprefixer, postcss-normalize and other tools.
If you really need to use option, rename it to \`overrideBrowserslist\`.
Learn more at:
https://github.com/browserslist/browserslist#readme
https://twitter.com/browserslist
`;function nO(r){return Object.prototype.toString.apply(r)==="[object Object]"}var Tl=new Map;function sO(r,e){e.browsers.selected.length!==0&&(e.add.selectors.length>0||Object.keys(e.add).length>2||r.warn(`Autoprefixer target browsers do not need any prefixes.You do not need Autoprefixer anymore.
Check your Browserslist config to be sure that your targets are set up correctly.
Learn more at:
https://github.com/postcss/autoprefixer#readme
https://github.com/browserslist/browserslist#readme
`))}uw.exports=Kt;function Kt(...r){let e;if(r.length===1&&nO(r[0])?(e=r[0],r=void 0):r.length===0||r.length===1&&!r[0]?r=void 0:r.length<=2&&(Array.isArray(r[0])||!r[0])?(e=r[1],r=r[0]):typeof r[r.length-1]=="object"&&(e=r.pop()),e||(e={}),e.browser)throw new Error("Change `browser` option to `overrideBrowserslist` in Autoprefixer");if(e.browserslist)throw new Error("Change `browserslist` option to `overrideBrowserslist` in Autoprefixer");e.overrideBrowserslist?r=e.overrideBrowserslist:e.browsers&&(typeof console!="undefined"&&console.warn&&(El.red?console.warn(El.red(lw.replace(/`[^`]+`/g,n=>El.yellow(n.slice(1,-1))))):console.warn(lw)),r=e.browsers);let t={ignoreUnknownVersions:e.ignoreUnknownVersions,stats:e.stats,env:e.env};function i(n){let s=ow,a=new eO(s.browsers,r,n,t),o=a.selected.join(", ")+JSON.stringify(e);return Tl.has(o)||Tl.set(o,new tO(s.prefixes,a,e)),Tl.get(o)}return{postcssPlugin:"autoprefixer",prepare(n){let s=i({from:n.opts.from,env:e.env});return{OnceExit(a){sO(n,s),e.remove!==!1&&s.processor.remove(a,n),e.add!==!1&&s.processor.add(a,n)}}},info(n){return n=n||{},n.from=n.from||m.cwd(),iO(i(n))},options:e,browsers:r}}Kt.postcss=!0;Kt.data=ow;Kt.defaults=KA.defaults;Kt.info=()=>Kt().info()});var cw={};Ce(cw,{default:()=>aO});var aO,pw=A(()=>{l();aO=[]});var hw={};Ce(hw,{default:()=>oO});var dw,oO,mw=A(()=>{l();ui();dw=J(Zt()),oO=Ye(dw.default.theme)});var yw={};Ce(yw,{default:()=>lO});var gw,lO,ww=A(()=>{l();ui();gw=J(Zt()),lO=Ye(gw.default)});function bw(r,e){return{handler:r,config:e}}var vw,xw=A(()=>{l();bw.withOptions=function(r,e=()=>({})){let t=function(i){return{__options:i,handler:r(i),config:e(i)}};return t.__isOptionsFunction=!0,t.__pluginFunction=r,t.__configFunction=e,t};vw=bw});var kw={};Ce(kw,{default:()=>uO});var uO,Sw=A(()=>{l();xw();uO=vw});l();"use strict";var fO=We(qh()),cO=We(me()),pO=We(fw()),dO=We((pw(),cw)),hO=We((mw(),hw)),mO=We((ww(),yw)),gO=We((jn(),Xl)),yO=We((Sw(),kw)),wO=We((Qs(),zf));function We(r){return r&&r.__esModule?r:{default:r}}console.warn("cdn.tailwindcss.com should not be used in production. To use Tailwind CSS in production, install it as a PostCSS plugin or use the Tailwind CLI: https://tailwindcss.com/docs/installation");var Mn="tailwind",Pl="text/tailwindcss",Cw="/template.html",gt,_w=!0,Aw=0,Dl=new Set,ql,Ow="",Ew=(r=!1)=>({get(e,t){return(!r||t==="config")&&typeof e[t]=="object"&&e[t]!==null?new Proxy(e[t],Ew()):e[t]},set(e,t,i){return e[t]=i,(!r||t==="config")&&Il(!0),!0}});window[Mn]=new Proxy({config:{},defaultTheme:hO.default,defaultConfig:mO.default,colors:gO.default,plugin:yO.default,resolveConfig:wO.default},Ew(!0));function Tw(r){ql.observe(r,{attributes:!0,attributeFilter:["type"],characterData:!0,subtree:!0,childList:!0})}new MutationObserver(async r=>{let e=!1;if(!ql){ql=new MutationObserver(async()=>await Il(!0));for(let t of document.querySelectorAll(`style[type="${Pl}"]`))Tw(t)}for(let t of r)for(let i of t.addedNodes)i.nodeType===1&&i.tagName==="STYLE"&&i.getAttribute("type")===Pl&&(Tw(i),e=!0);await Il(e)}).observe(document.documentElement,{attributes:!0,attributeFilter:["class"],childList:!0,subtree:!0});async function Il(r=!1){r&&(Aw++,Dl.clear());let e="";for(let i of document.querySelectorAll(`style[type="${Pl}"]`))e+=i.textContent;let t=new Set;for(let i of document.querySelectorAll("[class]"))for(let n of i.classList)Dl.has(n)||t.add(n);if(document.body&&(_w||t.size>0||e!==Ow||!gt||!gt.isConnected)){for(let n of t)Dl.add(n);_w=!1,Ow=e,self[Cw]=Array.from(t).join(" ");let i=(0,cO.default)([(0,fO.default)({...window[Mn].config,_hash:Aw,content:[Cw],plugins:[...dO.default,...Array.isArray(window[Mn].config.plugins)?window[Mn].config.plugins:[]]}),(0,pO.default)({remove:!1})]).process(`@tailwind base;@tailwind components;@tailwind utilities;${e}`).css;(!gt||!gt.isConnected)&&(gt=document.createElement("style"),document.head.append(gt)),gt.textContent=i}}})();
/*! https://mths.be/cssesc v3.0.0 by @mathias */
</script>
<style type="text/tailwindcss">
@layer components {
.card {
@apply mx-2 px-4 relative flex flex-col min-w-0 grow break-words bg-white rounded mt-4 xl:mb-0 shadow-lg p-4;
}
.card .title{
@apply text-slate-400 font-bold text-xs;
}
.card .value{
@apply font-semibold text-xl text-slate-700 inline;
}
}
</style>
</head>
<body class="bg-slate-600" x-data="petalot()"
x-init="
fetchConf('get')
fetchTele('tele')
setInterval(function(){ fetchTele('tele') }, 1000)
">
<div class="w-11/12 lg:w-1/2 mx-auto">
<div class="card font-bold text-xl flex-row" href="#pablo">PETALOT <span class="text-slate-400 text-sm m-1.5">by @function.3d</span></div>
<div class="flex flex-col sm:flex-row mx-auto items-stretch">
<template x-for="el in ui">
<div :class="el.type">
<div class="title" x-text="el.title"></div>
<div><div class="value" x-text="(el.value_type=='bool')?tele[el.value]?el.true:el.false:tele[el.value]"></div> <span x-text="el.unit"></span>
<label x-show="el.toggle" :for="'toggle-'+el.title" class="float-right inline-flex relative items-center cursor-pointer">
<input @click="fetchTele('set?'+el.value+'='+($event.target.checked?1:0))" x-model="tele[el.value]" type="checkbox" :id="'toggle-'+el.title" class="sr-only peer" >
<div class="w-11 h-6 bg-gray-200 peer-focus:outline-none peer-focus:ring-4 peer-focus:ring-slate-300 dark:peer-focus:ring-slate-800 rounded-full peer dark:bg-gray-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all dark:border-gray-600 peer-checked:bg-slate-600"></div>
</label>
</div>
</div>
</template>
</div>
<div x-data="{show:false}" class="card">
<div class="cursor-pointer hover:opacity-75 font-bold text-xl mb-4" @click="show = !show">Settings</div>
<div x-show="show">
<div class="flex flex-col">
<template x-for="[entry,value] in Object.entries(conf)" >
<div :style="'order:'+ fields[entry]['order']">
<div class="title" x-text="fields[entry]['title']"></div>
<input :tabindex="fields[entry]['order']" class="shadow appearance-none border mb-4 rounded w-full py-2 px-3 text-gray-700 leading-tight focus:outline-none focus:shadow-outline" x-model="conf[entry]">
</div>
</template>
</div>
<button x-text="save" class="bg-slate-500 hover:bg-slate-700 text-white font-bold py-2 px-4 rounded float-right" @click="fetchConf('set?'+ new URLSearchParams(conf));save='Saved!';setInterval(function(){ save='Save' }, 3000) ">
Save
</button>
<button class="bg-red-500 hover:bg-red-700 text-white mr-2 font-bold py-2 px-4 rounded float-right" @click="fetchConf('reset')">
Reset
</button>
</div>
</div>
</div>
<script>
function petalot() {
return {
tele : {
V: 0,
T: 0,
F: 0,
status: 0,
},
save:'Save',
conf:{},
fetchConf(url){
fetch(url)
.then(response=> {
return response.json()
})
.then((data) => {
this.conf = data;
this.conf.Vo = this.conf.Vo/2;
})
},
fields:{
To:{order:"1",title:"Temperature"},
Vo:{order:"2",title:"Speed"},
Tm:{order:"3",title:"Maximum Temperature"},
Kp:{order:"4",title:"Kp"},
Ki:{order:"5",title:"Ki"},
Kd:{order:"6",title:"Kd"},
R1:{order:"7",title:"R1"},
Max:{order:"8",title:"Maximum value for MOSFET (0-255)"},
ssid:{order:"9",title:"SSID"},
password:{order:"10",title:"SSID Password"},
LocalIP:{order:"11",title:"IP address"},
Subnet:{order:"12",title:"Subnet"},
Gateway:{order:"13",title:"Gateway"},
ifttt_event_name:{order:"14",title:"IFTTT Event Name"},
ifttt_api_key:{order:"15",title:"IFTTT API Key"},
},
fetchTele(url){
fetch(url)
.then(response=> {
return response.json()
})
.then((data) => {
this.tele.V = data.V/2,
this.tele.T= Math.round(data.T),
this.tele.F= data.F,
this.tele.status = data.status
})
},
ui : [
{ type: 'card', title: 'Status', value: 'status', unit:'', value_type:'bool', toggle:true, true:'working', false:'stopped' },
{ type: 'card', title: 'Temperature', value: 'T', unit:'°C' },
{ type: 'card', title: 'Speed', value: 'V', unit:'cm/min' },
{ type: 'card', title: 'Filament', value: 'F' , unit:'', value_type:'bool', true:'detected', false:'no detected' }
],
}
}
</script>
<script>
(()=>{var We=!1,Ge=!1,B=[];function $t(e){an(e)}function an(e){B.includes(e)||B.push(e),cn()}function he(e){let t=B.indexOf(e);t!==-1&&B.splice(t,1)}function cn(){!Ge&&!We&&(We=!0,queueMicrotask(ln))}function ln(){We=!1,Ge=!0;for(let e=0;e<B.length;e++)B[e]();B.length=0,Ge=!1}var A,K,Y,Ye,Je=!0;function Lt(e){Je=!1,e(),Je=!0}function jt(e){A=e.reactive,Y=e.release,K=t=>e.effect(t,{scheduler:r=>{Je?$t(r):r()}}),Ye=e.raw}function Ze(e){K=e}function Ft(e){let t=()=>{};return[n=>{let i=K(n);return e._x_effects||(e._x_effects=new Set,e._x_runEffects=()=>{e._x_effects.forEach(o=>o())}),e._x_effects.add(i),t=()=>{i!==void 0&&(e._x_effects.delete(i),Y(i))},i},()=>{t()}]}var Bt=[],Kt=[],zt=[];function Vt(e){zt.push(e)}function _e(e,t){typeof t=="function"?(e._x_cleanups||(e._x_cleanups=[]),e._x_cleanups.push(t)):(t=e,Kt.push(t))}function Ht(e){Bt.push(e)}function qt(e,t,r){e._x_attributeCleanups||(e._x_attributeCleanups={}),e._x_attributeCleanups[t]||(e._x_attributeCleanups[t]=[]),e._x_attributeCleanups[t].push(r)}function Qe(e,t){!e._x_attributeCleanups||Object.entries(e._x_attributeCleanups).forEach(([r,n])=>{(t===void 0||t.includes(r))&&(n.forEach(i=>i()),delete e._x_attributeCleanups[r])})}var et=new MutationObserver(Xe),tt=!1;function rt(){et.observe(document,{subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0}),tt=!0}function fn(){un(),et.disconnect(),tt=!1}var te=[],nt=!1;function un(){te=te.concat(et.takeRecords()),te.length&&!nt&&(nt=!0,queueMicrotask(()=>{dn(),nt=!1}))}function dn(){Xe(te),te.length=0}function m(e){if(!tt)return e();fn();let t=e();return rt(),t}var it=!1,ge=[];function Ut(){it=!0}function Wt(){it=!1,Xe(ge),ge=[]}function Xe(e){if(it){ge=ge.concat(e);return}let t=[],r=[],n=new Map,i=new Map;for(let o=0;o<e.length;o++)if(!e[o].target._x_ignoreMutationObserver&&(e[o].type==="childList"&&(e[o].addedNodes.forEach(s=>s.nodeType===1&&t.push(s)),e[o].removedNodes.forEach(s=>s.nodeType===1&&r.push(s))),e[o].type==="attributes")){let s=e[o].target,a=e[o].attributeName,c=e[o].oldValue,l=()=>{n.has(s)||n.set(s,[]),n.get(s).push({name:a,value:s.getAttribute(a)})},u=()=>{i.has(s)||i.set(s,[]),i.get(s).push(a)};s.hasAttribute(a)&&c===null?l():s.hasAttribute(a)?(u(),l()):u()}i.forEach((o,s)=>{Qe(s,o)}),n.forEach((o,s)=>{Bt.forEach(a=>a(s,o))});for(let o of r)if(!t.includes(o)&&(Kt.forEach(s=>s(o)),o._x_cleanups))for(;o._x_cleanups.length;)o._x_cleanups.pop()();t.forEach(o=>{o._x_ignoreSelf=!0,o._x_ignore=!0});for(let o of t)r.includes(o)||!o.isConnected||(delete o._x_ignoreSelf,delete o._x_ignore,zt.forEach(s=>s(o)),o._x_ignore=!0,o._x_ignoreSelf=!0);t.forEach(o=>{delete o._x_ignoreSelf,delete o._x_ignore}),t=null,r=null,n=null,i=null}function xe(e){return D(k(e))}function C(e,t,r){return e._x_dataStack=[t,...k(r||e)],()=>{e._x_dataStack=e._x_dataStack.filter(n=>n!==t)}}function ot(e,t){let r=e._x_dataStack[0];Object.entries(t).forEach(([n,i])=>{r[n]=i})}function k(e){return e._x_dataStack?e._x_dataStack:typeof ShadowRoot=="function"&&e instanceof ShadowRoot?k(e.host):e.parentNode?k(e.parentNode):[]}function D(e){let t=new Proxy({},{ownKeys:()=>Array.from(new Set(e.flatMap(r=>Object.keys(r)))),has:(r,n)=>e.some(i=>i.hasOwnProperty(n)),get:(r,n)=>(e.find(i=>{if(i.hasOwnProperty(n)){let o=Object.getOwnPropertyDescriptor(i,n);if(o.get&&o.get._x_alreadyBound||o.set&&o.set._x_alreadyBound)return!0;if((o.get||o.set)&&o.enumerable){let s=o.get,a=o.set,c=o;s=s&&s.bind(t),a=a&&a.bind(t),s&&(s._x_alreadyBound=!0),a&&(a._x_alreadyBound=!0),Object.defineProperty(i,n,{...c,get:s,set:a})}return!0}return!1})||{})[n],set:(r,n,i)=>{let o=e.find(s=>s.hasOwnProperty(n));return o?o[n]=i:e[e.length-1][n]=i,!0}});return t}function ye(e){let t=n=>typeof n=="object"&&!Array.isArray(n)&&n!==null,r=(n,i="")=>{Object.entries(Object.getOwnPropertyDescriptors(n)).forEach(([o,{value:s,enumerable:a}])=>{if(a===!1||s===void 0)return;let c=i===""?o:`${i}.${o}`;typeof s=="object"&&s!==null&&s._x_interceptor?n[o]=s.initialize(e,c,o):t(s)&&s!==n&&!(s instanceof Element)&&r(s,c)})};return r(e)}function be(e,t=()=>{}){let r={initialValue:void 0,_x_interceptor:!0,initialize(n,i,o){return e(this.initialValue,()=>pn(n,i),s=>st(n,i,s),i,o)}};return t(r),n=>{if(typeof n=="object"&&n!==null&&n._x_interceptor){let i=r.initialize.bind(r);r.initialize=(o,s,a)=>{let c=n.initialize(o,s,a);return r.initialValue=c,i(o,s,a)}}else r.initialValue=n;return r}}function pn(e,t){return t.split(".").reduce((r,n)=>r[n],e)}function st(e,t,r){if(typeof t=="string"&&(t=t.split(".")),t.length===1)e[t[0]]=r;else{if(t.length===0)throw error;return e[t[0]]||(e[t[0]]={}),st(e[t[0]],t.slice(1),r)}}var Gt={};function x(e,t){Gt[e]=t}function re(e,t){return Object.entries(Gt).forEach(([r,n])=>{Object.defineProperty(e,`$${r}`,{get(){let[i,o]=at(t);return i={interceptor:be,...i},_e(t,o),n(t,i)},enumerable:!1})}),e}function Yt(e,t,r,...n){try{return r(...n)}catch(i){J(i,e,t)}}function J(e,t,r=void 0){Object.assign(e,{el:t,expression:r}),console.warn(`Alpine ExpressionLine truncated
${r?'Expression: "'+r+`"
`:""}`,t),setTimeout(()=>{throw e},0)}var ve=!0;function Jt(e){let t=ve;ve=!1,e(),ve=t}function P(e,t,r={}){let n;return g(e,t)(i=>n=i,r),n}function g(...e){return Zt(...e)}var Zt=ct;function Qt(e){Zt=e}function ct(e,t){let r={};re(r,e);let n=[r,...k(e)];if(typeof t=="function")return mn(n,t);let i=hn(n,t,e);return Yt.bind(null,e,t,i)}function mn(e,t){return(r=()=>{},{scope:n={},params:i=[]}={})=>{let o=t.apply(D([n,...e]),i);we(r,o)}}var lt={};function _n(e,t){if(lt[e])return lt[e];let r=Object.getPrototypeOf(async function(){}).constructor,n=/^[\n\s]*if.*\(.*\)/.test(e)||/^(let|const)\s/.test(e)?`(() => { ${e} })()`:e,o=(()=>{try{return new r(["__self","scope"],`with (scope) { __self.result = ${n} }; __self.finished = true; return __self.result;`)}catch(s){return J(s,t,e),Promise.resolve()}})();return lt[e]=o,o}function hn(e,t,r){let n=_n(t,r);return(i=()=>{},{scope:o={},params:s=[]}={})=>{n.result=void 0,n.finished=!1;let a=D([o,...e]);if(typeof n=="function"){let c=n(n,a).catch(l=>J(l,r,t));n.finished?(we(i,n.result,a,s,r),n.result=void 0):c.then(l=>{we(i,l,a,s,r)}).catch(l=>J(l,r,t)).finally(()=>n.result=void 0)}}}function we(e,t,r,n,i){if(ve&&typeof t=="function"){let o=t.apply(r,n);o instanceof Promise?o.then(s=>we(e,s,r,n)).catch(s=>J(s,i,t)):e(o)}else e(t)}var ut="x-";function E(e=""){return ut+e}function Xt(e){ut=e}var er={};function d(e,t){er[e]=t}function ne(e,t,r){if(t=Array.from(t),e._x_virtualDirectives){let o=Object.entries(e._x_virtualDirectives).map(([a,c])=>({name:a,value:c})),s=ft(o);o=o.map(a=>s.find(c=>c.name===a.name)?{name:`x-bind:${a.name}`,value:`"${a.value}"`}:a),t=t.concat(o)}let n={};return t.map(tr((o,s)=>n[o]=s)).filter(rr).map(xn(n,r)).sort(yn).map(o=>gn(e,o))}function ft(e){return Array.from(e).map(tr()).filter(t=>!rr(t))}var dt=!1,ie=new Map,nr=Symbol();function ir(e){dt=!0;let t=Symbol();nr=t,ie.set(t,[]);let r=()=>{for(;ie.get(t).length;)ie.get(t).shift()();ie.delete(t)},n=()=>{dt=!1,r()};e(r),n()}function at(e){let t=[],r=a=>t.push(a),[n,i]=Ft(e);return t.push(i),[{Alpine:I,effect:n,cleanup:r,evaluateLater:g.bind(g,e),evaluate:P.bind(P,e)},()=>t.forEach(a=>a())]}function gn(e,t){let r=()=>{},n=er[t.type]||r,[i,o]=at(e);qt(e,t.original,o);let s=()=>{e._x_ignore||e._x_ignoreSelf||(n.inline&&n.inline(e,t,i),n=n.bind(n,e,t,i),dt?ie.get(nr).push(n):n())};return s.runCleanups=o,s}var Ee=(e,t)=>({name:r,value:n})=>(r.startsWith(e)&&(r=r.replace(e,t)),{name:r,value:n}),Se=e=>e;function tr(e=()=>{}){return({name:t,value:r})=>{let{name:n,value:i}=or.reduce((o,s)=>s(o),{name:t,value:r});return n!==t&&e(n,t),{name:n,value:i}}}var or=[];function Z(e){or.push(e)}function rr({name:e}){return sr().test(e)}var sr=()=>new RegExp(`^${ut}([^:^.]+)\\b`);function xn(e,t){return({name:r,value:n})=>{let i=r.match(sr()),o=r.match(/:([a-zA-Z0-9\-:]+)/),s=r.match(/\.[^.\]]+(?=[^\]]*$)/g)||[],a=t||e[r]||r;return{type:i?i[1]:null,value:o?o[1]:null,modifiers:s.map(c=>c.replace(".","")),expression:n,original:a}}}var pt="DEFAULT",Ae=["ignore","ref","data","id","radio","tabs","switch","disclosure","menu","listbox","list","item","combobox","bind","init","for","mask","model","modelable","transition","show","if",pt,"teleport"];function yn(e,t){let r=Ae.indexOf(e.type)===-1?pt:e.type,n=Ae.indexOf(t.type)===-1?pt:t.type;return Ae.indexOf(r)-Ae.indexOf(n)}function z(e,t,r={}){e.dispatchEvent(new CustomEvent(t,{detail:r,bubbles:!0,composed:!0,cancelable:!0}))}var mt=[],ht=!1;function Te(e=()=>{}){return queueMicrotask(()=>{ht||setTimeout(()=>{Oe()})}),new Promise(t=>{mt.push(()=>{e(),t()})})}function Oe(){for(ht=!1;mt.length;)mt.shift()()}function ar(){ht=!0}function R(e,t){if(typeof ShadowRoot=="function"&&e instanceof ShadowRoot){Array.from(e.children).forEach(i=>R(i,t));return}let r=!1;if(t(e,()=>r=!0),r)return;let n=e.firstElementChild;for(;n;)R(n,t,!1),n=n.nextElementSibling}function O(e,...t){console.warn(`Alpine Warning: ${e}`,...t)}function lr(){document.body||O("Unable to initialize. Trying to load Alpine before `<body>` is available. Did you forget to add `defer` in Alpine's `<script>` tag?"),z(document,"alpine:init"),z(document,"alpine:initializing"),rt(),Vt(t=>w(t,R)),_e(t=>bn(t)),Ht((t,r)=>{ne(t,r).forEach(n=>n())});let e=t=>!V(t.parentElement,!0);Array.from(document.querySelectorAll(cr())).filter(e).forEach(t=>{w(t)}),z(document,"alpine:initialized")}var _t=[],ur=[];function fr(){return _t.map(e=>e())}function cr(){return _t.concat(ur).map(e=>e())}function Ce(e){_t.push(e)}function Re(e){ur.push(e)}function V(e,t=!1){return Q(e,r=>{if((t?cr():fr()).some(i=>r.matches(i)))return!0})}function Q(e,t){if(!!e){if(t(e))return e;if(e._x_teleportBack&&(e=e._x_teleportBack),!!e.parentElement)return Q(e.parentElement,t)}}function dr(e){return fr().some(t=>e.matches(t))}function w(e,t=R){ir(()=>{t(e,(r,n)=>{ne(r,r.attributes).forEach(i=>i()),r._x_ignore&&n()})})}function bn(e){R(e,t=>Qe(t))}function oe(e,t){return Array.isArray(t)?pr(e,t.join(" ")):typeof t=="object"&&t!==null?vn(e,t):typeof t=="function"?oLine truncated
</script>
</body>
</html>
)rawliteral";
static const char PROGMEM INDEX_HTML_APMODE[] = R"rawliteral(
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body>
<form style="width: 50%; min-width:250px;margin:0 auto;display:flex; flex-direction:column" action="set">
<h2>Wifi parameters</h2>
<div>ssid</div><input id="ssid" name="ssid">
<br><div>password</div><input id="password" name="password">
<br><div>ip</div><input id="LocalIP" name="LocalIP">
<br><div>Gateway</div><input id="Gateway" name="Gateway">
<br><div>subnet</div><input id="Subnet" name="Subnet">
<br><input type="submit" value="Save">
</form>
</body>
</html>
)rawliteral";
void handleNotFound() {
server.send(404, "text/plain", "Not found");
}
void tele() {
String r;
r = String("{") +
"\"time\":" + String(millis()) +
",\"status\":" + (status=="working"?"true":"false") +
",\"T\":" + String(T) +
//",\"To\":" + String(To) +
",\"V\":" + String(V) +
",\"F\":" + String(F) +
//",\"Fc\":" + String(Fc) +
//",\"Fi\":" + String(Fi) +
//",\"tempLastStart\":" + String(tempLastStart) +
//",\"tempLastFilament\":" + String(tempLastFilament) +
",\"Output\":" + Output + //String(map(Output, 0, 255, 0, 100))
//",\"msg\":\"" + msg + "\"" +
//",\"config\":"+ printConf() +
"}";
server.send(200, "text/html", r);
}
void get(){
server.send(200, "text/html", printConf());
}
void reset(){
resetConfiguration();
}
void set() {
bool save = false;
bool reboot = false;
String ToChange = server.arg(String("To"));
if (ToChange != "" && ToChange.toFloat() <= Tm && ToChange.toFloat() >= 120) {
save = true;
To = ToChange.toInt();
//if (To!=0) Tco = To;
}
String VoChange = server.arg(String("Vo"));
if (VoChange != "" && VoChange.toFloat() <= 20 && VoChange.toFloat() >= 5) {
save = true;
Vo = VoChange.toInt()*2;
//if (Vo!=0) Vco = Vo;
}
String KpChange = server.arg(String("Kp"));
if (KpChange != "") {
save = true;
Kp = KpChange.toDouble();
myPID.SetTunings(Kp, Ki, Kd);
}
String KiChange = server.arg(String("Ki"));
if (KiChange != "") {
save = true;
Ki = KiChange.toDouble();
myPID.SetTunings(Kp, Ki, Kd);
}
String KdChange = server.arg(String("Kd"));
if (KdChange != "") {
save = true;
Kd = KdChange.toDouble();
myPID.SetTunings(Kp, Ki, Kd);
}
String MaxChange = server.arg(String("Max"));
if (MaxChange != "") {
save = true;
Max = MaxChange.toDouble();
myPID.SetOutputLimits(0,Max);
}
String TmChange = server.arg(String("Tm"));
if (TmChange != "" && TmChange.toFloat() <= 270 && TmChange.toFloat() >= 150) {
save = true;
Tm = TmChange.toFloat();
}
String statusChange = server.arg(String("status"));
if (statusChange != "") {
if (statusChange.toFloat())
start();
else
stop();
}
String R1Change = server.arg(String("R1"));
if (R1Change != "") {
save = true;
R1 = R1Change.toInt();
}
String ssidChange = server.arg(String("ssid"));
if (ssidChange != "") {
save = true;
ssidChange.toCharArray(ssid, sizeof(ssid));
}
String passwordChange = server.arg(String("password"));
if (passwordChange != "") {
save = true;
passwordChange.toCharArray(password, sizeof(password));
}
String _ifttt_event_name = server.arg(String("ifttt_event_name"));
if (_ifttt_event_name!="") {
save = true;
ifttt_event_name = _ifttt_event_name;
}
String _ifttt_api_key = server.arg(String("ifttt_api_key"));
if (_ifttt_api_key!="") {
save = true;
ifttt_api_key = _ifttt_api_key;
}
String LocalIPChange = server.arg(String("LocalIP"));
if (LocalIPChange!="") {
save = true;
reboot = true;
LocalIP = LocalIPChange;
}
String SubnetChange = server.arg(String("Subnet"));
if (SubnetChange!="") {
save = true;
reboot = true;
Subnet = SubnetChange;
}
String gatewayChange = server.arg(String("Gateway"));
if (gatewayChange!="") {
save = true;
reboot = true;
Gateway = gatewayChange;
}
if (save) {
saveConfiguration();
return;
}
tele();
}
void handleRoot()
{
//if (apmode)
// server.send_P(200, "text/html", INDEX_HTML_APMODE);
//else
server.send_P(200, "text/html", INDEX_HTML);
}
void InitServer()
{
server.on("/", handleRoot);
server.on("/get", get);
server.on("/tele", set);
server.on("/set", set);
server.on("/reset", reset);
server.onNotFound([]() {
handleNotFound();
});
server.enableCORS(true);
server.begin();
}
@@ -1,31 +0,0 @@
#include <AccelStepper.h>
int V;
AccelStepper stepper(AccelStepper::FULL2WIRE,PIN_STEP,PIN_DIR);
int stepsPerRevolution = 200;
bool stepperEnable = false;
void initStepper(){
stepper.setPinsInverted(true,false,true); //set enable pin inverted
stepper.setEnablePin(PIN_EN);
stepper.disableOutputs();
stepper.setMaxSpeed(40*stepsPerRevolution+1);
}
void stepperRunTask(){
if (status == "stopped" && stepperEnable) {
stepper.disableOutputs();
stepperEnable = false;
}
if (status == "working" && !stepperEnable) {
stepper.enableOutputs();
stepperEnable = true;
}
if (status == "working") {
stepper.setSpeed(Vo*stepsPerRevolution);
stepper.runSpeed();
}
}
@@ -1,102 +0,0 @@
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266mDNS.h>
bool apmode = false;
IPAddress local_ip;
double tempLastWifiTask;
double tempStartWifiTask;
bool wifiReady = false;
String IpAddress2String(const IPAddress& ipAddress)
{
return String(ipAddress[0]) + String(".") +\
String(ipAddress[1]) + String(".") +\
String(ipAddress[2]) + String(".") +\
String(ipAddress[3]) ;
}
void AP(){
apmode = true;
WiFi.disconnect(true);
IPAddress local_IP(192,168,4,1);
IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);
WiFi.softAPConfig(local_IP, gateway, subnet);
unsigned char mac[6];
char APNAME[40];
WiFi.macAddress(mac);
sprintf(APNAME, "PETALOT-%02X%02X%02X", mac[3], mac[4], mac[5]);
if (WiFi.softAP(APNAME)) {
Serial.println("AP Ready");
apmode = true;
}else{
Serial.println("AP Failed!");
}
}
void wifiTask(){
if (!wifiReady){
if (millis() >= tempLastWifiTask + 500){
if (WiFi.status() == WL_CONNECTED) {
MDNS.begin("Petalot");
Serial.println();
Serial.println(WiFi.localIP());
wifiReady=true;
return;
}
if (WiFi.status() == WL_CONNECT_FAILED) {
AP();
wifiReady=true;
return;
}
if (millis() >= tempStartWifiTask + 10000){
AP();
wifiReady=true;
return;
}
Serial.print(".");
tempLastWifiTask = millis();
}
}
}
void initWiFi()
{
if (!ssid){
AP();
wifiReady=true;
return;
} else {
IPAddress localip;
localip.fromString(LocalIP.c_str());
IPAddress subnet;
subnet.fromString(Subnet.c_str());
IPAddress gatewayip;
gatewayip.fromString(Gateway.c_str());
Serial.print("Connecting to ");
Serial.print(ssid);
WiFi.begin(ssid, password); //Conexión a la red
if (!WiFi.config(localip, gatewayip, subnet,IPAddress(8, 8, 8, 8))) {
Serial.println("config wifi ips failed");
}
tempStartWifiTask = millis();
}
}
int ifttt(String value_1="", String value_2="", String value_3="")
{
if (ifttt_event_name=="" || ifttt_api_key=="") return 0;
WiFiClient client;
HTTPClient http;
http.begin(client, "http://maker.ifttt.com/trigger/" +
ifttt_event_name+"/with/key/"+ifttt_api_key+
"?value1="+value_1+"&value2="+value_2+"&value3="+value_3);
int httpCode = http.GET();
http.end();
return httpCode;
}
@@ -1,42 +0,0 @@
# Petalot
## De botella de plástico PET a filamento 3D
### Si prefieres que yo te fabrique la maquina y el cortador enviame un email a functionddd@gmail.com con el pais de envio y encantado te responderé con un presupuesto. ###
Empieza aqui: [Preguntas frecuentes](https://function3d.xyz/)
![Petalot](https://github.com/function3d/petalot/raw/master/Media/petalot_v1.1.jpg)
![Petalot](https://github.com/function3d/petalot/raw/master/Media/petalot_v1.1_2.jpg)
Este es tu projecto si eres una persona concienciada por el medio ambiente, imprimes en 3D por hobby, tienes conocimientos basicos de electronica y te gusta hacer cosas.
## Lista de materiales necesarios
- [BOM](https://github.com/function3d/petalot/blob/master/BOM.md)
## Electronica
![electronics](https://github.com/function3d/petalot/raw/master/Schematic/electronics.jpg)
- [BOM](https://github.com/function3d/petalot/blob/master/BOM.md) for electronics parts.
- [Gerber para la fabricacion de la PCB](https://github.com/function3d/petalot/raw/master/Schematic/Gerber_v1.1_2023-01-02.zip)
- [Esquema electrónico](https://github.com/function3d/petalot/tree/master/Schematic)
- [Firmware](https://github.com/function3d/petalot/tree/master/Firmware)
- [Before switching on the electronics for the first time](https://github.com/function3d/petalot/blob/5b1d409dda7f66e7040381943212c45b0bf8b62b/before%20you%20switching%20on%20the%20electronics.md)
## STLs
- [carpeta con los STLs](https://github.com/function3d/petalot/tree/master/STLs)
![petalot](https://github.com/function3d/petalot/raw/master/STLs/petalot_v1.1.png)
## Cortador de botellas
- [carpeta con los STLs](https://github.com/function3d/petalot/tree/master/STLs/Cutter)
- [Video de youtube de como hacerlo](https://www.youtube.com/watch?v=eTBnhKWMYQk)
![Cortado de botellas](https://github.com/function3d/petalot/raw/master/STLs/Cutter/bottlecutter.jpg)
## Donaciones
[![Paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/donate/?hosted_button_id=CESEXLEFEU65Q)
[![Paypal](https://i.imgur.com/SEshqeh.png)](https://www.paypal.com/donate/?hosted_button_id=CESEXLEFEU65Q)
## Redes
Sigueme en [Youtube](https://www.youtube.com/channel/UC4UBuZ5YRTo5XYFUxdkmqkg), [Tiktok](https://www.tiktok.com/@function.3d) and [Instagram](https://www.instagram.com/function.3d/) para mas tutoriales e información.
@@ -1,177 +0,0 @@
## creative commons
# [Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/)
Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible.
### Using Creative Commons Public Licenses
Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses.
* __Considerations for licensors:__ Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. [More considerations for licensors](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensors).
* __Considerations for the public:__ By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. [More considerations for the public](http://wiki.creativecommons.org/Considerations_for_licensors_and_licensees#Considerations_for_licensees).
## Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License
By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions.
### Section 1 – Definitions.
a. __Adapted Material__ means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image.
b. __Adapter's License__ means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License.
c. __BY-NC-SA Compatible License__ means a license listed at [creativecommons.org/compatiblelicenses](http://creativecommons.org/compatiblelicenses), approved by Creative Commons as essentially the equivalent of this Public License.
d. __Copyright and Similar Rights__ means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights.
e. __Effective Technological Measures__ means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements.
f. __Exceptions and Limitations__ means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material.
g. __License Elements__ means the license attributes listed in the name of a Creative Commons Public License. The License Elements of this Public License are Attribution, NonCommercial, and ShareAlike.
h. __Licensed Material__ means the artistic or literary work, database, or other material to which the Licensor applied this Public License.
i. __Licensed Rights__ means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license.
h. __Licensor__ means the individual(s) or entity(ies) granting rights under this Public License.
i. __NonCommercial__ means not primarily intended for or directed towards commercial advantage or monetary compensation. For purposes of this Public License, the exchange of the Licensed Material for other material subject to Copyright and Similar Rights by digital file-sharing or similar means is NonCommercial provided there is no payment of monetary compensation in connection with the exchange.
j. __Share__ means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them.
k. __Sui Generis Database Rights__ means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world.
l. __You__ means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning.
### Section 2 – Scope.
a. ___License grant.___
1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to:
A. reproduce and Share the Licensed Material, in whole or in part, for NonCommercial purposes only; and
B. produce, reproduce, and Share Adapted Material for NonCommercial purposes only.
2. __Exceptions and Limitations.__ For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions.
3. __Term.__ The term of this Public License is specified in Section 6(a).
4. __Media and formats; technical modifications allowed.__ The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material.
5. __Downstream recipients.__
A. __Offer from the Licensor – Licensed Material.__ Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License.
B. __Additional offer from the Licensor – Adapted Material.__ Every recipient of Adapted Material from You automatically receives an offer from the Licensor to exercise the Licensed Rights in the Adapted Material under the conditions of the Adapter’s License You apply.
C. __No downstream restrictions.__ You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material.
6. __No endorsement.__ Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i).
b. ___Other rights.___
1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise.
2. Patent and trademark rights are not licensed under this Public License.
3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties, including when the Licensed Material is used other than for NonCommercial purposes.
### Section 3 – License Conditions.
Your exercise of the Licensed Rights is expressly made subject to the following conditions.
a. ___Attribution.___
1. If You Share the Licensed Material (including in modified form), You must:
A. retain the following if it is supplied by the Licensor with the Licensed Material:
i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated);
ii. a copyright notice;
iii. a notice that refers to this Public License;
iv. a notice that refers to the disclaimer of warranties;
v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable;
B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and
C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License.
2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information.
3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable.
b. ___ShareAlike.___
In addition to the conditions in Section 3(a), if You Share Adapted Material You produce, the following conditions also apply.
1. The Adapter’s License You apply must be a Creative Commons license with the same License Elements, this version or later, or a BY-NC-SA Compatible License.
2. You must include the text of, or the URI or hyperlink to, the Adapter's License You apply. You may satisfy this condition in any reasonable manner based on the medium, means, and context in which You Share Adapted Material.
3. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, Adapted Material that restrict exercise of the rights granted under the Adapter's License You apply.
### Section 4 – Sui Generis Database Rights.
Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material:
a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database for NonCommercial purposes only;
b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material, including for purposes of Section 3(b); and
c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database.
For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights.
### Section 5 – Disclaimer of Warranties and Limitation of Liability.
a. __Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You.__
b. __To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You.__
c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability.
### Section 6 – Term and Termination.
a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically.
b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates:
1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
2. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or
For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License.
c. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License.
d. Sections 1, 5, 6, 7, and 8 survive termination of this Public License.
### Section 7 – Other Terms and Conditions.
a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed.
b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License.
### Section 8 – Interpretation.
a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License.
b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions.
c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor.
d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority.
```
Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at [creativecommons.org/policies](http://creativecommons.org/policies), Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses.
Creative Commons may be contacted at [creativecommons.org](http://creativecommons.org/).
```
@@ -1,43 +0,0 @@
# Petalot
[en Español](https://github.com/function3d/petalot/blob/master/LEEME.md)
## From PET Bottle To 3D Filament
### If you prefer that I manufacture the machine and the cutter send me an email to functionddd@gmail.com with the shipping country and I will be happy to reply with a quote. ###
Start here: [FAQs](https://function3d.xyz/)
![Petalot](https://github.com/function3d/petalot/raw/master/Media/petalot_v1.1.jpg)
![Petalot](https://github.com/function3d/petalot/raw/master/Media/petalot_v1.1_2.jpg)
This is your project if you are an environmentally conscious person, you 3D print for hobby, you have basic notions of electronics and you like to make things.
## Bill of material
- [BOM](https://github.com/function3d/petalot/blob/master/BOM.md)
## Electronics
![electronics](https://github.com/function3d/petalot/raw/master/Schematic/electronics.jpg)
- [See BOM](https://github.com/function3d/petalot/blob/master/BOM.md) for electronics parts.
- [Gerber for PCB fabrication, just upload this zip file to jlcpcb.com and order your PCBs](https://github.com/function3d/petalot/raw/master/Schematic/Gerber_v1.1_2023-01-02.zip)
- [Schematic](https://github.com/function3d/petalot/tree/master/Schematic)
- [Firmware](https://github.com/function3d/petalot/tree/master/Firmware)
- [Before switching on the electronics for the first time](https://github.com/function3d/petalot/blob/5b1d409dda7f66e7040381943212c45b0bf8b62b/before%20you%20switching%20on%20the%20electronics.md)
## STLs
- [STLs folder and Print Guide](https://github.com/function3d/petalot/tree/master/STLs)
![petalot](https://github.com/function3d/petalot/raw/master/STLs/petalot_v1.1.png)
## Bottle cutter
- [STLs folder](https://github.com/function3d/petalot/tree/master/STLs) Two versions are available for 608zz and 6200zz bearings
- [Youtube video how to make it](https://www.youtube.com/watch?v=eTBnhKWMYQk)
![Bottle cutter](https://github.com/function3d/petalot/raw/master/STLs/cutter.jpg)
## Donation
[![Paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/donate/?hosted_button_id=CESEXLEFEU65Q)
[![Paypal](https://i.imgur.com/SEshqeh.png)](https://www.paypal.com/donate/?hosted_button_id=CESEXLEFEU65Q)
## Social
Follow me on [Youtube](https://www.youtube.com/channel/UC4UBuZ5YRTo5XYFUxdkmqkg), [Tiktok](https://www.tiktok.com/@function.3d) and [Instagram](https://www.instagram.com/function.3d/) for more tutorials and information.
@@ -1,5 +0,0 @@
My digital files are exclusively reserved for private and personal use. It means not selling the model or any derivative of the model for economic or financial gain.
[License](https://creativecommons.org/licenses/by-nc-sa/4.0/)
@@ -1,15 +0,0 @@
STLs are exclusively reserved for private and personal use. It means not selling the model or any derivative of the model for economic gain.
[License](https://creativecommons.org/licenses/by-nc-sa/4.0/)
![petalot](https://github.com/function3d/petalot/raw/master/STLs/petalot_v1.1.png)
# Print Guide
Material Usage: 425g.
I slice the parts in Cura with 2 perimeters and alternate extra wall, 4 top and bottom layers, seam: "sharpest corner" and "smart hiding", 0.44mm line width, 30% infill and 0.2mm layer height, gyroid infill. Combing mode: not on outer surface.
if you have tolerance problems try changing the "horizontal expansion" (-0.05, -0.1, ...).
All the parts can be printed on a 200mm x 200mm build plate.
@@ -1,851 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="210mm"
height="297mm"
viewBox="0 0 210 297"
version="1.1"
id="svg5"
inkscape:version="1.1 (c68e22c387, 2021-05-23)"
sodipodi:docname="petalot.svg"
inkscape:export-filename="/home/raul/Downloads/petalot/petalot.png"
inkscape:export-xdpi="383.63901"
inkscape:export-ydpi="383.63901"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<sodipodi:namedview
id="namedview7"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:document-units="mm"
showgrid="false"
inkscape:zoom="0.5"
inkscape:cx="322"
inkscape:cy="539"
inkscape:window-width="1920"
inkscape:window-height="1013"
inkscape:window-x="0"
inkscape:window-y="42"
inkscape:window-maximized="1"
inkscape:current-layer="g148858"
inkscape:snap-global="false" />
<defs
id="defs2">
<clipPath
clipPathUnits="userSpaceOnUse"
id="clipPath82912">
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 40.453027,119.45215 c 44.635314,9.17586 54.446593,9.87404 54.446593,15.18544 0,5.3114 36.82156,17.54888 36.82156,17.54888 l 35.53026,0.87135 8.11041,-13.43058 15.08281,10.80251 4.14298,6.22418 30.449,2.00525 39.47729,3.62243 c 0,0 7.688,33.2111 3.61268,32.65571 -4.07534,-0.55539 -152.1625,2.17947 -158.26161,2.17947 -6.09911,0 -67.41208,-1.237 -70.420991,-1.74428 -3.00891,-0.50727 -25.284166,-3.25878 -25.284166,-3.25878 0,0 2.795045,-32.31634 2.243126,-36.42722 -0.551919,-4.11087 24.050058,-36.23436 24.050058,-36.23436 z"
id="path82914" />
</clipPath>
</defs>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1">
<g
id="g148858"
transform="matrix(0.77679121,0,0,0.77679121,-14.68397,6.7475876)">
<g
id="g82795"
transform="matrix(0.9246308,0,0,0.9246308,19.913526,-5.6037353)">
<image
width="243.85699"
height="133.53697"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 Mpux2OwAKGq4L2zO8DF0tjYRl5Line truncated
id="image1096"
x="33.541008"
y="29.13336" />
<g
id="g39755"
transform="translate(4.8633458,-6.8014546)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="100.32103"
y="54.616344"
id="text2708"><tspan
sodipodi:role="line"
id="tspan2706"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="100.32103"
y="54.616344">Large gear 1 &amp; 2</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 116.00651,56.454336 114.07008,66.52633 97.856073,71.454446"
id="path31931"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.809891;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 98.726484,56.273467 41.699976,0.166904"
id="path32046"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.731902;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 107.8442,56.338983 -1.93643,9.219306 -17.261876,5.340288"
id="path39748"
sodipodi:nodetypes="ccc" />
</g>
<g
id="g39767"
transform="translate(100.22737,14.018776)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="100.32103"
y="54.616344"
id="text39759"><tspan
sodipodi:role="line"
id="tspan39757"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="100.32103"
y="54.616344">Spool holder</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 116.00651,56.454336 -1.93643,10.071994 -13.83296,4.182533"
id="path39761"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.781153;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 98.712115,56.259098 131.80701,56.45474"
id="path39763"
sodipodi:nodetypes="cc" />
</g>
<g
id="g46547"
transform="translate(54.581895,26.433922)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="108.38316"
y="54.616344"
id="text46541"><tspan
sodipodi:role="line"
id="tspan46539"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="108.38316"
y="54.616344">Guide</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 116.00651,56.454336 -1.93643,10.071994 -13.83296,4.182533"
id="path46543"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.582413;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 106.06099,56.259098 18.39715,0.195642"
id="path46545"
sodipodi:nodetypes="cc" />
</g>
<g
id="g50619"
transform="translate(21.594566,18.448913)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="95.728241"
y="54.616344"
id="text50613"><tspan
sodipodi:role="line"
id="tspan50611"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="95.728241"
y="54.616344">Filament sensor</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 116.00651,56.454336 -1.93643,10.071994 -13.83296,4.182533"
id="path50615"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.858045;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 95.294114,56.259098 135.22501,56.45474"
id="path50617"
sodipodi:nodetypes="cc" />
</g>
<g
id="g53839"
transform="translate(-15.400044,64.878539)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="96.538437"
y="61.134396"
id="text53833"><tspan
sodipodi:role="line"
id="tspan53831"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="96.538437"
y="61.134396">Filament hook</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.59346,56.123594 117.52989,46.0516 131.36285,41.869067"
id="path53835"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.826255;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 96.746137,56.259098 133.77299,56.45474"
id="path53837"
sodipodi:nodetypes="cc" />
</g>
<g
id="g58317"
transform="translate(-63.177047,57.81868)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="103.13367"
y="61.134396"
id="text58311"><tspan
sodipodi:role="line"
id="tspan58309"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="103.13367"
y="61.134396">Body 1 &amp; 2</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.59346,56.123594 117.52989,46.0516 131.36285,41.869067"
id="path58313"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.711436;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 102.31729,56.259098 129.7684,56.45474"
id="path58315"
sodipodi:nodetypes="cc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 125.45292,56.123594 127.38935,46.0516 158.55507,27.349235"
id="path60503"
sodipodi:nodetypes="ccc" />
</g>
<g
id="g60650"
transform="translate(-85.193809,-9.5004513)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="100.32103"
y="54.616344"
id="text60644"><tspan
sodipodi:role="line"
id="tspan60642"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="100.32103"
y="54.616344">Middle gear</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 115.44014,56.454336 1.93643,10.071994 5.61486,6.217985"
id="path60646"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.781153;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 98.712115,56.259098 131.80701,56.45474"
id="path60648"
sodipodi:nodetypes="cc" />
</g>
<g
id="g62771"
transform="translate(-50.11448,-36.457534)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="100.32103"
y="54.616344"
id="text62765"><tspan
sodipodi:role="line"
id="tspan62763"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="100.32103"
y="54.616344">Pulley centering</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 115.44014,56.454336 1.93643,10.071994 -0.14987,22.279295"
id="path62767"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.815827;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 98.729452,56.276435 142.6035,56.437403"
id="path62769"
sodipodi:nodetypes="cc" />
</g>
<g
id="g68305"
transform="translate(-11.558455,-23.631093)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="108.38316"
y="54.616344"
id="text68299"><tspan
sodipodi:role="line"
id="tspan68297"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="108.38316"
y="54.616344">Pulley</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 116.00651,56.454336 114.07008,66.52633 100.02221,83.722363"
id="path68301"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.582413;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 106.06099,56.259098 18.39715,0.195642"
id="path68303"
sodipodi:nodetypes="cc" />
</g>
<g
id="g74360"
transform="translate(139.48697,50.350284)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="100.32103"
y="54.616344"
id="text74354"><tspan
sodipodi:role="line"
id="tspan74352"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="100.32103"
y="54.616344">Electronic box</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 116.00651,56.454336 -1.93643,10.071994 -13.83296,4.182533"
id="path74356"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.831547;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 98.779669,56.259098 136.28235,56.45474"
id="path74358"
sodipodi:nodetypes="cc" />
</g>
<g
id="g77394"
transform="translate(-90.005168,47.317306)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="96.538437"
y="61.134396"
id="text77388"><tspan
sodipodi:role="line"
id="tspan77386"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="96.538437"
y="61.134396">Motor mount</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.59346,56.123594 117.52989,46.0516 145.48308,30.667961"
id="path77390"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.826255;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 96.746137,56.259098 130.34187,56.45474"
id="path77392"
sodipodi:nodetypes="cc" />
</g>
</g>
<g
id="g131022"
transform="rotate(15.101355,400.23319,253.41786)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26057px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 103.52667,169.08328 22.68574,0.46219"
id="path131012"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.977px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.074425"
x="109.28236"
y="168.83694"
id="text131016"><tspan
sodipodi:role="line"
id="tspan131014"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.074425"
x="109.28236"
y="168.83694">~7.5cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.41475,168.4054 -0.91994,0.65029 0.82651,0.75192"
id="path131018"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 125.24347,168.93304 0.91994,0.65029 -0.8265,0.75192"
id="path131020"
sodipodi:nodetypes="ccc" />
</g>
<g
id="g137106"
transform="matrix(0.61760417,-0.58424548,0.56002099,0.6443195,-1.9632195,53.594604)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26057px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.84864,169.38922 17.09812,0.20693"
id="path137096"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.977px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.074425"
x="131.73344"
y="186.15813"
id="text137100"
transform="matrix(1.1393506,0.05538607,-0.22379006,0.86681407,0,0)"><tspan
sodipodi:role="line"
id="tspan137098"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.074425"
x="131.73344"
y="186.15813">~6.5cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.88984,168.84381 -1.08031,0.3509 0.584,0.94813"
id="path137102"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 122.02682,168.94586 0.91994,0.65029 -0.8265,0.75192"
id="path137104"
sodipodi:nodetypes="ccc" />
</g>
<g
id="g140749"
transform="matrix(0.72352605,-0.67959515,0.6560671,0.74947334,75.083477,85.897618)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26057px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.84864,169.38922 17.09812,0.20693"
id="path140739"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.977px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.074425"
x="131.78894"
y="186.30557"
id="text140743"
transform="matrix(1.1393506,0.05538607,-0.22379006,0.86681408,0,0)"><tspan
sodipodi:role="line"
id="tspan140741"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.074425"
x="131.78894"
y="186.30557">~7.5cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.88984,168.84381 -1.08031,0.3509 0.584,0.94813"
id="path140745"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 122.02682,168.94586 0.91994,0.65029 -0.8265,0.75192"
id="path140747"
sodipodi:nodetypes="ccc" />
</g>
</g>
<g
id="g166739"
transform="matrix(0.97834024,0,0,0.97834024,2.369555,17.464593)">
<image
width="237.23659"
height="59.891426"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 BTz00EO9xvj9fmKxWE+QDGC2OphwLine truncated
id="image82654"
x="23.698118"
y="124.73057"
clip-path="url(#clipPath82912)"
transform="matrix(0.77679121,0,0,0.77679121,-6.5134272,2.8479311)" />
<path
style="fill:none;stroke:#000000;stroke-width:0.202408px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 50.864619,136.97981 19.144505,0.16075"
id="path82949" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.61019px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0652549"
x="56.66888"
y="136.54784"
id="text53833-3"><tspan
sodipodi:role="line"
id="tspan53831-6"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.0652549"
x="56.66888"
y="136.54784">~8cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.205526px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 51.579218,136.47468 -0.714599,0.50513 0.642018,0.58409"
id="path83064"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.205526px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 69.294525,136.63542 0.714599,0.50514 -0.642019,0.58408"
id="path83241"
sodipodi:nodetypes="ccc" />
<g
id="g99482"
transform="matrix(0.77679121,0,0,0.77679121,-6.5134272,2.8479311)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26057px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.84864,169.38922 17.09812,0.20693"
id="path91562"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.977px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.074425"
x="109.28236"
y="168.83694"
id="text91566"><tspan
sodipodi:role="line"
id="tspan91564"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.074425"
x="109.28236"
y="168.83694">~5cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.76858,168.73893 -0.91994,0.65029 0.82651,0.75192"
id="path91568"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 122.02682,168.94586 0.91994,0.65029 -0.8265,0.75192"
id="path91570"
sodipodi:nodetypes="ccc" />
</g>
<g
id="g99494"
transform="matrix(0.77679121,0,0,0.77679121,10.059194,2.8479311)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26057px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.84864,164.6939 8.31169,0.20693"
id="path99484"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.93212px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.073303"
x="106.29146"
y="163.44327"
id="text99488"><tspan
sodipodi:role="line"
id="tspan99486"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.073303"
x="106.29146"
y="163.44327">~2.5cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.76858,164.04361 -0.91994,0.65029 0.82651,0.75192"
id="path99490"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 113.24039,164.25054 0.91994,0.65029 -0.8265,0.75192"
id="path99492"
sodipodi:nodetypes="ccc" />
</g>
<path
style="fill:none;stroke:#000000;stroke-width:0.227254px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 103.56688,132.53287 24.13287,0.16074"
id="path114985" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.61019px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0652549"
x="109.37113"
y="132.10089"
id="text114989"><tspan
sodipodi:role="line"
id="tspan114987"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.0652549"
x="109.37113"
y="132.10089">~9cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.205526px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 104.28148,132.02774 -0.7146,0.50513 0.64202,0.58409"
id="path114991"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.205526px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 126.98516,132.18848 0.71459,0.50513 -0.64201,0.58409"
id="path114993"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.227254px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 133.11615,132.53287 20.77076,0.16074"
id="path123677"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.61019px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0652549"
x="138.92041"
y="132.10089"
id="text123681"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.0652549"
x="138.92041"
y="132.10089"
id="tspan125443">~8cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.205526px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 133.83075,132.02774 -0.7146,0.50513 0.64201,0.58409"
id="path123683"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.205526px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 153.17231,132.18848 0.7146,0.50513 -0.64201,0.58409"
id="path123685"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.26877;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 14.639158,150.23182 180.085072,0.15501"
id="path127585"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.61019px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0652549"
x="83.983498"
y="149.43123"
id="text127589"><tspan
sodipodi:role="line"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.0652549"
x="83.983498"
y="149.43123"
id="tspan127587">~70cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.468386px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 15.940922,149.02728 -1.628536,1.15119 1.46314,1.33111"
id="path127591"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.479927px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 193.32347,149.15744 1.66867,1.17956 -1.49919,1.3639"
id="path127593"
sodipodi:nodetypes="ccc" />
<g
id="g146565"
transform="matrix(0.77679121,0,0,0.77679121,115.56309,16.06875)">
<path
style="fill:none;stroke:#000000;stroke-width:0.217804px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.03802,165.65657 0.21021,-5.71683"
id="path146555"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:2.93212px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.073303"
x="107.69308"
y="163.44327"
id="text146559"><tspan
sodipodi:role="line"
id="tspan146557"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.073303"
x="107.69308"
y="163.44327">~1.6cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.38937,164.83471 0.65029,0.91994 0.75192,-0.82651"
id="path146561"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.5963,160.7478 0.65029,-0.91994 0.75192,0.8265"
id="path146563"
sodipodi:nodetypes="ccc" />
</g>
</g>
<g
id="g163411"
transform="matrix(0.54563481,0,0,0.54563481,35.206856,123.4779)">
<image
width="180.6828"
height="156.20868"
preserveAspectRatio="none"
xlink:href="data:image/png;base64,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 wtdpSQcq2ft0oWFgY1SllM35poyTLine truncated
id="image149003"
x="48.658947"
y="120.34637" />
<g
id="g149015"
transform="matrix(1.3318064,0,0,1.3318064,96.244219,70.612028)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="108.38316"
y="54.616344"
id="text149009"><tspan
sodipodi:role="line"
id="tspan149007"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="108.38316"
y="54.616344">Pulley</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 116.00651,56.454336 114.07008,66.52633 67.604349,79.883777"
id="path149011"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.582413;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 106.06099,56.259098 18.39715,0.195642"
id="path149013"
sodipodi:nodetypes="cc" />
</g>
<g
id="g149246"
transform="matrix(1.3318064,0,0,1.3318064,62.98306,102.11153)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="102.97051"
y="97.785568"
id="text149240"><tspan
sodipodi:role="line"
id="tspan149238"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="102.97051"
y="97.785568">Spacer 20</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.15708,91.734411 112.8193,80.846835 67.604349,76.032377"
id="path149242"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.610096;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 103.50212,92.076768 23.51489,0.16796"
id="path149244"
sodipodi:nodetypes="cc" />
</g>
<g
id="g154457"
transform="matrix(-1.3318064,0,0,1.3318064,166.08386,110.44057)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="-127.38057"
y="97.785568"
id="text154451"
transform="scale(-1,1)"><tspan
sodipodi:role="line"
id="tspan154449"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="-127.38057"
y="97.785568">Spacer 9</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.15708,91.734411 112.8193,80.846835 67.604349,76.032377"
id="path154453"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.610096;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 103.50212,92.076768 23.51489,0.16796"
id="path154455"
sodipodi:nodetypes="cc" />
</g>
<g
id="g156321"
transform="matrix(1.3318064,0,0,-1.3318064,62.98306,251.39268)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="102.97051"
y="-95.293358"
id="text156315"
transform="scale(1,-1)"><tspan
sodipodi:role="line"
id="tspan156313"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="102.97051"
y="-95.293358">Spacer 12</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.15708,91.734411 112.90689,77.748912 67.604349,76.032377"
id="path156317"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.610096;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 103.50212,92.076768 23.51489,0.16796"
id="path156319"
sodipodi:nodetypes="cc" />
</g>
<g
id="g158820"
transform="matrix(-1.3318064,0,0,-1.3318064,169.78625,250.29088)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="-126.04752"
y="-95.293358"
id="text158814"
transform="scale(-1)"><tspan
sodipodi:role="line"
id="tspan158812"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="-126.04752"
y="-95.293358">Spacer 12</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.15708,91.734411 112.90689,77.748912 67.604349,76.032377"
id="path158816"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.610096;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 103.50212,92.076768 23.51489,0.16796"
id="path158818"
sodipodi:nodetypes="cc" />
</g>
<g
id="g158832"
transform="matrix(0,-4.1517573,4.1517573,0,-523.70606,654.57754)">
<path
style="fill:none;stroke:#000000;stroke-width:0.26057px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 105.84864,169.38922 17.09812,0.20693"
id="path158822"
sodipodi:nodetypes="cc" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:1.95834px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.0489586"
x="112.65816"
y="169.03854"
id="text158826"><tspan
sodipodi:role="line"
id="tspan158824"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.0489586"
x="112.65816"
y="169.03854">75cm</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 106.76858,168.73893 -0.91994,0.65029 0.82651,0.75192"
id="path158828"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.264583px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 122.02682,168.94586 0.91994,0.65029 -0.8265,0.75192"
id="path158830"
sodipodi:nodetypes="ccc" />
</g>
<g
id="g166749"
transform="matrix(-1.3318064,0,0,1.3318064,224.45271,126.16978)">
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:4.82986px;line-height:1.25;font-family:sans-serif;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.120747"
x="-125.59028"
y="97.785568"
id="text166743"
transform="scale(-1,1)"><tspan
sodipodi:role="line"
id="tspan166741"
style="font-style:normal;font-variant:normal;font-weight:600;font-stretch:normal;font-family:Montserrat;-inkscape-font-specification:'Montserrat Semi-Bold';fill:#1a1a1a;stroke-width:0.120747"
x="-125.59028"
y="97.785568">washers</tspan></text>
<path
style="fill:none;stroke:#000000;stroke-width:0.765;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 115.15708,91.734411 112.8193,80.846835 90.088677,66.419238"
id="path166745"
sodipodi:nodetypes="ccc" />
<path
style="fill:none;stroke:#000000;stroke-width:0.610096;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 103.50212,92.076768 23.51489,0.16796"
id="path166747"
sodipodi:nodetypes="cc" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 791 KiB

File diff suppressed because it is too large. Load diff

Before

Width:  |  Height:  |  Size: 1.1 MiB

@@ -1,24 +0,0 @@
# Before switching on the electronics for the first time
## Set to 5V output on D3 DC-DC step down
### Option 1
- You put 12v between IN and GND
- With a multimeter you measure VO and GND
- Turn the potentiometer until you measure 5V
### Option 2
- Cut the jumper on ADJ
- Put a drop of tin on the 5V jumper
# Adjust the reference voltage of the stepper drive
You have to adjust it to supply 1A to the motor, this way the motor will hardly heat up and it will have enough power.
- Turn off the electronics
- Disconnect the motor
- Turn on the electronics
- Stop from the web interface so that the hotend is not heating up
- Measure the voltage between the small potentiometer on the driver and ground
- Turn the potentiometer until you measure is about 0.4V (0.4*2.5=1A)
- Once adjusted, turn off the electronics
- Connect the motor
- Turn on the electronics again
Never connect/disconnect the motor with the electronic on
@@ -1 +0,0 @@
This thing was created by Thingiverse user Tofna1, and is licensed under cc-nc-nd.
@@ -1 +0,0 @@
PETamentor2 SS by Tofna1 on Thingiverse: https://www.thingiverse.com/thing:5888962
@@ -1,37 +0,0 @@
Watch the unmount video here :
https://www.youtube.com/watch?v=Mc2vt349XlI
Here the screws list with the chronology of appearance for the 6200zz version :
0.28 - 2x M8 nuts
0.35 - 2x M8 washer
0.41 - 2x 6200zz bearing with 2 printed spacers
0.46 - 1x M8 washer + 1x M8 nut
0.53 - 2x M8 nuts
1.01 - 2x M8 washer
1.10 - 3x wood screw diameter 4mm length 15mm
1.21 - 2x wood screw diameter 4mm length 15mm
1.33 - 4x M3x10 screw
2.05 - 1x Original PETamentor cutter motor
2.13 - 1x M8x50 screw with a 8mm notch
2.31 - 1x M8 nut
2.40 - 3x M3x10 screw
3.03 - 1x M8x40 + 1x M8x50 screws
3.14 - 3x M3 nuts
You will have to use the 6200zz version of the base... obviously ;)
######################
For the 608zz version,
Identical to the 6200zz version except :
- Use the 608zz base... obviously ;)
- At chronology 1.01, add an M8 washer on the screw of the lowest bearing.
- No need to print the spacers
######################
by Mak3D
Loaded 100 of 735 files, more files were not shown because too many files have changed in this diff. Show more