commit 8cf912993d843059e1c9f18df160f23d600c2b4f Author: JonatanRek Date: Fri Aug 23 13:39:42 2019 +0200 History Clean Up diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..21affa7 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,31 @@ +# https://editorconfig.org/ + +root = true + +[*] +tab_width = 4 + +[*.{php,phpt,inc}] +charset = utf-8 +end_of_line = lf +indent_size = 2 +indent_style = tab +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +charset = utf-8 +end_of_line = lf +indent_style = tab +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 80 + +[COMMIT_EDITMSG] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = tab +trim_trailing_whitespace = true +insert_final_newline = true +max_line_length = 80 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f90b54e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +.ftpconfig +config.php +_nemazat/index.html +_nemazat/css/main.css.map +_nemazat/css/main.css +_nemazat/css/font-awesome.min.css diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..f23fa1d --- /dev/null +++ b/.htaccess @@ -0,0 +1,12 @@ +RewriteEngine On +RewriteBase /vasek/home/ + +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteCond %{REQUEST_FILENAME} !.css +RewriteCond %{REQUEST_FILENAME} !.js +RewriteRule (.*) index.php?url=$1 [QSA,L] + +RewriteCond %{HTTPS} off +RewriteCond %{REQUEST_FILENAME} !api.php +RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..db8a759 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 JonatanRek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..2cfe30d --- /dev/null +++ b/README.md @@ -0,0 +1,67 @@ + +# Smart_Home + +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +[![Discord](https://img.shields.io/discord/601817042475286540.svg?color=Blue&label=Discord&logo=Discord)](https://discord.gg/nMe5evu) + +PHP, JS, HTML - Supports PWA + + +# Installation +default user is Admin and his password id ESP + +# Discord +https://discord.gg/nMe5evu + +## Browser (Desktop PWA) + + + + + + + +## Mobile (PWA) + + + + + + + +API +POST Message (Sp铆na膷) +``` +{ + "token":"2" +} +``` +Answer (Sp铆na膷) +``` +{ + "device":{ + "hostname":"2", + "sleepTime":0 + }, + "state":"succes", + "value":"0" + } +} +``` +POST Message (Sensor) +``` +{ + "token":"4", + "values":{ + "door":{ + "value":1 + } + } +} +``` +Answer (Sensor) +``` +{ + +} +``` diff --git a/_FIRMWARE/drivers/CH341SER/CH341PT.DLL b/_FIRMWARE/drivers/CH341SER/CH341PT.DLL new file mode 100644 index 0000000..f3f7825 Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/CH341PT.DLL differ diff --git a/_FIRMWARE/drivers/CH341SER/CH341S64.SYS b/_FIRMWARE/drivers/CH341SER/CH341S64.SYS new file mode 100644 index 0000000..18f78a8 Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/CH341S64.SYS differ diff --git a/_FIRMWARE/drivers/CH341SER/CH341S98.SYS b/_FIRMWARE/drivers/CH341SER/CH341S98.SYS new file mode 100644 index 0000000..ec20708 Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/CH341S98.SYS differ diff --git a/_FIRMWARE/drivers/CH341SER/CH341SER.INF b/_FIRMWARE/drivers/CH341SER/CH341SER.INF new file mode 100644 index 0000000..3664779 --- /dev/null +++ b/_FIRMWARE/drivers/CH341SER/CH341SER.INF @@ -0,0 +1,213 @@ +; CH341SER.INF +; Driver for CH341 (USB=>SERIAL chip) V3.4 +; WDM&VXD for Windows 98/Me/2000/XP/Server2003/Vista/64bit Vista/Server2008/Win7/64bit Win7 +; Copyright (C) W.ch 2001-2014 +; + +[Version] +Signature = "$Chicago$" +Class = Ports +ClassGuid = {4D36E978-E325-11CE-BFC1-08002BE10318} +Provider = %WinChipHead% +DriverVer = 08/08/2014, 3.4.2014.08 +CatalogFile = CH341SER.CAT + +[ControlFlags] +ExcludeFromSelect = USB\VID_1A86&PID_7523 +ExcludeFromSelect = USB\VID_1A86&PID_5523 +ExcludeFromSelect = USB\VID_4348&PID_5523 +ExcludeFromSelect = USB\VID_4348&PID_5523&REV_0250 +ExcludeFromSelect = USBSERPORT\SER5523 +ExcludeFromSelect = CH341PORT\SER5523 + +[Manufacturer] +%WinChipHead% = WinChipHead,NT,NTamd64,NTia64 + +[WinChipHead] +%CH340SER.DeviceDesc% = CH341SER_Install, USB\VID_1A86&PID_7523 +%CH341ASER.DeviceDesc% = CH341SER_Install, USB\VID_1A86&PID_5523 +%CH341SER.DeviceDesc% = CH341SER_Install, USB\VID_4348&PID_5523 +%CH340SER.DeviceDesc% = CH341SER_Install, USB\VID_4348&PID_5523&REV_0250 +%CH341S98.DeviceDesc% = CH341S98_Install, USBSERPORT\SER5523 +%CH341S98.DeviceDesc% = CH341S98_Install, CH341PORT\SER5523 + +[WinChipHead.NT] +%CH340SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_1A86&PID_7523 +%CH341ASER.DeviceDesc% = CH341SER_Install.NT, USB\VID_1A86&PID_5523 +%CH341SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_4348&PID_5523 +%CH340SER.DeviceDesc% = CH341SER_Install.NT, USB\VID_4348&PID_5523&REV_0250 + +[WinChipHead.NTamd64] +%CH340SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_1A86&PID_7523 +%CH341ASER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_1A86&PID_5523 +%CH341SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_4348&PID_5523 +%CH340SER.DeviceDesc% = CH341SER_Inst.NTamd64, USB\VID_4348&PID_5523&REV_0250 + +[WinChipHead.NTia64] +%CH340SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_1A86&PID_7523 +%CH341ASER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_1A86&PID_5523 +%CH341SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_4348&PID_5523 +%CH340SER.DeviceDesc% = CH341SER_Inst.NTia64, USB\VID_4348&PID_5523&REV_0250 + +[CH341SER_Install] +DelFiles = CH341S98.DelFiles.SYS +CopyFiles = CH341SER.CopyFiles.SYS, CH341SER.CopyFiles.DLL +AddReg = CH341SER.9X.AddReg, CH341SER.AddReg + +[CH341SER_Install.NT] +CopyFiles = CH341SER.NT.CopyFiles.SYS, CH341SER.CopyFiles.DLL +AddReg = CH341SER.NT.AddReg, CH341SER.AddReg + +[CH341SER_Install.NT.HW] +AddReg = CH341SER.NT.HW.AddReg + +[CH341SER_Inst.NTamd64] +CopyFiles = CH341SER.NT.CopyFiles.SYSA64 +AddReg = CH341SER.NT.AddReg, CH341SER.AddReg + +[CH341SER_Inst.NTamd64.HW] +AddReg = CH341SER.NT.HW.AddReg + +[CH341SER_Inst.NTia64] +CopyFiles = CH341SER.NT.CopyFiles.SYSI64 +AddReg = CH341SER.NT.AddReg, CH341SER.AddReg + +[CH341SER_Inst.NTia64.HW] +AddReg = CH341SER.NT.HW.AddReg + +[CH341S98_Install] +DelFiles = CH341S98.DelFiles.SYS +CopyFiles = CH341S98.CopyFiles.VXD, CH341SER.CopyFiles.SYS +AddReg = CH341S98.9X.AddReg, CH341S98.AddReg + +;[CH341S98_Install.NT] + +[CH341S98.DelFiles.SYS] +CH341S98.SYS, , , 1 + +[CH341SER.CopyFiles.SYS] +CH341S98.SYS, , , 2 + +[CH341SER.NT.CopyFiles.SYS] +CH341SER.SYS, , , 2 + +[CH341SER.NT.CopyFiles.SYSA64] +CH341S64.SYS, , , 2 + +[CH341SER.NT.CopyFiles.SYSI64] +;CH341I64.SYS, , , 2 + +[CH341S98.CopyFiles.VXD] +CH341SER.VXD, , , 2 + +[CH341SER.CopyFiles.DLL] +CH341PT.DLL, , , 2 +;安装DLL是可选的,DLL可以用于识别CH341端口和监视CH341端口的插拔事件 + +[CH341SER.9X.AddReg] +HKR, , DevLoader, , *NTKERN +HKR, , NTMPDriver, , CH341S98.SYS + +[CH341SER.NT.AddReg] +HKR,,EnumPropPages32,,"MsPorts.dll,SerialPortPropPageProvider" + +[CH341SER.NT.HW.AddReg] +HKR,,"UpperFilters",0x00010000,"serenum" +;上面这行用于枚举接在串口的即插即用设备,启动时将产生DTR和RTS信号,如果需要枚举,请将上面这行的分号去掉 + +[CH341S98.9X.AddReg] +HKR, , DevLoader, , *vcomm +HKR, , PortDriver, , CH341SER.VXD +HKR, , Contention, , *vcd +HKR, , ConfigDialog, , serialui.dll +HKR, , DCB, 3, 1C,00,00,00, 80,25,00,00, 11,00,00,00, 00,00,0A,00, 0A,00,08,00, 00,11,13,00, 00,00,00,00 +HKR, , PortSubClass, 1, 01 +HKR, , EnumPropPages, , "serialui.dll,EnumPropPages" +HKR, , Enumerator, , serenum.vxd +;上面这行用于枚举接在串口的即插即用设备,启动时将产生DTR和RTS信号,如果需要枚举,请将上面这行的分号去掉 + +[CH341SER.AddReg] +HKLM, SOFTWARE\WinChipHead\IC\CH341SER, WDM, 0x00010001, 0x00000034 +HKLM, SOFTWARE\WinChipHead\IC\CH341PORT, DLL, 0x00010001, 0x00000010 +HKLM, SOFTWARE\WinChipHead\IC\CH341SER, Function, , "USB=>Serial" +;HKLM, SYSTEM\CurrentControlSet\Services\CH341SER, UserRemoval, 0x00010001, 0x00000001 +;上面这行用于在系统托盘中显示“安全删除USB转SERIAL硬件设备”,便于用户手工删除硬件 + +[CH341S98.AddReg] +HKLM, SOFTWARE\WinChipHead\IC\CH341SER, VXD, 0x00010001, 0x00000023 + +[CH341SER_Install.NT.Services] +AddService = CH341SER, 2, CH341SER.Service +AddService = Serenum, , Serenum_Service_Inst + +[CH341SER_Inst.NTamd64.Services] +AddService = CH341SER_A64, 2, CH341SER.ServiceA64 +AddService = Serenum, , Serenum_Service_Inst + +[CH341SER_Inst.NTia64.Services] +AddService = CH341SER_I64, 2, CH341SER.ServiceI64 +AddService = Serenum, , Serenum_Service_Inst + +[CH341SER.Service] +DisplayName = "CH341SER" +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %10%\System32\Drivers\CH341SER.SYS + +[CH341SER.ServiceA64] +DisplayName = "CH341SER_A64" +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %10%\System32\Drivers\CH341S64.SYS + +[CH341SER.ServiceI64] +DisplayName = "CH341SER_I64" +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %10%\System32\Drivers\CH341I64.SYS + +[Serenum_Service_Inst] +DisplayName = "SerEnum" +ServiceType = 1 +StartType = 3 +ErrorControl = 1 +ServiceBinary = %12%\serenum.sys +LoadOrderGroup = PNP Filter + +[DestinationDirs] +DefaultDestDir = 10, System32\Drivers +CH341S98.DelFiles.SYS = 11 +CH341SER.CopyFiles.SYS = 10, System32\Drivers +CH341SER.NT.CopyFiles.SYS = 10, System32\Drivers +CH341S98.CopyFiles.VXD = 11 +CH341SER.CopyFiles.DLL = 11 +CH341SER.NT.CopyFiles.SYSA64 = 10, System32\Drivers +;CH341SER.NT.CopyFiles.SYSI64 = 10, System32\Drivers + +[SourceDisksFiles] +CH341SER.SYS = 1 +CH341S98.SYS = 1 +CH341SER.VXD = 1 +CH341PT.DLL = 1 +CH341S64.SYS = 1 +;CH341I64.SYS = 1 + +[SourceDisksNames] +1 = %DISK_NAME%, , , + +[SourceDisksNames.amd64] +1 = %DISK_NAME%, , , + +[SourceDisksNames.ia64] +1 = %DISK_NAME%, , , + +[Strings] +WinChipHead = "wch.cn" +CH341SER.DeviceDesc = "USB-SERIAL CH341" +CH341S98.DeviceDesc = "USB-SERIAL CH341" +CH340SER.DeviceDesc = "USB-SERIAL CH340" +CH341ASER.DeviceDesc = "USB-SERIAL CH341A" +DISK_NAME = "CH341 Serial Installation Disk" diff --git a/_FIRMWARE/drivers/CH341SER/CH341SER.SYS b/_FIRMWARE/drivers/CH341SER/CH341SER.SYS new file mode 100644 index 0000000..ee6a82d Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/CH341SER.SYS differ diff --git a/_FIRMWARE/drivers/CH341SER/CH341SER.VXD b/_FIRMWARE/drivers/CH341SER/CH341SER.VXD new file mode 100644 index 0000000..1c04d3d Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/CH341SER.VXD differ diff --git a/_FIRMWARE/drivers/CH341SER/DRVSETUP64/DRVSETUP64.exe b/_FIRMWARE/drivers/CH341SER/DRVSETUP64/DRVSETUP64.exe new file mode 100644 index 0000000..b703d8c Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/DRVSETUP64/DRVSETUP64.exe differ diff --git a/_FIRMWARE/drivers/CH341SER/SETUP.EXE b/_FIRMWARE/drivers/CH341SER/SETUP.EXE new file mode 100644 index 0000000..48f996a Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/SETUP.EXE differ diff --git a/_FIRMWARE/drivers/CH341SER/ch341SER.CAT b/_FIRMWARE/drivers/CH341SER/ch341SER.CAT new file mode 100644 index 0000000..3b83e13 Binary files /dev/null and b/_FIRMWARE/drivers/CH341SER/ch341SER.CAT differ diff --git a/_FIRMWARE/drivers/PL2303/PL2303_Prolific_GPS_1013_20090319.exe b/_FIRMWARE/drivers/PL2303/PL2303_Prolific_GPS_1013_20090319.exe new file mode 100644 index 0000000..2fe9ef9 Binary files /dev/null and b/_FIRMWARE/drivers/PL2303/PL2303_Prolific_GPS_1013_20090319.exe differ diff --git a/_FIRMWARE/firmwares/NodeMCU Sensor/ESP_OS_NODE_STABLE/ESP_OS_NODE_STABLE.ino b/_FIRMWARE/firmwares/NodeMCU Sensor/ESP_OS_NODE_STABLE/ESP_OS_NODE_STABLE.ino new file mode 100644 index 0000000..0f26989 Binary files /dev/null and b/_FIRMWARE/firmwares/NodeMCU Sensor/ESP_OS_NODE_STABLE/ESP_OS_NODE_STABLE.ino differ diff --git a/_FIRMWARE/firmwares/NodeMCU Sensor/ESP_OS_NODE_V2.ino/ESP_OS_NODE_V2.ino.ino b/_FIRMWARE/firmwares/NodeMCU Sensor/ESP_OS_NODE_V2.ino/ESP_OS_NODE_V2.ino.ino new file mode 100644 index 0000000..322881a --- /dev/null +++ b/_FIRMWARE/firmwares/NodeMCU Sensor/ESP_OS_NODE_V2.ino/ESP_OS_NODE_V2.ino.ino @@ -0,0 +1,346 @@ +#include +#include +#include +#include +#include +#include +#include "DHT.h" + +String ssid = ""; +String pasw = ""; +String hwId = ""; +String url = ""; + +//Pins +#define LIGHTPIN 13 +#define DHTPIN 4 +#define DHTTYPE DHT11 +#define LED_BUILTIN 16 + +//Settings +bool deepSleepOn = true; +long sleepTime = 4; //in minutes +bool lightSensor = true; +bool humiditySensor = true; +bool temperatureSensor = true; + +ESP8266WebServer server(80); +DHT dht(DHTPIN, DHTTYPE); + + + +void setup() { + Serial.begin(9600); + Serial.setDebugOutput(true); + EEPROM.begin(512); + + Serial.println(""); +} + +void loop() { + restorSetting(); + if (!checkConnection()) { + settingMode(); + while (true){ + Serial.println("CONECTION SETTING LOOP"); + server.handleClient(); + } + } else { + httpRequest(); + sleep(); + } +} + + +//webpages +void handleRoot() { + String s = ""; + s += ""; + s += ""; + s += "Main"; + s += ""; + s += ""; + s += ""; + s += "

Restartovat

"; + s += "

Refrest WIFI Networks

"; + s += ""; + s += ""; + server.send(200, "text/html", s); +} + +void handleSetting() { + String wifiList = ""; + int n = WiFi.scanNetworks(); + Serial.println("scan done"); + if (n == 0) { + Serial.println("no networks found"); + } else { + for (int i = 0; i < n; ++i) { + //Serial.println("SSID: " + WiFi.SSID(i)); + wifiList = wifiList + String(""); + } + } + + String s = ""; + s += ""; + s += ""; + s += "Main"; + s += ""; + s += ""; + s += ""; + s += "
"; + s += "
SSID: "; + s += "
Password: "; + s += "
Token: "; + s += "
Api Url: "; + s += ""; + s += "
"; + s += ""; + s += ""; + server.send(200, "text/html", s); +} + +//functions +bool restorSetting() { + Serial.println("Reading EEPROM"); + ssid = ""; + pasw = ""; + hwId = ""; + url = ""; + if (EEPROM.read(0) != 0) { + Serial.println("Reading EEPROM"); + for (int i = 0; i < 64; ++i) { + ssid += char(EEPROM.read(i)); + } + Serial.println("SSID: " + String(ssid)); + for (int i = 64; i < 128; ++i) { + pasw += char(EEPROM.read(i)); + } + Serial.println("PASS: " + String(pasw)); + for (int i = 128; i < 192; ++i) { + hwId += char(EEPROM.read(i)); + } + Serial.println("TOKEN: " + String(hwId)); + for (int i = 192; i < 256; ++i) { + url += char(EEPROM.read(i)); + } + Serial.println("URL: " + String(url)); + return true; + } else { + return false; + } +} + +String urlDecode(String input) { + String s = input; + s.replace("%20", " "); + s.replace("+", " "); + s.replace("%21", "!"); + s.replace("%22", "\""); + s.replace("%23", "#"); + s.replace("%24", "$"); + s.replace("%25", "%"); + s.replace("%26", "&"); + s.replace("%27", "\'"); + s.replace("%28", "("); + s.replace("%29", ")"); + s.replace("%30", "*"); + s.replace("%31", "+"); + s.replace("%2C", ","); + s.replace("%2E", "."); + s.replace("%2F", "/"); + s.replace("%2C", ","); + s.replace("%3A", ":"); + s.replace("%3A", ";"); + s.replace("%3C", "<"); + s.replace("%3D", "="); + s.replace("%3E", ">"); + s.replace("%3F", "?"); + s.replace("%40", "@"); + s.replace("%5B", "["); + s.replace("%5C", "\\"); + s.replace("%5D", "]"); + s.replace("%5E", "^"); + s.replace("%5F", "-"); + s.replace("%60", "`"); + return s; +} + +bool checkConnection() { + int count = 0; + WiFi.persistent(false); + WiFi.mode(WIFI_STA); + WiFi.forceSleepWake(); + WiFi.begin(ssid, pasw); + Serial.print("Waiting for Wi-Fi connection"); + while ( count < 30 ) { + if (WiFi.status() == WL_CONNECTED) { + Serial.println(); + Serial.println("Connected!"); + return (true); + } + delay(500); + Serial.print("."); + count++; + } + Serial.println("Timed out."); + return false; +} + +void settingMode(){ + WiFi.mode(WIFI_AP); + WiFi.softAP("NodeMeter"); + + IPAddress myIP = WiFi.softAPIP(); + Serial.print("HotSpt IP:"); + Serial.println(myIP); + + server.on("/", handleRoot); + server.on("/restart", []() { + ESP.restart(); + }); + server.on("/setting", handleSetting); + server.on("/set", []() { + for (int i = 0; i < 96; ++i) { + EEPROM.write(i, 'e'); + } + EEPROM.commit(); + ssid = server.arg("ssid"); + pasw = server.arg("pasw"); + hwId = server.arg("token"); + url = server.arg("url"); + + for (int i = 0; i < 256; ++i) { + EEPROM.write(i, 0); + } + + Serial.println("Writing EEPROM..."); + Serial.println("SSID:" + ssid); + for (int i = 0; i < ssid.length(); ++i) { + EEPROM.write(i,ssid[i]); + } + + Serial.println("PASW:" + pasw); + for (int i = 0; i < pasw.length(); ++i) { + EEPROM.write(64 + i, pasw[i]); + } + + Serial.println("TOKEN:" + hwId); + for (int i = 0; i < hwId.length(); ++i) { + EEPROM.write(128 + i, hwId[i]); + } + + Serial.println("URL:" + url); + for (int i = 0; i < url.length(); ++i) { + EEPROM.write(192 + i, url[i]); + } + EEPROM.commit(); + + Serial.println("Write EEPROM done!"); + String s = "

Setup complete.

device will be connected to \""; + s += ssid; + s += "\" after the restart."; + server.send(200, "text/html", s); + ESP.restart(); + }); + + server.begin(); + Serial.println("HTTP server started"); +} + +bool httpRequest(){ + StaticJsonDocument<1024> sendContent; + sendContent["token"] = hwId; + if (temperatureSensor){ + sendContent["values"]["temp"]["value"] = String(getTemperature()); + sendContent["values"]["temp"]["unit"] = "C"; + } + + if (humiditySensor){ + sendContent["values"]["humi"]["value"] = String(getHumidity()); + sendContent["values"]["humi"]["unit"] = "%"; + } + + if (lightSensor){ + sendContent["values"]["light"]["value"] = String(getLight()); + sendContent["values"]["light"]["unit"] = ""; + } + + String requestJson = ""; + serializeJson(sendContent, requestJson); + Serial.println("JSON: " + requestJson); + + HTTPClient http; + http.begin(String(url)); + http.addHeader("Content-Type", "application/json"); //Specify content-type header + + int httpCode = http.POST(requestJson); + String payload = http.getString(); //Get the response payload + http.end(); + + DynamicJsonDocument doc(1024); + deserializeJson(doc, payload); + + String hostname = doc["device"]["hostname"]; + sleepTime = doc["device"]["sleepTime"]; + WiFi.hostname(hostname); + + Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code + Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload + http.end(); //Close connection +} + +void sleep(){ + Serial.println("DISCONECTED FROM WIFI"); + WiFi.disconnect(); + + if (deepSleepOn) { + Serial.println("GOING TO SLEEP FOR " + String(sleepTime)); + ESP.deepSleep((sleepTime * 60) * 1000000, RF_DEFAULT); // 20e6 is 20 microseconds + delay(1000); + } else { + delay(1000); + delay(sleepTime); + } +} + +//ReadTemperatures +float getTemperature() { + float t = dht.readTemperature(); + //Serial.print(dht.readTemperature()); + //Serial.println(t); + if (isnan(t)) { + Serial.println( "Failed to read temperature from sensor!") ; + return 999; + } + return t; +} + + +float getHumidity() { + float h = dht.readHumidity(); + //Serial.println(h); + if (isnan(h)) { + Serial.println("Failed to read humidity from sensor!"); + return 999; + } + return h; +} + + +int getLight() { + int l = analogRead(LIGHTPIN); + if (l > 1000) { + return 1; + } else { + return 0; + } + Serial.println("Failed to read light from sensor!"); + return 999; +} diff --git a/_FIRMWARE/firmwares/Sonoff Original/ESP_END_POINT.ino b/_FIRMWARE/firmwares/Sonoff Original/ESP_END_POINT.ino new file mode 100644 index 0000000..247bd47 --- /dev/null +++ b/_FIRMWARE/firmwares/Sonoff Original/ESP_END_POINT.ino @@ -0,0 +1,92 @@ +//Includes +#include +#include +#include + +//Variables +const char* ssid = ""; +const char* pasw = ""; +const char* server = "http://ESP:ESP@dev.steelants.cz/projekty/rest_vasek/api/out.php"; +const char* hwId = ""; +int lastState = 0; + +//Constant +#define SONOFF 12 +#define SONOFF_LED 13 +#define SONOFF_BUT 0 + +void setup() { + Serial.begin(9600); + Serial.println("HW: " + String(hwId)); + pinMode(SONOFF, OUTPUT); + pinMode(SONOFF_LED, OUTPUT); + pinMode(SONOFF_BUT, OUTPUT); + pinMode(SONOFF_BUT, INPUT); + // WI-FI CONECTING + WiFi.persistent(false); + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, pasw); +} + +void loop() { + if(WiFi.status() != WL_CONNECTED){ + WiFi.begin(ssid, pasw); + while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect + digitalWrite(SONOFF_LED, LOW); // LOW will turn on the LED + delay(1000); + digitalWrite(SONOFF_LED, HIGH); // HIGH will turn off the LED + delay(1000); + } + Serial.println("\nCONECTED TO WIFI"); + Serial.println("IP: " + String(WiFi.localIP())); + } + + bool buttonState = digitalRead(SONOFF_BUT); + HTTPClient http; + http.begin(server); + http.addHeader("Content-Type", "text/plain"); //Specify content-type header + String requestJson = "{"; + requestJson += "\"tocken\":\"" + String(hwId) + "\""; + + if (buttonState == true) { + requestJson += ","; + requestJson += "\"on/off\":{"; + requestJson += "\"value\":\"" + String(~lastState) + "\","; + requestJson += "\"unit\":\"\""; + requestJson += "}"; + } + + while(buttonState == true) { + delay(50); // keeps a small delay + } + + requestJson += "}"; + Serial.println("JSON: " + requestJson); + + int httpCode = http.POST(requestJson); + String payload = http.getString(); //Get the response payload + + Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code + Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload + + DynamicJsonDocument doc(1024); + deserializeJson(doc, payload); + + string hostname = doc["hostname"]; + WiFi.hostname(hostname); + + int state = doc["state"]; + + if (state == 1 && lastState == 0) { + Serial.println("ON"); + digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW + digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW + } else { + Serial.println("OFF"); + digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW + digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW + } + + lastState = state; + delay(1000); +} diff --git a/_FIRMWARE/firmwares/Sonoff_Basic/ESP_END_POINT.ino b/_FIRMWARE/firmwares/Sonoff_Basic/ESP_END_POINT.ino new file mode 100644 index 0000000..51d7e43 --- /dev/null +++ b/_FIRMWARE/firmwares/Sonoff_Basic/ESP_END_POINT.ino @@ -0,0 +1,94 @@ +//Includes +#include +#include +#include + +//Variables +const char* ssid = ""; +const char* pasw = ""; +const char* server = "http://ESP:ESP@dev.steelants.cz/projekty/rest_vasek/api/out.php"; +const char* hwId = ""; +int lastState = 0; + +//Constant +#define SONOFF 12 +#define SONOFF_LED 13 +#define SONOFF_BUT 0 + +void setup() { + Serial.begin(9600); + Serial.println("HW: " + String(hwId)); + pinMode(SONOFF, OUTPUT); + pinMode(SONOFF_LED, OUTPUT); + pinMode(SONOFF_BUT, OUTPUT); + pinMode(SONOFF_BUT, INPUT); + // WI-FI CONECTING + WiFi.persistent(false); + WiFi.mode(WIFI_STA); + WiFi.begin(ssid, pasw); +} + +void loop() { + if(WiFi.status() != WL_CONNECTED){ + WiFi.begin(ssid, pasw); + while (WiFi.status() != WL_CONNECTED) { // Wait for the Wi-Fi to connect + digitalWrite(SONOFF_LED, LOW); // LOW will turn on the LED + delay(1000); + digitalWrite(SONOFF_LED, HIGH); // HIGH will turn off the LED + delay(1000); + } + Serial.println("\nCONECTED TO WIFI"); + Serial.println("IP: " + String(WiFi.localIP())); + } + + bool buttonState = digitalRead(SONOFF_BUT); + HTTPClient http; + http.begin(server); + http.addHeader("Content-Type", "text/plain"); //Specify content-type header + String requestJson = "{"; + requestJson += "\"tocken\":\"" + String(hwId) + "\""; + + if (buttonState == true) { + requestJson += ","; + requestJson += "\"on/off\":{"; + requestJson += "\"value\":\"" + String(~lastState) + "\","; + requestJson += "\"unit\":\"\""; + requestJson += "}"; + } + + while(buttonState == true) { + delay(50); // keeps a small delay + } + + requestJson += "}"; + Serial.println("JSON: " + requestJson); + + int httpCode = http.POST(requestJson); + String payload = http.getString(); //Get the response payload + + Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code + Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload + + DynamicJsonDocument doc(1024); + deserializeJson(doc, payload); + + string hostname = doc["device"]["hostname"]; + sleepTime = doc["device"]["sleepTime"]; + + WiFi.hostname(hostname); + + int state = doc["state"]; + + if (state == 1 && lastState == 0) { + Serial.println("ON"); + digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW + digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW + } else { + Serial.println("OFF"); + digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW + digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW + } + + lastState = state; + delay(1000); +} \ No newline at end of file diff --git a/_FIRMWARE/firmwares/Sonoff_S20/ESP_END_POINT.ino b/_FIRMWARE/firmwares/Sonoff_S20/ESP_END_POINT.ino new file mode 100644 index 0000000..582df12 --- /dev/null +++ b/_FIRMWARE/firmwares/Sonoff_S20/ESP_END_POINT.ino @@ -0,0 +1,94 @@ +//Includes +#include +#include +#include + +//Variables +const char* ssid = ""; +const char* pasw = ""; +const char* server = "httpa://dev.steelants.cz/vasek/home/api.php"; +const char* hwId = ""; +int lastState = 0; +int reconectAtemptsMax = 10; //time to wait before restart + +//Constant +#define SONOFF 12 +#define SONOFF_LED 13 +#define SONOFF_BUT 0 +HTTPClient http; + +void setup() { + Serial.begin(9600); + Serial.println("HW: " + String(hwId)); + pinMode(SONOFF, OUTPUT); + pinMode(SONOFF_LED, OUTPUT); + pinMode(SONOFF_BUT, OUTPUT); + pinMode(SONOFF_BUT, INPUT); + + WiFi.persistent(false); + WiFi.mode(WIFI_STA); + + WiFi.setAutoConnect (true); + WiFi.setAutoReconnect (true); + + WiFi.begin(ssid, pasw); + http.begin(server); +} + +void loop() { + int reconectAtempts = 0; + while(WiFi.status() != WL_CONNECTED){ + if (reconectAtemptsMax == reconectAtempts) { + ESP.restart(); + } + WiFi.begin(ssid, pasw); + delay(1000); + } + + bool buttonState = digitalRead(SONOFF_BUT); + + http.addHeader("Content-Type", "text/plain"); //Specify content-type header + + StaticJsonBuffer<1024> jsonContent; + jsonContent["token"] = hwId; + + if (buttonState){ + jsonContent["values"]["on/off"]["value"] = lastState; + jsonContent["values"]["on/off"]["unit"] = ''; + while(buttonState) { + delay(100); + } + } + + String requestJson = ""; + serializeJson(jsonContent, requestJson); + jsonContent.clean(); + Serial.println("JSON: " + requestJson); + + int httpCode = http.POST(jsonContent); + String payload = http.getString(); //Get the response payload + + Serial.println("HTTP CODE: " + String(httpCode) + ""); //Print HTTP return code + Serial.println("HTTP BODY: " + String(payload) + ""); //Print request response payload + + deserializeJson(doc, payload); + + string hostname = doc["device"]["hostname"]; + + WiFi.hostname(hostname); + + int state = doc["state"]; + + if (state == 1 && lastState == 0) { + Serial.println("ON"); + digitalWrite(SONOFF, HIGH); // Turn the LED on by making the voltage LOW + digitalWrite(SONOFF_LED, LOW); // Turn the LED on by making the voltage LOW + } else { + Serial.println("OFF"); + digitalWrite(SONOFF, LOW); // Turn the LED on by making the voltage LOW + digitalWrite(SONOFF_LED, HIGH); // Turn the LED on by making the voltage LOW + } + + lastState = state; + delay(1000); +} \ No newline at end of file diff --git a/_FIRMWARE/libs/libraries.zip b/_FIRMWARE/libs/libraries.zip new file mode 100644 index 0000000..18cb1b1 Binary files /dev/null and b/_FIRMWARE/libs/libraries.zip differ diff --git a/_INSTALATION/_SQL_TABLES.sql b/_INSTALATION/_SQL_TABLES.sql new file mode 100644 index 0000000..a745a77 --- /dev/null +++ b/_INSTALATION/_SQL_TABLES.sql @@ -0,0 +1,268 @@ +-- phpMyAdmin SQL Dump +-- version 4.6.6deb4 +-- https://www.phpmyadmin.net/ +-- +-- Po膷铆ta膷: localhost:3306 +-- Vytvo艡eno: P谩t 28. 膷en 2019, 10:05 +-- Verze serveru: 10.1.38-MariaDB-0+deb9u1 +-- Verze PHP: 7.0.33-0+deb9u3 + +SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; +SET time_zone = "+00:00"; + + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!40101 SET NAMES utf8mb4 */; + +-- +-- Datab谩ze: `smart-home` +-- + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `automation` +-- + +CREATE TABLE `automation` ( + `automation_id` int(11) NOT NULL, + `name` int(11) NOT NULL, + `on_days` varchar(255) NOT NULL, + `if_something` varchar(255) NOT NULL, + `do_something` varchar(255) NOT NULL, + `executed` tinyint(4) NOT NULL, + `active` tinyint(4) NOT NULL DEFAULT '1' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `dashboard` +-- + +CREATE TABLE `dashboard` ( + `dashboard_id` int(11) NOT NULL, + `user_id` int(11) NOT NULL, + `subdevice_id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `devices` +-- + +CREATE TABLE `devices` ( + `device_id` int(11) NOT NULL, + `room_id` int(11) DEFAULT NULL, + `name` varchar(255) NOT NULL, + `token` varchar(255) NOT NULL, + `approved` int(11) NOT NULL, + `icon` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `records` +-- + +CREATE TABLE `records` ( + `record_id` int(11) NOT NULL, + `subdevice_id` int(11) NOT NULL, + `value` varchar(255) NOT NULL, + `time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `rooms` +-- + +CREATE TABLE `rooms` ( + `room_id` int(11) NOT NULL, + `name` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `scenes` +-- + +CREATE TABLE `scenes` ( + `scene_id` int(11) NOT NULL, + `icon` varchar(255) NOT NULL, + `name` varchar(255) NOT NULL, + `do_something` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `subdevices` +-- + +CREATE TABLE `subdevices` ( + `subdevice_id` int(11) NOT NULL, + `device_id` int(11) NOT NULL, + `type` varchar(255) NOT NULL, + `unit` varchar(255) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- -------------------------------------------------------- + +-- +-- Struktura tabulky `users` +-- + +CREATE TABLE `users` ( + `user_id` int(11) NOT NULL, + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + `startPage` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- +-- Vypisuji data pro tabulku `users` +-- + +INSERT INTO `users` (`user_id`, `username`, `password`, `startPage`) VALUES +(2, 'Admin', '08abb3ff83dfae60fb4591125fc49dc80cf7ef28224c2d5df86e2d0d037c553bc7f30e859348fd745c9c07a4edde4863e866a7d45356cf08a22e5e1eafa13406', 1); + +-- +-- Kl铆膷e pro exportovan茅 tabulky +-- + +-- +-- Kl铆膷e pro聽tabulku `automation` +-- +ALTER TABLE `automation` + ADD PRIMARY KEY (`automation_id`); + +-- +-- Kl铆膷e pro聽tabulku `dashboard` +-- +ALTER TABLE `dashboard` + ADD PRIMARY KEY (`dashboard_id`), + ADD KEY `user_id` (`user_id`), + ADD KEY `subdevice_id` (`subdevice_id`); + +-- +-- Kl铆膷e pro聽tabulku `devices` +-- +ALTER TABLE `devices` + ADD PRIMARY KEY (`device_id`), + ADD KEY `room_id` (`room_id`); + +-- +-- Kl铆膷e pro聽tabulku `records` +-- +ALTER TABLE `records` + ADD PRIMARY KEY (`record_id`), + ADD KEY `device_id` (`subdevice_id`); + +-- +-- Kl铆膷e pro聽tabulku `rooms` +-- +ALTER TABLE `rooms` + ADD PRIMARY KEY (`room_id`); + +-- +-- Kl铆膷e pro聽tabulku `scenes` +-- +ALTER TABLE `scenes` + ADD PRIMARY KEY (`scene_id`); + +-- +-- Kl铆膷e pro聽tabulku `subdevices` +-- +ALTER TABLE `subdevices` + ADD PRIMARY KEY (`subdevice_id`), + ADD KEY `device_id` (`device_id`); + +-- +-- Kl铆膷e pro聽tabulku `users` +-- +ALTER TABLE `users` + ADD PRIMARY KEY (`user_id`); + +-- +-- AUTO_INCREMENT pro tabulky +-- + +-- +-- AUTO_INCREMENT pro tabulku `automation` +-- +ALTER TABLE `automation` + MODIFY `automation_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10; +-- +-- AUTO_INCREMENT pro tabulku `dashboard` +-- +ALTER TABLE `dashboard` + MODIFY `dashboard_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=10; +-- +-- AUTO_INCREMENT pro tabulku `devices` +-- +ALTER TABLE `devices` + MODIFY `device_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=8; +-- +-- AUTO_INCREMENT pro tabulku `records` +-- +ALTER TABLE `records` + MODIFY `record_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=26310; +-- +-- AUTO_INCREMENT pro tabulku `rooms` +-- +ALTER TABLE `rooms` + MODIFY `room_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=22; +-- +-- AUTO_INCREMENT pro tabulku `scenes` +-- +ALTER TABLE `scenes` + MODIFY `scene_id` int(11) NOT NULL AUTO_INCREMENT; +-- +-- AUTO_INCREMENT pro tabulku `subdevices` +-- +ALTER TABLE `subdevices` + MODIFY `subdevice_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=11; +-- +-- AUTO_INCREMENT pro tabulku `users` +-- +ALTER TABLE `users` + MODIFY `user_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3; +-- +-- Omezen铆 pro exportovan茅 tabulky +-- + +-- +-- Omezen铆 pro tabulku `dashboard` +-- +ALTER TABLE `dashboard` + ADD CONSTRAINT `dashboard_ibfk_2` FOREIGN KEY (`subdevice_id`) REFERENCES `subdevices` (`subdevice_id`) ON DELETE CASCADE ON UPDATE NO ACTION, + ADD CONSTRAINT `dashboard_ibfk_3` FOREIGN KEY (`user_id`) REFERENCES `users` (`user_id`) ON DELETE CASCADE ON UPDATE NO ACTION; + +-- +-- Omezen铆 pro tabulku `devices` +-- +ALTER TABLE `devices` + ADD CONSTRAINT `devices_ibfk_1` FOREIGN KEY (`room_id`) REFERENCES `rooms` (`room_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Omezen铆 pro tabulku `records` +-- +ALTER TABLE `records` + ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`subdevice_id`) REFERENCES `subdevices` (`subdevice_id`) ON DELETE CASCADE ON UPDATE CASCADE; + +-- +-- Omezen铆 pro tabulku `subdevices` +-- +ALTER TABLE `subdevices` + ADD CONSTRAINT `subdevices_ibfk_1` FOREIGN KEY (`device_id`) REFERENCES `devices` (`device_id`); + +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/_README_IMG/1.png b/_README_IMG/1.png new file mode 100644 index 0000000..416a96d Binary files /dev/null and b/_README_IMG/1.png differ diff --git a/_README_IMG/10.png b/_README_IMG/10.png new file mode 100644 index 0000000..ebd6b84 Binary files /dev/null and b/_README_IMG/10.png differ diff --git a/_README_IMG/2.png b/_README_IMG/2.png new file mode 100644 index 0000000..de620ea Binary files /dev/null and b/_README_IMG/2.png differ diff --git a/_README_IMG/3.png b/_README_IMG/3.png new file mode 100644 index 0000000..1337e69 Binary files /dev/null and b/_README_IMG/3.png differ diff --git a/_README_IMG/4.png b/_README_IMG/4.png new file mode 100644 index 0000000..0850c06 Binary files /dev/null and b/_README_IMG/4.png differ diff --git a/_README_IMG/5.png b/_README_IMG/5.png new file mode 100644 index 0000000..aed64ef Binary files /dev/null and b/_README_IMG/5.png differ diff --git a/_README_IMG/6.png b/_README_IMG/6.png new file mode 100644 index 0000000..92bd953 Binary files /dev/null and b/_README_IMG/6.png differ diff --git a/_README_IMG/7.png b/_README_IMG/7.png new file mode 100644 index 0000000..7ca17ac Binary files /dev/null and b/_README_IMG/7.png differ diff --git a/_README_IMG/8.png b/_README_IMG/8.png new file mode 100644 index 0000000..a567150 Binary files /dev/null and b/_README_IMG/8.png differ diff --git a/_README_IMG/9.png b/_README_IMG/9.png new file mode 100644 index 0000000..bf6a3ce Binary files /dev/null and b/_README_IMG/9.png differ diff --git a/api.php b/api.php new file mode 100644 index 0000000..b3ff8ca --- /dev/null +++ b/api.php @@ -0,0 +1,149 @@ + 'unsuccess', + 'errorMSG' => "Using API from your IP insn麓t alowed!", + )); + header("HTTP/1.1 401 Unauthorized"); + exit(); + } +} + + + +//Read API data +$json = file_get_contents('php://input'); +$obj = json_decode($json, true); + +if (isset($obj['user']) && $obj['user'] != ''){ + //user at home + $user = UserManager::getUser($obj['user']); + $userId = $user['user_id']; + UserManager::atHome($userId, $obj['location']); + die(); +} + +//automationExecution +AutomationManager::executeAll(); + +//Record Cleaning +RecordManager::clean(RECORDTIMOUT); + +//Variables +$token = $obj['token']; +$values = null; + +if (isset($obj['values'])) { + $values = $obj['values']; +} + +//Checks +if ($token == null || $token == "") { + echo json_encode(array( + 'state' => 'unsuccess', + 'errorMSG' => "Missing Value Token in JSON payload", + )); + header("HTTP/1.1 401 Unauthorized"); + die(); +} + +//Vstupn铆 Checky +if (!DeviceManager::registeret($token)) { + DeviceManager::create($token, $token); + header("HTTP/1.1 401 Unauthorized"); + echo json_encode(array( + 'state' => 'unsuccess', + 'errorMSG' => "Device not registeret", + )); + exit(); +} + +if (!DeviceManager::approved($token)) { + header("HTTP/1.1 401 Unauthorized"); + echo json_encode(array( + 'state' => 'unsuccess', + 'errorMSG' => "Unaproved Device", + )); + exit(); +} + +if (!DeviceManager::approved($token)) { + header("HTTP/1.1 401 Unauthorized"); + echo json_encode(array( + 'state' => 'unsuccess', + 'errorMSG' => "Unaproved Device", + )); + exit(); +} + + +// Subdevices first data! +if ($values != null || $values != "") { + + //ZAPIS + $device = DeviceManager::getDeviceByToken($token); + $deviceId = $device['device_id']; + foreach ($values as $key => $value) { + if (!SubDeviceManager::getSubDeviceByMaster($deviceId, $key)) { + SubDeviceManager::create($deviceId, $key, UNITS[$key]); + } + RecordManager::create($deviceId, $key, round($value['value'],2)); + } + + $hostname = strtolower($device['name']); + $hostname = str_replace(' ', '_', $hostname); + echo json_encode(array( + 'device' => [ + 'hostname' => $hostname, + 'sleepTime' => $device['sleep_time'], + ], + 'state' => 'succes', + )); + header("HTTP/1.1 200 OK"); + die(); + } else { + //Vypis + //TODO: dod臎la ulo啪en铆 v媒pisu jin媒mi slovy zda li byl comman vykon谩n + $device = DeviceManager::getDeviceByToken($token); + $deviceId = $device['device_id']; + + if (count(SubDeviceManager::getAllSubDevices($deviceId)) == 0) { + SubDeviceManager::create($deviceId, 'on/off', UNITS[$key]); + RecordManager::create($deviceId, 'on/off', 0); + } + + $subDeviceId = SubDeviceManager::getAllSubDevices($deviceId)[0]['subdevice_id']; + + $subDeviceLastReord = RecordManager::getLastRecord($subDeviceId); + $subDeviceLastReordValue = $subDeviceLastReord['value']; + + RecordManager::setExecuted($subDeviceLastReord['record_id']); + + echo json_encode(array( + 'device' => [ + 'hostname' => $device['name'], + 'sleepTime' => $device['sleep_time'], + ], + 'state' => 'succes', + 'value' => $subDeviceLastReordValue + )); + header("HTTP/1.1 200 OK"); + die(); + } diff --git a/class/AutomationManager.php b/class/AutomationManager.php new file mode 100644 index 0000000..038ffa9 --- /dev/null +++ b/class/AutomationManager.php @@ -0,0 +1,79 @@ + $name, + 'on_days' => $onDays, + 'if_something' => $doCode, + 'do_something' => $ifCode, + ); + try { + Db::add ('automation', $scene); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public function getAll(){ + return Db::loadAll ("SELECT * FROM automation"); + + } + + public function executeAll(){ + global $dateTimeOffset; + $automations = Db::loadAll ("SELECT * FROM automation"); + $dayNameNow = strtolower (date('D', time())); + foreach ($automations as $automation) { + $onValue = $automation['if_something']; + $sceneDoJson = $automation['do_something']; + $actionDays = json_decode($automation['on_days'], true); + $value = time(); + + if ($automation['active'] != 0){ + if (in_array($dayNameNow, $actionDays)){ + switch ($onValue) { + case 'sunSet': + $value = date_sunset($value, SUNFUNCS_RET_TIMESTAMP, 50.0755381 , 14.4378005, 90, $dateTimeOffset); + break; + case 'sunRise': + $value = date_sunrise($value, SUNFUNCS_RET_TIMESTAMP, 50.0755381 , 14.4378005, 90, $dateTimeOffset); + break; + case 'time': + $onValue = explode(':',$onValue); + $today = date_create('now'); + $onValue = $today->setTime($onValue[0], $onValue[1]); + $value = $today->getTimestamp(); + break; + default: + break; + } + + if (time() > $value){ + if ($automation['executed'] == 0){ + $sceneDoArray = json_decode($sceneDoJson); + foreach ($sceneDoArray as $deviceId => $deviceState) { + RecordManager::create($deviceId, 'on/off', $deviceState); + } + Db::edit('automation', array('executed' => 1), 'WHERE automation_id = ?', array($automation['automation_id'])); + } + } elseif (time() < $value && $automation['executed'] = 1) { //recovery realowing of automation + Db::edit('automation', array('executed' => 0), 'WHERE automation_id = ?', array($automation['automation_id'])); + } + } + } + } + } +} diff --git a/class/ChartJS.php b/class/ChartJS.php new file mode 100644 index 0000000..5b0b8bc --- /dev/null +++ b/class/ChartJS.php @@ -0,0 +1,194 @@ + 'rgba(220,220,220,0.2)', 'stroke' => 'rgba(220,220,220,1)', 'point' => 'rgba(220,220,220,1)', 'pointStroke' => '#fff'); + /** + * Add label(s) + * @param array $labels + * @param bool $reset + */ + public function addLabels(array $labels, $reset = false) + { + if ($reset) { + $this->_labels = array(); + } + $this->_labels = $this->_labels + $labels; + } + /** + * Add dataset + * @param $dataset + * @param $reset + */ + public function addDataset($dataset, $reset) + { + if ($reset) { + $this->_datasets = array(); + } + $this->_datasets += $dataset; + } + public function __construct($id = null, $width = '', $height = '', $otherAttributes = array()) + { + if (!$id) { + $id = uniqid('chartjs_', true); + } + $this->_id = $id; + $this->_width = $width; + $this->_height = $height; + // Always save otherAttributes as array + if ($otherAttributes && !is_array($otherAttributes)) { + $otherAttributes = array($otherAttributes); + } + $this->_attributes = $otherAttributes; + } + /** + * This method allows to echo ChartJS object and directly renders canvas (instead of using ChartJS->render()) + */ + public function __toString() + { + return $this->renderCanvas(); + } + public function renderCanvas() + { + $data = $this->_renderData(); + $options = $this->_renderOptions(); + $height = $this->_renderHeight(); + $width = $this->_renderWidth(); + $attributes = $this->_renderAttributes(); + $canvas = ''; + return $canvas; + } + /** + * Prepare canvas' attributes + * @return string + */ + protected function _renderAttributes() + { + $attributes = ''; + foreach ($this->_attributes as $attribute => $value) { + $attributes .= ' ' . $attribute . '="' . $value . '"'; + } + return $attributes; + } + /** + * Prepare width attribute for canvas + * @return string + */ + protected function _renderWidth() + { + $width = ''; + if ($this->_width) { + $width = ' width="' . $this->_width . '"'; + } + return $width; + } + /** + * Prepare height attribute for canvas + * @return string + */ + protected function _renderHeight() + { + $height = ''; + if ($this->_height) { + $height = ' height="' . $this->_height . '"'; + } + return $height; + } + /** + * Render custom options for the chart + * @return string + */ + protected function _renderOptions() + { + if (empty($this->_options)) { + return ''; + } + return ' data-options=\'' . json_encode($this->_options) . '\''; + } + /** + * Prepare data (labels and dataset) for the chart + * @return string + */ + protected function _renderData() + { + $array_data = array('labels' => array(), 'datasets' => array()); + $i = 0; + foreach ($this->_datasets as $line) { + $this->_completeColors($line['options'], $i); + $array_data['datasets'][] = $line['options'] + array('data' => $line['data']); + $i++; + } + $array_data['labels'] = $this->_labels; + return ' data-data=\'' . json_encode($array_data) . '\''; + } + /** + * Set default colors + * @param array $defaultColors + */ + public static function setDefaultColors(array $defaultColors) + { + self::$_defaultColors = $defaultColors; + } + /** + * @param array $color + */ + public static function addDefaultColor(array $color) + { + if (!empty($color['fill']) && !empty($color['stroke']) && !empty($color['point']) && !empty($color['pointStroke'])) { + self::$_defaultColors[] = $color; + } else { + trigger_error('Color is missing to add this theme (need fill, stroke, point and pointStroke) : color not added', E_USER_WARNING); + } + } + protected function _completeColors(&$options, &$i) + { + if (empty(static::$_defaultColors[$i])) { + $i = 0; + } + $colors = static::$_defaultColors[$i]; + foreach (static::$_colorsRequired as $name) { + if (empty($options[$name])) { + $shortName = str_replace('Color', '', $name); + if (empty($colors[$shortName])) { + $shortName = static::$_colorsReplacement[$shortName]; + } + $options[$name] = $colors[$shortName]; + } + } + } +} diff --git a/class/ChartJS_Line.php b/class/ChartJS_Line.php new file mode 100644 index 0000000..3fa3f5a --- /dev/null +++ b/class/ChartJS_Line.php @@ -0,0 +1,21 @@ + 'point', 'pointHighlightStroke' => 'pointStroke'); + /** + * Add a set of data + * @param array $data + * @param array $options + * @param null $name Name cas be use to change data / options later + */ + public function addLine($data = array(), $options = array(), $name = null) + { + if (!$name) { + $name = count($this->_datasets) + 1; + } + $this->_datasets[$name]['data'] = $data; + $this->_datasets[$name]['options'] = $options; + } +} diff --git a/class/ChartManager.php b/class/ChartManager.php new file mode 100644 index 0000000..56435cf --- /dev/null +++ b/class/ChartManager.php @@ -0,0 +1,86 @@ +Aktu谩ln铆 Hodnota: '.$data[0]['value']; + echo ""; + echo '

'; + echo '
'; + for ($valuesRow = 0; $valuesRow < count($data); $valuesRow++) { + $row = $data[$valuesRow]; + + echo '
'; + } + echo '
'; + echo '
'; + echo ''; + echo 'Posledn铆 Update: '; + + echo ' + '; + } +} +?> diff --git a/class/DB.php b/class/DB.php new file mode 100644 index 0000000..8134907 --- /dev/null +++ b/class/DB.php @@ -0,0 +1,96 @@ + PDO::ERRMODE_EXCEPTION, + PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", + PDO::ATTR_EMULATE_PREPARES => false + ); + + public static function connect ($host, $user, $password, $database) { + if (!isset (self::$join)) { + self::$join = @new PDO( + "mysql:host=$host;dbname=$database;charset=utf8", + $user, + $password, + self::$commandDatabase + ); + self::$join->exec ("set names utf8"); + } + } + + public static function loadOne ($sql, $values = array (), $numberKey = false) { + $answer = self::$join->prepare ($sql); + $answer->execute ($values); + if (!$numberKey) { + return $answer->fetch (PDO::FETCH_ASSOC); + } else { + return $answer->fetch (PDO::FETCH_NUM); + } + } + + public static function command ($sql, $values = array()) { + $answer = self::$join->prepare ($sql); + return $answer->execute ($values); + } + + public static function loadAll ($sql, $values = array(), $numberKey = false) { + $answer = self::$join->prepare ($sql); + $answer->execute ($values); + if (!$numberKey) { + return $answer->fetchALL (PDO::FETCH_ASSOC); + } else { + return $answer->fetchALL (PDO::FETCH_NUM); + } + } + + public static function loadAlone ($sql, $values = array()) { + $answer = self::$join->prepare ($sql); + $answer->execute ($values); + return $answer->fetch (PDO::FETCH_NUM)[0]; + } + + public static function add ($table, $values = array()) { + return self::command ( + "INSERT INTO `$table` (`" . + implode('`, `', array_keys($values)) . + "`) VALUES (" . + str_repeat('?,', (count($values) > 0 ? count($values)-1 : 0)) . + "?)" + , array_values ($values)); + } + // TODO: pokud vlozim prazdne pole tak chyba ?? + public static function addAll ($table, $values = array ()) { + try { + foreach ($values as $value) { + self::add ($table, $value); + } + } catch (PDOException $ex) { + throw new PDOException ($ex->getMessage()); + } + } + + public static function edit ( + $table, + $values = array(), + $conditions, + $values2 = array() + ) { + return self::command ( + "UPDATE `$table` SET `" . + implode('` =?, `', array_keys($values)) . + "` =? " . + $conditions + , array_merge (array_values ($values), $values2)); + } + + public static function insertId () { + return self::$join->lastInsertId (); + } + + public static function addId ($lastTable, $lastIdName) { + $answer = self::$join->prepare ("SELECT `$lastIdName` FROM `$lastTable` ORDER BY `$lastIdName` DESC"); + $answer->execute (); + return $answer->fetch (PDO::FETCH_NUM)[0]; + } + } diff --git a/class/DashboardManager.php b/class/DashboardManager.php new file mode 100644 index 0000000..1fffabb --- /dev/null +++ b/class/DashboardManager.php @@ -0,0 +1,41 @@ + UserManager::getUserData('user_id'), + 'subdevice_id' => $subDeviceId, + ); + try { + Db::add ('dashboard', $dashboardItem); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + } + + function Remove ($subDeviceId){ + $userId = UserManager::getUserData('user_id'); + Db::command ('DELETE FROM dashboard WHERE subdevice_id=? AND user_id = ?', array ($subDeviceId, $userId)); + } +} diff --git a/class/DeviceManager.php b/class/DeviceManager.php new file mode 100644 index 0000000..4d529e7 --- /dev/null +++ b/class/DeviceManager.php @@ -0,0 +1,80 @@ + $name, + 'token' => $token, + ); + try { + Db::add ('devices', $device); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public function edit ($deviceId, $values = []) { + try { + Db::edit ('devices', $values, 'WHERE device_id = ?', array($deviceId)); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + /** + * [assignRoom P艡i艡azen铆 za艡铆zen铆 do t艡铆dy] + * @param [type] $roomId [膷铆slo m铆stnosti do kter se m谩 za艡铆zen铆 p艡i艡adit] + * @param [type] $deviceId [膶铆slo za艡铆zen铆 kter茅 chcete p艡i艡adit do m铆stnosti] + */ + public function assignRoom ($roomId, $deviceId) { + $device = array ( + 'room_id' => $roomId, + ); + try { + Db::edit ('devices', $device, 'WHERE device_id = ?', array($deviceId)); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + /** + * [delete Smaz谩n铆 za艡铆zen铆] + * @param [type] $deviceId [Id za艡铆zen铆 ke smaz谩n铆] + */ + public function delete ($deviceId) { + Db::command ('DELETE FROM devices WHERE device_id=?', array ($deviceId)); + } + + public function registeret ($deviceToken) { + return (count(Db::loadAll ("SELECT * FROM devices WHERE token=?", array($deviceToken))) == 1 ? true : false); + } + + public function approved ($deviceToken) { + return (count(Db::loadAll ("SELECT * FROM devices WHERE token=? AND approved = ?", array($deviceToken, 1))) == 1 ? true : false); + } +} +?> diff --git a/class/Form.php b/class/Form.php new file mode 120000 index 0000000..7fa7c6a --- /dev/null +++ b/class/Form.php @@ -0,0 +1 @@ +C:/Users/spaninger/Documents/git/PHP_FORM_GENERATOR/Form.php \ No newline at end of file diff --git a/class/Partial.php b/class/Partial.php new file mode 100644 index 0000000..69510ed --- /dev/null +++ b/class/Partial.php @@ -0,0 +1,34 @@ +debug = $debug; + if (!empty('templates/part/' . $path . '.phtml') && file_exists('templates/part/' . $path . '.phtml')) { + $this->path = $path; + } else { + echo '
';
+			echo 'PHTML: Parial File ' . $path . ' not found';
+			echo '
'; + die(); + } + } + + function prepare($searchS, $repleaceS) { + if (!empty($searchS)) { + $this->assignedValues[strtoupper($searchS)] = $repleaceS; + } + echo ($this->debug == true ? var_dump($this->assignedValues) : ''); + } + + function render() { + if (!empty($this->assignedValues)){ + extract($this->assignedValues); + } + + require('templates/part/' . $this->path . '.phtml'); + } +} diff --git a/class/RecordManager.php b/class/RecordManager.php new file mode 100644 index 0000000..553d0c9 --- /dev/null +++ b/class/RecordManager.php @@ -0,0 +1,74 @@ + $subDeviceId, + 'value' => $value, + ); + try { + return Db::add ('records', $record); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public static function setExecuted($recordId) { + try { + Db::edit ('records', ['execuded' => 1], 'WHERE record_id = ?', array($recordId)); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public static function getRecordById($recordId) { + return Db::loadOne('SELECT * FROM records WHERE record_id = ?;', array($recordId)); + } + + public static function getLastInsertedRecordId() { + return Db::insertId(); + } + + public static function getLastRecord($subDeviceId, $num = 1) { + if ($num == 1) + return Db::loadOne('SELECT * FROM records WHERE subdevice_id = ? AND value != ? ORDER BY time DESC;', array($subDeviceId, 999)); + return Db::loadAll('SELECT * FROM records WHERE subdevice_id = ? AND value != ? ORDER BY time DESC LIMIT ?;', array($subDeviceId, 999, $num)); + } + + public static function getAllRecord($subDeviceId, $timeFrom, $timeTo) { + return Db::loadAll('SELECT * FROM records WHERE subdevice_id = ? AND time >= ? AND time <= ? AND value != ? ORDER BY time;', array($subDeviceId, $timeFrom, $timeTo, 999)); + } + + public static function getAllRecordForGraph($subDeviceId, $period = "day", $groupBy = "hour") { + $periodLocal = '- 1 ' . strtoupper($period); + $dateTime = new DateTime(); + $dateTime = $dateTime->modify($periodLocal); + $dateTime = $dateTime->format('Y-m-d'); + $groupBy = strtoupper($groupBy).'(time)'; + $sql = 'SELECT value, time FROM records + WHERE + subdevice_id = ? + AND + value != 999 + AND + time > ? + GROUP BY '.$groupBy.' + ORDER BY time ASC'; + //TODO: Pras谩rna Opravit + return Db::loadAll($sql, array($subDeviceId, $dateTime)); + } + + public static function clean ($day) { + if (isset($day)) { + Db::command ('DELETE FROM records WHERE time < ADDDATE(NOW(), INTERVAL -? DAY);', array($day)); + } + } +} +?> diff --git a/class/RoomManager.php b/class/RoomManager.php new file mode 100644 index 0000000..6a2870a --- /dev/null +++ b/class/RoomManager.php @@ -0,0 +1,26 @@ + $name, + ); + try { + Db::add ('rooms', $room); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public function delete ($roomId) { + Db::command ('DELETE FROM rooms WHERE room_id=?', array ($roomId)); + } +} +?> diff --git a/class/Route.php b/class/Route.php new file mode 100644 index 0000000..5ff4c74 --- /dev/null +++ b/class/Route.php @@ -0,0 +1,26 @@ +urls[] = '/'.trim($url, '/'); + if (!empty($view)) { + $this->views[] = $view; + } + } + + function submit(){ + $urlGetParam = isset($_GET['url']) ? '/' . $_GET['url'] : '/'; + foreach ($this->urls as $urlKey => $urlValue) { + if ($urlValue === $urlGetParam) { + $useView = $this->views[$urlKey]; + new $useView(); + } + } + } +} diff --git a/class/SceneManager.php b/class/SceneManager.php new file mode 100644 index 0000000..5e04f47 --- /dev/null +++ b/class/SceneManager.php @@ -0,0 +1,41 @@ + $icon, + 'name' => $name, + 'do_something' => $doCode, + ); + try { + Db::add ('scenes', $scene); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public function getAllScenes () { + return Db::loadAll ("SELECT * FROM scenes"); + } + + public function getScene ($sceneId) { + return Db::loadOne("SELECT * FROM scenes WHERE scene_id = ?", array($sceneId)); + } + + public function execScene ($sceneId) { + $sceneData = SceneManager::getScene($sceneId); + $sceneDoJson = $sceneData['do_something']; + $sceneDoArray = json_decode($sceneDoJson); + foreach ($sceneDoArray as $deviceId => $deviceState) { + RecordManager::create($deviceId, 'on/off', $deviceState); + } + return true; + } + + public function delete($sceneId){ + Db::command ('DELETE FROM scenes WHERE scene_id=?', array ($sceneId)); + } +} +?> diff --git a/class/SubDeviceManager.php b/class/SubDeviceManager.php new file mode 100644 index 0000000..69cc7d4 --- /dev/null +++ b/class/SubDeviceManager.php @@ -0,0 +1,55 @@ + $deviceId, + 'type' => $type, + 'unit' => $unit, + ); + try { + Db::add('subdevices', $record); + } catch (PDOException $error) { + echo $error->getMessage(); + die(); + } + } +} diff --git a/class/Template.php b/class/Template.php new file mode 100644 index 0000000..d64d42c --- /dev/null +++ b/class/Template.php @@ -0,0 +1,34 @@ +debug = $debug; + if (!empty('templates/' . $path . '.phtml') && file_exists('templates/' . $path . '.phtml')) { + $this->path = $path; + } else { + echo '
';
+			echo 'PHTML: Template File ' . $path . ' not found';
+			echo '
'; + die(); + } + } + + function prepare($searchS, $repleaceS) { + if (!empty($searchS)) { + $this->assignedValues[strtoupper($searchS)] = $repleaceS; + } + echo ($this->debug == true ? var_dump($this->assignedValues) : ''); + } + + function render() { + extract($this->assignedValues); + if (!empty('controls/' . $this->path . '.php') && file_exists('controls/' . $this->path . '.php')) { + require_once('controls/' . $this->path . '.php'); + } + require_once('templates/' . $this->path . '.phtml'); + } +} diff --git a/class/UserManager.php b/class/UserManager.php new file mode 100644 index 0000000..12f601d --- /dev/null +++ b/class/UserManager.php @@ -0,0 +1,180 @@ +getMessage(); + die(); + } + } + + public function getUser ($userName) { + try { + $user = Db::loadOne ("SELECT * FROM users WHERE username = ?", [$userName]); + return $user; + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public function login ($username, $password, $rememberMe) { + try { + if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($username))) { + if ($user['password'] == UserManager::getHashPassword($password)) { + if (isset($rememberMe) && $rememberMe == 'true') { + setcookie ("rememberMe", $this->setEncryptedCookie($user['username']), time () + (30 * 24 * 60 * 60 * 1000), "/"); + } + $_SESSION['user']['id'] = $user['user_id']; + $page = "./index.php"; + if ($user["startPage"] == 1) { + $page = "./dashboard.php"; + } + unset($_POST['login']); + return $page; + } else { + throw new PDOException("Heslo nen铆 spr谩vn茅!"); + } + } else { + throw new PDOException("U啪ivatel s t铆m to jm茅nem neexistuje!"); + } + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + + public function isLogin () { + if (isset ($_SESSION['user']) && isset($_SESSION['user']['id'])) { + return true; + } else { + if (isset ($_COOKIE['rememberMe'])){ + if ($user = Db::loadOne ('SELECT * FROM users WHERE LOWER(username)=LOWER(?)', array ($this->getDecryptedCookie($_COOKIE['rememberMe'])))) { + $_SESSION['user']['id'] = $user['user_id']; + return true; + } + } + } + return false; + } + + public function logout () { + setcookie ("rememberMe","", time() - (30 * 24 * 60 * 60 * 1000), "/"); + unset($_SESSION['user']); + session_destroy(); + } + + public function setEncryptedCookie($value){ + $first_key = base64_decode(FIRSTKEY); + $second_key = base64_decode(SECONDKEY); + + $method = "aes-256-cbc"; + $ivlen = openssl_cipher_iv_length($method); + $iv = openssl_random_pseudo_bytes($ivlen); + $newvalue_raw = openssl_encrypt($value, $method, $first_key, OPENSSL_RAW_DATA, $iv); + $hmac = hash_hmac('sha256', $newvalue_raw, $second_key, TRUE); + $newvalue = base64_encode ($iv.$hmac.$newvalue_raw); + return $newvalue; + } + + public function getDecryptedCookie($value){ + $first_key = base64_decode(FIRSTKEY); + $second_key = base64_decode(SECONDKEY); + + $c = base64_decode($value); + $method = "aes-256-cbc"; + $ivlen = openssl_cipher_iv_length($method); + $iv = substr($c, 0, $ivlen); + $hmac = substr($c, $ivlen, 32); + $newValue_raw = substr($c, $ivlen+32); + $newValue = openssl_decrypt($newValue_raw, $method, $first_key, OPENSSL_RAW_DATA, $iv); + $calcmac = hash_hmac('sha256', $newValue_raw, $second_key, TRUE); + if (hash_equals ($hmac, $calcmac)) { + return $newValue; + } + return false; + } + + public static function getUserData ($type) { + if (isset($_SESSION['user']['id'])) { + $user = Db::loadOne ('SELECT ' . $type . ' FROM users WHERE user_id=?', array ($_SESSION['user']['id'])); + return $user[$type]; + } + return ""; + } + + public function setUserData ($type, $value) { + if (isset ($_SESSION['user']['id'])) { + Db::command ('UPDATE users SET ' . $type . '=? WHERE user_id=?', array ($value, $_SESSION['user']['id'])); + } + } + + public function getHashPassword ($password) { + $salt = "s0mRIdlKvI"; + $hashPassword = hash('sha512', ($password . $salt)); + return $hashPassword; + } + + public function ulozitObrazek ($file, $path = "", $name = "") { + if (!@is_array (getimagesize($file['tmp_name']))) { + throw new ChybaUzivatele("Form谩t obr谩zku ". $file['name'] ." nen铆 podporov谩n!"); + } else { + $extension = strtolower(strrchr($file['name'], '.')); + switch ($extension) { + case '.jpg': + case '.jpeg': + $img = @imagecreatefromjpeg($file['tmp_name']); + break; + case '.gif': + $img = @imagecreatefromgif($file['tmp_name']); + break; + case '.png': + $img2 = @imagecreatefrompng($file['tmp_name']); + break; + case '.ico': + $img3 = @$file['tmp_name']; + break; + default: + $img = false; + break; + } + if($name == ""){ + $nazev = substr($file['name'], 0, strpos($file['name'], ".")) ."_". round(microtime(true) * 1000); + }else{ + $nazev = $name; + } + if(!file_exists($path)){ + mkdir($path, 0777, true); + } + if (@$img) { + if (!imagejpeg ($img, $path . $nazev .".jpg", 95)) { + throw new ChybaUzivatele ("Obr谩zek neulo啪en!"); + } + imagedestroy ($img); + } else if (@$img2) { + if (!imagepng ($img2, $path . $nazev .".jpg")) { + throw new ChybaUzivatele ("Obr谩zek neulo啪en!"); + } + imagedestroy ($img2); + } else if (@$img3) { + if (!copy($img3, $path . $nazev .'.ico')) { + throw new ChybaUzivatele ("Obr谩zek neulo啪en!"); + } + } + return array('success' => true, 'url' => $path . $nazev .".jpg"); + } + } + + public function atHome($userId, $atHome){ + try { + Db::edit ('users', ['at_home' => $atHome], 'WHERE user_id = ?', array($userId)); + } catch(PDOException $error) { + echo $error->getMessage(); + die(); + } + } + } + ?> diff --git a/class/Utilities.php b/class/Utilities.php new file mode 100644 index 0000000..39d9052 --- /dev/null +++ b/class/Utilities.php @@ -0,0 +1,38 @@ + 'a', + '/[脕脌脗脙脛]/u' => 'A', + '/[脥脤脦脧]/u' => 'I', + '/[铆矛卯茂]/u' => 'i', + '/[臎茅猫锚毛]/u' => 'e', + '/[臍脡脠脢脣]/u' => 'E', + '/[贸貌么玫潞枚]/u' => 'o', + '/[脫脪脭脮脰]/u' => 'O', + '/[煤霉没眉]/u' => 'u', + '/[脷脵脹脺]/u' => 'U', + '/艩/' => 'S', + '/拧/' => 's', + '/膶/' => 'C', + '/膷/' => 'c', + '/艡/' => 'r', + '/艠/' => 'R', + '/脻/' => 'Y', + '/媒/' => 'y', + '/莽/' => 'c', + '/脟/' => 'C', + '/帽/' => 'n', + '/脩/' => 'N', + '/鈥/' => '-', // UTF-8 hyphen to "normal" hyphen + '/[鈥欌樷光衡歖/u' => ' ', // Literally a single quote + '/[鈥溾澛烩瀅/u' => ' ', // Double quote + '/ /' => ' ', // nonbreaking space (equiv. to 0x160) + ); + return preg_replace(array_keys($utf8), array_values($utf8), $text); + } +} diff --git a/config_sample.php b/config_sample.php new file mode 100644 index 0000000..a142791 --- /dev/null +++ b/config_sample.php @@ -0,0 +1,59 @@ + '', + 'temp' => "掳C", + 'humi' => "%", + 'light' => "", + 'on/off' => "" +]; + +//Graph Setting +const RANGES = [ + '' => [ + 'min' => 0, + 'max' => 100, + 'scale' =>20, + ], + 'temp' => [ + 'min' => 10, + 'max' => 45, + 'scale' =>20, + ], + 'humi' => [ + 'min' => 0, + 'max' => 100, + 'scale' =>20, + ], + 'light' => [ + 'min' => 0, + 'max' => 1, + 'scale' =>1, + ], + 'on/off' => [ + 'min' => 0, + 'max' => 1, + 'scale' =>1, + ], +]; +?> diff --git a/controls/automation.php b/controls/automation.php new file mode 100644 index 0000000..db57a8e --- /dev/null +++ b/controls/automation.php @@ -0,0 +1,14 @@ + diff --git a/controls/dashboard.php b/controls/dashboard.php new file mode 100644 index 0000000..ae37279 --- /dev/null +++ b/controls/dashboard.php @@ -0,0 +1,14 @@ + diff --git a/controls/home.php b/controls/home.php new file mode 100644 index 0000000..756b387 --- /dev/null +++ b/controls/home.php @@ -0,0 +1,67 @@ + $deviceOwnerUserId, + 'name' => $deviceName, + 'icon' => $deviceIcon, + 'permission' => $permissionsInJson, + 'sleep_time' => $sleepTime + ); + DeviceManager::edit($deviceId, $args); + } catch (\Exception $e) { + echo $e->message(); + + } + + + + //Debug + if (DEBUGMOD == 1) { + echo '
';
+			echo $permissionsInJson;
+			echo $deviceId;
+			var_dump(json_decode ($permissionsInJson));
+			echo '
'; + echo '
CONTINUE'; + die(); + } + } else if (isset($_POST['approveDevice'])) { + $deviceId = $_POST['deviceId']; + $args = array( + 'approved' => 1, + ); + DeviceManager::edit($deviceId, $args); + } else if (isset($_POST['disableDevice'])) { + $deviceId = $_POST['deviceId']; + $args = array( + 'approved' => 2, + ); + DeviceManager::edit($deviceId, $args); + } + + //Debug + if (DEBUGMOD == 1) { + echo '
';
+		var_dump($POST);
+		echo '
'; + echo 'CONTINUE'; + die(); + } + header('Location: /vasek/home/', TRUE); + die(); +} +?> diff --git a/controls/scene.php b/controls/scene.php new file mode 100644 index 0000000..19e7a64 --- /dev/null +++ b/controls/scene.php @@ -0,0 +1,18 @@ +'; + var_dump($_POST); + echo ''; + echo 'CONTINUE'; + die(); + } + + header('Location: /vasek/home/' . strtolower(basename(__FILE__, '.php')), TRUE); + die(); +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..32561fb --- /dev/null +++ b/index.php @@ -0,0 +1,75 @@ +'; + echo '
';
+	echo 'Language SLUG: ' . $langTag;
+	echo '
'; + echo '
';
+	print_r(get_defined_constants());
+	echo '
'; + echo '
';
+	print_r(get_defined_vars());
+	echo '
'; + echo '';*/ +} +require_once './lang/' . $langTag . '.php'; + +//DB Conector +Db::connect (DBHOST, DBUSER, DBPASS, DBNAME); + +//TODO: P艡esunout do Login Pohledu +$userManager = new UserManager(); +if (isset($_POST['username']) && isset($_POST['password']) ) { + $userManager->login($_POST['username'], $_POST['password'], $_POST['remember']); +} +/* +$form = new Form('name','1','POST',''); +$form->addInput(InputTypes::TEXT,'nadpis','','Label',''); +$form->addInput(InputTypes::BUTTON,'nadpis','','Label','test'); +$form->addInput(InputTypes::TEXT,'nadpis','','Label',''); +$form->addInput(InputTypes::TEXT,'nadpis','','Label','', false); +$form->addInput(InputTypes::TEXT,'nadpis','','Label',''); +$form->addInput(InputTypes::CHECK,'nadpis','','Label',''); +$form->addInput(InputTypes::TEXT,'nadpis','','Label',''); +$arg = array( + 'test_v' => 'test', + 'test_v2' => 'test', +); +$form->addSelect('1', '1', '1', $arg, false); +$form->render(); +die(); +*/ + +$route = new Route(); +$route->add('/', 'Home'); +$route->add('/login', 'Login'); +$route->add('/logout', 'Logout'); +$route->add('/automation', 'Automation'); +$route->add('/dashboard', 'Dashboard'); +$route->add('/setting', 'Setting'); +$route->add('/scene', 'Scene'); +$route->add('/ajax', 'Ajax'); +$route->add('/rooms', 'Rooms'); + +$route->submit(); diff --git a/lang/cs.php b/lang/cs.php new file mode 100644 index 0000000..c574793 --- /dev/null +++ b/lang/cs.php @@ -0,0 +1,71 @@ + 'Dom暖', + 'm_dashboard' => 'N谩st臎nka', + 'm_settings' => 'Nastaven铆', + 'm_automatization' => 'Automatizace', + 'm_scenes' => 'Sc茅ny', + + //Buttons + 'b_year' => 'Rok', + 'b_month' => 'M臎s铆c', + 'b_week' => 'T媒den', + 'b_day' => 'Den', + 'b_hour' => 'Hodina', + 'b_next' => 'Dal拧铆', + 'b_create' => 'Vytvo艡it', + 'b_edit' => 'Upravit', + 'b_remove' => 'Smazat', + 'b_approve' => 'Povolit', + 'b_disable' => 'Zak谩zat', + 'b_save' => 'Ulo啪it', + + + //labels + 'l_choseDevice' => 'Zvolte za艡铆zen铆:', + 'l_inHome' => 'P艡i p艡铆chodu', + 'l_outHome' => 'Pri odchodu', + 'l_sunSet' => 'V媒chod Slunce', + 'l_sunRice' => 'Z谩pad Slunce', + 'l_time' => '膶ase', + 'l_deviceValue' => 'Hodnot臎 za艡铆zen铆', + 'l_runAt' => 'Spustit p艡i', + 'l_resetAt' => 'Restartovat p艡i', + 'l_affectedDevices' => 'Ovlivn臎n谩 za艡铆zen铆', + 'l_atDays' => 'Ve dny', + 'l_read' => '膶铆st', + 'l_use' => 'Pou啪铆t', + 'l_edit' => 'Upravit', + 'l_owner' => 'Vlastn铆k', + 'l_member' => '膶len Dom谩cnosti', + 'l_permission' => 'Opr谩vmn臎n铆', + 'l_inMinutes' => 'v minut谩ch', + 'l_sleepTime' => 'Doba sp谩nku za艡铆zen铆', + + //Title + 't_createScene' => 'Vytvo艡it sc茅nu', + 't_editScene' => 'Upravit sc茅nu', + + 't_createAutomation' => 'Vytvo艡it Automatizaci', + + 't_editDevice' => 'Upravit Za艡铆zen铆', + + //constants + 'temp' => 'Teplota', + 'humi' => 'Vlhkost', + 'light' => 'Sv臎tlo', + 'battery' => 'Baterie', + 'on/off' => 'Vyp铆na膷', + + //words + 'w_title' => 'N谩zev', + 'w_icon' => 'Ikona', + 'w_no' => '啪谩dn谩', + 'w_noOne' => 'Nikdo', + 'w_room' => 'M铆stnost', + 'w_moduls' => 'Moduly', + + //example + '' => '', +]; diff --git a/lang/en.php b/lang/en.php new file mode 100644 index 0000000..77251f8 --- /dev/null +++ b/lang/en.php @@ -0,0 +1,71 @@ + 'Home', + 'm_dashboard' => 'Dashboard', + 'm_settings' => 'Setting', + 'm_automatization' => 'Automatization', + 'm_scenes' => 'Scenes', + + //Buttons + 'b_year' => 'Year', + 'b_month' => 'Month', + 'b_week' => 'Week', + 'b_day' => 'Day', + 'b_hour' => 'Hour', + 'b_next' => 'Next', + 'b_create' => 'Create', + 'b_edit' => 'Edit', + 'b_remove' => 'Remove', + 'b_approve' => 'Approve', + 'b_disable' => 'Disable', + 'b_save' => 'Save', + + + //labels + 'l_choseDevice' => 'Chose device:', + 'l_inHome' => 'When entering', + 'l_outHome' => 'When exiting', + 'l_sunSet' => 'Sun Rise', + 'l_sunRice' => 'Sun Set', + 'l_time' => 'Time', + 'l_deviceValue' => 'Device Valalue', + 'l_runAt' => 'Run at', + 'l_resetAt' => 'Reset at', + 'l_affectedDevices' => 'Affected devices', + 'l_atDays' => 'At days', + 'l_read' => 'Read', + 'l_use' => 'Use', + 'l_edit' => 'Edit', + 'l_owner' => 'Owner', + 'l_member' => 'Home Member', + 'l_permission' => 'Permission', + 'l_inMinutes' => 'in minutes', + 'l_sleepTime' => 'Device sleep Time', + + //Title + 't_createScene' => 'Create Scene', + 't_editScene' => 'Edit sc茅nu', + + 't_createAutomation' => 'Create Automation', + + 't_editDevice' => 'Edit Device', + + //constants + 'humi' => 'Humidity', + 'temp' => 'Temperature', + 'light' => 'Light', + 'battery' => 'Batteri', + 'on/off' => 'Switch', + + //words + 'w_title' => 'Name', + 'w_icon' => 'Icon', + 'w_no' => 'no', + 'w_noOne' => 'noone', + 'w_room' => 'Room', + 'w_moduls' => 'Moduls', + + //example + '' => '', +]; diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..7150e8b --- /dev/null +++ b/manifest.json @@ -0,0 +1,22 @@ +{ + "name": "Home", + "short_name": "Home", + "description": "Smart Home interface in PWA", + "lang": "cs-CZ", + "start_url": "/vasek/home/", + "scope": "/vasek/home/", + "display": "fullscreen", + "orientation": "portrait", + "theme_color": "#182239", + "icons": [ + { + "src": "/vasek/home/templates/images/icon-192x192.png", + "sizes": "192x192" + }, + { + "src": "/vasek/home/templates/images/icon-512x512.png", + "sizes": "512x512" + } + ], + "background_color": "#182239" +} \ No newline at end of file diff --git a/serviceWorker.js b/serviceWorker.js new file mode 100644 index 0000000..77ace7c --- /dev/null +++ b/serviceWorker.js @@ -0,0 +1,78 @@ +/** +* Cache version, change name to force reload +*/ +var CACHE_VERSION = 'v1'; + +/** +* Stuff to put in the cache at install +*/ +var CACHE_FILES = [ + 'templates/automatio.phtml', + 'templates/dashboard.phtml', + 'templates/home.phtml', + 'templates/login.phtml', + 'templates/scene.phtml', + 'templates/setting.phtml', + 'views/Automation.phtml', + 'views/Dashboard.phtml', + 'views/Home.phtml', + 'views/Login.phtml', + 'views/Scene.phtml', + 'views/Setting.phtml', + 'assets/logo.svg' +]; + +/** +* Service worker 'install' event. +* If all the files are successfully cached, then the service worker will be installed. +* If any of the files fail to download, then the install step will fail. +*/ +this.addEventListener('install', function(event) { + console.log('Install'); +}); + +/** +* After a service worker is installed and the user navigates to a different page or refreshes, +* the service worker will begin to receive fetch events. +* +* Network-first approach: if online, request is fetched from network and not from cache +*/ + +self.addEventListener('push', function(event) { + console.log('Received a push message', event); + + var title = 'Notification'; + var body = 'There is newly updated content available on the site. Click to see more.'; + var icon = 'https://raw.githubusercontent.com/deanhume/typography/gh-pages/icons/typography.png'; + var tag = 'simple-push-demo-notification-tag'; + + event.waitUntil( + self.registration.showNotification(title, { + body: body, + icon: icon, + tag: tag + }) + ); +}); + +self.addEventListener('sync', function(event) { + console.info('Event: Sync'); + +}); + +self.addEventListener('fetch', function (event) { + +}); + +self.addEventListener("online", function (event) { + +}); + +self.addEventListener("offline", function (event) { +}); + +self.addEventListener('notificationclick', function(e) { + +}); + + diff --git a/templates/Elementum/scss/elements/_buttons.scss b/templates/Elementum/scss/elements/_buttons.scss new file mode 100644 index 0000000..07e4b1d --- /dev/null +++ b/templates/Elementum/scss/elements/_buttons.scss @@ -0,0 +1,69 @@ +.button{ + background-color: $secondary-color; + border: 0; + border-radius: $control-border-radius; + color: $base-font-color; + padding: $control-padding-y $control-padding-x; + transition: background-color .15s; + height: 2.5rem; + display: inline-block; + line-height: 1.5; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + text-decoration: none; + + &:hover{ + color: $base-font-color; + background-color: $secondary-color-dark; + } + &:active{ + background-color: $secondary-color-dark; + } + &:focus{ + box-shadow: 0 0 3px $control-focus-color; + } +} + +.button.is-small{ + padding: $control-padding-y $control-padding-x/1.5; + height: 2rem; + font-size: .875rem; +} + +.button.is-large{ + height: 3rem; + font-size: 1.25rem; +} + +.buttons .button{ + margin-right: .25rem; + margin-bottom: .25rem; +} + +.button.is-primary{ + background-color: $primary-color; + color: white; + + &:hover{ + color: white; + background-color: $primary-color-dark; + } + &:active{ + background-color: $primary-color-dark; + } +} + +.button.is-danger{ + background-color: map-get($red-colors , '100'); + color: map-get($red-colors , '500'); + + &:hover{ + background-color: map-get($red-colors , '200'); + color: map-get($red-colors , '600'); + } + &:active{ + background-color: map-get($red-colors , '200'); + color: map-get($red-colors , '600'); + } +} diff --git a/templates/automation.phtml b/templates/automation.phtml new file mode 100644 index 0000000..0a1eee3 --- /dev/null +++ b/templates/automation.phtml @@ -0,0 +1,185 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + +
+
+ +
+ Create Automation + +
+ $automationData) { ?> +
+
+
+
delete
+
+
+
+ +
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+ + + + render(); + ?> + + diff --git a/templates/css/font-awesome.min.css b/templates/css/font-awesome.min.css new file mode 100644 index 0000000..229ba84 --- /dev/null +++ b/templates/css/font-awesome.min.css @@ -0,0 +1,6 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */ + @font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal} + .fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/templates/css/loading.css b/templates/css/loading.css new file mode 100644 index 0000000..6c58598 --- /dev/null +++ b/templates/css/loading.css @@ -0,0 +1,19 @@ +.loader { + border: 16px solid #f3f3f3; + border-radius: 50%; + border-top: 16px solid rgb(101, 30, 122);; + width: 100%; + height: 100%; + -webkit-animation: spin 2s linear infinite; /* Safari */ + animation: spin 2s linear infinite; +} + +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/templates/css/main.css b/templates/css/main.css new file mode 100644 index 0000000..a2eb8d4 --- /dev/null +++ b/templates/css/main.css @@ -0,0 +1,2956 @@ +/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */ +/* Document +========================================================================== */ +/** +* 1. Correct the line height in all browsers. +* 2. Prevent adjustments of font size after orientation changes in iOS. +*/ +html { + line-height: 1.15; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ +} + +/* Sections +========================================================================== */ +/** +* Remove the margin in all browsers. +*/ +body { + margin: 0; +} + +/** +* Render the `main` element consistently in IE. +*/ +main { + display: block; +} + +/** +* Correct the font size and margin on `h1` elements within `section` and +* `article` contexts in Chrome, Firefox, and Safari. +*/ +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +/* Grouping content +========================================================================== */ +/** +* 1. Add the correct box sizing in Firefox. +* 2. Show the overflow in Edge and IE. +*/ +hr { + -webkit-box-sizing: content-box; + box-sizing: content-box; + /* 1 */ + height: 0; + /* 1 */ + overflow: visible; + /* 2 */ +} + +/** +* 1. Correct the inheritance and scaling of font size in all browsers. +* 2. Correct the odd `em` font sizing in all browsers. +*/ +pre { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* Text-level semantics +========================================================================== */ +/** +* Remove the gray background on active links in IE 10. +*/ +a { + background-color: transparent; +} + +/** +* 1. Remove the bottom border in Chrome 57- +* 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. +*/ +abbr[title] { + border-bottom: none; + /* 1 */ + text-decoration: underline; + /* 2 */ + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + /* 2 */ +} + +/** +* Add the correct font weight in Chrome, Edge, and Safari. +*/ +b, +strong { + font-weight: bolder; +} + +/** +* 1. Correct the inheritance and scaling of font size in all browsers. +* 2. Correct the odd `em` font sizing in all browsers. +*/ +code, +kbd, +samp { + font-family: monospace, monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/** +* Add the correct font size in all browsers. +*/ +small { + font-size: 80%; +} + +/** +* Prevent `sub` and `sup` elements from affecting the line height in +* all browsers. +*/ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* Embedded content +========================================================================== */ +/** +* Remove the border on images inside links in IE 10. +*/ +img { + border-style: none; +} + +/* Forms +========================================================================== */ +/** +* 1. Change the font styles in all browsers. +* 2. Remove the margin in Firefox and Safari. +*/ +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + line-height: 1.15; + /* 1 */ + margin: 0; + /* 2 */ +} + +/** +* Show the overflow in IE. +* 1. Show the overflow in Edge. +*/ +button, +input { + /* 1 */ + overflow: visible; +} + +/** +* Remove the inheritance of text transform in Edge, Firefox, and IE. +* 1. Remove the inheritance of text transform in Firefox. +*/ +button, +select { + /* 1 */ + text-transform: none; +} + +/** +* Correct the inability to style clickable types in iOS and Safari. +*/ +button, +[type="button"], +[type="reset"], +[type="submit"] { + -webkit-appearance: button; +} + +/** +* Remove the inner border and padding in Firefox. +*/ +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { + border-style: none; + padding: 0; +} + +/** +* Restore the focus styles unset by the previous rule. +*/ +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { + outline: 1px dotted ButtonText; +} + +/** +* Correct the padding in Firefox. +*/ +fieldset { + padding: 0.35em 0.75em 0.625em; +} + +/** +* 1. Correct the text wrapping in Edge and IE. +* 2. Correct the color inheritance from `fieldset` elements in IE. +* 3. Remove the padding so developers are not caught out when they zero out +* `fieldset` elements in all browsers. +*/ +legend { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* 1 */ + color: inherit; + /* 2 */ + display: table; + /* 1 */ + max-width: 100%; + /* 1 */ + padding: 0; + /* 3 */ + white-space: normal; + /* 1 */ +} + +/** +* Add the correct vertical alignment in Chrome, Firefox, and Opera. +*/ +progress { + vertical-align: baseline; +} + +/** +* Remove the default vertical scrollbar in IE 10+. +*/ +textarea { + overflow: auto; +} + +/** +* 1. Add the correct box sizing in IE 10. +* 2. Remove the padding in IE 10. +*/ +[type="checkbox"], +[type="radio"] { + -webkit-box-sizing: border-box; + box-sizing: border-box; + /* 1 */ + padding: 0; + /* 2 */ +} + +/** +* Correct the cursor style of increment and decrement buttons in Chrome. +*/ +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** +* 1. Correct the odd appearance in Chrome and Safari. +* 2. Correct the outline style in Safari. +*/ +[type="search"] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/** +* Remove the inner padding in Chrome and Safari on macOS. +*/ +[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** +* 1. Correct the inability to style clickable types in iOS and Safari. +* 2. Change font properties to `inherit` in Safari. +*/ +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* Interactive +========================================================================== */ +/* +* Add the correct display in Edge, IE 10+, and Firefox. +*/ +details { + display: block; +} + +/* +* Add the correct display in all browsers. +*/ +summary { + display: list-item; +} + +/* Misc +========================================================================== */ +/** +* Add the correct display in IE 10+. +*/ +template { + display: none; +} + +/** +* Add the correct display in IE 10. +*/ +[hidden] { + display: none; +} + +* { + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +input:focus, +select:focus, +select:hover, +textarea:focus, +button:focus, +*:focus { + outline: none; +} + +[type="submit"], +[type="reset"], +[type="button"], +select, +option, +button, +a { + cursor: pointer; +} + +html { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: "Metropolis", sans-serif; + line-height: 1.5; + color: #d4def7; + background: #182239; +} + +a { + color: #678de4; +} + +a:hover { + color: #678de4; +} + +input, +select, +button { + font-family: "Metropolis", sans-serif; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 600; + line-height: 1.2; + margin: .5em 0; +} + +h1 { + font-size: 2.5rem; +} + +h2 { + font-size: 2rem; +} + +h3 { + font-size: 1.75rem; +} + +h4 { + font-size: 1.5rem; +} + +h5 { + font-size: 1.25rem; +} + +h6 { + font-size: 1rem; +} + +.alert { + border-left: 4px solid #678de4; + background-color: #e9effb; + color: #294ea3; + padding: .75rem 1rem; + margin-bottom: 1rem; +} + +.aler-heading { + margin-bottom: .25rem; +} + +.alert-danger { + background-color: #fbe9ed; + border-color: #e46782; + color: #d9264d; +} + +.alert-success { + background-color: #f3f7f4; + border-color: #79d29e; + color: #1f7a45; +} + +.alert-warning { + background-color: #fbf6e9; + border-color: #e4bd67; + color: #735b26; +} + +.button { + background-color: #d4def7; + border: 0; + border-radius: 3px; + color: #182239; + padding: 0.5em 1.2em; + -webkit-transition: .15s; + transition: .15s; + height: 2.5rem; + display: inline-block; + line-height: 1.5; + font-size: 1rem; + font-weight: 500; + cursor: pointer; + text-align: center; + text-decoration: none; +} + +.button:hover { + color: #182239; + background-color: #c7d5f5; +} + +.button:active { + background-color: #c7d5f5; +} + +.button:focus { + -webkit-box-shadow: 0 0 3px rgba(15, 108, 239, 0.3); + box-shadow: 0 0 3px rgba(15, 108, 239, 0.3); +} + +.button.is-small { + padding: 0.5em 0.8em; + height: 2rem; + font-size: .875rem; +} + +.button.is-large { + height: 3rem; + font-size: 1.25rem; +} + +.buttons .button { + margin-right: .25rem; + margin-bottom: .25rem; +} + +.button.is-primary { + background-color: #265cd9; + color: white; +} + +.button.is-primary:hover { + color: white; + background-color: #2456cc; +} + +.button.is-primary:active { + background-color: #2456cc; +} + +.button.is-danger { + background-color: #fbe9ed; + color: #d9264d; +} + +.button.is-danger:hover { + background-color: #f7d4db; + color: #a32943; +} + +.button.is-danger:active { + background-color: #f7d4db; + color: #a32943; +} + +.field { + margin-bottom: .8em; +} + +.label { + display: block; + margin-bottom: .2em; + font-weight: 500; +} + +.input, +.textarea, +.select { + border-radius: 3px; + border: 0px solid transparent; + color: #d4def7; + padding: 0.5em 0.8em; + height: 2.5rem; + line-height: 1.5; + background: #121a2b; + width: 100%; + display: block; +} + +.input:focus, +.textarea:focus, +.select:focus { + -webkit-box-shadow: 0 0 3px rgba(15, 108, 239, 0.3); + box-shadow: 0 0 3px rgba(15, 108, 239, 0.3); +} + +.input:disabled, +.textarea:disabled, +.select:disabled { + background: transparent; + opacity: .4; +} + +.select option { + background-color: inherit; + color: inherit; +} + +.textarea { + height: auto; + resize: vertical; +} + +.table { + border-spacing: 0; + border-collapse: collapse; + width: 100%; +} + +.table th { + font-weight: 600; + border-bottom: 2px solid transparent; + text-align: left; +} + +.table td, .table th { + padding: .5em .75em; +} + +.table td { + border-top: 1px solid transparent; +} + +.table.is-striped tbody tr:nth-child(odd) { + background: rgba(235, 240, 251, 0.5); +} + +.table tbody tr.is-active { + background: #d4def7; +} + +.container { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container { + max-width: 540px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 720px; + } +} + +@media (min-width: 992px) { + .container { + max-width: 960px; + } +} + +@media (min-width: 1200px) { + .container { + max-width: 1140px; + } +} + +.container-fluid { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} + +.row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + margin-right: -15px; + margin-left: -15px; +} + +.no-gutters { + margin-right: 0; + margin-left: 0; +} + +.no-gutters > .col, +.no-gutters > [class*="col-"] { + padding-right: 0; + padding-left: 0; +} + +.col-1, .col-2, .col-3, .col-4, .col-5, .col-6, .col-7, .col-8, .col-9, .col-10, .col-11, .col-12, .col, +.col-auto, .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm, +.col-sm-auto, .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12, .col-md, +.col-md-auto, .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg, +.col-lg-auto, .col-xl-1, .col-xl-2, .col-xl-3, .col-xl-4, .col-xl-5, .col-xl-6, .col-xl-7, .col-xl-8, .col-xl-9, .col-xl-10, .col-xl-11, .col-xl-12, .col-xl, +.col-xl-auto { + position: relative; + width: 100%; + padding-right: 15px; + padding-left: 15px; +} + +.col { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; +} + +.col-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; +} + +.col-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; +} + +.col-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; +} + +.col-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; +} + +.col-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; +} + +.col-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; +} + +.col-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; +} + +.col-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; +} + +.col-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; +} + +.col-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; +} + +.col-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; +} + +.col-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; +} + +.col-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; +} + +.order-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; +} + +.order-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; +} + +.order-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; +} + +.order-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; +} + +.order-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; +} + +.order-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; +} + +.order-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; +} + +.order-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; +} + +.order-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; +} + +.order-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; +} + +.order-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; +} + +.order-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; +} + +.order-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; +} + +.order-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; +} + +.order-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; +} + +.offset-1 { + margin-left: 8.33333%; +} + +.offset-2 { + margin-left: 16.66667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333%; +} + +.offset-5 { + margin-left: 41.66667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333%; +} + +.offset-8 { + margin-left: 66.66667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333%; +} + +.offset-11 { + margin-left: 91.66667%; +} + +@media (min-width: 576px) { + .col-sm { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-sm-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-sm-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-sm-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-sm-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-sm-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-sm-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-sm-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-sm-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-sm-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-sm-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-sm-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-sm-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-sm-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-sm-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + .order-sm-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + .order-sm-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + .order-sm-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .order-sm-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .order-sm-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .order-sm-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + .order-sm-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + .order-sm-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + .order-sm-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + .order-sm-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + .order-sm-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + .order-sm-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + .order-sm-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + .order-sm-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333%; + } + .offset-sm-2 { + margin-left: 16.66667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333%; + } + .offset-sm-5 { + margin-left: 41.66667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333%; + } + .offset-sm-8 { + margin-left: 66.66667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333%; + } + .offset-sm-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 768px) { + .col-md { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-md-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-md-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-md-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-md-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-md-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-md-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-md-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-md-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-md-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-md-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-md-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-md-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-md-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-md-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + .order-md-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + .order-md-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + .order-md-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .order-md-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .order-md-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .order-md-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + .order-md-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + .order-md-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + .order-md-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + .order-md-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + .order-md-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + .order-md-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + .order-md-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + .order-md-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333%; + } + .offset-md-2 { + margin-left: 16.66667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333%; + } + .offset-md-5 { + margin-left: 41.66667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333%; + } + .offset-md-8 { + margin-left: 66.66667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333%; + } + .offset-md-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 992px) { + .col-lg { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-lg-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-lg-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-lg-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-lg-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-lg-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-lg-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-lg-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-lg-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-lg-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-lg-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-lg-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-lg-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-lg-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-lg-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + .order-lg-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + .order-lg-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + .order-lg-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .order-lg-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .order-lg-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .order-lg-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + .order-lg-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + .order-lg-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + .order-lg-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + .order-lg-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + .order-lg-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + .order-lg-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + .order-lg-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + .order-lg-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333%; + } + .offset-lg-2 { + margin-left: 16.66667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333%; + } + .offset-lg-5 { + margin-left: 41.66667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333%; + } + .offset-lg-8 { + margin-left: 66.66667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333%; + } + .offset-lg-11 { + margin-left: 91.66667%; + } +} + +@media (min-width: 1200px) { + .col-xl { + -ms-flex-preferred-size: 0; + flex-basis: 0; + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + max-width: 100%; + } + .col-xl-auto { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + width: auto; + max-width: 100%; + } + .col-xl-1 { + -webkit-box-flex: 0; + -ms-flex: 0 0 8.33333%; + flex: 0 0 8.33333%; + max-width: 8.33333%; + } + .col-xl-2 { + -webkit-box-flex: 0; + -ms-flex: 0 0 16.66667%; + flex: 0 0 16.66667%; + max-width: 16.66667%; + } + .col-xl-3 { + -webkit-box-flex: 0; + -ms-flex: 0 0 25%; + flex: 0 0 25%; + max-width: 25%; + } + .col-xl-4 { + -webkit-box-flex: 0; + -ms-flex: 0 0 33.33333%; + flex: 0 0 33.33333%; + max-width: 33.33333%; + } + .col-xl-5 { + -webkit-box-flex: 0; + -ms-flex: 0 0 41.66667%; + flex: 0 0 41.66667%; + max-width: 41.66667%; + } + .col-xl-6 { + -webkit-box-flex: 0; + -ms-flex: 0 0 50%; + flex: 0 0 50%; + max-width: 50%; + } + .col-xl-7 { + -webkit-box-flex: 0; + -ms-flex: 0 0 58.33333%; + flex: 0 0 58.33333%; + max-width: 58.33333%; + } + .col-xl-8 { + -webkit-box-flex: 0; + -ms-flex: 0 0 66.66667%; + flex: 0 0 66.66667%; + max-width: 66.66667%; + } + .col-xl-9 { + -webkit-box-flex: 0; + -ms-flex: 0 0 75%; + flex: 0 0 75%; + max-width: 75%; + } + .col-xl-10 { + -webkit-box-flex: 0; + -ms-flex: 0 0 83.33333%; + flex: 0 0 83.33333%; + max-width: 83.33333%; + } + .col-xl-11 { + -webkit-box-flex: 0; + -ms-flex: 0 0 91.66667%; + flex: 0 0 91.66667%; + max-width: 91.66667%; + } + .col-xl-12 { + -webkit-box-flex: 0; + -ms-flex: 0 0 100%; + flex: 0 0 100%; + max-width: 100%; + } + .order-xl-first { + -webkit-box-ordinal-group: 0; + -ms-flex-order: -1; + order: -1; + } + .order-xl-last { + -webkit-box-ordinal-group: 14; + -ms-flex-order: 13; + order: 13; + } + .order-xl-0 { + -webkit-box-ordinal-group: 1; + -ms-flex-order: 0; + order: 0; + } + .order-xl-1 { + -webkit-box-ordinal-group: 2; + -ms-flex-order: 1; + order: 1; + } + .order-xl-2 { + -webkit-box-ordinal-group: 3; + -ms-flex-order: 2; + order: 2; + } + .order-xl-3 { + -webkit-box-ordinal-group: 4; + -ms-flex-order: 3; + order: 3; + } + .order-xl-4 { + -webkit-box-ordinal-group: 5; + -ms-flex-order: 4; + order: 4; + } + .order-xl-5 { + -webkit-box-ordinal-group: 6; + -ms-flex-order: 5; + order: 5; + } + .order-xl-6 { + -webkit-box-ordinal-group: 7; + -ms-flex-order: 6; + order: 6; + } + .order-xl-7 { + -webkit-box-ordinal-group: 8; + -ms-flex-order: 7; + order: 7; + } + .order-xl-8 { + -webkit-box-ordinal-group: 9; + -ms-flex-order: 8; + order: 8; + } + .order-xl-9 { + -webkit-box-ordinal-group: 10; + -ms-flex-order: 9; + order: 9; + } + .order-xl-10 { + -webkit-box-ordinal-group: 11; + -ms-flex-order: 10; + order: 10; + } + .order-xl-11 { + -webkit-box-ordinal-group: 12; + -ms-flex-order: 11; + order: 11; + } + .order-xl-12 { + -webkit-box-ordinal-group: 13; + -ms-flex-order: 12; + order: 12; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333%; + } + .offset-xl-2 { + margin-left: 16.66667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333%; + } + .offset-xl-5 { + margin-left: 41.66667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333%; + } + .offset-xl-8 { + margin-left: 66.66667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333%; + } + .offset-xl-11 { + margin-left: 91.66667%; + } +} + +.c-auto { + cursor: auto; +} + +.c-move { + cursor: move; +} + +.c-not-allowed { + cursor: not-allowed; +} + +.c-pointer { + cursor: pointer; +} + +.c-zoom-in { + cursor: -webkit-zoom-in; + cursor: zoom-in; +} + +.c-zoom-out { + cursor: -webkit-zoom-out; + cursor: zoom-out; +} + +.d-inline { + display: inline; +} + +.d-block { + display: block; +} + +.d-inline-block { + display: inline-block; +} + +.d-flex { + display: -webkit-box; + display: -ms-flexbox; + display: flex; +} + +.d-inline-flex { + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; +} + +.d-none { + display: none; +} + +.d-visible { + visibility: visible; +} + +.d-hidden { + visibility: hidden; +} + +.clearfix { + clear: both; +} + +.float-left { + float: left; +} + +.float-right { + float: right; +} + +.p-relative { + position: relative; +} + +.p-absolute { + position: absolute; +} + +.p-fixed { + position: fixed; +} + +.p-sticky { + position: -webkit-sticky; + position: sticky; +} + +.p-0 { + padding: 0rem !important; +} + +.pt-0 { + padding-top: 0rem !important; +} + +.pr-0 { + padding-right: 0rem !important; +} + +.pb-0 { + padding-bottom: 0rem !important; +} + +.pl-0 { + padding-left: 0rem !important; +} + +.px-0 { + padding-left: 0rem !important; + padding-right: 0rem !important; +} + +.py-0 { + padding-top: 0rem !important; + padding-bottom: 0rem !important; +} + +.m-0 { + margin: 0rem !important; +} + +.mt-0 { + margin-top: 0rem !important; +} + +.mr-0 { + margin-right: 0rem !important; +} + +.mb-0 { + margin-bottom: 0rem !important; +} + +.ml-0 { + margin-left: 0rem !important; +} + +.mx-0 { + margin-left: 0rem !important; + margin-right: 0rem !important; +} + +.my-0 { + margin-top: 0rem !important; + margin-bottom: 0rem !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pr-1 { + padding-right: 0.25rem !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pl-1 { + padding-left: 0.25rem !important; +} + +.px-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mr-1 { + margin-right: 0.25rem !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.ml-1 { + margin-left: 0.25rem !important; +} + +.mx-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pr-2 { + padding-right: 0.5rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pl-2 { + padding-left: 0.5rem !important; +} + +.px-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mr-2 { + margin-right: 0.5rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.ml-2 { + margin-left: 0.5rem !important; +} + +.mx-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.p-3 { + padding: 0.75rem !important; +} + +.pt-3 { + padding-top: 0.75rem !important; +} + +.pr-3 { + padding-right: 0.75rem !important; +} + +.pb-3 { + padding-bottom: 0.75rem !important; +} + +.pl-3 { + padding-left: 0.75rem !important; +} + +.px-3 { + padding-left: 0.75rem !important; + padding-right: 0.75rem !important; +} + +.py-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; +} + +.m-3 { + margin: 0.75rem !important; +} + +.mt-3 { + margin-top: 0.75rem !important; +} + +.mr-3 { + margin-right: 0.75rem !important; +} + +.mb-3 { + margin-bottom: 0.75rem !important; +} + +.ml-3 { + margin-left: 0.75rem !important; +} + +.mx-3 { + margin-left: 0.75rem !important; + margin-right: 0.75rem !important; +} + +.my-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; +} + +.p-4 { + padding: 1rem !important; +} + +.pt-4 { + padding-top: 1rem !important; +} + +.pr-4 { + padding-right: 1rem !important; +} + +.pb-4 { + padding-bottom: 1rem !important; +} + +.pl-4 { + padding-left: 1rem !important; +} + +.px-4 { + padding-left: 1rem !important; + padding-right: 1rem !important; +} + +.py-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.m-4 { + margin: 1rem !important; +} + +.mt-4 { + margin-top: 1rem !important; +} + +.mr-4 { + margin-right: 1rem !important; +} + +.mb-4 { + margin-bottom: 1rem !important; +} + +.ml-4 { + margin-left: 1rem !important; +} + +.mx-4 { + margin-left: 1rem !important; + margin-right: 1rem !important; +} + +.my-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.p-5 { + padding: 1.25rem !important; +} + +.pt-5 { + padding-top: 1.25rem !important; +} + +.pr-5 { + padding-right: 1.25rem !important; +} + +.pb-5 { + padding-bottom: 1.25rem !important; +} + +.pl-5 { + padding-left: 1.25rem !important; +} + +.px-5 { + padding-left: 1.25rem !important; + padding-right: 1.25rem !important; +} + +.py-5 { + padding-top: 1.25rem !important; + padding-bottom: 1.25rem !important; +} + +.m-5 { + margin: 1.25rem !important; +} + +.mt-5 { + margin-top: 1.25rem !important; +} + +.mr-5 { + margin-right: 1.25rem !important; +} + +.mb-5 { + margin-bottom: 1.25rem !important; +} + +.ml-5 { + margin-left: 1.25rem !important; +} + +.mx-5 { + margin-left: 1.25rem !important; + margin-right: 1.25rem !important; +} + +.my-5 { + margin-top: 1.25rem !important; + margin-bottom: 1.25rem !important; +} + +.p-6 { + padding: 1.5rem !important; +} + +.pt-6 { + padding-top: 1.5rem !important; +} + +.pr-6 { + padding-right: 1.5rem !important; +} + +.pb-6 { + padding-bottom: 1.5rem !important; +} + +.pl-6 { + padding-left: 1.5rem !important; +} + +.px-6 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; +} + +.py-6 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.m-6 { + margin: 1.5rem !important; +} + +.mt-6 { + margin-top: 1.5rem !important; +} + +.mr-6 { + margin-right: 1.5rem !important; +} + +.mb-6 { + margin-bottom: 1.5rem !important; +} + +.ml-6 { + margin-left: 1.5rem !important; +} + +.mx-6 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; +} + +.my-6 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.p-8 { + padding: 2rem !important; +} + +.pt-8 { + padding-top: 2rem !important; +} + +.pr-8 { + padding-right: 2rem !important; +} + +.pb-8 { + padding-bottom: 2rem !important; +} + +.pl-8 { + padding-left: 2rem !important; +} + +.px-8 { + padding-left: 2rem !important; + padding-right: 2rem !important; +} + +.py-8 { + padding-top: 2rem !important; + padding-bottom: 2rem !important; +} + +.m-8 { + margin: 2rem !important; +} + +.mt-8 { + margin-top: 2rem !important; +} + +.mr-8 { + margin-right: 2rem !important; +} + +.mb-8 { + margin-bottom: 2rem !important; +} + +.ml-8 { + margin-left: 2rem !important; +} + +.mx-8 { + margin-left: 2rem !important; + margin-right: 2rem !important; +} + +.my-8 { + margin-top: 2rem !important; + margin-bottom: 2rem !important; +} + +.p-10 { + padding: 2.5rem !important; +} + +.pt-10 { + padding-top: 2.5rem !important; +} + +.pr-10 { + padding-right: 2.5rem !important; +} + +.pb-10 { + padding-bottom: 2.5rem !important; +} + +.pl-10 { + padding-left: 2.5rem !important; +} + +.px-10 { + padding-left: 2.5rem !important; + padding-right: 2.5rem !important; +} + +.py-10 { + padding-top: 2.5rem !important; + padding-bottom: 2.5rem !important; +} + +.m-10 { + margin: 2.5rem !important; +} + +.mt-10 { + margin-top: 2.5rem !important; +} + +.mr-10 { + margin-right: 2.5rem !important; +} + +.mb-10 { + margin-bottom: 2.5rem !important; +} + +.ml-10 { + margin-left: 2.5rem !important; +} + +.mx-10 { + margin-left: 2.5rem !important; + margin-right: 2.5rem !important; +} + +.my-10 { + margin-top: 2.5rem !important; + margin-bottom: 2.5rem !important; +} + +.p-12 { + padding: 3rem !important; +} + +.pt-12 { + padding-top: 3rem !important; +} + +.pr-12 { + padding-right: 3rem !important; +} + +.pb-12 { + padding-bottom: 3rem !important; +} + +.pl-12 { + padding-left: 3rem !important; +} + +.px-12 { + padding-left: 3rem !important; + padding-right: 3rem !important; +} + +.py-12 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.m-12 { + margin: 3rem !important; +} + +.mt-12 { + margin-top: 3rem !important; +} + +.mr-12 { + margin-right: 3rem !important; +} + +.mb-12 { + margin-bottom: 3rem !important; +} + +.ml-12 { + margin-left: 3rem !important; +} + +.mx-12 { + margin-left: 3rem !important; + margin-right: 3rem !important; +} + +.my-12 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.p-16 { + padding: 4rem !important; +} + +.pt-16 { + padding-top: 4rem !important; +} + +.pr-16 { + padding-right: 4rem !important; +} + +.pb-16 { + padding-bottom: 4rem !important; +} + +.pl-16 { + padding-left: 4rem !important; +} + +.px-16 { + padding-left: 4rem !important; + padding-right: 4rem !important; +} + +.py-16 { + padding-top: 4rem !important; + padding-bottom: 4rem !important; +} + +.m-16 { + margin: 4rem !important; +} + +.mt-16 { + margin-top: 4rem !important; +} + +.mr-16 { + margin-right: 4rem !important; +} + +.mb-16 { + margin-bottom: 4rem !important; +} + +.ml-16 { + margin-left: 4rem !important; +} + +.mx-16 { + margin-left: 4rem !important; + margin-right: 4rem !important; +} + +.my-16 { + margin-top: 4rem !important; + margin-bottom: 4rem !important; +} + +.p-20 { + padding: 5rem !important; +} + +.pt-20 { + padding-top: 5rem !important; +} + +.pr-20 { + padding-right: 5rem !important; +} + +.pb-20 { + padding-bottom: 5rem !important; +} + +.pl-20 { + padding-left: 5rem !important; +} + +.px-20 { + padding-left: 5rem !important; + padding-right: 5rem !important; +} + +.py-20 { + padding-top: 5rem !important; + padding-bottom: 5rem !important; +} + +.m-20 { + margin: 5rem !important; +} + +.mt-20 { + margin-top: 5rem !important; +} + +.mr-20 { + margin-right: 5rem !important; +} + +.mb-20 { + margin-bottom: 5rem !important; +} + +.ml-20 { + margin-left: 5rem !important; +} + +.mx-20 { + margin-left: 5rem !important; + margin-right: 5rem !important; +} + +.my-20 { + margin-top: 5rem !important; + margin-bottom: 5rem !important; +} + +.p-24 { + padding: 6rem !important; +} + +.pt-24 { + padding-top: 6rem !important; +} + +.pr-24 { + padding-right: 6rem !important; +} + +.pb-24 { + padding-bottom: 6rem !important; +} + +.pl-24 { + padding-left: 6rem !important; +} + +.px-24 { + padding-left: 6rem !important; + padding-right: 6rem !important; +} + +.py-24 { + padding-top: 6rem !important; + padding-bottom: 6rem !important; +} + +.m-24 { + margin: 6rem !important; +} + +.mt-24 { + margin-top: 6rem !important; +} + +.mr-24 { + margin-right: 6rem !important; +} + +.mb-24 { + margin-bottom: 6rem !important; +} + +.ml-24 { + margin-left: 6rem !important; +} + +.mx-24 { + margin-left: 6rem !important; + margin-right: 6rem !important; +} + +.my-24 { + margin-top: 6rem !important; + margin-bottom: 6rem !important; +} + +.mx-auto { + margin-right: auto; + margin-left: auto; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.text-right { + text-align: right; +} + +.text-justify { + text-align: justify; +} + +.text-lowercase { + text-transform: lowercase; +} + +.text-capitalize { + text-transform: capitalize; +} + +.text-uppercase { + text-transform: uppercase; +} + +@font-face { + font-family: 'Metropolis'; + src: url("../fonts/Metropolis-Regular.ttf"); + font-weight: 400; +} + +@font-face { + font-family: 'Metropolis'; + src: url("../fonts/Metropolis-Medium.ttf"); + font-weight: 500; +} + +@font-face { + font-family: 'Metropolis'; + src: url("../fonts/Metropolis-SemiBold.ttf"); + font-weight: 600; +} + +.img-responsive { + display: block; + max-width: 100%; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + color: white; + margin: 0; +} + +.is-fullwidth { + width: 100%; +} + +.button.is-buy { + color: white; + background: linear-gradient(135deg, #8526d9, #d10583); +} + +.button.is-buy:hover { + color: white; + background: linear-gradient(135deg, #902ce8, #e80290); +} + +.button span + i, +.button i + span { + padding-left: .25rem; +} + +.button:focus { + -webkit-box-shadow: 0 0 3px #265cd9; + box-shadow: 0 0 3px #265cd9; +} + +.button.is-link { + background: transparent; + color: #d4def7; +} + +.button.is-link:hover, .button.is-link:focus { + background: transparent; + color: white; +} + +.input, +.textarea, +.select { + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5); + color: white; +} + +.input:focus, +.textarea:focus, +.select:focus { + border: 1px solid #294ea3; +} + +.nav-container { + background: linear-gradient(135deg, #26204c, #311d41); + position: fixed; + left: 0; + top: 0; + bottom: 0; + z-index: 100; +} + +.nav { + list-style-type: none; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding: 0; + margin: 0; +} + +.nav .nav { + padding-bottom: 0; + display: none; +} + +.nav .nav .nav-item a { + padding-left: 3em; +} + +.nav-item { + padding: .5rem; +} + +.nav-item a { + padding: 1rem; + display: block; + color: #DDE7F5; + text-decoration: none; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -ms-flex-wrap: nowrap; + flex-wrap: nowrap; + -webkit-box-align: baseline; + -ms-flex-align: baseline; + align-items: baseline; + font-size: 1.2rem; + border-radius: 5px; +} + +.nav-item a:hover { + color: white; +} + +.nav-item a span { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; +} + +.nav-item a span + i { + margin-right: -.7em; +} + +.nav-item i { + margin-right: .7em; + opacity: .7; + width: 1.5em; + text-align: center; +} + +.nav-item.is-active > a { + color: white; +} + +.nav-item.is-active > a i { + opacity: 1; + color: white; +} + +.nav-item.is-open > .nav { + display: block; +} + +@media (max-width: 767px) { + .nav-container { + top: auto; + bottom: 0; + } + .nav { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + } + .nav .nav-item { + -webkit-box-flex: 1; + -ms-flex: 1 0 0px; + flex: 1 0 0; + } + .nav a { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: .5rem; + } + .nav a i { + margin-right: 0; + } + .nav a span { + display: none; + } +} + +.container-limited { + width: 100%; + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; + max-width: 1400px; +} + +.flex-align-center { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; +} + +.justify-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; +} + +.main-name { + font-weight: 500; + color: white; + margin-bottom: .75em; +} + +.main-container { + margin-bottom: 4rem; +} + +.main-body { + padding: .25rem !important; +} + +.main { + min-height: 100vh; +} + +@media (max-width: 767px) { + .main-body { + padding-bottom: 55px !important; + } + .d-sm-none { + display: none; + } +} + +.square-wrap { + padding: .25rem !important; +} + +.square { + padding-bottom: 100%; + position: relative; +} + +.rectangle-2 { + padding-bottom: 50%; + position: relative; +} + +.square-content { + position: absolute; + width: 100%; + height: 100%; + left: 0; + top: 0; + background: linear-gradient(135deg, rgba(116, 34, 189, 0.5), rgba(185, 19, 121, 0.5)); + border-radius: 8px; + padding: .5rem; +} + +.square-content i.fa { + position: absolute; + left: .5rem; + top: .5rem; + font-size: 18px; +} + +.no-transitions * { + -webkit-transition: 0s !important; + transition: 0s !important; +} + +.modal-container { + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + background-color: rgba(116, 34, 189, 0.5); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + z-index: 1000; + padding: 1rem; + overflow: auto; +} + +.modal { + width: 480px; + max-width: 100%; + min-height: 280px; + background: #182239; + padding: 1rem; + position: relative; + margin: auto; +} + +.modal .close { + position: absolute; + top: 1rem; + right: 1rem; + font-size: 1.2rem; +} + +.break-all { + word-break: break-all; +} + +.is-inactive { + opacity: .4; +} +/*# sourceMappingURL=main.css.map */ \ No newline at end of file diff --git a/templates/css/main.css.map b/templates/css/main.css.map new file mode 100644 index 0000000..e3410c2 --- /dev/null +++ b/templates/css/main.css.map @@ -0,0 +1,44 @@ +{ + "version": 3, + "mappings": "ACAA,4EAA4E;AAE5E;6EAC6E;AAE7E;;;EAGE;AAEF,AAAA,IAAI,CAAC;EACJ,WAAW,EAAE,IAAI;EAAE,OAAO;EAC1B,wBAAwB,EAAE,IAAI;EAAE,OAAO;CACvC;;AAED;6EAC6E;AAE7E;;EAEE;AAEF,AAAA,IAAI,CAAC;EACJ,MAAM,EAAE,CAAC;CACT;;AAED;;EAEE;AAEF,AAAA,IAAI,CAAC;EACJ,OAAO,EAAE,KAAK;CACd;;AAED;;;EAGE;AAEF,AAAA,EAAE,CAAC;EACF,SAAS,EAAE,GAAG;EACd,MAAM,EAAE,QAAQ;CAChB;;AAED;6EAC6E;AAE7E;;;EAGE;AAEF,AAAA,EAAE,CAAC;EACF,UAAU,EAAE,WAAW;EAAE,OAAO;EAChC,MAAM,EAAE,CAAC;EAAE,OAAO;EAClB,QAAQ,EAAE,OAAO;EAAE,OAAO;CAC1B;;AAED;;;EAGE;AAEF,AAAA,GAAG,CAAC;EACH,WAAW,EAAE,oBAAoB;EAAE,OAAO;EAC1C,SAAS,EAAE,GAAG;EAAE,OAAO;CACvB;;AAED;6EAC6E;AAE7E;;EAEE;AAEF,AAAA,CAAC,CAAC;EACD,gBAAgB,EAAE,WAAW;CAC7B;;AAED;;;EAGE;AAEF,AAAA,IAAI,CAAA,AAAA,KAAC,AAAA,EAAO;EACX,aAAa,EAAE,IAAI;EAAE,OAAO;EAC5B,eAAe,EAAE,SAAS;EAAE,OAAO;EACnC,eAAe,EAAE,gBAAgB;EAAE,OAAO;CAC1C;;AAED;;EAEE;AAEF,AAAA,CAAC;AACD,MAAM,CAAC;EACN,WAAW,EAAE,MAAM;CACnB;;AAED;;;EAGE;AAEF,AAAA,IAAI;AACJ,GAAG;AACH,IAAI,CAAC;EACJ,WAAW,EAAE,oBAAoB;EAAE,OAAO;EAC1C,SAAS,EAAE,GAAG;EAAE,OAAO;CACvB;;AAED;;EAEE;AAEF,AAAA,KAAK,CAAC;EACL,SAAS,EAAE,GAAG;CACd;;AAED;;;EAGE;AAEF,AAAA,GAAG;AACH,GAAG,CAAC;EACH,SAAS,EAAE,GAAG;EACd,WAAW,EAAE,CAAC;EACd,QAAQ,EAAE,QAAQ;EAClB,cAAc,EAAE,QAAQ;CACxB;;AAED,AAAA,GAAG,CAAC;EACH,MAAM,EAAE,OAAO;CACf;;AAED,AAAA,GAAG,CAAC;EACH,GAAG,EAAE,MAAM;CACX;;AAED;6EAC6E;AAE7E;;EAEE;AAEF,AAAA,GAAG,CAAC;EACH,YAAY,EAAE,IAAI;CAClB;;AAED;6EAC6E;AAE7E;;;EAGE;AAEF,AAAA,MAAM;AACN,KAAK;AACL,QAAQ;AACR,MAAM;AACN,QAAQ,CAAC;EACR,WAAW,EAAE,OAAO;EAAE,OAAO;EAC7B,SAAS,EAAE,IAAI;EAAE,OAAO;EACxB,WAAW,EAAE,IAAI;EAAE,OAAO;EAC1B,MAAM,EAAE,CAAC;EAAE,OAAO;CAClB;;AAED;;;EAGE;AAEF,AAAA,MAAM;AACN,KAAK,CAAC;EAAE,OAAO;EACd,QAAQ,EAAE,OAAO;CACjB;;AAED;;;EAGE;AAEF,AAAA,MAAM;AACN,MAAM,CAAC;EAAE,OAAO;EACf,cAAc,EAAE,IAAI;CACpB;;AAED;;EAEE;AAEF,AAAA,MAAM;CACN,AAAA,IAAC,CAAK,QAAQ,AAAb;CACD,AAAA,IAAC,CAAK,OAAO,AAAZ;CACD,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACf,kBAAkB,EAAE,MAAM;CAC1B;;AAED;;EAEE;AAEF,AAAA,MAAM,AAAA,kBAAkB;CACxB,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,kBAAkB;CACjC,AAAA,IAAC,CAAK,OAAO,AAAZ,CAAa,kBAAkB;CAChC,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,kBAAkB,CAAC;EACjC,YAAY,EAAE,IAAI;EAClB,OAAO,EAAE,CAAC;CACV;;AAED;;EAEE;AAEF,AAAA,MAAM,AAAA,eAAe;CACrB,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,eAAe;CAC9B,AAAA,IAAC,CAAK,OAAO,AAAZ,CAAa,eAAe;CAC7B,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,eAAe,CAAC;EAC9B,OAAO,EAAE,qBAAqB;CAC9B;;AAED;;EAEE;AAEF,AAAA,QAAQ,CAAC;EACR,OAAO,EAAE,qBAAqB;CAC9B;;AAED;;;;;EAKE;AAEF,AAAA,MAAM,CAAC;EACN,UAAU,EAAE,UAAU;EAAE,OAAO;EAC/B,KAAK,EAAE,OAAO;EAAE,OAAO;EACvB,OAAO,EAAE,KAAK;EAAE,OAAO;EACvB,SAAS,EAAE,IAAI;EAAE,OAAO;EACxB,OAAO,EAAE,CAAC;EAAE,OAAO;EACnB,WAAW,EAAE,MAAM;EAAE,OAAO;CAC5B;;AAED;;EAEE;AAEF,AAAA,QAAQ,CAAC;EACR,cAAc,EAAE,QAAQ;CACxB;;AAED;;EAEE;AAEF,AAAA,QAAQ,CAAC;EACR,QAAQ,EAAE,IAAI;CACd;;AAED;;;EAGE;CAEF,AAAA,AAAA,IAAC,CAAK,UAAU,AAAf;CACD,AAAA,IAAC,CAAK,OAAO,AAAZ,EAAc;EACd,UAAU,EAAE,UAAU;EAAE,OAAO;EAC/B,OAAO,EAAE,CAAC;EAAE,OAAO;CACnB;;AAED;;EAEE;CAEF,AAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,2BAA2B;CAC1C,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,2BAA2B,CAAC;EAC1C,MAAM,EAAE,IAAI;CACZ;;AAED;;;EAGE;CAEF,AAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,EAAe;EACf,kBAAkB,EAAE,SAAS;EAAE,OAAO;EACtC,cAAc,EAAE,IAAI;EAAE,OAAO;CAC7B;;AAED;;EAEE;CAEF,AAAA,AAAA,IAAC,CAAK,QAAQ,AAAb,CAAc,2BAA2B,CAAC;EAC1C,kBAAkB,EAAE,IAAI;CACxB;;AAED;;;EAGE;AAEF,AAAA,4BAA4B,CAAC;EAC5B,kBAAkB,EAAE,MAAM;EAAE,OAAO;EACnC,IAAI,EAAE,OAAO;EAAE,OAAO;CACtB;;AAED;6EAC6E;AAE7E;;EAEE;AAEF,AAAA,OAAO,CAAC;EACP,OAAO,EAAE,KAAK;CACd;;AAED;;EAEE;AAEF,AAAA,OAAO,CAAC;EACP,OAAO,EAAE,SAAS;CAClB;;AAED;6EAC6E;AAE7E;;EAEE;AAEF,AAAA,QAAQ,CAAC;EACR,OAAO,EAAE,IAAI;CACb;;AAED;;EAEE;CAEF,AAAA,AAAA,MAAC,AAAA,EAAQ;EACR,OAAO,EAAE,IAAI;CACb;;AO5VD,AAAA,eAAe,CAAA;EACd,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,IAAI;CACf;;AAED,AAAA,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE,CAAA;EACD,KAAK,EAAE,KAAK;CACZ;;AAED,AAAA,aAAa,CAAA;EACZ,KAAK,EAAE,IAAI;CACX;;AChBD,AAAA,OAAO,AAAA,OAAO,CAAA;EACb,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,yCAAsD;CAMlE;;AARD,AAIC,OAJM,AAAA,OAAO,AAIZ,MAAM,CAAA;EACN,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,yCAAsD;CAClE;;AAGF,AACC,OADM,CACN,IAAI,GAAG,CAAC;AADT,OAAO,CAEN,CAAC,GAAG,IAAI,CAAA;EACP,YAAY,EAAE,MAAM;CACpB;;AAJF,AAMC,OANM,AAML,MAAM,CAAA;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CNLZ,OAAgB;CMMrB;;AAGJ,AAAA,OAAO,AAAA,QAAQ,CAAA;EACd,UAAU,EAAE,WAAW;EACvB,KAAK,ENRG,OAAgB;CMexB;;AATD,AAIC,OAJM,AAAA,QAAQ,AAIb,MAAM,EAJR,OAAO,AAAA,QAAQ,AAKb,MAAM,CAAA;EACN,UAAU,EAAE,WAAW;EACvB,KAAK,EAAE,KAAK;CACZ;;AC7BF,AAAA,MAAM;AACN,SAAS;AACT,OAAO,CAAA;EACN,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAc;EAC1C,KAAK,EAAE,KAAK;CAKZ;;AATD,AAMC,MANK,AAMJ,MAAM;AALR,SAAS,AAKP,MAAM;AAJR,OAAO,AAIL,MAAM,CAAA;EACN,MAAM,EAAE,GAAG,CAAC,KAAK,CPIV,OAAgB;COHvB;;ACRF,AAAA,OAAO,CAAA;EACN,gBAAgB,EJUF,OAAgB;EIT9B,QAAQ,EAAE,QAAQ;CAClB;;AAED,AAAA,iBAAiB,CAAA;EAChB,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,GAAG;EACnB,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;CACnB;;AAED,AAAA,YAAY,CAAA;EACX,KAAK,EAAE,KAAK;EACZ,eAAe,EAAE,IAAI;CASrB;;AAXD,AAIC,YAJW,AAIV,MAAM,CAAA;EACN,KAAK,EAAE,KAAK;CACZ;;AAED,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK;EARpC,AAAA,YAAY,CAAA;IASV,SAAS,EAAE,OAAO;GAEnB;;;AAED,AAAA,YAAY,CAAC,GAAG,CAAA;EACf,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,KAAK;EACd,MAAM,EAAE,IAAI;CACZ;;AAED,AAAA,WAAW,CAAA;EACV,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,IAAI;CAgBjB;;AAnBD,AAKC,WALU,CAKV,SAAS,CAAA;EACR,KAAK,ERvBE,OAAgB;EQwBvB,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,UAAU;CAUnB;;AAlBF,AAUE,WAVS,CAKV,SAAS,AAKP,MAAM,EAVT,WAAW,CAKV,SAAS,AAMP,OAAO,CAAA;EACP,KAAK,EAAE,KAAK;CACZ;;AAED,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK;EAfrC,AAKC,WALU,CAKV,SAAS,CAAA;IAWP,OAAO,EAAE,YAAY;GAEtB;;;AAGF,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK;EAClC,AAAA,cAAc,CAAA;IACb,OAAO,EAAE,IAAI;GACb;;;AAGF,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK;EAClC,AAAA,SAAS,CAAA;IACR,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,QAAQ;IAClB,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,CAAC;IACP,WAAW,EAAE,CAAC;IACd,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,kBAAkB;IAC9B,gBAAgB,EJzDH,OAAgB;II0D7B,cAAc,EAAE,MAAM;IACtB,OAAO,EAAE,IAAI;GAKb;EAfD,AAYC,SAZQ,CAYR,SAAS,CAAA;IACR,OAAO,EAAE,IAAI;GACb;EAGF,AAAA,OAAO,AAAA,QAAQ,CAAC,SAAS,CAAA;IACxB,OAAO,EAAE,IAAI;GACb;EAED,AAAA,OAAO,AAAA,QAAQ,CAAC,cAAc,CAAA;IAC7B,KAAK,EAAE,KAAK;GACZ;;;ACnFF,AAAA,IAAI,CAAA;EACH,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,IAAI;EACb,cAAc,EAAE,MAAM;EACtB,OAAO,EAAE,CAAC;EACV,MAAM,EAAE,CAAC;EACT,cAAc,EAAE,IAAI;CAOpB;;AAbD,AAQC,IARG,CAQH,IAAI,CAAA;EACH,cAAc,EAAE,CAAC;EACjB,OAAO,EAAE,IAAI;CACb;;AAIF,AAAA,UAAU,CAAA;EACT,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;CACZ;;AAED,AAAA,SAAS,GAAG,UAAU,CAAA;EACrB,UAAU,EAAE,IAAI;CAChB;;AAED,AACC,SADQ,CACR,CAAC,CAAA;EACA,OAAO,EAAE,MAAM;EACf,OAAO,EAAE,KAAK;EACd,SAAS,EAAE,IAAI;EACf,eAAe,EAAE,IAAI;EACrB,KAAK,ETLE,OAAgB;CSUvB;;AAXF,AAQE,SARO,CACR,CAAC,AAOC,MAAM,CAAA;EACN,KAAK,EAAE,KAAK;CACZ;;AAVH,AAaC,SAbQ,AAaP,UAAU,GAAG,CAAC,CAAA;EACd,KAAK,EAAE,KAAK;CACZ;;AAfF,AAiBC,SAjBQ,AAiBP,QAAQ,GAAG,IAAI,CAAA;EACf,OAAO,EAAE,KAAK;CACd;;AC5CF,AAAA,SAAS,CAAA;EACR,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,QAAQ;CAClB;;AAED,AAAA,OAAO,AAAA,YAAY,CAAA;EAClB,KAAK,EVSG,OAAgB;EURxB,gBAAgB,ENKA,OAAgB;EMJhC,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,CAAC;EAChB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAe;CAYjC;;AAnBD,AASC,OATM,AAAA,YAAY,AASjB,MAAM,EATR,OAAO,AAAA,YAAY,AAUjB,OAAO,CAAA;EACP,gBAAgB,ENJD,OAAgB;EMK/B,KAAK,EAAE,KAAK;CACZ;;AAbF,AAeC,OAfM,AAAA,YAAY,CAelB,CAAC,CAAA;EACA,WAAW,EAAE,GAAG;EAChB,YAAY,EAAE,KAAK;CACnB;;AAGF,AAAA,cAAc,CAAA;EACb,OAAO,EAAE,IAAI;EACb,KAAK,EAAE,IAAI;EACX,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,IAAI,EAAE,CAAC;EACP,gBAAgB,ENpBA,OAAgB;EMqBhC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAe;EACjC,OAAO,EAAE,GAAG;CACZ;;AChCD,AAAA,gBAAgB,CAAA;EACf,aAAa,EAAE,IAAI;CACnB;;AAED,AAAA,QAAQ,CAAA;EACP,OAAO,EAAE,KAAK;EACd,QAAQ,EAAE,QAAQ;EAClB,gBAAgB,EXDR,OAAgB;EWExB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAc;EACpC,UAAU,EAAE,GAAG;EACf,MAAM,EAAE,OAAO;CAMf;;AAZD,AAQC,QARO,AAQN,MAAM,CAAA;EACN,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAc;EACtC,SAAS,EAAE,WAAW;CACtB;;AAOF,AAAA,cAAc,CAAA;EACb,KAAK,EAAE,IAAI;EACX,cAAc,EAAE,IAAI;EACpB,QAAQ,EAAE,MAAM;EAChB,QAAQ,EAAE,QAAQ;CAWlB;;AAfD,AAMC,cANa,CAMb,GAAG,CAAA;EACF,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,CAAC;EACN,IAAI,EAAE,CAAC;EACP,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,KAAK;CACjB;;AAGF,AAAA,eAAe,CAAA;EACd,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,IAAI,EAAE,CAAC;EACP,KAAK,EAAE,CAAC;EACR,UAAU,EAAE,qFAAwE;EACpF,OAAO,EAAE,UAAU;EACnB,WAAW,EAAE,IAAI;CACjB;;AAED,AAAA,cAAc,CAAA;EACb,SAAS,EAAE,QAAQ;EACnB,KAAK,EAAE,KAAK;CACZ;;AAED,AAAA,QAAQ,CAAC,OAAO,AAAA,OAAO,CAAA;EACtB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,MAAM;EACb,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,CAAC;CACV;;AAED,AAAA,QAAQ,AAAA,MAAM,CAAC,OAAO,AAAA,OAAO,CAAA;EAC5B,OAAO,EAAE,CAAC;CACV;;AClED,AAAA,gBAAgB,CAAA;EACf,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,aAAa;EAC9B,SAAS,EAAE,IAAI;CACf;;AAED,AAAA,QAAQ,CAAA;EACP,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,aAAa,EAAE,MAAM;EACrB,UAAU,EAAE,IAAI;CAChB;;AAED,AAAA,QAAQ,CAAC,SAAS,CAAA;EACjB,YAAY,EAAE,IAAI;CAClB;;AAED,AAAA,aAAa,CAAA;EACZ,YAAY,EAAE,KAAK;CACnB;;ACpBD,AAAA,MAAM,CAAA;EACL,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,MAAM;CACd;;AAED,AAAA,KAAK,CAAA;EACJ,IAAI,EAAE,KAAK;EACX,UAAU,EAAE,MAAM;EAClB,QAAQ,EAAE,QAAQ;CAalB;;AAhBD,AAKC,KALI,AAKH,IAAK,CAAA,UAAW,CAAA,CAAC,EAAE,QAAQ,CAAA;EAC3B,OAAO,EAAE,EAAE;EACX,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,GAAG;EACX,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,GAAG;EACV,GAAG,EAAE,KAAK;EACV,UAAU,EAAE,GAAG;EACf,UAAU,EAAE,OAAc;EAC1B,OAAO,EAAE,CAAC;CACV;;AAGF,AAAA,eAAe,CAAA;EACd,OAAO,EAAE,YAAY;EACrB,UAAU,EAAE,WAAW;EACvB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,gBAAgB,EAAE,OAAc;EAChC,aAAa,EAAE,GAAG;EAClB,MAAM,EAAE,GAAG,CAAC,KAAK,CbtBT,OAAgB;EauBxB,QAAQ,EAAE,QAAQ;EAClB,OAAO,EAAE,CAAC;CACV;;AAED,AAAA,UAAU,CAAA;EACT,KAAK,EbtBG,OAAgB;CauBxB;;AAED,AACC,KADI,AAAA,UAAU,AACb,QAAQ,CAAA;EACR,UAAU,EAAE,wCAAqD;CACjE;;AAHF,AAKC,KALI,AAAA,UAAU,CAKd,eAAe,CAAA;EACd,gBAAgB,EAAE,OAAc;CAChC;;AAPF,AASC,KATI,AAAA,UAAU,CASd,UAAU,CAAA;EACT,KAAK,EAAE,KAAK;CACZ;;AAGF,AACC,KADI,AAAA,UAAU,GAAG,KAAK,AACrB,QAAQ,CAAA;EACR,UAAU,Eb7CH,OAAgB;Ca8CvB;;AAHF,AAKC,KALI,AAAA,UAAU,GAAG,KAAK,CAKtB,eAAe,CAAA;EACd,UAAU,EbjDH,OAAgB;CakDvB;;AAPF,AASC,KATI,AAAA,UAAU,GAAG,KAAK,CAStB,UAAU,CAAA;EACT,KAAK,EblDE,OAAgB;EamDvB,OAAO,EAAE,EAAE;CACX;;ACjEF,AAAA,kBAAkB,CAAA;EACjB,QAAQ,EAAE,QAAQ;EAClB,GAAG,EAAE,IAAI;EACT,KAAK,EAAE,IAAI;EACX,KAAK,EAAE,KAAK;EACZ,gBAAgB,EVMF,OAAgB;EUL9B,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,kBAAc;EACrC,MAAM,EAAE,iBAAiB;CACzB;;AAMD,AAAA,aAAa,CAAA;EACZ,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,IAAI;CASb;;AAXD,AAIC,aAJY,GAIV,CAAC,CAAA;EACF,SAAS,EAAE,CAAC;CAKZ;;AAVF,AAOE,aAPW,GAIV,CAAC,AAGD,eAAgB,CDXD,CAAC,ECWE;EAClB,UAAU,EAAE,KAAK;CACjB;;AAQH,AAAA,aAAa,CAAA;EACZ,aAAa,EAAE,IAAI;EACnB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;CACnB;;AAED,AAAA,mBAAmB,CAAA;EAClB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;CAMZ;;AARD,AAIC,mBAJkB,CAIlB,GAAG,CAAA;EACF,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,KAAK;CACjB;;AAGF,AAAA,qBAAqB,CAAA;EACpB,OAAO,EAAE,UAAU;EACnB,KAAK,EAAE,KAAK;EACZ,SAAS,EAAE,CAAC;CACZ;;ACnDD,AAAA,kBAAkB,CAAA;EZKhB,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAW;EAC1B,YAAY,EAAE,IAAW;EACzB,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;EYPlB,SAAS,EXmBgB,MAAM;CWlB/B;;AAED,AAAA,kBAAkB,CAAA;EACjB,WAAW,EAAE,MAAM;CACnB;;ACPD,AAAA,UAAU,CAAA;EACT,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;EACZ,aAAa,EAAE,KAAK;CACpB;;AAED,AAAA,eAAe,CAAA;EACd,aAAa,EAAE,IAAI;CACnB;;ACRD,AAAA,YAAY,CAAA;EACX,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;EACZ,aAAa,EAAE,KAAK;CACpB;;AAED,AAAA,aAAa,CAAA;EACZ,OAAO,EAAE,WAAW;EACpB,UAAU,EjBCF,OAAgB;EiBAxB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAc;CACpC;;AAED,AAAA,OAAO,AAAA,WAAW,CAAA;EACjB,SAAS,EAAE,MAAM;EACjB,MAAM,EAAE,OAAO;EACf,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,MAAM;EACd,aAAa,EAAE,GAAG;EAClB,WAAW,EAAE,GAAG;CAChB;;AAED,AAAA,aAAa,CAAA;EACZ,SAAS,EAAE,IAAI;EACf,KAAK,EAAE,KAAK;EACZ,WAAW,EAAE,GAAG;CAChB;;AAED,AAAA,cAAc,CAAA;EACb,aAAa,EAAE,MAAM;CACrB;;AAED,AACC,kBADiB,CACjB,EAAE,CAAA;EACD,OAAO,EAAE,QAAQ;CACjB;;AAHF,AAKC,kBALiB,CAKjB,EAAE,AAAA,UAAW,CJ1BI,CAAC,EI0BH;EACd,aAAa,EAAE,IAAI;CACnB;;AAPF,AASC,kBATiB,CASjB,EAAE,AAAA,UAAW,CAAA,CAAC,EAAC;EACd,YAAY,EAAE,IAAI;EAClB,KAAK,EAAE,KAAK;CACZ;;AC3CF,AAAA,aAAa,CAAA;EACZ,aAAa,EAAE,GAAG,CAAC,KAAK,CdUV,OAAgB;CcT9B;;AAED,AACC,iBADgB,CAChB,CAAC,CAAA;EACA,cAAc,EAAE,MAAM;CACtB;;AAHF,AAKC,iBALgB,CAKhB,MAAM,CAAA;EACL,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,KAAK,EAAE,KAAK;EACZ,WAAW,EAAE,IAAI;CACjB;;AAGF,AAAA,wBAAwB,CAAA;EACvB,gBAAgB,ElBTR,OAAgB;EkBUxB,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,kBAAc;CACpC;;AAED,AAAA,gBAAgB,CAAA;EACf,OAAO,EAAE,SAAS;EAClB,MAAM,EAAE,OAAO;CAUf;;AAZD,AAIC,gBAJe,AAId,MAAM,CAAA;EACN,gBAAgB,ElBjBT,OAAgB;CkBkBvB;;AANF,AAQC,gBARe,AAQd,UAAU,CAAA;EACV,gBAAgB,ElBnBT,OAAgB;EkBoBvB,KAAK,EAAE,KAAK;CACZ;;ACjCF,AAAA,CAAC,CAAA;EACA,UAAU,EAAE,UAAU;CACtB;;AAED,AAAA,KAAK,AAAA,MAAM;AACX,MAAM,AAAA,MAAM;AACZ,MAAM,AAAA,MAAM;AACZ,QAAQ,AAAA,MAAM;AACd,MAAM,AAAA,MAAM;AACZ,CAAC,AAAA,MAAM,CAAC;EACP,OAAO,EAAE,IAAI;CACb;;CAED,AAAA,AAAA,IAAC,CAAK,QAAQ,AAAb;CACD,AAAA,IAAC,CAAK,OAAO,AAAZ;CACD,AAAA,IAAC,CAAK,QAAQ,AAAb;AACD,MAAM;AACN,MAAM;AACN,MAAM;AACN,CAAC,CAAA;EACA,MAAM,EAAE,OAAO;CACf;;ArBXD,AAAA,IAAI,CqBaA;EACH,sBAAsB,EAAE,WAAW;EACnC,uBAAuB,EAAE,SAAS;EAClC,WAAW,EnBzBA,YAAY,EAAE,UAAU;EmB0BnC,WAAW,EnBxBO,GAAG;EmByBrB,KAAK,EnBbG,OAAgB;EmBcxB,UAAU,EnBrBF,OAAgB;CmBsBxB;;ArB6CD,AAAA,CAAC,CqB3CA;EACA,KAAK,EnBpBG,OAAgB;CmByBxB;;AAND,AAGC,CAHA,AAGC,MAAM,CAAA;EACN,KAAK,EnBvBE,OAAgB;CmBwBvB;;AAGF,AAAA,KAAK;AACL,MAAM;AACN,MAAM,CAAA;EACL,WAAW,EnB1CA,YAAY,EAAE,UAAU;CmB2CnC;;AdvCD,AAAA,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE;AACF,EAAE,CcyCA;EACD,WAAW,EAAE,GAAG;EAChB,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,MAAM;CACd;;ArBhBD,AAAA,EAAE,CqBkBA;EACD,SAAS,EAAE,MAAM;CACjB;;AACD,AAAA,EAAE,CAAA;EACD,SAAS,EAAE,IAAI;CACf;;AACD,AAAA,EAAE,CAAA;EACD,SAAS,EAAE,OAAO;CAClB;;AACD,AAAA,EAAE,CAAA;EACD,SAAS,EAAE,MAAM;CACjB;;AACD,AAAA,EAAE,CAAA;EACD,SAAS,EAAE,OAAO;CAClB;;AACD,AAAA,EAAE,CAAA;EACD,SAAS,EAAE,IAAI;CACf;;AC1ED,AAAA,MAAM,CAAA;EACL,WAAW,EAAE,GAAG,CAAC,KAAK,CpBYd,OAAgB;EoBXxB,gBAAgB,EpBcR,OAAgB;EoBbxB,KAAK,EpBQG,OAAgB;EoBPxB,OAAO,EAAE,WAAW;EACpB,aAAa,EAAE,IAAI;CACnB;;AAED,AAAA,aAAa,CAAA;EACZ,aAAa,EAAE,MAAM;CACrB;;AAED,AAAA,aAAa,CAAA;EACZ,gBAAgB,EpB2BR,OAAgB;EoB1BxB,YAAY,EpBuBJ,OAAgB;EoBtBxB,KAAK,EpBqBG,OAAgB;CoBpBxB;;AACD,AAAA,cAAc,CAAA;EACb,gBAAgB,EpBkCR,OAAgB;EoBjCxB,YAAY,EpB8BJ,OAAgB;EoB7BxB,KAAK,EpB0BG,OAAgB;CoBzBxB;;AACD,AAAA,cAAc,CAAA;EACb,gBAAgB,EpByCR,OAAe;EoBxCvB,YAAY,EpBqCJ,OAAe;EoBpCvB,KAAK,EpBiCG,OAAe;CoBhCvB;;AC1BD,AAAA,WAAW,CAAA;EACV,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;EACf,SAAS,EAAE,OAAO;EAClB,MAAM,EAAE,KAAK;EACb,OAAO,EAAE,CAAC;EACV,eAAe,EAAE,IAAI;EACrB,KAAK,EAAE,OAAO;CACd;;AAED,AAAA,gBAAgB,CAAA;EACf,QAAQ,EAAE,QAAQ;CA+BlB;;AAhCD,AAGC,gBAHe,GAAhB,gBAAgB,CAGV;EACJ,WAAW,EAAE,IAAI;CAajB;;AAjBF,AAME,gBANc,GAAhB,gBAAgB,AAMb,QAAQ,CAAA;EACR,OAAO,EAAE,EAAE;EACX,OAAO,EAAE,YAAY;EACrB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,OAAO;EACnB,aAAa,EAAE,KAAK;EACpB,YAAY,EAAE,IAAI;CAClB;;AAhBH,AAmBC,gBAnBe,CAmBf,CAAC,CAAA;EACA,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,IAAI;EACrB,KAAK,EAAE,OAAO;CASd;;AA/BF,AAwBE,gBAxBc,CAmBf,CAAC,AAKC,MAAM,CAAA;EACN,eAAe,EAAE,SAAS;CAC1B;;AA1BH,AA4BE,gBA5Bc,CAmBf,CAAC,CASA,CAAC,CAAA;EACA,YAAY,EAAE,IAAI;CAClB;;ACxCH,AAAA,WAAW,CAAA;EACV,OAAO,EAAE,IAAI;EACb,OAAO,EAAE,CAAC;EACV,eAAe,EAAE,IAAI;CACrB;;AAED,AACC,UADS,GAAV,UAAU,CACJ;EACJ,WAAW,EAAE,KAAK;CAClB;;AAHF,AAKC,UALS,CAKT,IAAI,CAAA;EACH,OAAO,EAAE,MAAM;CACf;;AAPF,AASC,UATS,CAST,CAAC,CAAA;EACA,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,IAAI;EACrB,aAAa,EAAE,GAAG;CAClB;;AAGF,AAAA,UAAU,AAAA,UAAU,CAAC,CAAC,CAAA;EACrB,gBAAgB,EtBRR,OAAgB;CsBSxB;;ACxBD,AAAA,OAAO,CAAA;EACN,gBAAgB,EvBcR,OAAgB;EuBbxB,MAAM,EAAE,CAAC;EACT,aAAa,EvBiFU,GAAG;EuBhF1B,KAAK,EvBIG,OAAgB;EuBHxB,OAAO,EvBmFY,KAAI,CADJ,KAAK;EuBjFxB,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,YAAY;EACrB,WAAW,EAAE,GAAG;EAChB,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,GAAG;EAChB,MAAM,EAAE,OAAO;EACf,UAAU,EAAE,MAAM;EAClB,eAAe,EAAE,IAAI;CAYrB;;AA1BD,AAgBC,OAhBM,AAgBL,MAAM,CAAA;EACN,KAAK,EvBTE,OAAgB;EuBUvB,gBAAgB,EvBqDK,OAA4B;CuBpDjD;;AAnBF,AAoBC,OApBM,AAoBL,OAAO,CAAA;EACP,gBAAgB,EvBkDK,OAA4B;CuBjDjD;;AjBZF,AAMC,OANM,AAML,MAAM,CiBOA;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CvBqEC,uBAAsB;CuBpEvC;;AAGL,AAAA,OAAO,AAAA,SAAS,CAAA;EACf,OAAO,EvB2DY,KAAI,CuB3DK,KAAsB;EAClD,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,OAAO;CAClB;;AAED,AAAA,OAAO,AAAA,SAAS,CAAA;EACf,MAAM,EAAE,IAAI;EACZ,SAAS,EAAE,OAAO;CAClB;;AAED,AAAA,QAAQ,CAAC,OAAO,CAAA;EACf,YAAY,EAAE,MAAM;EACpB,aAAa,EAAE,MAAM;CACrB;;AAED,AAAA,OAAO,AAAA,WAAW,CAAA;EACjB,gBAAgB,EvBjCR,OAAgB;EuBkCxB,KAAK,EAAE,KAAK;CASZ;;AAXD,AAIC,OAJM,AAAA,WAAW,AAIhB,MAAM,CAAA;EACN,KAAK,EAAE,KAAK;EACZ,gBAAgB,EvBkBG,OAA0B;CuBjB7C;;AAPF,AAQC,OARM,AAAA,WAAW,AAQhB,OAAO,CAAA;EACP,gBAAgB,EvBeG,OAA0B;CuBd7C;;AAGF,AAAA,OAAO,AAAA,UAAU,CAAA;EAChB,gBAAgB,EvBlBR,OAAgB;EuBmBxB,KAAK,EvBvBG,OAAgB;CuBiCxB;;AAZD,AAIC,OAJM,AAAA,UAAU,AAIf,MAAM,CAAA;EACN,gBAAgB,EvBvBT,OAAgB;EuBwBvB,KAAK,EvB5BE,OAAgB;CuB6BvB;;AAPF,AAQC,OARM,AAAA,UAAU,AAQf,OAAO,CAAA;EACP,gBAAgB,EvB3BT,OAAgB;EuB4BvB,KAAK,EvBhCE,OAAgB;CuBiCvB;;ACpEF,AAAA,MAAM,CAAA;EACL,aAAa,EAAE,IAAI;CACnB;;AAED,AAAA,MAAM,CAAA;EACL,OAAO,EAAE,KAAK;EACd,aAAa,EAAE,IAAI;EACnB,WAAW,EAAE,GAAG;CAChB;;AjBRD,AAAA,MAAM;AACN,SAAS;AACT,OAAO,CiBUA;EACN,aAAa,ExBuEU,GAAG;EwBtE1B,MAAM,EpBAgB,GAAG,CoBAK,KAAK,CpBCb,WAAW;EoBAjC,KAAK,ExBAG,OAAgB;EwBCxB,OAAO,ExB2EU,KAAI,CADJ,KAAI;EwBzErB,MAAM,EAAE,MAAM;EACd,WAAW,EAAE,GAAG;EAChB,UAAU,EpBHgB,OAAgB;EoBI1C,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,KAAK;CAUd;;AjB/BD,AAMC,MANK,AAMJ,MAAM;AALR,SAAS,AAKP,MAAM;AAJR,OAAO,AAIL,MAAM,CiBiBA;EACN,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CxBqEC,uBAAsB;CwBpE1C;;AAfF,AAiBC,MAjBK,AAiBJ,SAAS;AAhBX,SAAS,AAgBP,SAAS;AAfX,OAAO,AAeL,SAAS,CAAA;EACT,UAAU,EpBbW,WAAW;EoBchC,OAAO,EAAE,EAAE;CACX;;AAGF,AAAA,OAAO,CAAC,MAAM,CAAA;EACb,gBAAgB,EAAE,OAAO;EACzB,KAAK,EAAE,OAAO;CACd;;AAED,AAAA,SAAS,CAAA;EACR,MAAM,EAAE,IAAI;EACZ,MAAM,EAAE,QAAQ;CAChB;;ACzCD,AAAA,MAAM,CAAA;EACL,cAAc,EAAE,CAAC;EACjB,eAAe,EAAE,QAAQ;EACzB,KAAK,EAAE,IAAI;CAeX;;AAlBD,AAKC,MALK,CAKL,EAAE,CAAA;EACD,WAAW,EAAE,GAAG;EAChB,aAAa,EAAE,GAAG,CAAC,KAAK,CrBQH,WAAW;EqBPhC,UAAU,EAAE,IAAI;CAChB;;AATF,AAWC,MAXK,CAWL,EAAE,EAXH,MAAM,CAWF,EAAE,CAAA;EACJ,OAAO,EAAE,UAAU;CACnB;;AAbF,AAeC,MAfK,CAeL,EAAE,CAAA;EACD,UAAU,EAAE,GAAG,CAAC,KAAK,CrBDA,WAAW;CqBEhC;;AAGF,AACC,MADK,AAAA,WAAW,CAChB,KAAK,CAAC,EAAE,AAAA,UAAW,CAAA,GAAG,EAAC;EACtB,UAAU,EzBwDE,wBAAO;CyBvDnB;;AAGF,AAAA,MAAM,CAAC,KAAK,CAAC,EAAE,AAAA,UAAU,CAAA;EACxB,UAAU,EzBZF,OAAgB;CyBaxB;;ACvBC,AAAA,UAAU,CAAC;EvBAX,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAW;EAC1B,YAAY,EAAE,IAAW;EACzB,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;CuBDhB;;AzBoDC,MAAM,EAAE,SAAS,EAAE,KAAK;EyBvD1B,AAAA,UAAU,CAAC;IvBYP,SAAS,EHoHP,KAAK;G0B7HV;;;AzBoDC,MAAM,EAAE,SAAS,EAAE,KAAK;EyBvD1B,AAAA,UAAU,CAAC;IvBYP,SAAS,EHqHP,KAAK;G0B9HV;;;AzBoDC,MAAM,EAAE,SAAS,EAAE,KAAK;EyBvD1B,AAAA,UAAU,CAAC;IvBYP,SAAS,EHsHP,KAAK;G0B/HV;;;AzBoDC,MAAM,EAAE,SAAS,EAAE,MAAM;EyBvD3B,AAAA,UAAU,CAAC;IvBYP,SAAS,EHuHP,MAAM;G0BhIX;;;AASD,AAAA,gBAAgB,CAAC;EvBZjB,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAW;EAC1B,YAAY,EAAE,IAAW;EACzB,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;CuBUhB;;AAQD,AAAA,IAAI,CAAC;EvBJL,OAAO,EAAE,IAAI;EACb,SAAS,EAAE,IAAI;EACf,YAAY,EAAE,KAAY;EAC1B,WAAW,EAAE,KAAY;CuBGxB;;AAID,AAAA,WAAW,CAAC;EACV,YAAY,EAAE,CAAC;EACf,WAAW,EAAE,CAAC;CAOf;;AATD,AAIE,WAJS,GAIP,IAAI;AAJR,WAAW,IAKP,AAAA,KAAC,EAAO,MAAM,AAAb,EAAe;EAChB,aAAa,EAAE,CAAC;EAChB,YAAY,EAAE,CAAC;CAChB;;AxBtBC,AAZJ,MAYU,EAAN,MAAM,EAAN,MAAM,EAAN,MAAM,EAAN,MAAM,EAAN,MAAM,EAAN,MAAM,EAAN,MAAM,EAAN,MAAM,EAAN,OAAO,EAAP,OAAO,EAAP,OAAO,EAIT,IAAI;AACJ,SAAS,EALP,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,UAAU,EAAV,UAAU,EAAV,UAAU,EAIZ,OAAO;AACP,YAAY,EALV,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,UAAU,EAAV,UAAU,EAAV,UAAU,EAIZ,OAAO;AACP,YAAY,EALV,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,UAAU,EAAV,UAAU,EAAV,UAAU,EAIZ,OAAO;AACP,YAAY,EALV,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,SAAS,EAAT,UAAU,EAAV,UAAU,EAAV,UAAU,EAIZ,OAAO;AACP,YAAY,CAjBD;EACX,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAW;EAC1B,YAAY,EAAE,IAAW;CAC1B;;AAkBG,AAAA,IAAI,CAAU;EACZ,UAAU,EAAE,CAAC;EACb,SAAS,EAAE,CAAC;EACZ,SAAS,EAAE,IAAI;CAChB;;AACD,AAAA,SAAS,CAAU;EACjB,IAAI,EAAE,QAAQ;EACd,KAAK,EAAE,IAAI;EACX,SAAS,EAAE,IAAI;CAChB;;AAGC,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAA4B;EAItC,SAAS,EAAE,QAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;EAItC,SAAS,EAAE,GAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;EAItC,SAAS,EAAE,GAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,MAAM,CAAc;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;EAItC,SAAS,EAAE,GAA4B;CDAhC;;AAFD,AAAA,OAAO,CAAa;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,OAAO,CAAa;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;EAItC,SAAS,EAAE,SAA4B;CDAhC;;AAFD,AAAA,OAAO,CAAa;ECF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAA4B;EAItC,SAAS,EAAE,IAA4B;CDAhC;;AAGH,AAAA,YAAY,CAAU;EAAE,KAAK,EAAE,EAAE;CAAI;;AAErC,AAAA,WAAW,CAAU;EAAE,KAAK,EFmGJ,EAAE;CEnGoB;;AAG5C,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,QAAQ,CAAc;EAAE,KAAK,EADlB,CAAC;CACyB;;AAArC,AAAA,SAAS,CAAa;EAAE,KAAK,EADlB,EAAC;CACyB;;AAArC,AAAA,SAAS,CAAa;EAAE,KAAK,EADlB,EAAC;CACyB;;AAArC,AAAA,SAAS,CAAa;EAAE,KAAK,EADlB,EAAC;CACyB;;AAMnC,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,QAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,GAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,GAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;AAFD,AAAA,SAAS,CAAc;ECT/B,WAAW,EAAmB,GAAgB;CDWrC;;AAFD,AAAA,UAAU,CAAa;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;AAFD,AAAA,UAAU,CAAa;ECT/B,WAAW,EAAmB,SAAgB;CDWrC;;ADAP,MAAM,EAAE,SAAS,EAAE,KAAK;EC9BtB,AAAA,OAAO,CAAO;IACZ,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,IAAI;GAChB;EACD,AAAA,YAAY,CAAO;IACjB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;GAChB;EAGC,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAA4B;IAItC,SAAS,EAAE,QAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAA4B;IAItC,SAAS,EAAE,IAA4B;GDAhC;EAGH,AAAA,eAAe,CAAO;IAAE,KAAK,EAAE,EAAE;GAAI;EAErC,AAAA,cAAc,CAAO;IAAE,KAAK,EFmGJ,EAAE;GEnGoB;EAG5C,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAMnC,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAgB,CAAC;GDWnB;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,QAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;;;ADAP,MAAM,EAAE,SAAS,EAAE,KAAK;EC9BtB,AAAA,OAAO,CAAO;IACZ,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,IAAI;GAChB;EACD,AAAA,YAAY,CAAO;IACjB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;GAChB;EAGC,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAA4B;IAItC,SAAS,EAAE,QAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAA4B;IAItC,SAAS,EAAE,IAA4B;GDAhC;EAGH,AAAA,eAAe,CAAO;IAAE,KAAK,EAAE,EAAE;GAAI;EAErC,AAAA,cAAc,CAAO;IAAE,KAAK,EFmGJ,EAAE;GEnGoB;EAG5C,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAMnC,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAgB,CAAC;GDWnB;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,QAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;;;ADAP,MAAM,EAAE,SAAS,EAAE,KAAK;EC9BtB,AAAA,OAAO,CAAO;IACZ,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,IAAI;GAChB;EACD,AAAA,YAAY,CAAO;IACjB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;GAChB;EAGC,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAA4B;IAItC,SAAS,EAAE,QAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAA4B;IAItC,SAAS,EAAE,IAA4B;GDAhC;EAGH,AAAA,eAAe,CAAO;IAAE,KAAK,EAAE,EAAE;GAAI;EAErC,AAAA,cAAc,CAAO;IAAE,KAAK,EFmGJ,EAAE;GEnGoB;EAG5C,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAMnC,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAgB,CAAC;GDWnB;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,QAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;;;ADAP,MAAM,EAAE,SAAS,EAAE,MAAM;EC9BvB,AAAA,OAAO,CAAO;IACZ,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,IAAI;GAChB;EACD,AAAA,YAAY,CAAO;IACjB,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,IAAI;GAChB;EAGC,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAA4B;IAItC,SAAS,EAAE,QAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,SAAS,CAAW;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,GAA4B;IAItC,SAAS,EAAE,GAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAA4B;IAItC,SAAS,EAAE,SAA4B;GDAhC;EAFD,AAAA,UAAU,CAAU;ICF1B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAA4B;IAItC,SAAS,EAAE,IAA4B;GDAhC;EAGH,AAAA,eAAe,CAAO;IAAE,KAAK,EAAE,EAAE;GAAI;EAErC,AAAA,cAAc,CAAO;IAAE,KAAK,EFmGJ,EAAE;GEnGoB;EAG5C,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,WAAW,CAAW;IAAE,KAAK,EADlB,CAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAArC,AAAA,YAAY,CAAU;IAAE,KAAK,EADlB,EAAC;GACyB;EAMnC,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAgB,CAAC;GDWnB;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,QAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,YAAY,CAAW;ICT/B,WAAW,EAAmB,GAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;EAFD,AAAA,aAAa,CAAU;ICT/B,WAAW,EAAmB,SAAgB;GDWrC;;;AyB3DV,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BMT,OAAgB;C2BLvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BGT,OAAgB;E2BFvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BOT,OAAgB;C2BNvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BIT,OAAgB;E2BHvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BQT,OAAgB;C2BPvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BKT,OAAgB;E2BJvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BST,OAAgB;C2BRvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BMT,OAAgB;E2BLvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BUT,OAAgB;C2BTvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BOT,OAAgB;E2BNvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BWT,OAAgB;C2BVvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BQT,OAAgB;E2BPvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BYT,OAAgB;C2BXvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BST,OAAgB;E2BRvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BaT,OAAgB;C2BZvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BUT,OAAgB;E2BTvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,eAAe,CAAI;EAClB,gBAAgB,E3BcT,OAAgB;C2BbvB;;AACD,AAAA,cAAc,AAAA,eAAe,CAAI;EAChC,gBAAgB,E3BWT,OAAgB;E2BVvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,eAAe,AAQ3B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAKF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BST,OAAgB;C2BRvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BMT,OAAgB;E2BLvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BUT,OAAgB;C2BTvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BOT,OAAgB;E2BNvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BWT,OAAgB;C2BVvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BQT,OAAgB;E2BPvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BYT,OAAgB;C2BXvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BST,OAAgB;E2BRvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BaT,OAAgB;C2BZvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BUT,OAAgB;E2BTvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BcT,OAAgB;C2BbvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BWT,OAAgB;E2BVvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BeT,OAAgB;C2BdvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BYT,OAAgB;E2BXvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BgBT,OAAgB;C2BfvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BaT,OAAgB;E2BZvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,WAAW,CAAI;EACd,gBAAgB,E3BiBT,OAAgB;C2BhBvB;;AACD,AAAA,cAAc,AAAA,WAAW,CAAI;EAC5B,gBAAgB,E3BcT,OAAgB;E2BbvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,WAAW,AAQvB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAKF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BAT,OAAgB;C2BCvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BHT,OAAgB;E2BIvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BCT,OAAgB;C2BAvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BFT,OAAgB;E2BGvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BET,OAAgB;C2BDvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BDT,OAAgB;E2BEvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BGT,OAAgB;C2BFvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BAT,OAAgB;E2BCvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BIT,OAAgB;C2BHvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BCT,OAAgB;E2BAvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BKT,OAAgB;C2BJvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BET,OAAgB;E2BDvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BMT,OAAgB;C2BLvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BGT,OAAgB;E2BFvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BOT,OAAgB;C2BNvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BIT,OAAgB;E2BHvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,aAAa,CAAI;EAChB,gBAAgB,E3BQT,OAAgB;C2BPvB;;AACD,AAAA,cAAc,AAAA,aAAa,CAAI;EAC9B,gBAAgB,E3BKT,OAAgB;E2BJvB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,aAAa,AAQzB,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAKF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BTT,OAAe;C2BUtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BZT,OAAe;E2BatB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BRT,OAAe;C2BStB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BXT,OAAe;E2BYtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BPT,OAAe;C2BQtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BVT,OAAe;E2BWtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BNT,OAAe;C2BOtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BTT,OAAe;E2BUtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BLT,OAAe;C2BMtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BRT,OAAe;E2BStB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BJT,OAAe;C2BKtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BPT,OAAe;E2BQtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BHT,OAAe;C2BItB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BNT,OAAe;E2BOtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BFT,OAAe;C2BGtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BLT,OAAe;E2BMtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AAhBF,AAAA,cAAc,CAAI;EACjB,gBAAgB,E3BDT,OAAe;C2BEtB;;AACD,AAAA,cAAc,AAAA,cAAc,CAAI;EAC/B,gBAAgB,E3BJT,OAAe;E2BKtB,OAAO,EAAE,YAAY;EACrB,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,OAAO,EAAE,GAAG;EACZ,aAAa,EAAE,GAAG;CAQlB;;AAdD,AAQC,cARa,AAAA,cAAc,AAQ1B,OAAO,CAAA;EACP,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAc;EACnC,OAAO,EAAE,SAAW;EACpB,KAAK,EAAE,KAAK;EACZ,cAAc,EAAE,SAAS;CACzB;;AChFH,AAAA,OAAO,CAAA;EACN,MAAM,EAAE,IAAI;CACZ;;AACD,AAAA,OAAO,CAAA;EACN,MAAM,EAAE,IAAI;CACZ;;AACD,AAAA,cAAc,CAAA;EACb,MAAM,EAAE,WAAW;CACnB;;AACD,AAAA,UAAU,CAAA;EACT,MAAM,EAAE,OAAO;CACf;;AACD,AAAA,UAAU,CAAA;EACT,MAAM,EAAE,OAAO;CACf;;AACD,AAAA,WAAW,CAAA;EACV,MAAM,EAAE,QAAQ;CAChB;;ACdA,AAAA,SAAS,CAAD;EACP,OAAO,EAJG,MAAM;CAKhB;;AAFD,AAAA,QAAQ,CAAA;EACP,OAAO,EAJU,KAAK;CAKtB;;AAFD,AAAA,eAAe,CAAP;EACP,OAAO,EAJgB,YAAY;CAKnC;;AAFD,AAAA,OAAO,CAAC;EACP,OAAO,EAJ6B,IAAI;CAKxC;;AAFD,AAAA,cAAc,CAAN;EACP,OAAO,EAJkC,WAAW;CAKpD;;AAFD,AAAA,OAAO,CAAC;EACP,OAAO,EAJ8C,IAAI;CAKzD;;AAGF,AAAA,UAAU,CAAA;EACT,UAAU,EAAE,OAAO;CACnB;;AACD,AAAA,SAAS,CAAA;EACR,UAAU,EAAE,MAAM;CAClB;;ACbD,AAAA,SAAS,CAAA;EACR,KAAK,EAAE,IAAI;CACX;;AAED,AAAA,WAAW,CAAA;EACV,KAAK,EAAE,IAAI;CACX;;AACD,AAAA,YAAY,CAAA;EACX,KAAK,EAAE,KAAK;CACZ;;AAED,AAAA,WAAW,CAAA;EACV,QAAQ,EAAE,QAAQ;CAClB;;AACD,AAAA,WAAW,CAAA;EACV,QAAQ,EAAE,QAAQ;CAClB;;AACD,AAAA,QAAQ,CAAA;EACP,QAAQ,EAAE,KAAK;CACf;;AACD,AAAA,SAAS,CAAA;EACR,QAAQ,EAAE,MAAM;CAChB;;ACjBA,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,OAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,OAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,OAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,OAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,OAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,OAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,OAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,OAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,OAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,OAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,OAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,OAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,OAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,OAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,OAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,OAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,OAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,OAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,MAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,MAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,MAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,MAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,MAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,MAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,MAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,MAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,MAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,MAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,MAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,MAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,MAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,MAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,MAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,MAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,MAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,MAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,OAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,OAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,OAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,OAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,OAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,OAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,OAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,OAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,OAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,OAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,OAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,OAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,OAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,OAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,OAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,OAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,OAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,OAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,OAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,OAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,OAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,OAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,OAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,OAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,OAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,OAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,OAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,OAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,OAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,OAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,OAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,OAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,OAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,OAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,OAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,OAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,MAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,MAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,MAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,MAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,MAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,MAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,MAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,MAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,MAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,MAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,MAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,MAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,MAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,MAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,MAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,MAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,MAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,MAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,IAAI,CAAI;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,IAAI,CAAI;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,KAAK,CAAI;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,KAAK,CAAI;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,KAAK,CAAI;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,KAAK,CAAG;EACP,OAAO,EAHA,MAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EANJ,MAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EATN,MAAY,CASG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,cAAc,EAZP,MAAY,CAYI,UAAU;CACjC;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAfL,MAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAlBL,MAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,MAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAtBJ,MAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,MAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,KAAK,CAAG;EACP,MAAM,EA3BC,MAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9BH,MAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAjCL,MAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EApCN,MAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAvCJ,MAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EA1CJ,MAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,MAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9CH,MAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,MAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,KAAK,CAAG;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,KAAK,CAAG;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,KAAK,CAAG;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,KAAK,CAAG;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,KAAK,CAAG;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,KAAK,CAAG;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AA9CD,AAAA,KAAK,CAAG;EACP,OAAO,EAHA,IAAY,CAGH,UAAU;CAC1B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EANJ,IAAY,CAMC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EATN,IAAY,CASG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,cAAc,EAZP,IAAY,CAYI,UAAU;CACjC;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAfL,IAAY,CAeE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAlBL,IAAY,CAkBE,UAAU;EAC/B,aAAa,EAnBN,IAAY,CAmBG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAtBJ,IAAY,CAsBC,UAAU;EAC9B,cAAc,EAvBP,IAAY,CAuBI,UAAU;CACjC;;AAED,AAAA,KAAK,CAAG;EACP,MAAM,EA3BC,IAAY,CA2BJ,UAAU;CACzB;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9BH,IAAY,CA8BA,UAAU;CAC7B;;AACD,AAAA,MAAM,CAAG;EACR,YAAY,EAjCL,IAAY,CAiCE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,aAAa,EApCN,IAAY,CAoCG,UAAU;CAChC;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EAvCJ,IAAY,CAuCC,UAAU;CAC9B;;AACD,AAAA,MAAM,CAAG;EACR,WAAW,EA1CJ,IAAY,CA0CC,UAAU;EAC9B,YAAY,EA3CL,IAAY,CA2CE,UAAU;CAC/B;;AACD,AAAA,MAAM,CAAG;EACR,UAAU,EA9CH,IAAY,CA8CA,UAAU;EAC7B,aAAa,EA/CN,IAAY,CA+CG,UAAU;CAChC;;AAGF,AAAA,QAAQ,CAAA;EACP,YAAY,EAAE,IAAI;EAClB,WAAW,EAAE,IAAI;CACjB;;ACzDD,AAAA,UAAU,CAAA;EACT,UAAU,EAAE,IAAI;CAChB;;AACD,AAAA,YAAY,CAAA;EACX,UAAU,EAAE,MAAM;CAClB;;AACD,AAAA,WAAW,CAAA;EACV,UAAU,EAAE,KAAK;CACjB;;AACD,AAAA,aAAa,CAAA;EACZ,UAAU,EAAE,OAAO;CACnB;;AACD,AAAA,eAAe,CAAA;EACd,cAAc,EAAE,SAAS;CACzB;;AACD,AAAA,gBAAgB,CAAA;EACf,cAAc,EAAE,UAAU;CAC1B;;AACD,AAAA,eAAe,CAAA;EACd,cAAc,EAAE,SAAS;CACzB", + "sources": [ + "../scss/main.scss", + "../Elementum/scss/base/_normalize.scss", + "../Elementum/scss/base/_functions.scss", + "../Elementum/scss/base/_variables.scss", + "../Elementum/scss/mixins/_breakpoints.scss", + "../Elementum/scss/mixins/_grid-framework.scss", + "../Elementum/scss/mixins/_grid.scss", + "../scss/base/_variables.scss", + "../scss/base/_base.scss", + "../scss/elements/_buttons.scss", + "../scss/elements/_inputs.scss", + "../scss/components/_navbar.scss", + "../scss/components/_navs.scss", + "../scss/components/_dropdowns.scss", + "../scss/components/_products.scss", + "../scss/components/_filters.scss", + "../scss/components/_steps.scss", + "../scss/components/_flycart.scss", + "../scss/layout/_grid.scss", + "../scss/pages/_main.scss", + "../scss/pages/_detail.scss", + "../scss/pages/_cart.scss", + "../Elementum/scss/base/_base.scss", + "../Elementum/scss/components/_alerts.scss", + "../Elementum/scss/components/_breadcrumbs.scss", + "../Elementum/scss/components/_pagination.scss", + "../Elementum/scss/elements/_buttons.scss", + "../Elementum/scss/elements/_inputs.scss", + "../Elementum/scss/elements/_tables.scss", + "../Elementum/scss/layout/_grid.scss", + "../Elementum/scss/utilities/_colors.scss", + "../Elementum/scss/utilities/_cursor.scss", + "../Elementum/scss/utilities/_display.scss", + "../Elementum/scss/utilities/_position.scss", + "../Elementum/scss/utilities/_spacing.scss", + "../Elementum/scss/utilities/_text.scss" + ], + "names": [], + "file": "main.css" +} \ No newline at end of file diff --git a/templates/css/modal.css b/templates/css/modal.css new file mode 100644 index 0000000..6b85663 --- /dev/null +++ b/templates/css/modal.css @@ -0,0 +1,28 @@ +.modal-container-hiden { + display: none !important; +} + +#modal:target { + display: flex; +} + +#modal2:target { + display: flex; +} + +#modal3:target { + display: flex; +} + +#modal4:target { + display: flex; +} + + +@media (max-width: 767px){ + .modal>.overflow { + height: calc(100% - 44px); + overflow-y: scroll; + overflow-x: hidden; + } +} diff --git a/templates/css/pre.css b/templates/css/pre.css new file mode 100644 index 0000000..0a75a13 --- /dev/null +++ b/templates/css/pre.css @@ -0,0 +1,17 @@ +pre{ + border-radius: 3px; + border: 0px solid transparent; + color: #d4def7; + padding: 0.5em 0.8em; + line-height: 1.5; + background: #121a2b; + width: 100%; + display: block; +} + +.rectangle-content{ + width: 100%; + background: linear-gradient(135deg, rgba(116, 34, 189, 0.5), rgba(185, 19, 121, 0.5)); + border-radius: 8px; + padding: .25rem !important; +} \ No newline at end of file diff --git a/templates/dashboard.phtml b/templates/dashboard.phtml new file mode 100644 index 0000000..19e22fb --- /dev/null +++ b/templates/dashboard.phtml @@ -0,0 +1,75 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + +
+
+ +
+ Add Device + +
+ $dashboardItemData) { + $partialDeviceButton = new Partial('dashboardButton'); + $partialDeviceButton->prepare('dashboardItemData', $dashboardItemData); + + $partialDeviceButton->render(); + } ?> +
+
+
+ + + + prepare('DEVICEDATA', $DEVICEDATA); + + $partial->render(); + } + $partial = new Partial('footer'); + $partial->render(); + ?> + + diff --git a/templates/fonts/FontAwesome.otf b/templates/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/templates/fonts/FontAwesome.otf differ diff --git a/templates/fonts/Metropolis-Medium.otf b/templates/fonts/Metropolis-Medium.otf new file mode 100644 index 0000000..239d69d Binary files /dev/null and b/templates/fonts/Metropolis-Medium.otf differ diff --git a/templates/fonts/Metropolis-Regular.otf b/templates/fonts/Metropolis-Regular.otf new file mode 100644 index 0000000..737760b Binary files /dev/null and b/templates/fonts/Metropolis-Regular.otf differ diff --git a/templates/fonts/Metropolis-SemiBold.otf b/templates/fonts/Metropolis-SemiBold.otf new file mode 100644 index 0000000..f9889d0 Binary files /dev/null and b/templates/fonts/Metropolis-SemiBold.otf differ diff --git a/templates/fonts/fontawesome-webfont.eot b/templates/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/templates/fonts/fontawesome-webfont.eot differ diff --git a/templates/fonts/fontawesome-webfont.svg b/templates/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/templates/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/fonts/fontawesome-webfont.ttf b/templates/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/templates/fonts/fontawesome-webfont.ttf differ diff --git a/templates/fonts/fontawesome-webfont.woff b/templates/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/templates/fonts/fontawesome-webfont.woff differ diff --git a/templates/fonts/fontawesome-webfont.woff2 b/templates/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/templates/fonts/fontawesome-webfont.woff2 differ diff --git a/templates/home.phtml b/templates/home.phtml new file mode 100644 index 0000000..9e7dab0 --- /dev/null +++ b/templates/home.phtml @@ -0,0 +1,100 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + +
+
+ + + + +
+
+ doma jsou: + +
+ +
+ $room) { ?> + $device) { ?> + $subDevice) { + //BUTTON + $partialDeviceButton = new Partial('deviceButton'); + $partialDeviceButton->prepare('roomid',$roomId); + $partialDeviceButton->prepare('subdeviceid',$subDeviceKey); + $partialDeviceButton->prepare('subdevice',$subDevice); + $partialDeviceButton->prepare('deviceid',$deviceId); + $partialDeviceButton->prepare('device',$device); + + $partialDeviceButton->render(); + + //DETAIL + $partialDetail = new Partial('deviceDetail'); + $partialDetail->prepare('subdeviceid',$subDeviceKey); + $partialDetail->prepare('subdevice',$subDevice); + $partialDetail->prepare('device',$device); + $partialDetail->prepare('lang',$LANG); + + $partialDetail->render(); + + //SETTING + $partialEdit = new Partial('deviceEdit'); + $partialEdit->prepare('deviceid',$deviceId); + $partialEdit->prepare('subdevice',$subDevice); + $partialEdit->prepare('device',$device); + $partialEdit->prepare('users',$USERS); + $partialEdit->prepare('rooms',$ROOMS); + $partialEdit->prepare('lang',$LANG); + + $partialEdit->render(); + } + } + } ?> +
+
+
+ render(); + ?> + + \ No newline at end of file diff --git a/templates/images/icon-192x192.png b/templates/images/icon-192x192.png new file mode 100644 index 0000000..d5635af Binary files /dev/null and b/templates/images/icon-192x192.png differ diff --git a/templates/images/icon-512x512.png b/templates/images/icon-512x512.png new file mode 100644 index 0000000..4d31abb Binary files /dev/null and b/templates/images/icon-512x512.png differ diff --git a/templates/js/jquery.js b/templates/js/jquery.js new file mode 100644 index 0000000..07c00cd --- /dev/null +++ b/templates/js/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0') + .attr("method", method) + .attr("action", url + hash); + + + if (target) { + form.attr("target", target); + } + + var submit = form[0].submit; + iterateValues(values, [], form, null, traditional); + + return { form: form, submit: function () { submit.call(form[0]); } }; + } + + //Utility Functions + /** + * Url and QueryString Parser. + * @param {string} url - a Url to parse. + * @returns {object} an object with the parsed url with the following structure {url: URL, params:{ KEY: VALUE }} + */ + $.parseUrl = function (url) { + + if (url.indexOf('?') === -1) { + return { + url: url, + params: {} + }; + } + var parts = url.split('?'), + query_string = parts[1], + elems = query_string.split('&'); + url = parts[0]; + + var i, pair, obj = {}; + for (i = 0; i < elems.length; i += 1) { + pair = elems[i].split('='); + obj[pair[0]] = pair[1]; + } + + return { + url: url, + params: obj + }; + }; + + //Private Functions + var getInput = function (name, value, parent, array, traditional) { + var parentString; + if (parent.length > 0) { + parentString = parent[0]; + var i; + for (i = 1; i < parent.length; i += 1) { + parentString += "[" + parent[i] + "]"; + } + + if (array) { + if (traditional) + name = parentString; + else + name = parentString + "[" + name + "]"; + } else { + name = parentString + "[" + name + "]"; + } + } + + return $("").attr("type", "hidden") + .attr("name", name) + .attr("value", value); + }; + + var iterateValues = function (values, parent, form, isArray, traditional) { + var i, iterateParent = []; + Object.keys(values).forEach(function (i) { + if (typeof values[i] === "object") { + iterateParent = parent.slice(); + iterateParent.push(i); + iterateValues(values[i], iterateParent, form, Array.isArray(values[i]), traditional); + } else { + form.append(getInput(i, values[i], parent, isArray, traditional)); + } + }); + }; + + var removeNulls = function (values) { + var propNames = Object.getOwnPropertyNames(values); + for (var i = 0; i < propNames.length; i++) { + var propName = propNames[i]; + if (values[propName] === null || values[propName] === undefined) { + delete values[propName]; + } else if (typeof values[propName] === 'object') { + values[propName] = removeNulls(values[propName]); + } else if (values[propName].length < 1) { + delete values[propName]; + } + } + return values; + }; +}(window.jQuery || window.Zepto || window.jqlite)); diff --git a/templates/js/post.js b/templates/js/post.js new file mode 100644 index 0000000..e8f8aa7 --- /dev/null +++ b/templates/js/post.js @@ -0,0 +1,54 @@ +function ajaxPost(path, params, self, reload = false) { + navigator.vibrate([200]); + $.ajax({ + url: path, + type: 'POST', + data: params, + success: function(msg){ + if (msg != '' && msg != 1){ + $(self).find('.content').addClass( "loader" ); + $(self).find('.row').hide(); + waitForExecution(params, self, msg); + } else { + + } + console.log(msg); + if (reload){ + location.reload(); + } + }, + error: function (request, status, error) { + console.log('0'); + } + }); + return false; +} + +function waitForExecution(params, elements, msg_state){ + console.log('Waiting FOR Executed'); + var interval = setInterval( + function(){ + $.ajax({ + url: 'ajax', + type: 'POST', + data: { + lastRecord:'', + subDevice_id : params['subDevice_id'] + }, + success: function(msg){ + if (msg == 1){ + $(elements).find('.text-right').text(msg_state); + $(elements).find('.content').removeClass( "loader" ); + $(elements).find('.row').show(); + console.log('Executed'); + clearInterval(interval); + } + console.log('Waiting FOR Executed'); + console.log(msg); + }, + error: function (request, status, error) { + console.log('0'); + } + }); + }, 1000); + } \ No newline at end of file diff --git a/templates/js/script.js b/templates/js/script.js new file mode 100644 index 0000000..8f19f87 --- /dev/null +++ b/templates/js/script.js @@ -0,0 +1,226 @@ +if ('serviceWorker' in navigator) { + window.addEventListener('load', () => { + navigator.serviceWorker.register('serviceWorker.js') + .then(registration => { + console.log('Service Worker is registered', registration); + }) + .catch(err => { + console.error('Registration failed:', err); + }); + }); +} + +$('#valueSelector').change(function() { + console.log($(this).val()); + if( $(this).val() == 'time') { + $('#atTime').prop( "disabled", false ); + } else if( $(this).val() == 'atDeviceValue') { + $('#atDeviceValue').prop( "disabled", false ); + $('#atDeviceValueInt').prop( "disabled", false ); + } else { + $('#atDeviceValue').prop( "disabled", true ); + } +}); + +var pressTimer; +var touch = 0; +var touchSubId = ""; +$("div.square-content").on('touchend', function (e){ + clearTimeout(pressTimer); +}); + +$("div.square-content").on('touchstart', function (eTarget) { + var id = $(this).attr('id').replace('device-', ''); + var subId = $(this).attr('data-sub-device-id'); + + touch++; + if(touch == 2 && touchSubId == subId){ + console.log("Detail"); + $("#modal-detail-"+subId).removeClass('modal-container-hiden').show(); + ajaxChart(subId); + touch = 0; + touchSubId = ""; + return; + } + touchSubId = subId; + + pressTimer = window.setTimeout(function (e) { + console.log("Setting"); + $("#modal-setting-"+id).removeClass('modal-container-hiden').show(); + }, 500); +}); + +$("div.square-content").mousedown(function(e) { + if (event.which == 3) { + var windowLoc = $(location).attr('pathname'); + windowLoc = windowLoc.substring(windowLoc.lastIndexOf("/")); + console.log(windowLoc); + var id = null; + if (windowLoc == "/") { + id = $(this).attr('id').replace('device-', ''); + } else if (windowLoc == "/scene") { + id = $(this).attr('id').replace('scene-', ''); + } + $("#modal-setting-"+id).removeClass('modal-container-hiden').show(); + console.log("Setting"); + console.log("modal" + id); + } +}); + +$(".close").on('click', function (e) { + var a = $(this).parent().parent(); + a.hide(); +}); + +$(this).bind("contextmenu", function(e) { + e.preventDefault(); +}); + +$("div.square-content").on('dblclick', function (eTarget) { + windowLoc = windowLoc.substring(windowLoc.lastIndexOf("/")); + if (windowLoc == "/") { + console.log("Detail"); + var subId = $(this).attr('data-sub-device-id'); + ajaxChart(subId); + $("#modal-detail-"+subId).removeClass('modal-container-hiden').show(); + } +}); + +$("input#sleepTime").change(function() { + console.log("Input text changed!"); +}); + +var element = $('div.delete'); +element.hide(); +$("a#remove").on('click', function (e) { + console.log("Show/Hide Button"); + var element = $('div.delete'); + element.toggle(); +}); + +function ajaxChart(id, period = 'day', group = 'hour'){ + $.ajax({ + url: 'ajax', + type: 'POST', + dataType: 'json', + data: { + "subDevice": id, + "action": 'chart', + "period": period, + "group": group + }, + success: function(data){ + console.log('ID: ',id, 'DATA: ', data); + var ctx = document.getElementById('canvas-'+id).getContext('2d'); + var myChart = new Chart(ctx, data); + }, + error: function (request, status, error) { + console.log("ERROR ajaxChart():", request, error); + } + }); +} + +//select room on load +var windowLoc = $(location).attr('pathname'); +windowLoc = windowLoc.substring(windowLoc.lastIndexOf("/")); +console.log(); +if (windowLoc == "/") { + var selectRoomId = localStorage.getItem("selectedRoomId"); + console.log('Saved Selected Room ID '+ selectRoomId); + $('[name="room"]').val(selectRoomId); + $('.device-button').each(function(){ + if (selectRoomId != 'all'){ + if($(this).data('room-id') != selectRoomId){ + $(this).hide(); + } else { + $(this).show(); + } + } + }); +} + +//Room selector +$( '[name="room"]' ).change(function (e) { + console.log('Selected Room ID ' + this.value) + var roomId = this.value; + localStorage.setItem("selectedRoomId", roomId); + $('.device-button').show(); + if (roomId != 'all'){ + $('.device-button').each(function(){ + if($(this).data('room-id') != roomId){ + $(this).hide(); + } + }); + } +}); + + +var autoUpdate = setInterval(function(){ + $.ajax({ + url: 'ajax', + type: 'POST', + dataType: 'json', + data: { + "action": 'getState' + }, + success: function(data){ + // console.log('DATA: ', data); + for (const key in data) { + if (data.hasOwnProperty(key)) { + const device = data[key]; + $('[data-sub-device-id="'+key+'"]') + .find('.device-button-value') + .text(device['value']) + .attr('title',device['time']) + } + } + }, + error: function (request, status, error) { + console.log("ERROR ajaxChart():", request, error); + } + }); +},2000); + + + +//Graphs +$('.graph-period').on('click', function (e) { + var subId = $(this).attr('data-sub-device-id'); + var period = $(this).attr('data-period'); + var groupBy = $(this).attr('data-group'); + ajaxChart(subId, period, groupBy); +}); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/loading.css b/templates/loading.css new file mode 100644 index 0000000..228c2c0 --- /dev/null +++ b/templates/loading.css @@ -0,0 +1,20 @@ +.loader { + border: 16px solid #f3f3f3; + border-radius: 50%; + border-top: 16px solid #3498db; + width: 120px; + height: 120px; + -webkit-animation: spin 2s linear infinite; /* Safari */ + animation: spin 2s linear infinite; +} + +/* Safari */ +@-webkit-keyframes spin { + 0% { -webkit-transform: rotate(0deg); } + 100% { -webkit-transform: rotate(360deg); } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} \ No newline at end of file diff --git a/templates/login.phtml b/templates/login.phtml new file mode 100644 index 0000000..6c37b8b --- /dev/null +++ b/templates/login.phtml @@ -0,0 +1,37 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + + + + render(); + ?> + + diff --git a/templates/part/automationCreate.phtml b/templates/part/automationCreate.phtml new file mode 100644 index 0000000..d2e3a06 --- /dev/null +++ b/templates/part/automationCreate.phtml @@ -0,0 +1,85 @@ + \ No newline at end of file diff --git a/templates/part/automationCreateFinal.phtml b/templates/part/automationCreateFinal.phtml new file mode 100644 index 0000000..cd64174 --- /dev/null +++ b/templates/part/automationCreateFinal.phtml @@ -0,0 +1,38 @@ + \ No newline at end of file diff --git a/templates/part/automationEdit.phtml b/templates/part/automationEdit.phtml new file mode 100644 index 0000000..c28ab76 --- /dev/null +++ b/templates/part/automationEdit.phtml @@ -0,0 +1,97 @@ + \ No newline at end of file diff --git a/templates/part/dashboardButton.phtml b/templates/part/dashboardButton.phtml new file mode 100644 index 0000000..2f7bdb3 --- /dev/null +++ b/templates/part/dashboardButton.phtml @@ -0,0 +1,22 @@ +
+
+
+
+
delete
+
+
+
&#x
+
+
+
+
+
+
+
+ +
+
+
+
+
+
\ No newline at end of file diff --git a/templates/part/deviceButton.phtml b/templates/part/deviceButton.phtml new file mode 100644 index 0000000..cde0f77 --- /dev/null +++ b/templates/part/deviceButton.phtml @@ -0,0 +1,29 @@ + + +
data-room-id=""> +
+
" id="device-" data-sub-device-id=""> +
+
+
+
&#x
+
+
+
+
+
+
+
+ +
+
+
+
+
+
diff --git a/templates/part/deviceDetail.phtml b/templates/part/deviceDetail.phtml new file mode 100644 index 0000000..e5ed9b0 --- /dev/null +++ b/templates/part/deviceDetail.phtml @@ -0,0 +1,80 @@ + + \ No newline at end of file diff --git a/templates/part/deviceEdit.phtml b/templates/part/deviceEdit.phtml new file mode 100644 index 0000000..42a60eb --- /dev/null +++ b/templates/part/deviceEdit.phtml @@ -0,0 +1,160 @@ + \ No newline at end of file diff --git a/templates/part/footer.phtml b/templates/part/footer.phtml new file mode 100644 index 0000000..ec61ae8 --- /dev/null +++ b/templates/part/footer.phtml @@ -0,0 +1,3 @@ + + + diff --git a/templates/part/head.phtml b/templates/part/head.phtml new file mode 100644 index 0000000..d9fc778 --- /dev/null +++ b/templates/part/head.phtml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/templates/part/sceneCreate.phtml b/templates/part/sceneCreate.phtml new file mode 100644 index 0000000..6d71fde --- /dev/null +++ b/templates/part/sceneCreate.phtml @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/templates/part/sceneCreateOptions.phtml b/templates/part/sceneCreateOptions.phtml new file mode 100644 index 0000000..d0bd111 --- /dev/null +++ b/templates/part/sceneCreateOptions.phtml @@ -0,0 +1,26 @@ + \ No newline at end of file diff --git a/templates/part/sceneEdit.phtml b/templates/part/sceneEdit.phtml new file mode 100644 index 0000000..5a5818c --- /dev/null +++ b/templates/part/sceneEdit.phtml @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/templates/part/test.phtml b/templates/part/test.phtml new file mode 100644 index 0000000..002c703 --- /dev/null +++ b/templates/part/test.phtml @@ -0,0 +1,3 @@ +

+ TEST - TEST +

\ No newline at end of file diff --git a/templates/rooms.phtml b/templates/rooms.phtml new file mode 100644 index 0000000..88ddd49 --- /dev/null +++ b/templates/rooms.phtml @@ -0,0 +1,163 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + +
+
+ + + + +
+
+ $room) { ?> +
+
+

+ $value) { ?> +
+ + +
+                                    
+                                
+ +
+ $value) { ?> +
+
+
+
+
+
+
+
&#x
+
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ +
+ +
+ +
+
+ render(); + ?> + + + \ No newline at end of file diff --git a/templates/scene.phtml b/templates/scene.phtml new file mode 100644 index 0000000..eaad72d --- /dev/null +++ b/templates/scene.phtml @@ -0,0 +1,91 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + +
+
+ +
+ +
+ $sceneData) { ?> +
+
+
+
+
+
+ &#x +
+
+
+
+ +
+
+
+
+
+
+
+
+
+
+ + prepare('lang',$LANG); + $partialSceneEdit->prepare('sceneId',$sceneId); + $partialSceneEdit->prepare('scene',$sceneData); + + + $partialSceneEdit->render(); + ?> + +
+
+
+ + prepare('lang',$LANG); + $partial->prepare('setStateFormDevices',$SETSTATEFORMDEVICES ); + $partial->prepare('sceneIcon',$SCENEICON ); + $partial->prepare('SceneName',$SCENENAME ); + $partial->render(); + } else { + $partial = new Partial('sceneCreate'); + $partial->prepare('lang',$LANG); + $partial->prepare('subDevices',$SUBDEVICES); + $partial->render(); + } + $partial = new Partial('footer'); + $partial->render(); + ?> + + \ No newline at end of file diff --git a/templates/setting.phtml b/templates/setting.phtml new file mode 100644 index 0000000..fd2d953 --- /dev/null +++ b/templates/setting.phtml @@ -0,0 +1,81 @@ + + + + render(); + ?> + <?php echo $TITLE ?> + + +
+
+ +
+
+
+
+
+
Str谩nka po na膷ten铆
+ +
+ +
+
+ +
+ +
+
+
+ +
+
+
+ + +
+ + render(); + //TODO js do main.js + ?> + + + diff --git a/views/Ajax.php b/views/Ajax.php new file mode 100644 index 0000000..69b4dca --- /dev/null +++ b/views/Ajax.php @@ -0,0 +1,163 @@ +isLogin()){ + header('Location: ./'); + } + + $is_ajax = 'XMLHttpRequest' == ( $_SERVER['HTTP_X_REQUESTED_WITH'] ?? '' ); + if (!$is_ajax){ + header('Location: ./'); + } + + if (isset($_POST['subDevice_id'])){ + $subDeviceId = $_POST['subDevice_id']; + if (isset($_POST['lastRecord'])){ + echo RecordManager::getLastRecord($subDeviceId)['execuded']; + die(); + } + $subDeviceData = SubDeviceManager::getSubDevice($subDeviceId); + $deviceId = SubDeviceManager::getSubDeviceMaster($subDeviceId)['device_id']; + if ($subDeviceData['type'] == 'on/off'){ + if (RecordManager::getLastRecord($subDeviceData['subdevice_id'])['value'] == 0){ + RecordManager::create($deviceId, 'on/off', 1); + echo 'ON'; + }else{ + RecordManager::create($deviceId, 'on/off', 0); + echo 'OFF'; + } + } + + } else if (isset($_POST['automation_id'])){ + $automationId = $_POST['automation_id']; + AutomationManager::deactive($automationId); + } else if (isset($_POST['subDevice']) && isset($_POST['action']) && $_POST['action'] == "chart") { + //TODO lepe rozstrukturovat + $subDeviceId = $_POST['subDevice']; + $period = $_POST['period']; + $groupBy = $_POST['group']; + + $subDevice = SubDeviceManager::getSubDevice($subDeviceId); + $records = RecordManager::getAllRecordForGraph($subDeviceId, $period, $groupBy); + + $array = array_column($records, 'value'); + + if ($subDevice['type'] == 'light'){ + foreach ($array as $key => $value) { + if ($value == 1 || $value == 0) + { + return; + } + if ($value > 810){ + $array[$key] = 1; + } else { + $array[$key] = 0; + } + } + } + + $data = json_encode($array); + + $arrayTimeStamps = array_column($records, 'time'); + foreach ($arrayTimeStamps as $key => $value) { + $arrayTimeStamps[$key] = (new DateTime($value))->format(TIMEFORMAT); + } + + $labels = json_encode($arrayTimeStamps); + $range = RANGES[$subDevice['type']]; + header('Content-Type: application/json'); + $JSON = '{ + "type": "line", + "data": { + "labels": ' . $labels . ', + "datasets": [{ + "data": ' . $data . ', + "backgroundColor": "#7522bf", + "lineTension": 0, + "radius": 5 + }] + }, + "options": { + "legend": { + "display": false + }, + "scales": { + "yAxes": [{ + "ticks": { + "min": ' . $range['min'] . ', + "max": ' . $range['max'] . ', + "steps": ' . $range['scale'] . ' + } + }] + }, + "tooltips": { + "enabled": false + }, + "hover": { + "mode": null + } + } + }'; + + echo $JSON; + } else if (isset($_POST['action']) && $_POST['action'] == "getState") { + //State Update + $roomsData = RoomManager::getAllRooms(); + $subDevices = []; + foreach ($roomsData as $roomKey => $roomsData) { + $devicesData = DeviceManager::getAllDevicesInRoom($roomsData['room_id']); + foreach ($devicesData as $deviceKey => $deviceData) { + $subDevicesData = SubDeviceManager::getAllSubDevices($deviceData['device_id']); + foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { + $lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']); + $parsedValue = round($lastRecord['value']); + //TODO: P艡edelat na switch sna啪拧铆 p艡id谩v谩n铆 + /*Value Parsing*/ + if ($subDeviceData['type'] == "on/off") { + $parsedValue = ($parsedValue == 1 ? 'ON' : 'OFF'); + } + if ($subDeviceData['type'] == "light") { + $replacementTrue = 'Light'; + $replacementFalse = 'Dark'; + if ($parsedValue != 1){ + //Analog Reading + $parsedValue = ($parsedValue <= 810 ? $replacementTrue : $replacementFalse); + } else { + //Digital Reading + $parsedValue = ($parsedValue == 0 ? $replacementTrue : $replacementFalse); + } + } + if ($subDeviceData['type'] == "door") { + $replacementTrue = 'Closed'; + $replacementFalse = 'Opened'; + $parsedValue = ($parsedValue == 1 ? $replacementTrue : $replacementFalse); + } + $subDevices[$subDeviceData['subdevice_id']] = [ + 'value' => $parsedValue .$subDeviceData['unit'], + 'time' => $lastRecord['time'], + ]; + } + } + } + echo json_encode($subDevices); + die(); + } else if (isset($_POST['scene_id'])) { + $sceneId = $_POST['scene_id']; + echo SceneManager::execScene($sceneId); + } + + die(); + + } +} diff --git a/views/Automation.php b/views/Automation.php new file mode 100644 index 0000000..0ef1a20 --- /dev/null +++ b/views/Automation.php @@ -0,0 +1,52 @@ +isLogin()){ + header('Location: ./login'); + } + + $automations = []; + $automationsData = AutomationManager::getAll(); + foreach ($automationsData as $automationKey => $automationData) { + $automations[$automationData['automation_id']] = [ + 'name' => '', + 'onDays' => implode(', ',json_decode($automationData['on_days'])), + 'ifSomething' => $automationData['if_something'], + 'doSomething' => $automationData['do_something'], + 'active' => $automationData['active'], + ]; + } + + $approvedSubDevices = []; + $allDevicesData = DeviceManager::getAllDevices(); + foreach ($allDevicesData as $deviceKey => $deviceValue) { + if (!$deviceValue['approved']) continue; + $allSubDevicesData = SubDeviceManager::getAllSubDevices($deviceValue['device_id']); + foreach ($allSubDevicesData as $subDeviceKey => $subDeviceValue) { + $approvedSubDevices[$subDeviceValue['subdevice_id']] = [ + 'name' => $allDevicesData[$deviceKey]['name'], + 'type' => $subDeviceValue['type'], + ]; + } + } + + $template = new Template('automation'); + $template->prepare('title', 'Automation'); + $template->prepare('lang', $lang); + $template->prepare('automations', $automations); + $template->prepare('subDevices', $approvedSubDevices); + + $template->render(); + } +} diff --git a/views/Dashboard.php b/views/Dashboard.php new file mode 100644 index 0000000..cfa5d20 --- /dev/null +++ b/views/Dashboard.php @@ -0,0 +1,90 @@ +isLogin()){ + header('Location: ./login'); + } + + $template = new Template('dashboard'); + + $dashboard = []; + $dashboardData = DashboardManager::getAllDashboards($userManager->getUserData('user_id')); + foreach ($dashboardData as $dashboardItemKey => $dashboardItemValue) { + $subDeviceData = SubDeviceManager::getSubDevice($dashboardItemValue['subdevice_id']); + $deviceData = SubDeviceManager::getSubDeviceMaster($dashboardItemValue['subdevice_id']); + + $lastRecord = RecordManager::getLastRecord($dashboardItemValue['subdevice_id']); + $parsedValue = $lastRecord['value']; + + //TODO: Opravit aby to bylo stejn茅 parsov谩n铆 jako na HOME + if ($subDeviceData['type'] == "on/off") { + $parsedValue = ($parsedValue == 1 ? 'ON' : 'OFF'); + } + if ($subDeviceData['type'] == "light") { + $parsedValue = ($parsedValue == 1 ? 'Light' : 'Dark'); + } + + $dashboard[$dashboardItemValue['dashboard_id']] = [ + 'icon' => $deviceData['icon'], + 'id' => $subDeviceData['subdevice_id'], + 'masterId' => $deviceData['device_id'], + 'name' => $deviceData['name'], + 'type' => $subDeviceData['type'], + 'unit' => $subDeviceData['unit'], + 'lastRecord' => [ + 'value' => $parsedValue, + ], + ]; + } + + $approvedSubDevices = []; + $allDevicesData = DeviceManager::getAllDevices(); + foreach ($allDevicesData as $deviceKey => $deviceValue) { + if (!$deviceValue['approved']) continue; + $allSubDevicesData = SubDeviceManager::getAllSubDevices($deviceValue['device_id']); + foreach ($allSubDevicesData as $subDeviceKey => $subDeviceValue) { + $approvedSubDevices[$subDeviceValue['subdevice_id']] = [ + 'name' => $allDevicesData[$deviceKey]['name'], + 'type' => $subDeviceValue['type'], + ]; + } + } + + + if (isset($_POST['deviceId'])){ + + $deviceData = DeviceManager::getDeviceById($_POST['deviceId']); + + $subDevices = []; + $subDevicesData = SubDeviceManager::getAllSubDevices($_POST['deviceId']); + + foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { + $subDevices[$subDeviceData['subdevice_id']] = [ + 'type' => $subDeviceData['type'], + 'unit' => $subDeviceData['unit'], + ]; + } + + $device = [ + 'id' => $deviceData['device_id'], + 'name' => $deviceData['name'], + 'token' => $deviceData['token'], + 'icon' => $deviceData['icon'], + 'subDevices' => $subDevices, + ]; + $template->prepare('deviceData', $device); + } + + $template->prepare('title', 'N谩st臎nka'); + $template->prepare('lang', $lang); + $template->prepare('dashboard', $dashboard); + $template->prepare('subDevices', $approvedSubDevices); + + $template->render(); + } +} diff --git a/views/Home.php b/views/Home.php new file mode 100644 index 0000000..2c7a721 --- /dev/null +++ b/views/Home.php @@ -0,0 +1,192 @@ +isLogin()){ + header('Location: ./login'); + } + + $template = new Template('home'); + + $roomsItems = []; + $roomsData = RoomManager::getAllRooms(); + foreach ($roomsData as $roomKey => $roomsData) { + $devices = []; + $devicesData = DeviceManager::getAllDevicesInRoom($roomsData['room_id']); + foreach ($devicesData as $deviceKey => $deviceData) { + $subDevices = []; + $subDevicesData = SubDeviceManager::getAllSubDevices($deviceData['device_id']); + foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { + + $events = RecordManager::getLastRecord($subDeviceData['subdevice_id'], 5); + + + $lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']); + $parsedValue = round($lastRecord['value']); + + /*Value Parsing*/ + if ($subDeviceData['type'] == "on/off") { + $parsedValue = ($parsedValue == 1 ? 'ON' : 'OFF'); + } + if ($subDeviceData['type'] == "door") { + $replacementTrue = 'Closed'; + $replacementFalse = 'Opened'; + foreach ($events as $key => $value) { + $events[$key]['value'] = ($value['value'] == 1 ? $replacementTrue : $replacementFalse); + } + $parsedValue = ($parsedValue == 1 ? $replacementTrue : $replacementFalse); + } + + if ($subDeviceData['type'] == "light") { + $replacementTrue = 'Light'; + $replacementFalse = 'Dark'; + foreach ($events as $key => $value) { + if ($parsedValue != 1){ + //Analog Reading + $events[$key]['value'] = ($value['value'] <= 810 ? $replacementTrue : $replacementFalse); + } else { + //Digital Reading + $events[$key]['value'] = ($value['value'] == 0 ? $replacementTrue : $replacementFalse); + } + } + if ($parsedValue != 1){ + //Analog Reading + $parsedValue = ($parsedValue <= 810 ? $replacementTrue : $replacementFalse); + } else { + //Digital Reading + $parsedValue = ($parsedValue == 0 ? $replacementTrue : $replacementFalse); + } + } + + $subDevice = SubDeviceManager::getSubDevice($subDeviceData['subdevice_id']); + $records = RecordManager::getAllRecordForGraph($subDeviceData['subdevice_id']); + + $array = array_column($records, 'value'); + foreach ($array as $key => $value) { + $array[$key] = $value . $subDevice['unit']; + } + + $data = json_encode($array); + $labels = json_encode($array); + + + $date2 = new DateTime($lastRecord['time']); + + $niceTime = $this->ago($date2); + + $connectionError = false; + + $startDate = date_create($lastRecord['time']); + $interval = $startDate->diff(new DateTime()); + $hours = $interval->format('%h'); + $minutes = $interval->format('%i'); + $lastSeen = ($hours * 60 + $minutes); + + if ($lastSeen > $deviceData['sleep_time'] && $subDeviceData['type'] != "on/off") { + $connectionError = true; + } + + $subDevices[$subDeviceData['subdevice_id']] = [ + 'data' => $data, + 'events'=> $events, + 'labels' => $labels, + 'range' => RANGES[$subDevice['type']], + 'type' => $subDeviceData['type'], + 'unit' => $subDeviceData['unit'], + 'comError' => $connectionError, + 'lastRecort' => [ + 'value' => $parsedValue, + 'time' => $lastRecord['time'], + 'niceTime' => $niceTime, + ], + ]; + } + + $permissionArray = json_decode($deviceData['permission']); + + $userIsDeviceAdmin = false; + if($permissionArray[1] == 3) { + $userIsDeviceAdmin = true; + } else if ($permissionArray[0] == 3) { + if ( $deviceData['owner'] == $userManager->getUserData('user_id')) { + $userIsDeviceAdmin = true; + } + } + + $devices[$deviceData['device_id']] = [ + 'name' => $deviceData['name'], + 'icon' => $deviceData['icon'], + 'room' => $deviceData['room_id'], + 'token' => $deviceData['token'], + 'sleepTime' => $deviceData['sleep_time'], + 'permission' => $permissionArray, + 'owner' => $deviceData['owner'], + 'userIsAdmin' => $userIsDeviceAdmin, + 'subDevices' => $subDevices, + ]; + } + $roomsItems[$roomsData['room_id']] = [ + 'name' => $roomsData['name'], + 'deviceCount' => $roomsData['device_count'], + 'devices' => $devices, + ]; + } + + if (isset($_POST['deviceId'])){ + $deviceData = DeviceManager::getDeviceById($_POST['deviceId']); + + $subDevices = []; + $subDevicesData = SubDeviceManager::getAllSubDevices($_POST['deviceId']); + + foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { + $subDevices[$subDeviceData['subdevice_id']] = [ + 'type' => $subDeviceData['type'], + 'unit' => $subDeviceData['unit'], + ]; + } + + $device = [ + 'id' => $deviceData['device_id'], + 'name' => $deviceData['name'], + 'token' => $deviceData['token'], + 'icon' => $deviceData['icon'], + 'subDevices' => $subDevices, + ]; + $template->prepare('deviceData', $device); + } + + $users = UserManager::getUsers(); + $template->prepare('users', $users); + + $rooms = RoomManager::getAllRooms(); + $template->prepare('rooms', $rooms); + $template->prepare('title', 'Home'); + $template->prepare('lang', $lang); + $template->prepare('data', $roomsItems); + + $template->render(); + + } + + function ago( $datetime ) + { + $interval = date_create('now')->diff( $datetime ); + $suffix = ( $interval->invert ? ' ago' : '' ); + if ( $v = $interval->y >= 1 ) return $this->pluralize( $interval->m, 'month' ) . $suffix; + if ( $v = $interval->d >= 1 ) return $this->pluralize( $interval->d, 'day' ) . $suffix; + if ( $v = $interval->h >= 1 ) return $this->pluralize( $interval->h, 'hour' ) . $suffix; + if ( $v = $interval->i >= 1 ) return $this->pluralize( $interval->i, 'minute' ) . $suffix; + return $this->pluralize( $interval->s, 'second' ) . $suffix; + } + + function pluralize( $count, $text ) + { + return $count . ( ( $count == 1 ) ? ( " $text" ) : ( " ${text}s" ) ); + } +} diff --git a/views/Login.php b/views/Login.php new file mode 100644 index 0000000..4d205c1 --- /dev/null +++ b/views/Login.php @@ -0,0 +1,19 @@ +isLogin()){ + header('Location: ./'); + } + + $template = new Template('login'); + $template->prepare('title', 'Home'); + $template->prepare('lang', $lang); + + $template->render(); + } +} diff --git a/views/Logout.php b/views/Logout.php new file mode 100644 index 0000000..026d680 --- /dev/null +++ b/views/Logout.php @@ -0,0 +1,11 @@ +logout(); + header('Location: /vasek/home/login', TRUE); + die(); + } +} diff --git a/views/Rooms.php b/views/Rooms.php new file mode 100644 index 0000000..32a5ae5 --- /dev/null +++ b/views/Rooms.php @@ -0,0 +1,85 @@ +isLogin()){ + header('Location: ./login'); + } + + $template = new Template('rooms'); + + $template->prepare('title', 'Rooms'); + $template->prepare('lang', $lang); + + $roomsItems = []; + $roomsData = RoomManager::getAllRooms(); + foreach ($roomsData as $roomKey => $roomsData) { + $devicesData = DeviceManager::getAllDevicesInRoom($roomsData['room_id']); + $roomReading = []; + if ($roomsData['device_count'] == 0) { + continue; + } + + $roomReadingCache = []; + $roomControlsCache = []; + foreach ($devicesData as $deviceKey => $deviceData) { + $subDevicesData = SubDeviceManager::getAllSubDevices($deviceData['device_id']); + foreach ($subDevicesData as $subDeviceKey => $subDeviceData) { + $subDeviceType = $subDeviceData['type']; + $subDeviceUnit = $subDeviceData['unit']; + $lastRecord = RecordManager::getLastRecord($subDeviceData['subdevice_id']); + + if (in_array($subDeviceType, ['on/off','battery','door'])) { + if ($subDeviceType == 'on/off') { + $roomControlsCache[$subDeviceKey] = [ + 'type' => $subDeviceType, + 'name' => $deviceData['name'], + 'icon' => $deviceData['icon'], + 'value' => $lastRecord['value'], + ]; + } + continue; + } + + if (array_key_exists($subDeviceType, $roomReadingCache)) { + $roomReadingCache[$subDeviceType] = [ + "value" => $roomReadingCache[$subDeviceType]['value'] + $lastRecord['value'], + "count" => $roomReadingCache[$subDeviceType]['count'] + 1, + "unit" => $subDeviceUnit, + ]; + } else { + $roomReadingCache[$subDeviceType] = [ + "value" => $lastRecord['value'], + "count" => 1, + "unit" => $subDeviceUnit, + ]; + } + } + } + + // parsing + foreach ($roomReadingCache as $type => $value) { + $roomReading[$type] = $value["value"] / $value["count"]; + $roomReading[$type] .= @($value['unit']); + } + + $roomsItems[$roomsData['room_id']] = [ + 'name' => $roomsData['name'], + 'reading' => $roomReading, + 'controls' => $roomControlsCache, + 'deviceCount' => $roomsData['device_count'], + ]; + } + + $template->prepare('rooms', $roomsItems); + + $template->render(); + + } +} diff --git a/views/Scene.php b/views/Scene.php new file mode 100644 index 0000000..0974a7d --- /dev/null +++ b/views/Scene.php @@ -0,0 +1,82 @@ +isLogin()){ + header('Location: ./'); + } + + $template = new Template('scene'); + $template->prepare('title', 'Sc茅ny'); + $template->prepare('lang', $lang); + + $scenes = []; + foreach (SceneManager::getAllScenes() as $sceneId => $sceneData) { + $doSomething = []; + foreach (json_decode($sceneData['do_something']) as $subdeviceId => $subDeviceState) { + $subDeviceMasterDeviceData = SubDeviceManager::getSubDeviceMaster($subdeviceId); + $doSomething[$subdeviceId] = [ + 'name' => $subDeviceMasterDeviceData['name'], + 'state' => $subDeviceState, + ]; + } + $scenes[$sceneData['scene_id']] = [ + "name" => $sceneData['name'], + "icon" => $sceneData['icon'], + "do_something" => $doSomething, + + ]; + } + + $template->prepare('scenes', $scenes); + + $approvedSubDevices = []; + $allDevicesData = DeviceManager::getAllDevices(); + foreach ($allDevicesData as $deviceKey => $deviceValue) { + if (!$deviceValue['approved']) continue; + $allSubDevicesData = SubDeviceManager::getAllSubDevices($deviceValue['device_id']); + foreach ($allSubDevicesData as $subDeviceKey => $subDeviceValue) { + if ($subDeviceValue['type'] != 'on/off') continue; + $approvedSubDevices[$subDeviceValue['subdevice_id']] = [ + 'name' => $allDevicesData[$deviceKey]['name'], + ]; + } + } + $template->prepare('subDevices', $approvedSubDevices); + + $approvedSubDevices = []; + $allDevicesData = DeviceManager::getAllDevices(); + foreach ($allDevicesData as $deviceKey => $deviceValue) { + if (!$deviceValue['approved']) continue; + $allSubDevicesData = SubDeviceManager::getAllSubDevices($deviceValue['device_id']); + foreach ($allSubDevicesData as $subDeviceKey => $subDeviceValue) { + if ($subDeviceValue['type'] != 'on/off') continue; + $approvedSubDevices[$subDeviceValue['subdevice_id']] = [ + 'name' => $allDevicesData[$deviceKey]['name'], + ]; + } + } + $template->prepare('subDevices', $approvedSubDevices); + + if (isset($_POST['devices'])){ + $devices = $_POST['devices']; + $devicesOBJ = []; + foreach ($devices as $deviceId) { + $deviceData = DeviceManager::getDeviceById($deviceId); + $subdeviceData = SubDeviceManager::getSubDeviceByMaster($deviceId, 'on/off'); + $devicesOBJ[$deviceId] = [ + 'name' => $deviceData['name'], + 'setableSubDevices' => $subdeviceData['subdevice_id'], + ]; + } + $template->prepare('setStateFormDevices', $devicesOBJ); + $template->prepare('sceneName', $_POST['sceneName']); + $template->prepare('sceneIcon', $_POST['sceneIcon']); + } + $template->render(); + } +} diff --git a/views/Setting.php b/views/Setting.php new file mode 100644 index 0000000..a4db0d3 --- /dev/null +++ b/views/Setting.php @@ -0,0 +1,31 @@ +isLogin()){ + header('Location: ./login'); + } + + $automations = []; + $automationsData = AutomationManager::getAll(); + foreach ($automationsData as $automationKey => $automationData) { + $automations[$automationData['automation_id']] = [ + 'name' => '', + 'onDays' => $automationData['on_days'], + 'ifSomething' => $automationData['if_something'], + 'doSomething' => $automationData['do_something'], + ]; + } + + $template = new Template('setting'); + $template->prepare('title', 'Automation'); + $template->prepare('lang', $lang); + $template->prepare('automations', $automations); + + $template->render(); + } +}