diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index abfef30..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,466 +0,0 @@ -OneFinity CNC Controller Firmware Changelog -=========================================== - -## v1.0.8 - - Fixed chatter and lost steps issues (most commonly seen by Fusion users), re-enabled support for G61, G61.1, G64. - - Fixed 3d preview on Safari-based web browsers (MacOS & iOS) - - Made it less likely for a user to upload a non-gcode file - - Fixed problems with UI freezing when attempting to process a non-gcode file - - Simplified error popup to make it less confusing - - Improved error messages for most internal errors - -## v1.0.7 - - Cleaned up UI layout a bit on the main screen - - Enabled auto expansion of partition and file system to fill SD card on first boot - - Added probe continuity test before probing (pop-up dialog) - - Added a popup after probing, reminding the user to put away the probe - - Lowered default probe seek speed - - Fixed file drop-down menu showing old files - - Added file system watcher for uploaded files - - Improved support for large gcode files, improves performance on Raspi - - Fixed a bug where the UI could become unresponsive at boot, or when uploading the first gcode file - - Changed default max-deviation to 0.001 to reduce issues with chattering while cutting arcs and circles - - Hides ratpoison (window manager) message during boot up - - Disabled G61, G61.1, G64 gcodes until the root cause of circle chatter is identified and fixed - - Increased icon size on the main GUI - - Improved version comparison logic for handling public beta releases in the future - - Changed default max-jerk to 1000 for X/Y axes - - Changed default idle current to 1A - - Force-set some critical configuration values to help with reliability - - Metric units only for junction-accel and max-deviation - - Rewrote the homing procedure to be more consistent - - Small improvements to the stall homing procedure - - Fixed error messages in the console (webgl) - - Fixed styling bug with error dialog - - Added a setting to allow enable/disable of probing safety prompts - -## v1.0.6 - - Tweaked stall homing procedure to clear stepper stall condition before homing - - Modified motor homing parameters (8 microsteps, 1.688 m/min search velocity, 2 stall volts, 1 stall current, 1.5mm zero backoff) - - Added pop up message while loading/simulating file on upload - - Decreased max velocity in default settings for X and Y axes - - Restored jerk to 1000 on all axes - - Fixed issue with default units not displaying on Control page (thanks to Robin Goldstone) - -## v1.0.5 - - Changed the jog commands so that save/restore modal states are not used to avoid situation where spindle/loads could - turn back on if the stop button was used instead of the M5/M9 gcode commands. - - Added tool path status to control page - - Moved over/under/no-fit warnings to tool status from machine status - - Added "home machine" pop up on start if the machine is not homed - - Added confirmation for X0Y0 and Z0 buttons - -## v1.0.4 - - Fixed text sticking out of some dialog boxes - - Added changes to PWR microcontroller to support new precharge circuitry on V3 of the PCB - - Added a Shutdown button under the menu - - Added confirmation dialog to shutdown - - Fixed Reset Defaults for OneFinity settings - - Probe buttons now turn green when probe input is active - - Added defaults for both machinist and woodworker machines - - Re-activated "Upgrade" button under Admin to grab updates directly from the web - -## v1.0.3 - - Changed upgrade scripts to point at OneFinity github repository - - Upgrade function not yet fully implemented - -## v1.0.2 - - Initial release of customized OneFinity firmware - - Includes GUI customizations, stall homing - -Note: This firmware was forked from version 0.4.14 of the Buildbotics firmware - -Buildbotics CNC Controller Firmware Changelog -============================================= - -## v0.4.14 - - Handle file uploads with '#' or '?' in the name. - - Added "step mode" to Web based jogging. - - Fixed touch screen Web jogging. - -## v0.4.13 - - Support for OMRON MX2 VFD. - - Better error handling in WiFi configuration. - - Fix open WiFi access. - - Improved video camera performance. - - Allow up to 4 camera clients at once. - - Add axis bounds GCode variables ``#<_x_min>``, ``#<_x_max>``, etc. - - Expose ``junction-accel`` planning parameter. - - Fixed problem with manual firmware upload on OSX. - - Ignore cameras that do not support MJPEG format video. - -## v0.4.12 - - Segments straddle arc in linearization. - - Control max-arc-error with GCode var. - - Implemented path modes G61, G61.1 & G64 with naive CAM and basic blending. - - Log GCode messages to "Messages" tab. - - Acknowledging a message on one browser clears it for all. - - Automatically reload Web view when file changes. - - Added ``config-screen`` script. Web based screen config to come later. - - Suppress message popup with (MSG,# No popup message). - - Show latest GCode message in ``Message`` field on CONTROL page. - - Marked several GCodes supported in cheat sheet. - - Solved planner lookahead failure for most reasonable cases. - - Prevent cutting off distant parts of 3D path view. - - Raised default ``latch-backoff`` to 100mm and ``zero-backoff`` to 5mm. - - Added ``max-deviation`` option. - - Fixed problem with GCode boolean expression parsing. #232. - - Ensure 2uS step pulse width. - -## v0.4.11 - - Don't reset global offsets on M2. - - Test shunt and show error on failure. - - Report spindle status codes from Modbus. - - Save more log files in bug report. - - Fixed indicators low-side units. - - Support for YL600, YL620 & YL620-A VFDs. - - Move Modbus indicators to tool page. - - Support for Sunfar E300 VFD. - - Set GCODE_SCRIPT_PATH to support GCode file routines. - - Fix pause bug introduced in v0.4.10. - -## v0.4.10 - - Fix demo password check - - Fix bug were fast clicks could cause jog commands to arrive out of order. - - Fix bug where planner position may not sync after jog. - - Show power shutdown on indicators page. - - Show all motors in shutdown when in power shutdown. - - Improved GCode error messages. - - Put controller into estop when in power shutdown. - -## v0.4.9 - - Enforce 6A per motor channel peak current limit. - - Adjust config values above max or below min instead of resetting to default. - -## v0.4.8 - - Fixed log rotating. - - Use systemd service instead of init.d. - - Fix planner terminate. - - Changed AVR serial interrupt priorites. - - Increased AVR serial and command buffers. - - Boost HDMI signal. - - Rewrote RPi serial driver. - - Automatically scale max CPU speed to reduce RPi temp. - - Disable USB camera if RPi temperature above 80°C, back on at 75°C. - - Respect offsets in canned cycle moves. #219 - - Fixed G53 warning. - - Fixed delayed offset update after M2 or M30 end of program. - - Handle multiple consecutive config resets correctly. - - Fixed log CPU usage problem introduced in v0.4.6. - - Show RPi temp on indicators page. - - Show red thermometer if RPi temp exceeds 80°C. - -## v0.4.7 - - Fix homing switch to motor channel mapping with non-standard axis order. - - Added ``switch-debounce`` and ``switch-lockout`` config options. - - Handle corrupt GCode simulation data correctly. - - Fixes for exception logging. - - Always limit motor max-velocity. #209 - - Sync GCode and planner files to disk after write. - - Added warning about reliability in a noisy environment on WiFi config page. - - EStop on motor fault. - - Fixed ETA line wrapping on Web interface. - - Fixed zeroing with non-zero offset when unhomed. #211 - - Handle file paths uploaded from Windows correctly. #212 - - Don't retain estop state through reboot. - - Log when RPi gets hot. - - Support Modbus multi-write mode. - - Added support for Nowforever VFDs. - -## v0.4.6 - - Fixed a rare ``Negative s-curve time`` error. - - Don't allow manual axis homing when soft limits are not set. - - Right click to enable camera crosshair. - - Demo mode. - - Limit idle-current to 2A. - - Removed dangerous ``power-mode`` in favor of simpler ``enabled`` option. - - Fixed bug where motor driver could fail to disabled during estop. - - Restored estop text. - -## v0.4.5 - - Fix for random errors while running VFD. - - Fix bug where planner would not continue after optional pause (M1). - - Fix lockup on invalid no move probe G38.x. #183 - - Fix zeroing homed axis after jog. - - Fix VFD communication at higher baud rates (> 9600). #184 - -## v0.4.4 - - Write version to log file. - - Write time to log file periodically. - - Show simulation progress with or with out 3D view. - - Synchronize file list between browsers. - - Increased max simulation time to 24hrs. - - Added button to download current GCode file. - - Blink play button to indicate pause. - - Many layout tweaks/improvements. - - Don't abort simulations when system time changes. - - Only allow one camera stream at a time. - -## v0.4.2 - - Suppress ``Auto-creating missing tool`` warning. - - Prevent ``Stream is closed`` error. - - Suppress ``WebGL not supported`` warning. - - Fixed Web disconnect during simulation of large GCode. - - Disable outputs on estop. - - Improved switch debouncing for better homing. - - Handle zero length dwell correctly. - - Fixed problem with cached GCode file upload when file changed on disk. - - Run simulation at low process priority. - - Added ``Bug Report`` button to ``Admin`` -> ``General``. - - Only render 3D view as needed to save CPU. - - Prevent lockup due to browser causing out of memory condition. - - Show error message when too large GCode upload fails. - - Much faster 3D view loading. - -## v0.4.1 - - Fix toolpath view axes bug. - - Added LASER intensity view. - - Fixed reverse path planner bug. - - Video size and path view controls persistent over browser reload. - - Fixed time and progress bugs. - - Added PWM rapid auto off feature for LASER/Plasma. - - Added dynamic PWM for LASER/Plasma. - - Added motor faults table to indicators page. - - Emit error and indicate FAULT on axis for motor driver faults. - - Display axis motor FAULT on LCD. - - Fixed bug with rapid repeated unpause. - -## v0.4.0 - - Increased display precision of position and motor config. - - Added support for 256 microstepping. - - Smoother operation at 250k step rate by doubling clock as needed. - - Indicators tab improvements. - - Much improved camera support. - - Camera hotpluging. - - Move camera video to header. - - Click to switch video size. - - Automount/unmount USB drives. - - Automatically install ``buildbotics.gc`` when no other GCode exists. - - Preplan GCode and check for errors. - - Display 3D view of program tool paths in browser. - - Display accurate time remaining, ETA and progress during run. - - Automatically collapse moves in planner which are too short in time. - - Show IO status indicators on configuration pages. - - Check that axis dimensions fit path plan dimensions. - - Show machine working envelope in path plan viewer. - - Don't reload browser view on reconnect unless controller has reloaded. - - Increased max switch backoff search distance. - - Major improvements for LASER raster GCodes. - - Fixed major bug in command queuing. - - Ignore Program Number O-Codes. - - Improved planning of collinear line segments. - - Allow PWM output up to 320kHz and no slower than 8Hz. - -## v0.3.28 - - Show step rate on motor configuration page. - - Limit motor max-velocity such that step rate cannot exceed 250k. - - Fixed deceleration bug at full 250k step rate. - -## v0.3.27 - - Fixed homing in imperial mode. - -## v0.3.26 - - Removed VFD test. - - Show VFD status on configuration page. - - Show VFD commands fail counts. - - Marked some VFD types as beta. - -## v0.3.25 - - Error on home if max-soft-limit <= min-soft-limit + 1. #139 - - Decrease boot time networking delay. - - Default to US keyboard layout. #145 - - Added configuration option to show metric or imperial units in browser. #74 - - Implemented fine jogging control in Web interface. #147 - -## v0.3.24 - - Added unhome button on axis position popup. - - Ignore soft limits of max <= min. - - Fixed problem with restarting program in imperial units mode. - - Handle GCode with infinite or very long loops correctly. - - Fixed Huanyang spindle restart after stop. - -## v0.3.23 - - Fix for modbus read operation. - - Finalized AC-Tech VFD support. - - Preliminary FR-D700 VFD support. - - Ignore leading zeros in modbus messages. - - Handle older PWR firmwares. - -## v0.3.22 - - Fix position loss after program pause. #130 - - Correctly handle disabled axes. - - Fixed config checkbox not displaying defaulted enabled correctly. - - Added Custom Modbus VFD programming. - -## v0.3.21 - - Implemented M70-M73 modal state save/restore. - - Added support for modbus VFDs. - - Start Huanyang spindle with out first pressing Start button on VFD. - - Faster switching of large GCode files in Web. - - Fixed reported gcode line off by one. - - Disable MDI input while running. - - Stabilized direction pin output during slow moves. - -## v0.3.20 - - Eliminated drift caused by miscounting half microsteps. - - Fixed disappearing GCode in Web. - - More efficient GCode scrolling with very large files. - - Fully functional soft-limited jogging. - - Added client and access-point Wifi configuration. - - Fixed broken hostname Web redirect after change. - - Split admin page -> General & Network. - - Improved calculation of junction velocity limits. - -## v0.3.19 - - Fixed stopping problems. #127 - - Fixed ``Negative s-curve time`` error. - - Improved jogging with soft limits. - - Added site favicon. - - Fixed problems with offsets and imperial units. - - Fixed ``All zero s-curve times`` caused by extremely short, non-zero moves. - - Fixed position drift. - -## v0.3.18 - - Don't enable any tool by default. - -## v0.3.17 - - Fixed pausing fail near end of run bug. - - Show "Upgrading firmware" when upgrading. - - Log excessive pwr communication failures as errors. - - Ensure we can still get out of non-idle cycles when there are errors. - - Less frequent pwr variable updates. - - Stop cancels seek and subsequent estop. - - Fixed bug in AVR/Planner command synchronization. - - Consistently display HOMING state during homing operation. - - Homing zeros axis global offset. - - Added zero all button. #126 - - Separate "Auto" and "MDI" play/pause & stop buttons. #126 - - Moved home all button. #126 - - Display "Video camera not found." instead of broken image icon. - - Show offset positions not absolute on LCD. - - Don't change gcode lines while homing. - - Don't change button states while homing. - - Adding warning about power cyclying during an upgrade. - - Reset planner on AVR errors. - - Fixed pausing with short moves. - - Corrected s-curve accel increasing jogging velocities. - -## v0.3.16 - - Fixed switch debounce bug. - -## v0.3.15 - - Suppress warning missing config.json warning after config reset. - - Fixed EStop reboot loop. - - Removed AVR unexpected reboot error. - -## v0.3.14 - - Fixed: Config fails silently after web disconnect #112 - - Always reload the page after a disconnect. - - Honor soft limits #111 (but not when jogging) - - Limit switch going active while moving causes estop. #54 - - Added more links to help page. - - Fixed axis display on LCD. #122 - - Added GCode cheat sheet. - - Fixed LCD boot splash screen. #121 - - Implemented tool change procedures and pause message box. #81 - - Implemented program start and end procedures. - -## v0.3.13 - - Disable spindle and loads on stop. - - Fixed several state transition (stop, pause, estop, etc.) problems. - -## v0.3.12 - - Updated DB25 M2 breakout diagram. - - Enabled AVR watchdog. - - Fixed problem with selecting newly uploaded file. - - More thorough shutdown of stepper driver in estop. - - Fixed spindle type specific options. - - No more ``Unexpected AVR firmware reboot`` errors on estop clear. - - Downgraded ``Machine alarmed - Command not processed`` errors to warnings. - - Suppress unnecessary axis homing warnings. - - More details for axis homing errors. - - Support GCode messages e.g. (MSG, Hello World!) - - Support programmed pauses. i.e. M0 - -## v0.3.11 - - Suppressed ``firmware rebooted`` warning. - - Error on unexpected AVR reboot. - - Fixed pin fault output. - - No longer using interrupts for switch inputs. Debouncing on clock tick. - -## v0.3.10 - - Fixed "Flood" display, changed to "Load 1" and "Load 2". #108 - - Highlight loads when on. - - Fixed axis zeroing. - - Fixed bug in home position set after successful home. #109 - - Fixed ugly Web error dumps. - - Allow access to log file from Web. - - Rotate log so it does not grow too big. - - Keep same GCode file through browser reload. #20 - -## v0.3.9 - - Fixed bug in move exec that was causing bumping between moves. - - Fixed planner bug which could create negative s-curve times. - - Hide step and optional pause buttons until they are implemented. - - Fixed pausing problems. - - Limit number of console messages. - - Scrollbar on console view. - - Log debug messages to console in developer mode. - - Fixed AVR log message source. - - Fixed step correction. - - JOGGING, HOMMING and MDI states. - - Fixed position problem with rapid MDI entry. - -## v0.3.8 - - Fixed pwr flags display - - Added pwr fault flags to indicators - -## v0.3.7 - - Allow blocking error dialog for a period of time - - Show actual error message on planner errors - - Reset planner on serious error - - Fixed console clear - - Added helpful info to Video tab - - Changed "Console" tab to "Messages" - - Removed spin up/down velocity options, they don't do anything - - Allow RS485 to work when wires are swapped - - Allow setting VFD ID - - Only show relevant spindle config items - - More robust video camera reset - - Added help page - - Allow upgrade with out Internet - - Limit power fault reporting - - Added load over temp, load limiting and motor overload power faults - -## v0.3.6 - - Set max_usb_current=1 in /boot/config.txt from installer #103 - -## v0.3.5 - - Fixed dwell (G4) - - Always show limit switch indicators regardless of motor enable - - Fixed feed rate display - - Added current GCode unit display - - Fixed homed axis zeroing - - Fixed probe pin input - - Added reload button to video tab - - Don't open error dialog on repeat messages - - Handle large GCode files in browser - - Added max lookahead limit to planner - - Fixed GCode stopping/pausing where ramp down needs more than is in the queue - - Added breakout box diagram to indicators - - Initialize axes offsets to zero on startup - - Fixed conflict between ``x`` state variable and ``x`` axis variable - - Don't show ipv6 addresses on LCD. They don't fit. - -## v0.3.4 - - Added alternate units for motor parameters - - Automatic config file upgrading - - Fixed planner/jog sync - - Fixed planner limits config - - Accel units mm/min² -> m/min² - - Search and latch velocity mm/min -> m/min - - Fixed password update (broken in last version) - - Start Web server earlier in case of Python coding errors - - -Changelog not maintained in previous versions. See git commit log. diff --git a/CODE_TAG b/CODE_TAG deleted file mode 100644 index d36ffb0..0000000 --- a/CODE_TAG +++ /dev/null @@ -1,22 +0,0 @@ - This file is part of the Buildbotics firmware. - - Copyright (c) 2015 - 2018, Buildbotics LLC - All rights reserved. - - This file ("the software") is free software: you can redistribute it - and/or modify it under the terms of the GNU General Public License, - version 2 as published by the Free Software Foundation. You should - have received a copy of the GNU General Public License, version 2 - along with the software. If not, see . - - The software is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the software. If not, see - . - - For information regarding this software email: - "Joseph Coffland" diff --git a/MANIFEST.in b/MANIFEST.in index a1204ab..ad16711 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,6 @@ include package.json README.md requirements.txt -graft scripts -graft python-packages +graft installer +include scripts/install.sh graft src/py/bbctrl/http graft src/py/camotics include src/avr/bbctrl-avr-firmware.hex diff --git a/Makefile b/Makefile index a6a6548..bfa1a8c 100644 --- a/Makefile +++ b/Makefile @@ -22,12 +22,8 @@ RSYNC_OPTS := $(RSYNC_EXCLUDE) -rv --no-g --delete --force VERSION := $(shell sed -n 's/^.*"version": "\([^"]*\)",.*$$/\1/p' package.json) PKG_NAME := bbctrl-$(VERSION) -PUB_PATH := root@buildbotics.com:/var/www/buildbotics.com/bbctrl -BETA_VERSION := $(VERSION)-rc$(shell ./scripts/next-rc) -BETA_PKG_NAME := bbctrl-$(BETA_VERSION) SUBPROJECTS := avr boot pwr jig -WATCH := src/pug src/pug/templates src/stylus src/js src/resources src/svelte-components src/static Makefile ifndef HOST HOST=onefinity @@ -37,16 +33,12 @@ ifndef PASSWORD PASSWORD=onefinity endif - all: $(HTML) $(RESOURCES) @for SUB in $(SUBPROJECTS); do $(MAKE) -C src/$$SUB; done pkg: all $(AVR_FIRMWARE) bbserial ./setup.py sdist -beta-pkg: pkg - cp dist/$(PKG_NAME).tar.bz2 dist/$(BETA_PKG_NAME).tar.bz2 - bbserial: $(MAKE) -C src/bbserial @@ -74,15 +66,6 @@ $(GPLAN_IMG): $(AVR_FIRMWARE): $(MAKE) -C src/avr -publish: pkg - echo -n $(VERSION) > dist/latest.txt - rsync $(RSYNC_OPTS) dist/$(PKG_NAME).tar.bz2 dist/latest.txt $(PUB_PATH)/ - -publish-beta: beta-pkg - echo -n $(BETA_VERSION) > dist/latest-beta.txt - rsync $(RSYNC_OPTS) dist/$(BETA_PKG_NAME).tar.bz2 dist/latest-beta.txt \ - $(PUB_PATH)/ - update: pkg http_proxy= curl -i -X PUT -H "Content-Type: multipart/form-data" \ -F "firmware=@dist/$(PKG_NAME).tar.bz2" -F "password=$(PASSWORD)" \ @@ -122,34 +105,4 @@ $(TARGET_DIR)/%.html: src/pug/%.pug node_modules FORCE @mkdir -p $(TARGET_DIR) $(PUG) -O pug-opts.js -P $< -o $(TARGET_DIR) || (rm -f $@; exit 1) -pylint: - pylint3 -E $(shell find src/py -name \*.py | grep -v flycheck_) - -jshint: - ./node_modules/jshint/bin/jshint --config jshint.json src/js/*.js - -lint: pylint jshint - -watch: - @clear - $(MAKE) - @while sleep 1; do \ - inotifywait -qr -e modify -e create -e delete \ - --exclude .*~ --exclude \#.* $(WATCH); \ - clear; \ - $(MAKE); \ - done - -tidy: - rm -f $(shell find "$(DIR)" -name \*~) - -clean: tidy - rm -rf build html dist - @for SUB in $(SUBPROJECTS); do \ - $(MAKE) -C src/$$SUB clean; \ - done - -dist-clean: clean - rm -rf node_modules - .PHONY: all install clean tidy pkg gplan lint pylint jshint bbserial diff --git a/installer/Team Onefinity.ngc b/installer/Team Onefinity.ngc new file mode 100644 index 0000000..85cdef0 --- /dev/null +++ b/installer/Team Onefinity.ngc @@ -0,0 +1,659 @@ +% +G21 G40 G49 M6 T1 +G17 +M7 +G0Z20.320 +G0X0.000Y0.000S16000M3 +G0X26.732Y12.863Z5.080 +G1Z-3.175F1270.0 +G1X21.606Y17.989F2540.0 +G1Y12.042 +G1X25.676Y12.773 +G1X26.732Y12.863 +G1X34.154Y9.033 +G1X19.066Y24.121 +G1Y9.006 +G1X26.125Y10.273 +G2X27.247Y10.273I0.561J-3.125 +G1X34.154Y9.033 +G0Z5.080 +G0X31.766Y33.993 +G1Z-3.175F1270.0 +G1X21.606Y44.153F2540.0 +G1Y43.784 +G1X31.766Y33.624 +G1Y33.993 +G1X34.306Y35.045 +G1X19.066Y50.285 +G1Y42.732 +G1X34.306Y27.492 +G1Y35.045 +G0Z5.080 +G0X31.766Y60.159 +G1Z-3.175F1270.0 +G1X21.606Y70.318F2540.0 +G1Y69.948 +G1X31.766Y59.789 +G1Y60.159 +G1X34.306Y61.211 +G1X19.066Y76.450 +G1Y68.896 +G1X34.306Y53.657 +G1Y61.211 +G0Z5.080 +G0X31.766Y90.231 +G1Z-3.175F1270.0 +G1X27.488F2540.0 +G1X31.766Y85.954 +G1Y90.231 +G1X34.306Y92.771 +G1X21.356 +G1X34.306Y79.822 +G1Y92.771 +G0Z5.080 +G0X61.691Y55.036 +G1Z-3.175F1270.0 +G1X63.248F2540.0 +G1Y88.425 +G2X66.423Y91.600I3.175J0.000 +G1X77.157 +G1Y91.866 +G1X47.750 +G1Y91.600 +G1X58.516 +G2X61.691Y88.425I0.000J-3.175 +G1Y55.036 +G0Z5.080 +G0X88.590 +G1Z-3.175F1270.0 +G1X111.381F2540.0 +G1Y55.301 +G1X93.321 +G2X90.146Y58.476I0.000J3.175 +G1Y70.643 +G2X93.321Y73.818I3.175J0.000 +G1X107.380 +G1Y74.084 +G1X93.321 +G2X90.146Y77.259I0.000J3.175 +G1Y88.425 +G2X93.321Y91.600I3.175J0.000 +G1X110.220 +G1Y91.866 +G1X88.590 +G1Y55.036 +G0Z5.080 +G0X122.153 +G1Z-3.175F1270.0 +G1X123.719F2540.0 +G1X127.166Y64.004 +G2X130.130Y66.040I2.964J-1.139 +G1X146.391 +G2X149.354Y64.004I0.000J-3.175 +G1X152.802Y55.036 +G1X154.303 +G1X139.687Y91.866 +G1X136.769 +G1X122.153Y55.036 +G0Z5.080 +G0X132.680Y66.306 +G1Z-3.175F1270.0 +G2X129.716Y70.620I0.000J3.175F2540.0 +G1X132.098Y76.845 +G1X133.063Y79.498 +G1X134.092Y82.435 +G1X135.189Y85.669 +G2X138.196Y87.824I3.007J-1.020 +G1X138.325 +G2X141.328Y85.679I0.000J-3.175 +G1X142.433Y82.457 +G1X143.467Y79.518 +G1X144.433Y76.851 +G1X145.333Y74.451 +G1X146.805Y70.620 +G2X143.841Y66.306I-2.964J-1.138 +G1X132.680 +G0Z5.080 +G0X167.414Y55.036 +G1Z-3.175F1270.0 +G1X168.971F2540.0 +G1Y73.759 +G1X168.947Y76.349 +G1X168.876Y79.029 +G1X168.757Y81.813 +G1X168.589Y84.724 +G2X171.759Y88.082I3.170J0.183 +G1X172.049 +G2X175.085Y85.836I0.000J-3.175 +G1X175.677Y83.901 +G1X176.359Y81.760 +G1X177.102Y79.531 +G1X177.877Y77.332 +G1X182.870Y63.705 +G1X182.369Y65.444 +G1X181.521Y68.194 +G1X180.648Y70.844 +G1X179.742Y73.414 +G1X173.050Y91.866 +G1X167.414 +G1Y55.036 +G0Z5.080 +G0X186.047 +G1Z-3.175F1270.0 +G1X186.709F2540.0 +G1X189.243Y61.950 +G2X186.442Y60.271I-2.800J1.496 +G1X186.249 +G2X183.614Y61.675I0.000J3.175 +G1X186.047Y55.036 +G0Z5.080 +G0X203.785 +G1Z-3.175F1270.0 +G1X205.342F2540.0 +G1Y91.866 +G1X199.644 +G1X192.952Y73.323 +G1X191.959Y70.488 +G1X191.055Y67.759 +G1X190.236Y65.128 +G1X189.586Y62.886 +G1X194.879Y77.332 +G1X195.654Y79.531 +G1X196.397Y81.760 +G1X197.079Y83.901 +G1X197.670Y85.836 +G2X200.707Y88.082I3.036J-0.928 +G1X200.997 +G2X204.167Y84.733I0.000J-3.175 +G1X203.999Y81.672 +G1X203.880Y78.828 +G1X203.809Y76.184 +G1X203.785Y73.726 +G1Y55.036 +G0Z5.080 +G0X186.055Y18.115 +G1Z-3.175F1270.0 +G1X186.009Y18.105F2540.0 +G1X186.055Y17.999 +G1Y18.115 +G1X185.846Y20.662 +G2X183.925Y20.635I-1.003J3.012 +G1X183.850Y20.658 +G2X182.792Y21.213I0.918J3.039 +G1X182.707Y21.280 +G1X182.260Y21.714 +G1X182.051Y21.961 +G1X181.761Y22.394 +G1X181.394Y23.076 +G1X181.055Y23.830 +G1X173.477Y41.419 +G1X172.282 +G1Y8.016 +G1X172.558 +G1Y24.599 +G1X172.580Y25.408 +G1X172.663Y26.179 +G1X172.774Y26.696 +G1X172.878Y27.007 +G1X173.108Y27.530 +G1X173.164Y27.632 +G2X173.748Y28.390I2.780J-1.535 +G1X173.813Y28.452 +G2X175.480Y29.290I2.196J-2.293 +G1X175.555Y29.303 +G2X177.475Y29.026I0.528J-3.131 +G1X177.562Y28.984 +G2X178.399Y28.391I-1.391J-2.854 +G1X178.498Y28.294 +G1X178.838Y27.899 +G1X179.037Y27.625 +G1X179.285Y27.206 +G1X179.505Y26.777 +G1X187.630Y8.016 +G1X188.570 +G1Y41.419 +G1X188.294 +G1Y25.010 +G1X188.271Y24.216 +G1X188.177Y23.433 +G1X188.086Y23.078 +G1X187.917Y22.590 +G1X187.870Y22.482 +G2X187.362Y21.681I-2.906J1.279 +G1X187.306Y21.616 +G2X185.911Y20.684I-2.399J2.080 +G1X185.846Y20.662 +G0Z5.080 +G0X174.797Y31.718 +G1Z-3.175F1270.0 +G1X174.912Y31.742F2540.0 +G1X174.797Y32.011 +G1Y31.718 +G0Z5.080 +G0X201.208Y8.016 +G1Z-3.175F1270.0 +G1X201.483F2540.0 +G1Y41.419 +G1X201.208 +G1Y8.016 +G0Z5.080 +G0X221.852 +G1Z-3.175F1270.0 +G1X222.128F2540.0 +G1Y35.585 +G1X222.152Y36.556 +G1X222.239Y37.441 +G1X222.338Y37.967 +G1X222.494Y38.513 +G1X222.648Y38.864 +G1X222.990Y39.459 +G1X223.068Y39.565 +G2X223.987Y40.409I2.564J-1.872 +G1X224.094Y40.473 +G1X224.660Y40.744 +G1X224.991Y40.863 +G1X225.495Y40.981 +G1X225.981Y41.055 +G1X226.840Y41.124 +G1X227.808Y41.143 +G1X229.857 +G1Y41.419 +G1X214.122 +G1Y41.143 +G1X217.128Y41.132 +G1X217.865Y41.093 +G1X218.540Y41.009 +G1X219.037Y40.895 +G1X219.329Y40.787 +G1X219.958Y40.472 +G1X220.109Y40.375 +G1X220.711Y39.869 +G1X220.827Y39.744 +G1X221.305Y39.070 +G1X221.385Y38.918 +G1X221.658Y38.205 +G1X221.703Y38.027 +G1X221.790Y37.485 +G1X221.837Y36.840 +G1X221.852Y35.846 +G1Y8.016 +G0Z5.080 +G0X250.225 +G1Z-3.175F1270.0 +G1X250.501F2540.0 +G1Y16.797 +G1X250.516Y17.761 +G1X250.567Y18.756 +G1X250.681Y19.487 +G1X250.826Y20.159 +G1X251.009Y20.832 +G1X257.512Y41.419 +G1X257.222 +G1X253.849Y30.875 +G1X253.398Y29.763 +G1X253.228Y29.421 +G1X252.892Y28.886 +G1X252.817Y28.790 +G2X250.547Y27.571I-2.508J1.947 +G1X250.489Y27.567 +G2X248.506Y28.080I-0.238J3.166 +G1X248.444Y28.121 +G2X247.655Y28.861I1.745J2.653 +G1X247.590Y28.947 +G1X247.304Y29.401 +G1X247.150Y29.698 +G1X246.888Y30.394 +G1X246.668Y31.132 +G1X243.420Y41.419 +G1X243.133 +G1X249.500Y21.400 +G1X249.680Y20.918 +G1X249.880Y20.269 +G1X250.036Y19.612 +G1X250.149Y18.936 +G1X250.190Y18.463 +G1X250.211Y17.912 +G1X250.225Y16.513 +G1Y8.016 +G0Z5.080 +G0X159.368 +G1Z-3.175F1270.0 +G1X159.644F2540.0 +G1Y41.419 +G1X159.368 +G1Y8.016 +G0Z5.080 +G0X133.203 +G1Z-3.175F1270.0 +G1X133.478F2540.0 +G1Y19.288 +G1X133.495Y20.123 +G1X133.556Y20.925 +G1X133.697Y21.712 +G1X133.822Y22.074 +G1X134.078Y22.633 +G1X134.130Y22.723 +G2X135.032Y23.713I2.746J-1.594 +G1X135.122Y23.778 +G1X135.738Y24.121 +G1X136.070Y24.260 +G1X136.588Y24.399 +G1X137.076Y24.485 +G1X137.885Y24.559 +G1X138.771Y24.580 +G1X145.626 +G1Y24.855 +G1X139.094 +G1X138.075Y24.883 +G1X137.539Y24.929 +G1X137.029Y24.999 +G1X136.489Y25.115 +G1X136.122Y25.236 +G1X135.630Y25.447 +G1X135.480Y25.527 +G1X134.777Y26.035 +G1X134.681Y26.127 +G1X134.136Y26.817 +G1X134.084Y26.906 +G1X133.828Y27.457 +G1X133.702Y27.818 +G1X133.557Y28.600 +G1X133.495Y29.391 +G1X133.478Y30.207 +G1Y35.748 +G1X133.502Y36.665 +G1X133.541Y37.153 +G1X133.601Y37.619 +G1X133.699Y38.112 +G1X133.873Y38.681 +G1X134.045Y39.039 +G1X134.470Y39.698 +G1X134.548Y39.791 +G2X135.430Y40.523I2.436J-2.037 +G1X135.520Y40.574 +G1X136.072Y40.818 +G1X136.429Y40.936 +G1X137.204Y41.070 +G1X137.999Y41.128 +G1X138.833Y41.143 +G1X146.730 +G1Y41.419 +G1X133.203 +G1Y8.016 +G0Z5.080 +G0X107.038 +G1Z-3.175F1270.0 +G1X120.565F2540.0 +G1Y8.291 +G1X112.934 +G1X111.953Y8.315 +G1X111.446Y8.353 +G1X110.966Y8.412 +G1X110.462Y8.507 +G1X109.883Y8.676 +G1X109.516Y8.848 +G1X108.829Y9.284 +G1X108.734Y9.363 +G2X108.068Y10.127I2.031J2.441 +G1X108.003Y10.231 +G1X107.733Y10.777 +G1X107.609Y11.102 +G1X107.485Y11.599 +G1X107.405Y12.080 +G1X107.334Y12.901 +G1X107.313Y13.808 +G1Y19.288 +G1X107.330Y20.123 +G1X107.391Y20.925 +G1X107.532Y21.712 +G1X107.657Y22.074 +G1X107.913Y22.633 +G1X107.965Y22.723 +G2X108.867Y23.713I2.746J-1.594 +G1X108.957Y23.778 +G1X109.573Y24.121 +G1X109.905Y24.260 +G1X110.423Y24.399 +G1X110.911Y24.485 +G1X111.720Y24.559 +G1X112.606Y24.580 +G1X119.461 +G1Y24.855 +G1X112.929 +G1X111.910Y24.883 +G1X111.374Y24.929 +G1X110.863Y24.999 +G1X110.323Y25.115 +G1X109.957Y25.236 +G1X109.464Y25.447 +G1X109.315Y25.527 +G1X108.612Y26.035 +G1X108.516Y26.127 +G1X107.971Y26.817 +G1X107.919Y26.906 +G1X107.663Y27.457 +G1X107.536Y27.818 +G1X107.392Y28.600 +G1X107.330Y29.391 +G1X107.313Y30.207 +G1Y35.748 +G1X107.337Y36.665 +G1X107.376Y37.153 +G1X107.436Y37.619 +G1X107.534Y38.112 +G1X107.708Y38.681 +G1X107.880Y39.039 +G1X108.305Y39.698 +G1X108.383Y39.791 +G2X109.265Y40.523I2.436J-2.037 +G1X109.355Y40.573 +G1X109.907Y40.817 +G1X110.263Y40.936 +G1X111.039Y41.070 +G1X111.834Y41.128 +G1X112.668Y41.143 +G1X120.565 +G1Y41.419 +G1X107.038 +G1Y8.016 +G0Z5.080 +G0X91.885Y18.115 +G1Z-3.175F1270.0 +G1X91.839Y18.105F2540.0 +G1X91.885Y17.998 +G1Y18.115 +G1X91.677Y20.662 +G2X89.754Y20.635I-1.004J3.012 +G1X89.680Y20.658 +G2X88.622Y21.213I0.918J3.039 +G1X88.537Y21.280 +G1X88.090Y21.713 +G1X87.881Y21.961 +G1X87.591Y22.393 +G1X87.224Y23.076 +G1X86.885Y23.829 +G1X79.307Y41.419 +G1X78.112 +G1Y8.016 +G1X78.388 +G1Y24.599 +G1X78.409Y25.408 +G1X78.493Y26.180 +G1X78.604Y26.697 +G1X78.709Y27.008 +G1X78.939Y27.531 +G1X78.995Y27.633 +G2X79.578Y28.391I2.779J-1.535 +G1X79.643Y28.453 +G2X81.310Y29.290I2.196J-2.293 +G1X81.385Y29.302 +G2X83.305Y29.026I0.529J-3.131 +G1X83.392Y28.983 +G2X84.229Y28.391I-1.392J-2.854 +G1X84.328Y28.294 +G1X84.668Y27.899 +G1X84.867Y27.625 +G1X85.115Y27.206 +G1X85.335Y26.777 +G1X93.460Y8.016 +G1X94.400 +G1Y41.419 +G1X94.124 +G1Y25.009 +G1X94.101Y24.216 +G1X94.007Y23.432 +G1X93.916Y23.078 +G1X93.747Y22.590 +G1X93.700Y22.482 +G2X93.193Y21.681I-2.906J1.279 +G1X93.137Y21.617 +G2X91.742Y20.684I-2.399J2.079 +G1X91.677Y20.662 +G0Z5.080 +G0X80.627Y31.718 +G1Z-3.175F1270.0 +G1X80.742Y31.742F2540.0 +G1X80.627Y32.010 +G1Y31.718 +G0Z5.080 +G0X56.689Y8.295 +G1Z-3.175F1270.0 +G1X57.314Y8.143F2540.0 +G1X57.985Y8.049 +G1X58.710Y8.016 +G1X59.435Y8.049 +G1X60.106Y8.143 +G1X60.731Y8.295 +G1X61.320Y8.505 +G1X61.883Y8.775 +G1X62.429Y9.109 +G1X62.964Y9.516 +G1X63.493Y10.004 +G1X63.980Y10.541 +G1X64.387Y11.085 +G1X64.721Y11.636 +G1X64.989Y12.201 +G1X65.197Y12.788 +G1X65.348Y13.407 +G1X65.441Y14.069 +G1X65.474Y14.815 +G1X65.465Y35.027 +G1X65.401Y35.727 +G1X65.278Y36.377 +G1X65.098Y36.986 +G1X64.861Y37.562 +G1X64.563Y38.116 +G1X64.197Y38.656 +G1X63.755Y39.187 +G1X63.241Y39.701 +G1X62.710Y40.142 +G1X62.170Y40.508 +G1X61.616Y40.807 +G1X61.040Y41.044 +G1X60.431Y41.224 +G1X59.781Y41.347 +G1X59.081Y41.410 +G1X58.339 +G1X57.639Y41.347 +G1X56.989Y41.224 +G1X56.381Y41.044 +G1X55.804Y40.807 +G1X55.250Y40.508 +G1X54.710Y40.142 +G1X54.179Y39.701 +G1X53.665Y39.187 +G1X53.224Y38.656 +G1X52.858Y38.116 +G1X52.559Y37.562 +G1X52.322Y36.986 +G1X52.142Y36.377 +G1X52.019Y35.727 +G1X51.956Y35.027 +G1X51.956Y14.417 +G1X52.018Y13.732 +G1X52.140Y13.093 +G1X52.320Y12.491 +G1X52.558Y11.916 +G1X52.858Y11.359 +G1X53.228Y10.812 +G1X53.674Y10.272 +G1X54.191Y9.750 +G1X54.722Y9.303 +G1X55.262Y8.933 +G1X55.816Y8.632 +G1X56.391Y8.393 +G1X56.689Y8.295 +G0Z5.080 +G0X56.804Y8.566 +G1Z-3.175F1270.0 +G1X56.190Y8.789F2540.0 +G1X55.603Y9.076 +G1X55.053Y9.420 +G1X54.545Y9.814 +G1X54.085Y10.247 +G1X53.673Y10.711 +G1X53.303Y11.209 +G1X52.978Y11.746 +G1X52.705Y12.317 +G1X52.490Y12.915 +G1X52.338Y13.530 +G1X52.248Y14.154 +G1X52.222Y14.705 +G1Y34.727 +G1X52.247Y35.285 +G1X52.335Y35.913 +G1X52.485Y36.536 +G1X52.699Y37.143 +G1X52.975Y37.726 +G1X53.308Y38.275 +G1X53.691Y38.784 +G1X54.116Y39.250 +G1X54.583Y39.676 +G1X55.091Y40.058 +G1X55.640Y40.391 +G1X56.223Y40.667 +G1X56.831Y40.881 +G1X57.453Y41.031 +G1X58.082Y41.119 +G1X58.710Y41.147 +G1X59.339Y41.119 +G1X59.967Y41.031 +G1X60.590Y40.881 +G1X61.197Y40.667 +G1X61.780Y40.391 +G1X62.329Y40.058 +G1X62.837Y39.676 +G1X63.304Y39.250 +G1X63.730Y38.784 +G1X64.112Y38.275 +G1X64.445Y37.726 +G1X64.721Y37.143 +G1X64.935Y36.536 +G1X65.086Y35.913 +G1X65.173Y35.285 +G1X65.198Y34.727 +G1Y14.705 +G1X65.172Y14.154 +G1X65.083Y13.530 +G1X64.930Y12.915 +G1X64.716Y12.317 +G1X64.443Y11.746 +G1X64.118Y11.209 +G1X63.748Y10.711 +G1X63.335Y10.247 +G1X62.875Y9.814 +G1X62.367Y9.420 +G1X61.817Y9.076 +G1X61.230Y8.789 +G1X60.616Y8.566 +G1X59.985Y8.409 +G1X59.348Y8.317 +G1X58.710Y8.288 +G1X58.072Y8.317 +G1X57.435Y8.409 +G1X56.804Y8.566 +G0Z5.080 +G0Z20.320 +G0X0.000Y0.000 +M2 +% diff --git a/scripts/11-automount.rules b/installer/config/11-automount.rules similarity index 100% rename from scripts/11-automount.rules rename to installer/config/11-automount.rules diff --git a/scripts/Xresources b/installer/config/Xresources similarity index 100% rename from scripts/Xresources rename to installer/config/Xresources diff --git a/scripts/bbctrl-logrotate b/installer/config/bbctrl-logrotate similarity index 100% rename from scripts/bbctrl-logrotate rename to installer/config/bbctrl-logrotate diff --git a/scripts/bbctrl.service b/installer/config/bbctrl.service similarity index 100% rename from scripts/bbctrl.service rename to installer/config/bbctrl.service diff --git a/scripts/cron_d_reboot b/installer/config/cron_d_reboot similarity index 100% rename from scripts/cron_d_reboot rename to installer/config/cron_d_reboot diff --git a/scripts/cron_reboot_logrotate b/installer/config/cron_reboot_logrotate similarity index 100% rename from scripts/cron_reboot_logrotate rename to installer/config/cron_reboot_logrotate diff --git a/scripts/ratpoisonrc b/installer/config/ratpoisonrc similarity index 100% rename from scripts/ratpoisonrc rename to installer/config/ratpoisonrc diff --git a/scripts/rc.local b/installer/config/rc.local similarity index 85% rename from scripts/rc.local rename to installer/config/rc.local index 43e549a..546e979 100644 --- a/scripts/rc.local +++ b/installer/config/rc.local @@ -23,9 +23,6 @@ fi # Reload udev /etc/init.d/udev restart -# Stop boot splash so it doesn't interfere with X if GPU enabled and to save CPU -plymouth quit - # Start X in /home/pi cd /home/pi sudo -u pi startx diff --git a/scripts/xinitrc b/installer/config/xinitrc similarity index 100% rename from scripts/xinitrc rename to installer/config/xinitrc diff --git a/scripts/xorg.conf b/installer/config/xorg.conf similarity index 100% rename from scripts/xorg.conf rename to installer/config/xorg.conf diff --git a/python-packages/pathtools-0.1.2-py3-none-any.whl b/installer/python-packages/pathtools-0.1.2-py3-none-any.whl similarity index 100% rename from python-packages/pathtools-0.1.2-py3-none-any.whl rename to installer/python-packages/pathtools-0.1.2-py3-none-any.whl diff --git a/python-packages/watchdog-0.10.6-py3-none-any.whl b/installer/python-packages/watchdog-0.10.6-py3-none-any.whl similarity index 100% rename from python-packages/watchdog-0.10.6-py3-none-any.whl rename to installer/python-packages/watchdog-0.10.6-py3-none-any.whl diff --git a/scripts/avr109-flash.py b/installer/scripts/avr109-flash.py similarity index 100% rename from scripts/avr109-flash.py rename to installer/scripts/avr109-flash.py diff --git a/scripts/browser b/installer/scripts/browser similarity index 100% rename from scripts/browser rename to installer/scripts/browser diff --git a/scripts/config-wifi b/installer/scripts/config-wifi similarity index 100% rename from scripts/config-wifi rename to installer/scripts/config-wifi diff --git a/scripts/delete-cookies.py b/installer/scripts/delete-cookies.py similarity index 100% rename from scripts/delete-cookies.py rename to installer/scripts/delete-cookies.py diff --git a/scripts/edit-boot-config b/installer/scripts/edit-boot-config similarity index 100% rename from scripts/edit-boot-config rename to installer/scripts/edit-boot-config diff --git a/scripts/edit-config b/installer/scripts/edit-config similarity index 100% rename from scripts/edit-config rename to installer/scripts/edit-config diff --git a/scripts/resize2fs_once b/installer/scripts/resize2fs_once similarity index 100% rename from scripts/resize2fs_once rename to installer/scripts/resize2fs_once diff --git a/scripts/resize_root_fs.sh b/installer/scripts/resize_root_fs.sh similarity index 100% rename from scripts/resize_root_fs.sh rename to installer/scripts/resize_root_fs.sh diff --git a/scripts/sethostname b/installer/scripts/sethostname similarity index 100% rename from scripts/sethostname rename to installer/scripts/sethostname diff --git a/scripts/update-bbctrl b/installer/scripts/update-bbctrl similarity index 100% rename from scripts/update-bbctrl rename to installer/scripts/update-bbctrl diff --git a/scripts/upgrade-bbctrl b/installer/scripts/upgrade-bbctrl similarity index 100% rename from scripts/upgrade-bbctrl rename to installer/scripts/upgrade-bbctrl diff --git a/installer/splash/boot.png b/installer/splash/boot.png new file mode 100644 index 0000000..2008ca2 Binary files /dev/null and b/installer/splash/boot.png differ diff --git a/installer/splash/onefinity.plymouth b/installer/splash/onefinity.plymouth new file mode 100644 index 0000000..e3c4b9f --- /dev/null +++ b/installer/splash/onefinity.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=onefinity +Description=Onefinity +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/onefinity +ScriptFile=/usr/share/plymouth/themes/onefinity/onefinity.script diff --git a/src/splash/buildbotics.script b/installer/splash/onefinity.script similarity index 87% rename from src/splash/buildbotics.script rename to installer/splash/onefinity.script index 51fb51d..7e41057 100644 --- a/src/splash/buildbotics.script +++ b/installer/splash/onefinity.script @@ -1,7 +1,12 @@ screenW = Window.GetWidth(); screenH = Window.GetHeight(); -image = Image("splash.png"); +image = Image("boot.png"); + +if (Plymouth.GetMode() == "shutdown") { + image = Image("shutdown.png"); +} + imageW = image.GetWidth(); imageH = image.GetHeight(); diff --git a/installer/splash/shutdown.png b/installer/splash/shutdown.png new file mode 100644 index 0000000..1800389 Binary files /dev/null and b/installer/splash/shutdown.png differ diff --git a/package-lock.json b/package-lock.json index 3dd092c..8bccad7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,13 @@ { "name": "bbctrl", - "version": "1.0.10b4", + "version": "1.0.10b7", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "bbctrl", - "version": "1.0.10b4", + "version": "1.0.10b7", + "hasInstallScript": true, "license": "GPL-3.0+", "dependencies": { "browserify": "^17.0.0", diff --git a/package.json b/package.json index 0610ea7..f2f463a 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,12 @@ { "name": "bbctrl", - "version": "1.0.10b4", + "version": "1.0.10b7", "homepage": "https://onefinitycnc.com/", "repository": "https://github.com/OneFinityCNC/onefinity", "license": "GPL-3.0+", + "scripts": { + "postinstall": "cd src/svelte-components && npm i" + }, "dependencies": { "browserify": "^17.0.0", "jshint": "^2.13.4", diff --git a/scripts/check-config-vars.py b/scripts/check-config-vars.py deleted file mode 100644 index 6fd567a..0000000 --- a/scripts/check-config-vars.py +++ /dev/null @@ -1,37 +0,0 @@ -#!/usr/bin/env python3 - -'''Check that the configuration variable template used on the RPi matches the -variables used in the AVR''' - -import sys -import json - -templ = json.load(open('src/resources/config-template.json', 'r')) -vars = json.load(open('avr/build/vars.json', 'r')) - - -def check(section): - errors = 0 - - for name, entry in section.items(): - if 'type' in entry: - ok = False - - # TODO check that defaults are valid - # TODO check that types match - - if 'code' in entry and not entry['code'] in vars: - print('"%s" with code "%s" not found' % (name, entry['code'])) - - else: ok = True - - if not ok: errors += 1 - - else: errors += check(entry) - - return errors - - -errors = check(templ) -print('\n%d errors' % errors) -sys.exit(errors != 0) diff --git a/scripts/config-wifi-external b/scripts/config-wifi-external deleted file mode 100644 index 018c676..0000000 --- a/scripts/config-wifi-external +++ /dev/null @@ -1,259 +0,0 @@ -#!/bin/bash -e - -AP=false -DISABLE=false -SSID= -PASS= -CHANNEL=7 -REBOOT=false - -WLAN0_CFG=/etc/network/interfaces.d/wlan0 -HOSTAPD_CFG=/etc/hostapd/hostapd.conf -DNSMASQ_CFG=/etc/dnsmasq.conf -DHCPCD_CFG=/etc/dhcpcd.conf -WPA_CFG=/etc/wpa_supplicant/wpa_supplicant.conf - - -function query_config() { - if [ -e $WLAN0_CFG ]; then - SSID=$(grep wpa-ssid $WLAN0_CFG | - sed 's/^[[:space:]]*wpa-ssid "\([^"]*\)"/\1/') - echo "{\"ssid\": \"$SSID\", \"mode\": \"client\"}" - - else - if [ -e $HOSTAPD_CFG -a -e /etc/default/hostapd ]; then - SSID=$(grep ^ssid= $HOSTAPD_CFG | sed 's/^ssid=\(.*\)$/\1/') - CHANNEL=$(grep ^channel= $HOSTAPD_CFG | - sed 's/^channel=\(.*\)$/\1/') - - echo -n "{\"ssid\": \"$SSID\", " - echo "\"channel\": $CHANNEL, \"mode\": \"ap\"}" - - else - echo "{\"mode\": \"disabled\"}" - fi - fi - -} - - -function disable_wifi() { - rm -f $WLAN0_CFG $HOSTAPD_CFG /etc/default/hostapd -} - - -function configure_wlan0() { - echo "auto wlan0" - echo "allow-hotplug wlan0" - echo "iface wlan0 inet dhcp" - echo " wpa-scan-ssid 1" - echo " wpa-ap-scan 1" - echo " wpa-key-mgmt WPA-PSK" - echo " wpa-proto RSN WPA" - echo " wpa-pairwise CCMP TKIP" - echo " wpa-group CCMP TKIP" - echo " wpa-ssid \"$SSID\"" - - if [ ${#PASS} -ne 0 ]; then - echo " wpa-psk \"$PASS\"" - fi -} - - -function configure_wpa() { - echo "country=US" - echo "ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev" - echo "update_config=1" - - if [ ${#PASS} -eq 0 ]; then - echo "network={" - echo " ssid=\"$SSID\"" - echo " key_mgmt=NONE" - echo "}" - fi -} - - -function configure_dhcpcd() { - echo "hostname" - echo "clientid" - echo "persistent" - echo "option rapid_commit" - echo "option domain_name_servers, domain_name, domain_search, host_name" - echo "option classless_static_routes" - echo "option ntp_servers" - echo "option interface_mtu" - echo "require dhcp_server_identifier" - echo "slaac private" - - if $AP; then - echo - echo "interface wlan0" - echo " static ip_address=192.168.43.1/24" - fi -} - - -function configure_wifi() { - disable_wifi - echo "source-directory /etc/network/interfaces.d" > /etc/network/interfaces - configure_wlan0 > $WLAN0_CFG - configure_wpa > $WPA_CFG - configure_dhcpcd > $DHCPCD_CFG -} - - -function configure_dnsmasq() { - echo "interface=wlan0" - echo "domain-needed" - echo "bogus-priv" - echo "dhcp-range=192.168.43.2,192.168.43.20,255.255.255.0,12h" -} - - -function configure_hostapd() { - echo "interface=wlan0" - echo "driver=nl80211" - echo "ssid=$SSID" - echo "hw_mode=g" - echo "channel=$CHANNEL" - echo "wmm_enabled=0" - echo "macaddr_acl=0" - echo "auth_algs=1" - echo "ignore_broadcast_ssid=0" - echo "wpa=2" - echo "wpa_passphrase=$PASS" - echo "wpa_key_mgmt=WPA-PSK" - echo "wpa_pairwise=TKIP" - echo "rsn_pairwise=CCMP" -} - - -function is_installed() { - dpkg-query -W --showformat='${Status}' $1 | - grep "install ok installed" >/dev/null - if [ $? -eq 0 ]; then echo true; else echo false; fi -} - - -function configure_ap() { - disable_wifi - - # Install packages - ( - $(is_installed dnsmasq) && - $(is_installed hostapd) && - $(is_installed iptables-persistent) - - ) || ( - export DEBIAN_FRONTEND=noninteractive - apt-get update - apt-get install -yq dnsmasq hostapd iptables-persistent - ) - - configure_dhcpcd > $DHCPCD_CFG - configure_dnsmasq > $DNSMASQ_CFG - configure_hostapd > $HOSTAPD_CFG - - echo "DAEMON_CONF=\"/etc/hostapd/hostapd.conf\"" > /etc/default/hostapd - - # Enable IP forwarding - sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf - echo 1 > /proc/sys/net/ipv4/ip_forward - - # Enable IP masquerading - iptables -t nat -F - iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE - iptables-save > /etc/iptables/rules.v4 -} - - -function usage() { - echo "Usage: config-wifi [OPTIONS]" - echo - echo "Configure wifi as either a client or access point." - echo - echo "OPTIONS:" - echo - echo " -a Configure access point." - echo " -d Disable wifi." - echo " -r Reboot when done." - echo " -s Set SSID." - echo " -p Set password." - echo " -c Set wifi channel." - echo " -j Report wifi config as JSON data." - echo -} - - -# Parse args -while [ $# -ne 0 ]; do - case "$1" in - -a) AP=true ;; - -d) DISABLE=true ;; - -r) REBOOT=true; ;; - -s) SSID="$2"; shift ;; - -p) PASS="$2"; shift ;; - -c) CHANNEL="$2"; shift ;; - -j) query_config; exit 0 ;; - - -h) - usage - exit 0 - ;; - - *) - usage - echo "Unknown argument '$1'" - exit 1 - esac - - shift -done - - -if $DISABLE; then - disable_wifi - -else - # Check args - function clean_str() { - echo "$1" | tr -d '\n\r"' - } - - SSID=$(clean_str "$SSID") - PASS=$(clean_str "$PASS") - - LANG=C LC_ALL=C # For correct string byte length - - if [ ${#SSID} -eq 0 -o 32 -lt ${#SSID} ]; then - echo "Invalid or missing SSID '$SSID'" - exit 1 - fi - - if [ ${#PASS} -ne 0 ]; then - if [ ${#PASS} -lt 8 -o 128 -lt ${#PASS} ]; then - echo "Invalid passsword" - exit 1 - fi - fi - - echo "$CHANNEL" | grep '^[0-9]\{1,2\}' > /dev/null - if [ $? -ne 0 ]; then - echo "Invalid channel '$CHANNEL'" - exit 1 - fi - - # Execute - if $AP; then - echo "Configuring Wifi access point" - configure_ap - - else - echo "Configuring Wifi" - configure_wifi - fi -fi - - -if $REBOOT; then nohup reboot & fi diff --git a/scripts/demo-chroot b/scripts/demo-chroot deleted file mode 100644 index 75e7578..0000000 --- a/scripts/demo-chroot +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash -ex - -ROOT="$PWD/demo" - -# Clean up on EXIT -function cleanup { - umount "$ROOT"/{dev/pts,dev,sys,proc} 2>/dev/null || true -} -trap cleanup EXIT - -# mount binds -mount --bind /dev "$ROOT/dev/" -mount --bind /sys "$ROOT/sys/" -mount --bind /proc "$ROOT/proc/" -mount --bind /dev/pts "$ROOT/dev/pts" - -chroot "$ROOT" "$@" diff --git a/scripts/download-dependencies.sh b/scripts/download-dependencies.sh index 1237d3d..0234002 100755 --- a/scripts/download-dependencies.sh +++ b/scripts/download-dependencies.sh @@ -1,3 +1,3 @@ #!/bin/bash -ex -pip3 download -d python-packages -r requirements.txt +pip3 download -d installer/python-packages -r requirements.txt diff --git a/scripts/install.sh b/scripts/install.sh index a13d7ed..b8c0bdb 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -12,39 +12,41 @@ while [ $# -gt 0 ]; do shift 1 done - if $UPDATE_PY; then systemctl stop bbctrl # Update service rm -f /etc/init.d/bbctrl - cp scripts/bbctrl.service /etc/systemd/system/ + cp ./installer/config/bbctrl.service /etc/systemd/system/ systemctl daemon-reload systemctl enable bbctrl fi if $UPDATE_AVR; then - chmod +x ./scripts/avr109-flash.py - ./scripts/avr109-flash.py src/avr/bbctrl-avr-firmware.hex + chmod +x ./installer/scripts/avr109-flash.py + ./installer/scripts/avr109-flash.py src/avr/bbctrl-avr-firmware.hex fi # Update config.txt -./scripts/edit-boot-config max_usb_current=1 config_hdmi_boost=8 hdmi_force_hotplug=1 hdmi_group=2 hdmi_mode=82 +./installer/scripts/edit-boot-config \ + disable_overscan=1 \ + framebuffer_width=1280 \ + framebuffer_height=720 \ + nohz=on \ + dtparam=sd_overclock=100 \ + max_usb_current=1 \ + config_hdmi_boost=8 \ + disable_splash=1 \ + hdmi_force_hotplug=1 \ + hdmi_group=2 \ + hdmi_mode=82 # TODO Enable GPU -#./scripts/edit-boot-config dtoverlay=vc4-kms-v3d -#./scripts/edit-boot-config gpu_mem=16 +#./installer/scripts/edit-boot-config \ +# dtoverlay=vc4-kms-v3d \ +# gpu_mem=16 #chmod ug+s /usr/lib/xorg/Xorg -# Use the full screen resolution -# grep "^framebuffer_width=1280$" /boot/config.txt >/dev/null -# if [ $? -eq 0 ]; then -# mount -o remount,rw /boot && -# sed -i 's/^\(framebuffer_.*\)$/#\1/g' /boot/config.txt -# mount -o remount,ro /boot -# REBOOT=true -# fi - # Fix camera grep dwc_otg.fiq_fsm_mask /boot/cmdline.txt >/dev/null if [ $? -ne 0 ]; then @@ -73,14 +75,20 @@ sed -i 's/^TimeoutStartSec=.*$/TimeoutStartSec=1/' \ /etc/systemd/system/network-online.target.wants/networking.service # Change to US keyboard layout -sed -i 's/^XKBLAYOUT="gb"$/XKBLAYOUT="us" # Comment stops change on upgrade/' \ - /etc/default/keyboard +sed -i 's/^XKBLAYOUT="gb"$/XKBLAYOUT="us" # Comment stops change on upgrade/' /etc/default/keyboard + +# Set the default locale to en_US +grep '^en_US.UTF-8 UTF-8' /etc/locale.gen >/dev/null +if [ $? -ne 0 ]; then + perl -pi -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/g' /etc/locale.gen + locale-gen en_US.UTF-8 + update-locale en_US.UTF-8 +fi # Setup USB stick automount -diff ./scripts/11-automount.rules /etc/udev/rules.d/11-automount.rules \ - >/dev/null +diff ./installer/config/11-automount.rules /etc/udev/rules.d/11-automount.rules >/dev/null if [ $? -ne 0 ]; then - cp ./scripts/11-automount.rules /etc/udev/rules.d/ + cp ./installer/config/11-automount.rules /etc/udev/rules.d/ sed -i 's/^\(MountFlags=slave\)/#\1/' \ /lib/systemd/system/systemd-udevd.service REBOOT=true @@ -94,19 +102,30 @@ if [ $? -ne 0 ]; then fi # Install .Xresources & .xinitrc -cp scripts/Xresources ~pi/.Xresources +cp ./installer/config/Xresources ~pi/.Xresources chown pi:pi ~pi/.Xresources -cp scripts/xinitrc ~pi/.xinitrc +cp ./installer/config/xinitrc ~pi/.xinitrc chmod +x ~pi/.xinitrc chown pi:pi ~pi/.xinitrc -#Configure the "ratpoison" window manager +# Configure the "ratpoison" window manager if [ ! -e ~pi/.ratpoisonrc ]; then - cp scripts/ratpoisonrc ~pi/.ratpoisonrc + cp ./installer/config/ratpoisonrc ~pi/.ratpoisonrc chmod 644 ~pi/.ratpoisonrc chown pi:pi ~pi/.ratpoisonrc fi +# Configure the Plymouth graphical bootloader with the Onefinity theme +if [ ! -e /usr/share/plymouth/themes/onefinity/onefinity.plymouth ]; then + mkdir -p /usr/share/plymouth/themes/onefinity/ + cp -av installer/splash/* /usr/share/plymouth/themes/onefinity/ + plymouth-set-default-theme -R onefinity +fi +grep 'quiet splash plymouth.ignore-serial-consoles logo.nologo' /boot/cmdline.txt >/dev/null +if [ $? -ne 0 ]; then + echo -n " quiet splash plymouth.ignore-serial-consoles logo.nologo" >> /boot/cmdline.txt +fi + # Install bbserial MODSRC=src/bbserial/bbserial.ko MODDST=/lib/modules/$(uname -r)/kernel/drivers/tty/serial/bbserial.ko @@ -118,7 +137,7 @@ if [ $? -ne 0 ]; then fi # Install rc.local -cp scripts/rc.local /etc/ +cp ./installer/config/rc.local /etc/ # Install bbctrl if $UPDATE_PY; then @@ -127,7 +146,7 @@ if $UPDATE_PY; then rm -rf /usr/local/lib/python*/dist-packages/bbctrl-* # Ensure python dependencies are installed - pip3 install --no-index --find-links python-packages -r requirements.txt + pip3 install --no-index --find-links installer/python-packages -r requirements.txt ./setup.py install --force @@ -138,26 +157,26 @@ if $UPDATE_PY; then fi # Expand the file system if necessary -chmod +x ./scripts/resize_root_fs.sh -./scripts/resize_root_fs.sh +chmod +x ./installer/scripts/resize_root_fs.sh +./installer/scripts/resize_root_fs.sh if [ $? -eq 0 ]; then REBOOT=true fi # Install our logrotate config -cp ./scripts/bbctrl-logrotate /etc/logrotate.d/bbctrl +cp ./installer/config/bbctrl-logrotate /etc/logrotate.d/bbctrl chown root:root /etc/logrotate.d/bbctrl # Ensure logrotate runs on every boot (for systems with no network, thus bad clock) if [ ! -e /etc/cron.d/reboot ]; then - cp ./scripts/cron_d_reboot /etc/cron.d/reboot + cp ./installer/config/cron_d_reboot /etc/cron.d/reboot mkdir -p /etc/cron.reboot - cp ./scripts/cron_reboot_logrotate /etc/cron.reboot/logrotate + cp ./installer/config/cron_reboot_logrotate /etc/cron.reboot/logrotate fi # Delete some cookies that were left behind in older images -chmod +x ./scripts/delete-cookies.py -./scripts/delete-cookies.py +chmod +x ./installer/scripts/delete-cookies.py +./installer/scripts/delete-cookies.py pkill -HUP chromium # Force Chromium to restart, to see the cookie changes # Get rid of some old files that were left behind in older images diff --git a/scripts/log-position-to-gcode b/scripts/log-position-to-gcode deleted file mode 100644 index 7597fb4..0000000 --- a/scripts/log-position-to-gcode +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env python3 - -import json -import sys - -p = [0, 0, 0] - - -print('F400 G21') - -for line in sys.stdin: - try: - if not line.startswith('I:Comm:> '): continue - line = line[9:] - - data = json.loads(line) - - changed = False - for axis in range(3): - var = 'xyz'[axis] + 'p' - if var in data: - p[axis] = data[var] - changed = True - - if changed: print('G1 X%d Y%d Z%d' % tuple(p)) - - except json.decoder.JSONDecodeError: pass diff --git a/scripts/reset-video b/scripts/reset-video deleted file mode 100644 index 94b46cd..0000000 --- a/scripts/reset-video +++ /dev/null @@ -1,23 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import subprocess -import os.path -import time - -if not os.path.exists('/dev/video0'): - print('/dev/video0 not found') - sys.exit(1) - -p = subprocess.Popen('udevadm info -q path /dev/video0'.split(), - stdout = subprocess.PIPE) -s = p.communicate()[0].decode('utf-8') -dev = s.split('/')[7] - -with open('/sys/bus/usb/drivers/usb/unbind', 'w') as f: - f.write(dev) - -time.sleep(1) - -with open('/sys/bus/usb/drivers/usb/bind', 'w') as f: - f.write(dev) diff --git a/scripts/ssh-bbctrl b/scripts/ssh-bbctrl deleted file mode 100644 index ad9ed9a..0000000 --- a/scripts/ssh-bbctrl +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/bash - -USER=bbmc -HOST=bbctrl.local - -if [ $# -eq 1 ]; then - if [[ "$1" = *@ ]]; then - LOGIN="$1" - else - LOGIN=$USER@"$1" - fi -else - LOGIN=$USER@$HOST -fi - -ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "$LOGIN" diff --git a/scripts/svg2abs.js b/scripts/svg2abs.js deleted file mode 100644 index 7cfc6dd..0000000 --- a/scripts/svg2abs.js +++ /dev/null @@ -1,64 +0,0 @@ -function convertToAbsolute(path) { - var x0, y0, x1, y1, x2, y2, segs = path.pathSegList; - - for (var x = 0, y = 0, i = 0, len = segs.numberOfItems; i < len; i++) { - var seg = segs.getItem(i), c = seg.pathSegTypeAsLetter; - - if (/[MLHVCSQTA]/.test(c)){ - if ('x' in seg) x = seg.x; - if ('y' in seg) y = seg.y; - - } else { - if ('x1' in seg) x1 = x + seg.x1; - if ('x2' in seg) x2 = x + seg.x2; - if ('y1' in seg) y1 = y + seg.y1; - if ('y2' in seg) y2 = y + seg.y2; - if ('x' in seg) x += seg.x; - if ('y' in seg) y += seg.y; - - switch(c) { - case 'm': - segs.replaceItem(path.createSVGPathSegMovetoAbs(x, y), i); - break; - case 'l': - segs.replaceItem(path.createSVGPathSegLinetoAbs(x, y), i); - break; - case 'h': - segs.replaceItem(path.createSVGPathSegLinetoHorizontalAbs(x), i); - break; - case 'v': - segs.replaceItem(path.createSVGPathSegLinetoVerticalAbs(y), i); - break; - case 'c': - segs.replaceItem( - path.createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2), i); - break; - case 's': - segs.replaceItem( - path.createSVGPathSegCurvetoCubicSmoothAbs(x, y, x2, y2), i); - break; - case 'q': - segs.replaceItem( - path.createSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1), i); - break; - case 't': - segs.replaceItem( - path.createSVGPathSegCurvetoQuadraticSmoothAbs(x, y), i); - break; - case 'a': - segs.replaceItem( - path.createSVGPathSegArcAbs(x, y, seg.r1, seg.r2, seg.angle, - seg.largeArcFlag, seg.sweepFlag), i); - break; - - case 'z': case 'Z': - x = x0; - y = y0; - break; - } - } - - // Record the start of a subpath - if (c == 'M' || c == 'm') x0 = x, y0 = y; - } -} diff --git a/setup.py b/setup.py index d57ae67..7b3b375 100755 --- a/setup.py +++ b/setup.py @@ -29,14 +29,13 @@ setup( ] }, scripts=[ - 'scripts/update-bbctrl', - 'scripts/upgrade-bbctrl', - 'scripts/sethostname', - 'scripts/reset-video', - 'scripts/config-wifi', - 'scripts/edit-config', - 'scripts/edit-boot-config', - 'scripts/browser', + 'installer/scripts/update-bbctrl', + 'installer/scripts/upgrade-bbctrl', + 'installer/scripts/sethostname', + 'installer/scripts/config-wifi', + 'installer/scripts/edit-config', + 'installer/scripts/edit-boot-config', + 'installer/scripts/browser', ], install_requires=[ 'tornado', diff --git a/src/js/admin-network-view.js b/src/js/admin-network-view.js index c37e6ff..12d20c5 100644 --- a/src/js/admin-network-view.js +++ b/src/js/admin-network-view.js @@ -4,7 +4,7 @@ module.exports = { attached: function () { this.svelteComponent = SvelteComponents.createComponent( "AdminNetworkView", - document.getElementById("svelte-root") + document.getElementById("admin-network") ); }, diff --git a/src/js/app.js b/src/js/app.js index 8e2dd2d..46a07ff 100644 --- a/src/js/app.js +++ b/src/js/app.js @@ -4,7 +4,6 @@ const api = require("./api"); const cookie = require("./cookie")("bbctrl-"); const Sock = require("./sock"); -SvelteComponents.initNetworkInfo(); SvelteComponents.createComponent("DialogHost", document.getElementById("svelte-dialog-host") ); @@ -136,6 +135,7 @@ module.exports = new Vue({ watch: { display_units: function (value) { localStorage.setItem("display_units", value); + SvelteComponents.setDisplayUnits(value); }, }, @@ -214,6 +214,10 @@ module.exports = new Vue({ ready: function () { $(window).on("hashchange", this.parse_hash); this.connect(); + + SvelteComponents.registerControllerMethods({ + dispatch: (...args) => this.$dispatch(...args) + }); }, methods: { @@ -289,15 +293,6 @@ module.exports = new Vue({ update_object(this.config, config, true); this.parse_hash(); - if (!this.devModChecked) { - this.devModChecked = true; - if (this.config.devmode) { - SvelteComponents.createComponent("Devmode", - document.getElementById("svelte-devmode-host") - ); - } - } - if (!this.checkedUpgrade) { this.checkedUpgrade = true; diff --git a/src/js/control-view.js b/src/js/control-view.js index 856a263..47bf907 100644 --- a/src/js/control-view.js +++ b/src/js/control-view.js @@ -9,6 +9,7 @@ module.exports = { data: function () { return { + current_time: "", mach_units: this.$root.state.metric ? "METRIC" : "IMPERIAL", mdi: '', last_file: undefined, @@ -19,22 +20,6 @@ module.exports = { history: [], speed_override: 1, feed_override: 1, - manual_home: { - x: false, - y: false, - z: false, - a: false, - b: false, - c: false - }, - position_msg: { - x: false, - y: false, - z: false, - a: false, - b: false, - c: false - }, jog_incr_amounts: { "METRIC": { fine: 0.1, @@ -49,7 +34,6 @@ module.exports = { large: 5, } }, - axis_position: 0, jog_incr: localStorage.getItem("jog_incr") || 'small', jog_step: cookie.get_bool('jog-step'), jog_adjust: parseInt(cookie.get('jog-adjust', 2)), @@ -253,10 +237,18 @@ module.exports = { ready: function () { this.load(); + setInterval(() => { + this.current_time = new Date().toLocaleTimeString(); + }, 1000); + SvelteComponents.registerControllerMethods({ stop: (...args) => this.stop(...args), send: (...args) => this.send(...args), - goto_zero: (...args) => this.goto_zero(...args) + goto_zero: (...args) => this.goto_zero(...args), + isAxisHomed: (axis) => this[axis].homed, + unhome: (...args) => this.unhome(...args), + set_position: (...args) => this.set_position(...args), + set_home: (...args) => this.set_home(...args) }); }, @@ -398,18 +390,13 @@ module.exports = { return; } - const fd = new FormData(); - - fd.append('gcode', file); - - try { - await api.upload('file', fd); - - this.last_file_time = undefined; // Force reload - this.$broadcast('gcode-reload', file.name); - } catch (err) { - api.alert('Upload failed', err) - } + SvelteComponents.showDialog("Upload", { + file, + onComplete: () => { + this.last_file_time = undefined; // Force reload + this.$broadcast('gcode-reload', file.name); + } + }); }, delete_current: function () { @@ -433,23 +420,20 @@ module.exports = { } else if (this[axis].homingMode != 'manual') { api.put('home/' + axis); } else { - this.manual_home[axis] = true; + SvelteComponents.showDialog("ManualHomeAxis", { axis }); } }, set_home: function (axis, position) { - this.manual_home[axis] = false; api.put('home/' + axis + '/set', { position: parseFloat(position) }); }, unhome: function (axis) { - this.position_msg[axis] = false; api.put('home/' + axis + '/clear'); }, show_set_position: function (axis) { - this.axis_position = 0; - this.position_msg[axis] = true; + SvelteComponents.showDialog("SetAxisPosition", { axis }); }, show_toolpath_msg: function (axis) { @@ -457,7 +441,6 @@ module.exports = { }, set_position: function (axis, position) { - this.position_msg[axis] = false; api.put('position/' + axis, { 'position': parseFloat(position) }); }, @@ -530,7 +513,7 @@ module.exports = { this.send(JSON.stringify(data)); }, - showProbeDialog: function(probeType) { + showProbeDialog: function (probeType) { SvelteComponents.showDialog("Probe", { probeType }); } }, diff --git a/src/js/settings-view.js b/src/js/settings-view.js index 6d26b98..ab87296 100644 --- a/src/js/settings-view.js +++ b/src/js/settings-view.js @@ -1,31 +1,14 @@ -'use strict' - module.exports = { - template: '#settings-view-template', - props: ['config', 'template'], + template: "#settings-view-template", - computed: { - display_units: { - cache: false, - get: function () { - return this.$root.display_units; - }, - set: function (value) { - this.$root.display_units = value; - } - }, + attached: function () { + this.svelteComponent = SvelteComponents.createComponent( + "SettingsView", + document.getElementById("settings") + ); }, - events: { - 'input-changed': function () { - this.$dispatch('config-changed'); - return false; - } - }, - - methods: { - showScreenRotationDialog: function () { - SvelteComponents.showDialog("ScreenRotation"); - } + detached: function() { + this.svelteComponent.$destroy(); } -} +}; diff --git a/src/pug/index.pug b/src/pug/index.pug index 6515f50..3d65e50 100644 --- a/src/pug/index.pug +++ b/src/pug/index.pug @@ -19,7 +19,6 @@ html(lang="en") body(v-cloak) #svelte-dialog-host - #svelte-devmode-host #overlay(v-if="status != 'connected'") span {{status}} diff --git a/src/pug/templates/admin-network-view.pug b/src/pug/templates/admin-network-view.pug index dd57264..dd7d4a9 100644 --- a/src/pug/templates/admin-network-view.pug +++ b/src/pug/templates/admin-network-view.pug @@ -1,3 +1,2 @@ script#admin-network-view-template(type="text/x-template") - #admin-network - #svelte-root + #admin-network \ No newline at end of file diff --git a/src/pug/templates/control-view.pug b/src/pug/templates/control-view.pug index 4151b16..83845b9 100644 --- a/src/pug/templates/control-view.pug +++ b/src/pug/templates/control-view.pug @@ -150,60 +150,18 @@ script#control-view-template(type="text/x-template") th.actions button.pure-button(:disabled="!can_set_axis", title=`Set {{'${axis}' | upper}} axis position.`, - @click=`show_set_position('${axis}')`,style="height:60px;width:60px") + @click=`show_set_position('${axis}')`, style="height:60px;width:60px") .fa.fa-cog button.pure-button(:disabled="!can_set_axis", title=`Zero {{'${axis}' | upper}} axis offset.`, - @click=`zero('${axis}')`,style="height:60px;width:60px") + @click=`zero('${axis}')`, style="height:60px;width:60px") .fa.fa-map-marker button.pure-button(:disabled="!is_idle", @click=`home('${axis}')`, - title=`Home {{'${axis}' | upper}} axis.`,style="height:60px;width:60px") + title=`Home {{'${axis}' | upper}} axis.`, style="height:60px;width:60px") .fa.fa-home - message(:show.sync=`position_msg['${axis}']`) - h3(slot="header") Set {{'#{axis}' | upper}} axis position - - div(slot="body") - .pure-form - .pure-control-group - label Position - input(v-model="axis_position", - @keyup.enter=`set_position('${axis}', axis_position)`) - p - - div(slot="footer") - button.pure-button(@click=`position_msg['${axis}'] = false`) - | Cancel - - button.pure-button(v-if=`${axis}.homed`, - @click=`unhome('${axis}')`) Unhome - - button.pure-button.button-success( - @click=`set_position('${axis}', axis_position)`) Set - - message(:show.sync=`manual_home['${axis}']`) - h3(slot="header") Manually home {{'#{axis}' | upper}} axis - - div(slot="body") - p Set axis absolute position. - - .pure-form - .pure-control-group - label Absolute - input(v-model="axis_position", - @keyup.enter=`set_home('${axis}', axis_position)`) - - p - - div(slot="footer") - button.pure-button(@click=`manual_home['${axis}'] = false`) - | Cancel - - button.pure-button.button-success( - title=`Home {{'${axis}' | upper}} axis.`, - @click=`set_home('${axis}', axis_position)`) Set tr(style="vertical-align: top;") td @@ -265,6 +223,11 @@ script#control-view-template(type="text/x-template") td table.info + tr + th Current Time + td + span {{current_time}} + tr th Remaining td(title="Total run time (days:hours:mins:secs)"). @@ -273,12 +236,7 @@ script#control-view-template(type="text/x-template") tr th ETA td.eta {{eta}} - tr - th Line - td - | {{0 <= state.line ? state.line : 0 | number}} - span(v-if="toolpath.lines") - |  of {{toolpath.lines | number}} + tr th Progress td.progress diff --git a/src/pug/templates/settings-view.pug b/src/pug/templates/settings-view.pug index 15ec257..8a0061f 100644 --- a/src/pug/templates/settings-view.pug +++ b/src/pug/templates/settings-view.pug @@ -1,53 +1,2 @@ script#settings-view-template(type="text/x-template") - #settings - h1 Settings - - .pure-form.pure-form-aligned - fieldset - h2 Screen - .pure-control-group - label(for="screen-rotation") - button.pure-button(name="screen-rotation", @click="showScreenRotationDialog") Change Screen Rotation - - fieldset - h2 Probe Dimensions - templated-input(v-for="templ in template.probe", v-if="$key !== 'probe-diameter'", :name="$key" - :model.sync="config.probe[$key]", :template="templ") - - fieldset - h2 GCode - templated-input(v-for="templ in template.gcode", :name="$key", - :model.sync="config.gcode[$key]", :template="templ") - - fieldset - h2 Path Accuracy - templated-input(name="max-deviation", - :model.sync="config.settings['max-deviation']", - :template="template.settings['max-deviation']") - - p. - Lower #[tt max-deviation] to follow the programmed path more precisely - but at a slower speed. - - p. - In order to improve traversal speed, the path planner may merge - consecutive moves or round off sharp corners if doing so would deviate - from the program path by less than #[tt max-deviation]. - - - var base = '//linuxcnc.org/docs/html/gcode/g-code.html' - p. - GCode commands - #[a(href=base + "#gcode:g61", target="_blank") G61, G61.1] and - #[a(href=base + "#gcode:g64", target="_blank") G64] also affect path - planning accuracy. - - h2 Cornering Speed (Advanced) - templated-input(name="junction-accel", - :model.sync="config.settings['junction-accel']", - :template="template.settings['junction-accel']") - - p. - Junction acceleration limits the cornering speed the planner will - allow. Increasing this value will allow for faster traversal of - corners but may cause the planner to violate axis jerk limits and - stall the motors. Use with caution. + #settings \ No newline at end of file diff --git a/src/py/bbctrl/AVREmu.py b/src/py/bbctrl/AVREmu.py deleted file mode 100644 index 05181af..0000000 --- a/src/py/bbctrl/AVREmu.py +++ /dev/null @@ -1,207 +0,0 @@ -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software is distributed in the hope that it will be useful, but # -# WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - -import os -import sys -import traceback -import signal - -import bbctrl -import bbctrl.Cmd as Cmd - - -class AVREmu(object): - def __init__(self, ctrl): - self.ctrl = ctrl - self.log = ctrl.log.get('AVREmu') - - self.avrOut = None - self.avrIn = None - self.i2cOut = None - self.read_cb = None - self.write_cb = None - self.pid = None - - - def close(self): - # Close pipes - def _close(fd, withHandle): - if fd is None: return - try: - if withHandle: self.ctrl.ioloop.remove_handler(fd) - except: pass - try: - os.close(fd) - except: pass - - _close(self.avrOut, True) - _close(self.avrIn, True) - _close(self.i2cOut, False) - - self.avrOut, self.avrIn, self.i2cOut = None, None, None - - # Kill process and wait for it - if self.pid is not None: - os.kill(self.pid, signal.SIGKILL) - os.waitpid(self.pid, 0) - self.pid = None - - - def _start(self): - try: - self.close() - - # Create pipes - stdinFDs = os.pipe() - stdoutFDs = os.pipe() - i2cFDs = os.pipe() - - self.pid = os.fork() - - if not self.pid: - # Dup child ends - os.dup2(stdinFDs[0], 0) - os.dup2(stdoutFDs[1], 1) - os.dup2(i2cFDs[0], 3) - - # Close orig fds - os.close(stdinFDs[0]) - os.close(stdoutFDs[1]) - os.close(i2cFDs[0]) - - # Close parent ends - os.close(stdinFDs[1]) - os.close(stdoutFDs[0]) - os.close(i2cFDs[1]) - - cmd = ['bbemu'] - if self.ctrl.args.fast_emu: cmd.append('--fast') - - os.execvp(cmd[0], cmd) - os._exit(1) # In case of failure - - # Parent, close child ends - os.close(stdinFDs[0]) - os.close(stdoutFDs[1]) - os.close(i2cFDs[0]) - - # Non-blocking IO - os.set_blocking(stdinFDs[1], False) - os.set_blocking(stdoutFDs[0], False) - os.set_blocking(i2cFDs[1], False) - - self.avrOut = stdinFDs[1] - self.avrIn = stdoutFDs[0] - self.i2cOut = i2cFDs[1] - - ioloop = self.ctrl.ioloop - ioloop.add_handler(self.avrOut, self._avr_write_handler, - ioloop.WRITE | ioloop.ERROR) - ioloop.add_handler(self.avrIn, self._avr_read_handler, - ioloop.READ | ioloop.ERROR) - - self.write_enabled = True - - except Exception: - self.close() - self.log.exception('Internal error: Failed to start bbemu') - - - def set_handlers(self, read_cb, write_cb): - if self.read_cb is not None or self.write_cb is not None: - raise Exception('AVR handler already set') - - self.read_cb = read_cb - self.write_cb = write_cb - self._start() - - - def enable_write(self, enable): - if self.avrOut is None: return - - flags = self.ctrl.ioloop.WRITE if enable else 0 - self.ctrl.ioloop.update_handler(self.avrOut, flags) - self.write_enabled = enable - - - def _avr_write(self, data): - try: - length = os.write(self.avrOut, data) - self.continue_write = length and length == len(data) - return length - - except BlockingIOError: pass - except BrokenPipeError: pass - - return 0 - - - def _avr_write_handler(self, fd, events): - if self.avrOut is None: return - - if events & self.ctrl.ioloop.ERROR: - self._start() - return - - try: - while True: - self.continue_write = False - self.write_cb(self._avr_write) - if not self.continue_write: break - - except Exception as e: - self.log.warning('AVR write handler error: %s', - traceback.format_exc()) - - - def _avr_read_handler(self, fd, events): - if self.avrIn is None: return - - if events & self.ctrl.ioloop.ERROR: - self._start() - return - - try: - data = os.read(self.avrIn, 4096) - if data is not None: self.read_cb(data) - - except Exception as e: - self.log.warning('AVR read handler error: %s %s' % - (data, traceback.format_exc())) - - - def i2c_command(self, cmd, byte = None, word = None, block = None): - if byte is not None: data = chr(byte) - elif word is not None: data = word - elif block is not None: data = block - else: data = '' - - try: - if self.i2cOut is not None: - os.write(self.i2cOut, bytes(cmd + data + '\n', 'utf-8')) - - except BrokenPipeError: pass diff --git a/src/py/bbctrl/Ctrl.py b/src/py/bbctrl/Ctrl.py index f66f39d..31728c7 100644 --- a/src/py/bbctrl/Ctrl.py +++ b/src/py/bbctrl/Ctrl.py @@ -25,10 +25,7 @@ class Ctrl(object): self.log.get('Ctrl').info('Starting %s' % self.id) try: - if args.demo: - self.avr = bbctrl.AVREmu(self) - else: - self.avr = bbctrl.AVR(self) + self.avr = bbctrl.AVR(self) self.i2c = bbctrl.I2C(args.i2c_port, args.demo) self.mach = bbctrl.Mach(self, self.avr) diff --git a/src/py/bbctrl/FileHandler.py b/src/py/bbctrl/FileHandler.py index ad6a24e..33d5eb3 100644 --- a/src/py/bbctrl/FileHandler.py +++ b/src/py/bbctrl/FileHandler.py @@ -1,34 +1,8 @@ -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software is distributed in the hope that it will be useful, but # -# WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - import os +import tempfile import bbctrl import glob -import html +import tornado from tornado import gen from tornado.web import HTTPError @@ -36,17 +10,32 @@ from tornado.web import HTTPError def safe_remove(path): try: os.unlink(path) - except OSError: pass + except OSError: + pass +@tornado.web.stream_request_body class FileHandler(bbctrl.APIHandler): - def prepare(self): pass + def prepare(self): + if self.request.method == 'PUT': + self.request.connection.set_max_body_size(2 ** 30) + self.uploadFilename = self.request.path.split('/')[-1] \ + .replace('\\', '/') \ + .replace('#', '-') \ + .replace('?', '-') + + self.uploadFile = tempfile.NamedTemporaryFile("wb") + + def data_received(self, data): + if self.request.method == 'PUT': + self.uploadFile.write(data) def delete_ok(self, filename): if not filename: # Delete everything - for path in glob.glob(self.get_upload('*')): safe_remove(path) + for path in glob.glob(self.get_upload('*')): + safe_remove(path) self.get_ctrl().preplanner.delete_all_plans() self.get_ctrl().state.clear_files() @@ -57,26 +46,29 @@ class FileHandler(bbctrl.APIHandler): self.get_ctrl().preplanner.delete_plans(filename) self.get_ctrl().state.remove_file(filename) - def put_ok(self, *args): - gcode = self.request.files['gcode'][0] - filename = os.path.basename(gcode['filename'].replace('\\', '/')) - filename = filename.replace('#', '-').replace('?', '-') + if not os.path.exists(self.get_upload()): + os.mkdir(self.get_upload()) - if not os.path.exists(self.get_upload()): os.mkdir(self.get_upload()) + filename = self.get_upload(self.uploadFilename).encode('utf8') + safe_remove(filename) + os.link(self.uploadFile.name, filename) - with open(self.get_upload(filename).encode('utf8'), 'wb') as f: - f.write(gcode['body']) - os.sync() + self.uploadFile.close() - self.get_ctrl().preplanner.invalidate(filename) - self.get_ctrl().state.add_file(filename) - self.get_log('FileHandler').info('GCode received: ' + filename) + del(self.uploadFile) + self.get_ctrl().preplanner.invalidate(self.uploadFilename) + self.get_ctrl().state.add_file(self.uploadFilename) + self.get_log('FileHandler').info( + 'GCode received: ' + self.uploadFilename) + + del(self.uploadFilename) @gen.coroutine def get(self, filename): - if not filename: raise HTTPError(400, 'Missing filename') + if not filename: + raise HTTPError(400, 'Missing filename') filename = os.path.basename(filename) try: @@ -84,6 +76,7 @@ class FileHandler(bbctrl.APIHandler): self.write(f.read()) except Exception: self.get_ctrl().state.select_file('') - raise HTTPError(400, "Unable to read file - doesn't appear to be GCode.") + raise HTTPError( + 400, "Unable to read file - doesn't appear to be GCode.") self.get_ctrl().state.select_file(filename) diff --git a/src/py/bbctrl/ObjGraph.py b/src/py/bbctrl/ObjGraph.py deleted file mode 100644 index 7957bbb..0000000 --- a/src/py/bbctrl/ObjGraph.py +++ /dev/null @@ -1,1223 +0,0 @@ -""" -Tools for drawing Python object reference graphs with graphviz. - -You can find documentation online at https://mg.pov.lt/objgraph/ - -Copyright (c) 2008-2017 Marius Gedminas and contributors - -Released under the MIT licence. -""" -# 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. - -from __future__ import print_function - -import codecs -import collections -import gc -import re -import inspect -import types -import operator -import os -import subprocess -import tempfile -import sys -import itertools - -try: - # Python 2.x compatibility - from StringIO import StringIO -except ImportError: - from io import StringIO - -try: - from types import InstanceType -except ImportError: - # Python 3.x compatibility - InstanceType = None - - -__author__ = "Marius Gedminas (marius@gedmin.as)" -__copyright__ = "Copyright (c) 2008-2017 Marius Gedminas and contributors" -__license__ = "MIT" -__version__ = '3.4.1.dev0' -__date__ = '2018-02-13' - - -try: - basestring -except NameError: - # Python 3.x compatibility - basestring = str - -try: - iteritems = dict.iteritems -except AttributeError: - # Python 3.x compatibility - iteritems = dict.items - -IS_INTERACTIVE = False -try: # pragma: nocover - import graphviz - if get_ipython().__class__.__name__ != 'TerminalInteractiveShell': - IS_INTERACTIVE = True -except (NameError, ImportError): - pass - - -def _isinstance(object, classinfo): - """Return whether an object is an instance of a class or its subclass. - - Differs from the builtin isinstance() implementation in that it does not - depend on the ``__class__`` attribute which is proxied by - mock.Mock(spec=...). - """ - return issubclass(type(object), classinfo) - - -def count(typename, objects=None): - """Count objects tracked by the garbage collector with a given class name. - - The class name can optionally be fully qualified. - - Example: - - >>> count('dict') - 42 - >>> count('mymodule.MyClass') - 2 - - .. note:: - - The Python garbage collector does not track simple - objects like int or str. See - https://docs.python.org/3/library/gc.html#gc.is_tracked - for more information. - - Instead of looking through all objects tracked by the GC, you may - specify your own collection, e.g. - - >>> count('MyClass', get_leaking_objects()) - 3 - - See also: :func:`get_leaking_objects`. - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - Accepts fully-qualified type names (i.e. 'package.module.ClassName') - as well as short type names (i.e. 'ClassName'). - - """ - if objects is None: - objects = gc.get_objects() - try: - if '.' in typename: - return sum(1 for o in objects if _long_typename(o) == typename) - else: - return sum(1 for o in objects if _short_typename(o) == typename) - finally: - del objects # clear cyclic references to frame - - -def typestats(objects=None, shortnames=True, filter=None): - """Count the number of instances for each type tracked by the GC. - - Note that the GC does not track simple objects like int or str. - - Note that classes with the same name but defined in different modules - will be lumped together if ``shortnames`` is True. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - Example: - - >>> typestats() - {'list': 12041, 'tuple': 10245, ...} - >>> typestats(get_leaking_objects()) - {'MemoryError': 1, 'tuple': 2795, 'RuntimeError': 1, 'list': 47, ...} - - .. versionadded:: 1.1 - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - if objects is None: - objects = gc.get_objects() - try: - if shortnames: - typename = _short_typename - else: - typename = _long_typename - stats = {} - for o in objects: - if filter and not filter(o): - continue - n = typename(o) - stats[n] = stats.get(n, 0) + 1 - return stats - finally: - del objects # clear cyclic references to frame - - -def most_common_types(limit=10, objects=None, shortnames=True, filter=None): - """Count the names of types with the most instances. - - Returns a list of (type_name, count), sorted most-frequent-first. - - Limits the return value to at most ``limit`` items. You may set ``limit`` - to None to avoid that. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - The caveats documented in :func:`typestats` apply. - - Example: - - >>> most_common_types(limit=2) - [('list', 12041), ('tuple', 10245)] - - .. versionadded:: 1.4 - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - stats = sorted( - typestats(objects, shortnames=shortnames, filter=filter).items(), - key=operator.itemgetter(1), reverse=True) - if limit: - stats = stats[:limit] - return stats - - -def show_most_common_types( - limit=10, - objects=None, - shortnames=True, - file=None, - filter=None): - """Print the table of types of most common instances. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - The caveats documented in :func:`typestats` apply. - - Example: - - >>> show_most_common_types(limit=5) - tuple 8959 - function 2442 - wrapper_descriptor 1048 - dict 953 - builtin_function_or_method 800 - - .. versionadded:: 1.1 - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 3.0 - New parameter: ``file``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - if file is None: - file = sys.stdout - stats = most_common_types(limit, objects, shortnames=shortnames, - filter=filter) - width = max(len(name) for name, count in stats) - for name, count in stats: - file.write('%-*s %i\n' % (width, name, count)) - - -def growth(limit=10, peak_stats={}, shortnames=True, filter=None): - """Count the increase in peak object since last call. - - Returns a list of (type_name, total_count, increase_delta), - descending order by increase_delta. - - Limits the output to ``limit`` largest deltas. You may set ``limit`` to - None to see all of them. - - Uses and updates ``peak_stats``, a dictionary from type names to previously - seen peak object counts. Usually you don't need to pay attention to this - argument. - - If ``filter`` is specified, it should be a function taking one argument and - returning a boolean. Objects for which ``filter(obj)`` returns ``False`` - will be ignored. - - The caveats documented in :func:`typestats` apply. - - Example: - - >>> growth(2) - [(tuple, 12282, 10), (dict, 1922, 7)] - - .. versionadded:: 3.3.0 - - """ - gc.collect() - stats = typestats(shortnames=shortnames, filter=filter) - deltas = {} - for name, count in iteritems(stats): - old_count = peak_stats.get(name, 0) - if count > old_count: - deltas[name] = count - old_count - peak_stats[name] = count - deltas = sorted(deltas.items(), key=operator.itemgetter(1), - reverse=True) - if limit: - deltas = deltas[:limit] - - return [(name, stats[name], delta) for name, delta in deltas] - - -def show_growth(limit=10, peak_stats=None, shortnames=True, file=None, - filter=None): - """Show the increase in peak object counts since last call. - - if ``peak_stats`` is None, peak object counts will recorded in - func `growth`, and your can record the counts by yourself with set - ``peak_stats`` to a dictionary. - - The caveats documented in :func:`growth` apply. - - Example: - - >>> show_growth() - wrapper_descriptor 970 +14 - tuple 12282 +10 - dict 1922 +7 - ... - - .. versionadded:: 1.5 - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 2.1 - New parameter: ``file``. - - .. versionchanged:: 3.1.3 - New parameter: ``filter``. - - """ - if peak_stats is None: - result = growth(limit, shortnames=shortnames, filter=filter) - else: - result = growth(limit, peak_stats, shortnames, filter) - if result: - if file is None: - file = sys.stdout - width = max(len(name) for name, _, _ in result) - for name, count, delta in result: - file.write('%-*s%9d %+9d\n' % (width, name, count, delta)) - - -def get_new_ids(skip_update=False, limit=10, sortby='deltas', - shortnames=None, file=None, _state={}): - """Find and display new objects allocated since last call. - - Shows the increase in object counts since last call to this - function and returns the memory address ids for new objects. - - Returns a dictionary mapping object type names to sets of object IDs - that have been created since the last time this function was called. - - ``skip_update`` (bool): If True, returns the same dictionary that - was returned during the previous call without updating the internal - state or examining the objects currently in memory. - - ``limit`` (int): The maximum number of rows that you want to print - data for. Use 0 to suppress the printing. Use None to print everything. - - ``sortby`` (str): This is the column that you want to sort by in - descending order. Possible values are: 'old', 'current', 'new', - 'deltas' - - ``shortnames`` (bool): If True, classes with the same name but - defined in different modules will be lumped together. If False, - all type names will be qualified with the module name. If None (default), - ``get_new_ids`` will remember the value from previous calls, so it's - enough to prime this once. By default the primed value is True. - - ``_state`` (dict): Stores old, current, and new_ids in memory. - It is used by the function to store the internal state between calls. - Never pass in this argument unless you know what you're doing. - - The caveats documented in :func:`growth` apply. - - When one gets new_ids from :func:`get_new_ids`, one can use - :func:`at_addrs` to get a list of those objects. Then one can iterate over - the new objects, print out what they are, and call :func:`show_backrefs` or - :func:`show_chain` to see where they are referenced. - - Example: - - >>> _ = get_new_ids() # store current objects in _state - >>> _ = get_new_ids() # current_ids become old_ids in _state - >>> a = [0, 1, 2] # list we don't know about - >>> b = [3, 4, 5] # list we don't know about - >>> new_ids = get_new_ids(limit=3) # we see new lists - ====================================================================== - Type Old_ids Current_ids New_ids Count_Deltas - ====================================================================== - list 324 326 +3 +2 - dict 1125 1125 +0 +0 - wrapper_descriptor 1001 1001 +0 +0 - ====================================================================== - >>> new_lists = at_addrs(new_ids['list']) - >>> a in new_lists - True - >>> b in new_lists - True - - .. versionadded:: 3.4 - """ - if not _state: - _state['old'] = collections.defaultdict(set) - _state['current'] = collections.defaultdict(set) - _state['new'] = collections.defaultdict(set) - _state['shortnames'] = True - new_ids = _state['new'] - if skip_update: - return new_ids - old_ids = _state['old'] - current_ids = _state['current'] - if shortnames is None: - shortnames = _state['shortnames'] - else: - _state['shortnames'] = shortnames - gc.collect() - objects = gc.get_objects() - for class_name in old_ids: - old_ids[class_name].clear() - for class_name, ids_set in current_ids.items(): - old_ids[class_name].update(ids_set) - for class_name in current_ids: - current_ids[class_name].clear() - for o in objects: - if shortnames: - class_name = _short_typename(o) - else: - class_name = _long_typename(o) - id_number = id(o) - current_ids[class_name].add(id_number) - for class_name in new_ids: - new_ids[class_name].clear() - rows = [] - keys_to_remove = [] - for class_name in current_ids: - num_old = len(old_ids[class_name]) - num_current = len(current_ids[class_name]) - if num_old == 0 and num_current == 0: - # remove the key from our dicts if we don't have any old or - # current class_name objects - keys_to_remove.append(class_name) - continue - new_ids_set = current_ids[class_name] - old_ids[class_name] - new_ids[class_name].update(new_ids_set) - num_new = len(new_ids_set) - num_delta = num_current - num_old - row = (class_name, num_old, num_current, num_new, num_delta) - rows.append(row) - for key in keys_to_remove: - del old_ids[key] - del current_ids[key] - del new_ids[key] - index_by_sortby = {'old': 1, 'current': 2, 'new': 3, 'deltas': 4} - rows.sort(key=operator.itemgetter(index_by_sortby[sortby], 0), - reverse=True) - if limit is not None: - rows = rows[:limit] - if not rows: - return new_ids - if file is None: - file = sys.stdout - width = max(len(row[0]) for row in rows) - print('='*(width+13*4), file=file) - print('%-*s%13s%13s%13s%13s' % - (width, 'Type', 'Old_ids', 'Current_ids', 'New_ids', 'Count_Deltas'), - file=file) - print('='*(width+13*4), file=file) - for row_class, old, current, new, delta in rows: - print('%-*s%13d%13d%+13d%+13d' % - (width, row_class, old, current, new, delta), file=file) - print('='*(width+13*4), file=file) - return new_ids - - -def get_leaking_objects(objects=None): - """Return objects that do not have any referents. - - These could indicate reference-counting bugs in C code. Or they could - be legitimate. - - Note that the GC does not track simple objects like int or str. - - .. versionadded:: 1.7 - """ - if objects is None: - gc.collect() - objects = gc.get_objects() - try: - ids = set(id(i) for i in objects) - for i in objects: - ids.difference_update(id(j) for j in gc.get_referents(i)) - # this then is our set of objects without referrers - return [i for i in objects if id(i) in ids] - finally: - del objects, i # clear cyclic references to frame - - -def by_type(typename, objects=None): - """Return objects tracked by the garbage collector with a given class name. - - Example: - - >>> by_type('MyClass') - [] - - Note that the GC does not track simple objects like int or str. - - .. versionchanged:: 1.7 - New parameter: ``objects``. - - .. versionchanged:: 1.8 - Accepts fully-qualified type names (i.e. 'package.module.ClassName') - as well as short type names (i.e. 'ClassName'). - - """ - if objects is None: - objects = gc.get_objects() - try: - if '.' in typename: - return [o for o in objects if _long_typename(o) == typename] - else: - return [o for o in objects if _short_typename(o) == typename] - finally: - del objects # clear cyclic references to frame - - -def at(addr): - """Return an object at a given memory address. - - The reverse of id(obj): - - >>> at(id(obj)) is obj - True - - Note that this function does not work on objects that are not tracked by - the GC (e.g. ints or strings). - """ - for o in gc.get_objects(): - if id(o) == addr: - return o - return None - - -def at_addrs(address_set): - """Return a list of objects for a given set of memory addresses. - - The reverse of [id(obj1), id(obj2), ...]. Note that objects are returned - in an arbitrary order. - - When one gets ``new_ids`` from :func:`get_new_ids`, one can use this - function to get a list of those objects. Then one can iterate over the new - objects, print out what they are, and call :func:`show_backrefs` or - :func:`show_chain` to see where they are referenced. - - >>> a = [0, 1, 2] - >>> new_ids = get_new_ids() - >>> new_lists = at_addrs(new_ids['list']) - >>> a in new_lists - True - - Note that this function does not work on objects that are not tracked - by the GC (e.g. ints or strings). - - .. versionadded:: 3.4 - """ - res = [] - for o in gc.get_objects(): - if id(o) in address_set: - res.append(o) - return res - - -def find_ref_chain(obj, predicate, max_depth=20, extra_ignore=()): - """Find a shortest chain of references leading from obj. - - The end of the chain will be some object that matches your predicate. - - ``predicate`` is a function taking one argument and returning a boolean. - - ``max_depth`` limits the search depth. - - ``extra_ignore`` can be a list of object IDs to exclude those objects from - your search. - - Example: - - >>> find_ref_chain(obj, lambda x: isinstance(x, MyClass)) - [obj, ..., ] - - Returns ``[obj]`` if such a chain could not be found. - - .. versionadded:: 1.7 - """ - return _find_chain(obj, predicate, gc.get_referents, - max_depth=max_depth, extra_ignore=extra_ignore)[::-1] - - -def find_backref_chain(obj, predicate, max_depth=20, extra_ignore=()): - """Find a shortest chain of references leading to obj. - - The start of the chain will be some object that matches your predicate. - - ``predicate`` is a function taking one argument and returning a boolean. - - ``max_depth`` limits the search depth. - - ``extra_ignore`` can be a list of object IDs to exclude those objects from - your search. - - Example: - - >>> find_backref_chain(obj, is_proper_module) - [, ..., obj] - - Returns ``[obj]`` if such a chain could not be found. - - .. versionchanged:: 1.5 - Returns ``obj`` instead of ``None`` when a chain could not be found. - - """ - return _find_chain(obj, predicate, gc.get_referrers, - max_depth=max_depth, extra_ignore=extra_ignore) - - -def show_backrefs(objs, max_depth=3, extra_ignore=(), filter=None, too_many=10, - highlight=None, filename=None, extra_info=None, - refcounts=False, shortnames=True, output=None): - """Generate an object reference graph ending at ``objs``. - - The graph will show you what objects refer to ``objs``, directly and - indirectly. - - ``objs`` can be a single object, or it can be a list of objects. If - unsure, wrap the single object in a new list. - - ``filename`` if specified, can be the name of a .dot or a image - file, whose extension indicates the desired output format; note - that output to a specific format is entirely handled by GraphViz: - if the desired format is not supported, you just get the .dot - file. If ``filename`` and ``output`` are not specified, ``show_backrefs`` - will try to display the graph inline (if you're using IPython), otherwise - it'll try to produce a .dot file and spawn a viewer (xdot). If xdot is - not available, ``show_backrefs`` will convert the .dot file to a - .png and print its name. - - ``output`` if specified, the GraphViz output will be written to this - file object. ``output`` and ``filename`` should not both be specified. - - Use ``max_depth`` and ``too_many`` to limit the depth and breadth of the - graph. - - Use ``filter`` (a predicate) and ``extra_ignore`` (a list of object IDs) to - remove undesired objects from the graph. - - Use ``highlight`` (a predicate) to highlight certain graph nodes in blue. - - Use ``extra_info`` (a function taking one argument and returning a - string) to report extra information for objects. - - Specify ``refcounts=True`` if you want to see reference counts. - These will mostly match the number of arrows pointing to an object, - but can be different for various reasons. - - Specify ``shortnames=False`` if you want to see fully-qualified type - names ('package.module.ClassName'). By default you get to see only the - class name part. - - Examples: - - >>> show_backrefs(obj) - >>> show_backrefs([obj1, obj2]) - >>> show_backrefs(obj, max_depth=5) - >>> show_backrefs(obj, filter=lambda x: not inspect.isclass(x)) - >>> show_backrefs(obj, highlight=inspect.isclass) - >>> show_backrefs(obj, extra_ignore=[id(locals())]) - - .. versionchanged:: 1.3 - New parameters: ``filename``, ``extra_info``. - - .. versionchanged:: 1.5 - New parameter: ``refcounts``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 2.0 - New parameter: ``output``. - - """ - # For show_backrefs(), it makes sense to stop when reaching a - # module because you'll end up in sys.modules and explode the - # graph with useless clutter. That's why we're specifying - # cull_func here, but not in show_graph(). - return _show_graph(objs, max_depth=max_depth, extra_ignore=extra_ignore, - filter=filter, too_many=too_many, highlight=highlight, - edge_func=gc.get_referrers, swap_source_target=False, - filename=filename, output=output, extra_info=extra_info, - refcounts=refcounts, shortnames=shortnames, - cull_func=is_proper_module) - - -def show_refs(objs, max_depth=3, extra_ignore=(), filter=None, too_many=10, - highlight=None, filename=None, extra_info=None, - refcounts=False, shortnames=True, output=None): - """Generate an object reference graph starting at ``objs``. - - The graph will show you what objects are reachable from ``objs``, directly - and indirectly. - - ``objs`` can be a single object, or it can be a list of objects. If - unsure, wrap the single object in a new list. - - ``filename`` if specified, can be the name of a .dot or a image - file, whose extension indicates the desired output format; note - that output to a specific format is entirely handled by GraphViz: - if the desired format is not supported, you just get the .dot - file. If ``filename`` and ``output`` is not specified, ``show_refs`` will - try to display the graph inline (if you're using IPython), otherwise it'll - try to produce a .dot file and spawn a viewer (xdot). If xdot is - not available, ``show_refs`` will convert the .dot file to a - .png and print its name. - - ``output`` if specified, the GraphViz output will be written to this - file object. ``output`` and ``filename`` should not both be specified. - - Use ``max_depth`` and ``too_many`` to limit the depth and breadth of the - graph. - - Use ``filter`` (a predicate) and ``extra_ignore`` (a list of object IDs) to - remove undesired objects from the graph. - - Use ``highlight`` (a predicate) to highlight certain graph nodes in blue. - - Use ``extra_info`` (a function returning a string) to report extra - information for objects. - - Specify ``refcounts=True`` if you want to see reference counts. - - Examples: - - >>> show_refs(obj) - >>> show_refs([obj1, obj2]) - >>> show_refs(obj, max_depth=5) - >>> show_refs(obj, filter=lambda x: not inspect.isclass(x)) - >>> show_refs(obj, highlight=inspect.isclass) - >>> show_refs(obj, extra_ignore=[id(locals())]) - - .. versionadded:: 1.1 - - .. versionchanged:: 1.3 - New parameters: ``filename``, ``extra_info``. - - .. versionchanged:: 1.5 - Follows references from module objects instead of stopping. - New parameter: ``refcounts``. - - .. versionchanged:: 1.8 - New parameter: ``shortnames``. - - .. versionchanged:: 2.0 - New parameter: ``output``. - """ - return _show_graph(objs, max_depth=max_depth, extra_ignore=extra_ignore, - filter=filter, too_many=too_many, highlight=highlight, - edge_func=gc.get_referents, swap_source_target=True, - filename=filename, extra_info=extra_info, - refcounts=refcounts, shortnames=shortnames, - output=output) - - -def show_chain(*chains, **kw): - """Show a chain (or several chains) of object references. - - Useful in combination with :func:`find_ref_chain` or - :func:`find_backref_chain`, e.g. - - >>> show_chain(find_backref_chain(obj, is_proper_module)) - - You can specify if you want that chain traced backwards or forwards - by passing a ``backrefs`` keyword argument, e.g. - - >>> show_chain(find_ref_chain(obj, is_proper_module), - ... backrefs=False) - - Ideally this shouldn't matter, but for some objects - :func:`gc.get_referrers` and :func:`gc.get_referents` are not perfectly - symmetrical. - - You can specify ``highlight``, ``extra_info``, ``refcounts``, - ``shortnames``, ``filename`` or ``output`` arguments like for - :func:`show_backrefs` or :func:`show_refs`. - - .. versionadded:: 1.5 - - .. versionchanged:: 1.7 - New parameter: ``backrefs``. - - .. versionchanged:: 2.0 - New parameter: ``output``. - - """ - backrefs = kw.pop('backrefs', True) - chains = [chain for chain in chains if chain] # remove empty ones - - def in_chains(x, ids=set(map(id, itertools.chain(*chains)))): - return id(x) in ids - max_depth = max(map(len, chains)) - 1 - if backrefs: - show_backrefs([chain[-1] for chain in chains], max_depth=max_depth, - filter=in_chains, **kw) - else: - show_refs([chain[0] for chain in chains], max_depth=max_depth, - filter=in_chains, **kw) - - -def is_proper_module(obj): - """ - Returns ``True`` if ``obj`` can be treated like a garbage collector root. - - That is, if ``obj`` is a module that is in ``sys.modules``. - - >>> import types - >>> is_proper_module([]) - False - >>> is_proper_module(types) - True - >>> is_proper_module(types.ModuleType('foo')) - False - - .. versionadded:: 1.8 - """ - return ( - inspect.ismodule(obj) - and obj is sys.modules.get(getattr(obj, '__name__', None)) - ) - - -# -# Internal helpers -# - -def _find_chain(obj, predicate, edge_func, max_depth=20, extra_ignore=()): - queue = [obj] - depth = {id(obj): 0} - parent = {id(obj): None} - ignore = set(extra_ignore) - ignore.add(id(extra_ignore)) - ignore.add(id(queue)) - ignore.add(id(depth)) - ignore.add(id(parent)) - ignore.add(id(ignore)) - ignore.add(id(sys._getframe())) # this function - ignore.add(id(sys._getframe(1))) # find_chain/find_backref_chain - gc.collect() - while queue: - target = queue.pop(0) - if predicate(target): - chain = [target] - while parent[id(target)] is not None: - target = parent[id(target)] - chain.append(target) - return chain - tdepth = depth[id(target)] - if tdepth < max_depth: - referrers = edge_func(target) - ignore.add(id(referrers)) - for source in referrers: - if id(source) in ignore: - continue - if id(source) not in depth: - depth[id(source)] = tdepth + 1 - parent[id(source)] = target - queue.append(source) - return [obj] # not found - - -def _show_graph(objs, edge_func, swap_source_target, - max_depth=3, extra_ignore=(), filter=None, too_many=10, - highlight=None, filename=None, extra_info=None, - refcounts=False, shortnames=True, output=None, - cull_func=None): - if not _isinstance(objs, (list, tuple)): - objs = [objs] - - is_interactive = False - if filename and output: - raise ValueError('Cannot specify both output and filename.') - elif output: - f = output - elif filename and filename.endswith('.dot'): - f = codecs.open(filename, 'w', encoding='utf-8') - dot_filename = filename - elif IS_INTERACTIVE: - is_interactive = True - f = StringIO() - else: - fd, dot_filename = tempfile.mkstemp(prefix='objgraph-', - suffix='.dot', text=True) - f = os.fdopen(fd, "w") - if getattr(f, 'encoding', None): - # Python 3 will wrap the file in the user's preferred encoding - # Re-wrap it for utf-8 - import io - f = io.TextIOWrapper(f.detach(), 'utf-8') - f.write('digraph ObjectGraph {\n' - ' node[shape=box, style=filled, fillcolor=white];\n') - queue = [] - depth = {} - ignore = set(extra_ignore) - ignore.add(id(objs)) - ignore.add(id(extra_ignore)) - ignore.add(id(queue)) - ignore.add(id(depth)) - ignore.add(id(ignore)) - ignore.add(id(sys._getframe())) # this function - ignore.add(id(sys._getframe().f_locals)) - ignore.add(id(sys._getframe(1))) # show_refs/show_backrefs - ignore.add(id(sys._getframe(1).f_locals)) - for obj in objs: - f.write(' %s[fontcolor=red];\n' % (_obj_node_id(obj))) - depth[id(obj)] = 0 - queue.append(obj) - del obj - gc.collect() - nodes = 0 - while queue: - nodes += 1 - # The names "source" and "target" are reversed here because - # originally there was just show_backrefs() and we were - # traversing the reference graph backwards. - target = queue.pop(0) - tdepth = depth[id(target)] - f.write(' %s[label="%s"];\n' % (_obj_node_id(target), - _obj_label(target, extra_info, - refcounts, shortnames))) - h, s, v = _gradient((0, 0, 1), (0, 0, .3), tdepth, max_depth) - if inspect.ismodule(target): - h = .3 - s = 1 - if highlight and highlight(target): - h = .6 - s = .6 - v = 0.5 + v * 0.5 - f.write(' %s[fillcolor="%g,%g,%g"];\n' - % (_obj_node_id(target), h, s, v)) - if v < 0.5: - f.write(' %s[fontcolor=white];\n' % (_obj_node_id(target))) - if hasattr(getattr(target, '__class__', None), '__del__'): - f.write(' %s->%s_has_a_del[color=red,style=dotted,' - 'len=0.25,weight=10];\n' % (_obj_node_id(target), - _obj_node_id(target))) - f.write(' %s_has_a_del[label="__del__",shape=doublecircle,' - 'height=0.25,color=red,fillcolor="0,.5,1",fontsize=6];\n' - % (_obj_node_id(target))) - if tdepth >= max_depth: - continue - if cull_func is not None and cull_func(target): - continue - neighbours = edge_func(target) - ignore.add(id(neighbours)) - n = 0 - skipped = 0 - for source in neighbours: - if id(source) in ignore: - continue - if filter and not filter(source): - continue - if n >= too_many: - skipped += 1 - continue - if swap_source_target: - srcnode, tgtnode = target, source - else: - srcnode, tgtnode = source, target - elabel = _edge_label(srcnode, tgtnode, shortnames) - f.write(' %s -> %s%s;\n' % (_obj_node_id(srcnode), - _obj_node_id(tgtnode), elabel)) - if id(source) not in depth: - depth[id(source)] = tdepth + 1 - queue.append(source) - n += 1 - del source - del neighbours - if skipped > 0: - h, s, v = _gradient((0, 1, 1), (0, 1, .3), tdepth + 1, max_depth) - if swap_source_target: - label = "%d more references" % skipped - edge = "%s->too_many_%s" % (_obj_node_id(target), - _obj_node_id(target)) - else: - label = "%d more backreferences" % skipped - edge = "too_many_%s->%s" % (_obj_node_id(target), - _obj_node_id(target)) - f.write(' %s[color=red,style=dotted,len=0.25,weight=10];\n' - % edge) - f.write(' too_many_%s[label="%s",shape=box,height=0.25,' - 'color=red,fillcolor="%g,%g,%g",fontsize=6];\n' - % (_obj_node_id(target), label, h, s, v)) - f.write(' too_many_%s[fontcolor=white];\n' - % (_obj_node_id(target))) - f.write("}\n") - - if output: - return - - if is_interactive: - return graphviz.Source(f.getvalue()) - else: - # The file should only be closed if this function was in charge of - # opening the file. - f.close() - print("Graph written to %s (%d nodes)" % (dot_filename, nodes)) - _present_graph(dot_filename, filename) - - -def _present_graph(dot_filename, filename=None): - """Present a .dot file to the user in the requested fashion. - - If ``filename`` is provided, runs ``dot`` to convert the .dot file - into the desired format, determined by the filename extension. - - If ``filename`` is not provided, tries to launch ``xdot``, a - graphical .dot file viewer. If ``xdot`` is not present on the system, - converts the graph to a PNG. - """ - if filename == dot_filename: - # nothing to do, the user asked for a .dot file and got it - return - if not filename and _program_in_path('xdot'): - print("Spawning graph viewer (xdot)") - subprocess.Popen(['xdot', dot_filename], close_fds=True) - elif _program_in_path('dot'): - if not filename: - print("Graph viewer (xdot) not found, generating a png instead") - filename = dot_filename[:-4] + '.png' - stem, ext = os.path.splitext(filename) - cmd = ['dot', '-T' + ext[1:], '-o' + filename, dot_filename] - dot = subprocess.Popen(cmd, close_fds=False) - dot.wait() - if dot.returncode != 0: - # XXX: shouldn't this go to stderr or a log? - print('dot failed (exit code %d) while executing "%s"' - % (dot.returncode, ' '.join(cmd))) - else: - print("Image generated as %s" % filename) - else: - if not filename: - print("Graph viewer (xdot) and image renderer (dot) not found," - " not doing anything else") - else: - print("Image renderer (dot) not found, not doing anything else") - - -def _obj_node_id(obj): - return ('o%d' % id(obj)).replace('-', '_') - - -def _obj_label(obj, extra_info=None, refcounts=False, shortnames=True): - if shortnames: - label = [_short_typename(obj)] - else: - label = [_long_typename(obj)] - if refcounts: - label[0] += ' [%d]' % (sys.getrefcount(obj) - 4) - # Why -4? To ignore the references coming from - # obj_label's frame (obj) - # show_graph's frame (target variable) - # sys.getrefcount()'s argument - # something else that doesn't show up in gc.get_referrers() - label.append(_safe_repr(obj)) - if extra_info: - label.append(str(extra_info(obj))) - return _quote('\n'.join(label)) - - -def _quote(s): - return (s.replace("\\", "\\\\") - .replace("\"", "\\\"") - .replace("\n", "\\n") - .replace("\0", "\\\\0")) - - -def _get_obj_type(obj): - objtype = type(obj) - if type(obj) == InstanceType: - objtype = obj.__class__ - return objtype - - -def _short_typename(obj): - return _get_obj_type(obj).__name__ - - -def _long_typename(obj): - objtype = _get_obj_type(obj) - name = objtype.__name__ - module = getattr(objtype, '__module__', None) - if module: - return '%s.%s' % (module, name) - else: - return name - - -def _safe_repr(obj): - try: - return _short_repr(obj) - except Exception: - return '(unrepresentable)' - - -def _name_or_repr(value): - try: - result = value.__name__ - except AttributeError: - result = repr(value)[:40] - - if _isinstance(result, basestring): - return result - else: - return repr(value)[:40] - - -def _short_repr(obj): - if _isinstance(obj, (type, types.ModuleType, types.BuiltinMethodType, - types.BuiltinFunctionType)): - return _name_or_repr(obj) - if _isinstance(obj, types.MethodType): - name = _name_or_repr(obj.__func__) - if obj.__self__: - return name + ' (bound)' - else: - return name - # NB: types.LambdaType is an alias for types.FunctionType! - if _isinstance(obj, types.LambdaType) and obj.__name__ == '': - return 'lambda: %s:%s' % (os.path.basename(obj.__code__.co_filename), - obj.__code__.co_firstlineno) - if _isinstance(obj, types.FrameType): - return '%s:%s' % (obj.f_code.co_filename, obj.f_lineno) - if _isinstance(obj, (tuple, list, dict, set)): - return '%d items' % len(obj) - return repr(obj)[:40] - - -def _gradient(start_color, end_color, depth, max_depth): - if max_depth == 0: - # avoid division by zero - return start_color - h1, s1, v1 = start_color - h2, s2, v2 = end_color - f = float(depth) / max_depth - h = h1 * (1-f) + h2 * f - s = s1 * (1-f) + s2 * f - v = v1 * (1-f) + v2 * f - return h, s, v - - -def _edge_label(source, target, shortnames=True): - if (_isinstance(target, dict) - and target is getattr(source, '__dict__', None)): - return ' [label="__dict__",weight=10]' - if _isinstance(source, types.FrameType): - if target is source.f_locals: - return ' [label="f_locals",weight=10]' - if target is source.f_globals: - return ' [label="f_globals",weight=10]' - if _isinstance(source, types.MethodType): - try: - if target is source.__self__: - return ' [label="__self__",weight=10]' - if target is source.__func__: - return ' [label="__func__",weight=10]' - except AttributeError: # pragma: nocover - # Python < 2.6 compatibility - if target is source.im_self: - return ' [label="im_self",weight=10]' - if target is source.im_func: - return ' [label="im_func",weight=10]' - if _isinstance(source, types.FunctionType): - for k in dir(source): - if target is getattr(source, k): - return ' [label="%s",weight=10]' % _quote(k) - if _isinstance(source, dict): - for k, v in iteritems(source): - if v is target: - if _isinstance(k, basestring) and _is_identifier(k): - return ' [label="%s",weight=2]' % _quote(k) - else: - if shortnames: - tn = _short_typename(k) - else: - tn = _long_typename(k) - return ' [label="%s"]' % _quote(tn + "\n" + _safe_repr(k)) - return '' - - -_is_identifier = re.compile('[a-zA-Z_][a-zA-Z_0-9]*$').match - - -def _program_in_path(program): - # XXX: Consider using distutils.spawn.find_executable or shutil.which - path = os.environ.get("PATH", os.defpath).split(os.pathsep) - path = [os.path.join(dir, program) for dir in path] - path = [True for file in path - if os.path.isfile(file) or os.path.isfile(file + '.exe')] - return bool(path) diff --git a/src/py/bbctrl/State.py b/src/py/bbctrl/State.py index d60de7b..89badcc 100644 --- a/src/py/bbctrl/State.py +++ b/src/py/bbctrl/State.py @@ -1,12 +1,24 @@ import traceback import copy +import json import uuid import os +import socket import bbctrl +import iw_parse +from tornado import gen from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler +def call_get_output(cmd): + p = subprocess.Popen(cmd, stdout=subprocess.PIPE) + s = p.communicate()[0].decode('utf-8') + if p.returncode: + raise HTTPError(400, 'Command failed') + return s + + class UploadChangeHandler(FileSystemEventHandler): def __init__(self, state): self.state = state @@ -64,6 +76,36 @@ class State(object): self), self.ctrl.get_upload(), recursive=True) observer.start() + self._updateNetworkInfo() + + @gen.coroutine + def _updateNetworkInfo(self): + try: + ipAddresses = call_get_output(['hostname', '-I']).split() + except: + ipAddresses = "" + + hostname = socket.gethostname() + + try: + wifi = json.loads(call_get_output(['config-wifi', '-j'])) + except: + wifi = {'enabled': False} + + try: + lines = iw_parse.call_iwlist().decode("utf-8").split("\n") + wifi['networks'] = iw_parse.get_parsed_cells(lines) + except: + wifi['networks'] = [] + + self.set('networkInfo', { + 'ipAddresses': ipAddresses, + 'hostname': hostname, + 'wifi': wifi + }) + + self.timeout = self.ctrl.ioloop.call_later(5, self._updateNetworkInfo) + def reset(self): # Unhome all motors for i in range(4): @@ -81,8 +123,6 @@ class State(object): if not os.path.exists(upload): os.mkdir(upload) - from shutil import copy - copy(bbctrl.get_resource('http/buildbotics.nc'), upload) for path in os.listdir(upload): if os.path.isfile(upload + '/' + path): @@ -170,8 +210,11 @@ class State(object): return name - def has(self, name): return self.resolve(name) in self.vars - def set_callback(self, name, cb): self.callbacks[self.resolve(name)] = cb + def has(self, name): + return self.resolve(name) in self.vars + + def set_callback(self, name, cb): + self.callbacks[self.resolve(name)] = cb def set(self, name, value): name = self.resolve(name) @@ -233,7 +276,8 @@ class State(object): self.listeners.append(listener) listener(self.vars) - def remove_listener(self, listener): self.listeners.remove(listener) + def remove_listener(self, listener): + self.listeners.remove(listener) def set_machine_vars(self, vars): # Record all machine vars, indexed or otherwise @@ -284,7 +328,8 @@ class State(object): if motor_axis == axis.lower() and self.vars.get('%dme' % motor, 0): return motor - def is_axis_homed(self, axis): return self.get('%s_homed' % axis, False) + def is_axis_homed(self, axis): + return self.get('%s_homed' % axis, False) def is_axis_enabled(self, axis): motor = self.find_motor(axis) diff --git a/src/py/bbctrl/Web.py b/src/py/bbctrl/Web.py index 15892c8..bfb8679 100644 --- a/src/py/bbctrl/Web.py +++ b/src/py/bbctrl/Web.py @@ -1,6 +1,5 @@ import os import re -import json import tornado import sockjs.tornado import datetime @@ -10,7 +9,6 @@ from tornado.web import HTTPError from tornado import gen import bbctrl -import iw_parse def call_get_output(cmd): @@ -23,11 +21,17 @@ def call_get_output(cmd): class RebootHandler(bbctrl.APIHandler): def put_ok(self): - subprocess.Popen('reboot') + subprocess.Popen(['plymouth', 'show-splash']) + subprocess.Popen(['plymouth', 'change-mode', '--shutdown']) + subprocess.Popen(['killall', 'xinit']) + subprocess.Popen(['reboot']) class ShutdownHandler(bbctrl.APIHandler): def put_ok(self): + subprocess.Popen(['plymouth', 'show-splash']) + subprocess.Popen(['plymouth', 'change-mode', '--shutdown']) + subprocess.Popen(['killall', 'xinit']) subprocess.Popen(['shutdown', '-h', 'now']) @@ -101,31 +105,6 @@ class HostnameHandler(bbctrl.APIHandler): class NetworkHandler(bbctrl.APIHandler): - def get(self): - try: - ipAddresses = call_get_output(['hostname', '-I']).split() - except: - ipAddresses = "" - - hostname = socket.gethostname() - - try: - wifi = json.loads(call_get_output(['config-wifi', '-j'])) - except: - wifi = {'enabled': False} - - try: - lines = iw_parse.call_iwlist().decode("utf-8").split("\n") - wifi['networks'] = iw_parse.get_parsed_cells(lines) - except: - wifi['networks'] = [] - - self.write_json({ - 'ipAddresses': ipAddresses, - 'hostname': hostname, - 'wifi': wifi - }) - def put(self): if self.get_ctrl().args.demo: raise HTTPError(400, 'Cannot configure WiFi in demo mode') @@ -267,14 +246,6 @@ class HomeHandler(bbctrl.APIHandler): self.get_ctrl().mach.home(axis) -class DevmodeHandler(bbctrl.APIHandler): - def put_ok(self, command, *args): - if command == "/probe": - self.get_ctrl().mach.fake_probe_contact() - else: - raise HTTPError(400, 'Not implemented') - - class StartHandler(bbctrl.APIHandler): def put_ok(self): self.get_ctrl().mach.start() @@ -383,13 +354,34 @@ class ScreenRotationHandler(bbctrl.APIHandler): text = config.read() text = transformationMatrixPattern.sub(r'\1\2\3\5', text) if rotated: - text = matchIsTouchscreenPattern.sub(r'\1\2\3\2Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"\1\4', text) + text = matchIsTouchscreenPattern.sub( + r'\1\2\3\2Option "TransformationMatrix" "-1 0 1 0 -1 1 0 0 1"\1\4', text) with open("/usr/share/X11/xorg.conf.d/40-libinput.conf", 'wt') as config: config.write(text) subprocess.run('reboot') +class TimeHandler(bbctrl.APIHandler): + def get(self): + timeinfo = call_get_output(['timedatectl']) + timezones = call_get_output( + ['timedatectl', 'list-timezones', '--no-pager']) + self.get_log('TimeHandler').info( + 'Time stuff: {}, {}'.format(timeinfo, timezones)) + + self.write_json({ + 'timeinfo': timeinfo, + 'timezones': timezones + }) + + def put_ok(self): + datetime = self.json['datetime'] + timezone = self.json['timezone'] + subprocess.Popen(['timedatectl', 'set-time', datetime]) + subprocess.Popen(['timedatectl', 'set-timezone', timezone]) + + # Base class for Web Socket connections class ClientConnection(object): def __init__(self, app): @@ -509,7 +501,6 @@ class Web(tornado.web.Application): (r'/api/file(/[^/]+)?', bbctrl.FileHandler), (r'/api/path/([^/]+)((/positions)|(/speeds))?', PathHandler), (r'/api/home(/[xyzabcXYZABC]((/set)|(/clear))?)?', HomeHandler), - (r'/api/devmode((/probe))?', DevmodeHandler), (r'/api/start', StartHandler), (r'/api/estop', EStopHandler), (r'/api/clear', ClearHandler), @@ -526,6 +517,7 @@ class Web(tornado.web.Application): (r'/api/jog', JogHandler), (r'/api/video', bbctrl.VideoHandler), (r'/api/screen-rotation', ScreenRotationHandler), + (r'/api/time', TimeHandler), (r'/(.*)', StaticFileHandler, {'path': bbctrl.get_resource('http/'), 'default_filename': 'index.html'}), @@ -545,7 +537,8 @@ class Web(tornado.web.Application): print('Listening on http://%s:%d/' % (args.addr, args.port)) - def opened(self, ctrl): ctrl.clear_timeout() + def opened(self, ctrl): + ctrl.clear_timeout() def closed(self, ctrl): # Time out clients in demo mode diff --git a/src/py/bbctrl/__init__.py b/src/py/bbctrl/__init__.py index c5cae69..3b5c03f 100644 --- a/src/py/bbctrl/__init__.py +++ b/src/py/bbctrl/__init__.py @@ -1,33 +1,5 @@ #!/usr/bin/env python3 -################################################################################ -# # -# This file is part of the Buildbotics firmware. # -# # -# Copyright (c) 2015 - 2018, Buildbotics LLC # -# All rights reserved. # -# # -# This file ("the software") is free software: you can redistribute it # -# and/or modify it under the terms of the GNU General Public License, # -# version 2 as published by the Free Software Foundation. You should # -# have received a copy of the GNU General Public License, version 2 # -# along with the software. If not, see . # -# # -# The software is distributed in the hope that it will be useful, but # -# WITHOUT ANY WARRANTY; without even the implied warranty of # -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # -# Lesser General Public License for more details. # -# # -# You should have received a copy of the GNU Lesser General Public # -# License along with the software. If not, see # -# . # -# # -# For information regarding this software email: # -# "Joseph Coffland" # -# # -################################################################################ - -import os import sys import signal import tornado @@ -53,13 +25,11 @@ from bbctrl.Comm import Comm from bbctrl.CommandQueue import CommandQueue from bbctrl.Camera import Camera, VideoHandler from bbctrl.AVR import AVR -from bbctrl.AVREmu import AVREmu from bbctrl.IOLoop import IOLoop from bbctrl.MonitorTemp import MonitorTemp import bbctrl.Cmd as Cmd import bbctrl.v4l2 as v4l2 import bbctrl.Log as log -import bbctrl.ObjGraph as ObjGraph ctrl = None @@ -69,7 +39,7 @@ def get_resource(path): return resource_filename(Requirement.parse('bbctrl'), 'bbctrl/' + path) -def on_exit(sig = 0, func = None): +def on_exit(sig=0, func=None): global ctrl print('Exit handler triggered: signal = %d', sig) @@ -85,76 +55,46 @@ def time_str(): return datetime.datetime.now().strftime('%Y%m%d-%H:%M:%S') - -class Debugger: - def __init__(self, ioloop, freq = 60 * 15, depth = 100): - self.ioloop = ioloop - self.freq = freq - self.depth = depth - self._callback() - - - def _callback(self): - with open('bbctrl-debug-%s.log' % time_str(), 'w') as log: - def line(name): - log.write('==== ' + name + ' ' + '=' * (74 - len(name)) + '\n') - - line('Common') - ObjGraph.show_most_common_types(limit = self.depth, file = log) - - log.write('\n') - line('Growth') - ObjGraph.show_growth(limit = self.depth, file = log) - - log.write('\n') - line('New IDs') - ObjGraph.get_new_ids(limit = self.depth, file = log) - - log.flush() - self.ioloop.call_later(self.freq, self._callback) - - - def parse_args(): parser = argparse.ArgumentParser( - description = 'Buildbotics Machine Controller') + description='Buildbotics Machine Controller') - parser.add_argument('-p', '--port', default = 80, - type = int, help = 'HTTP port') - parser.add_argument('-a', '--addr', metavar = 'IP', default = '0.0.0.0', - help = 'HTTP address to bind') - parser.add_argument('-s', '--serial', default = '/dev/ttyAMA0', - help = 'Serial device') - parser.add_argument('-b', '--baud', default = 230400, type = int, - help = 'Serial baud rate') - parser.add_argument('--i2c-port', default = 1, type = int, - help = 'I2C port') - parser.add_argument('--avr-addr', default = 0x2b, type = int, - help = 'AVR I2C address') - parser.add_argument('--pwr-addr', default = 0x60, type = int, - help = 'Power AVR I2C address') - parser.add_argument('-v', '--verbose', action = 'store_true', - help = 'Verbose output') - parser.add_argument('-l', '--log', metavar = "FILE", - help = 'Set a log file') - parser.add_argument('--disable-camera', action = 'store_true', - help = 'Disable the camera') - parser.add_argument('--width', default = 640, type = int, - help = 'Camera width') - parser.add_argument('--height', default = 480, type = int, - help = 'Camera height') - parser.add_argument('--fps', default = 15, type = int, - help = 'Camera frames per second') - parser.add_argument('--camera-clients', default = 4, - help = 'Maximum simultaneous camera clients') - parser.add_argument('--demo', action = 'store_true', - help = 'Enter demo mode') - parser.add_argument('--debug', default = 0, type = int, - help = 'Enable debug mode and set frequency in seconds') - parser.add_argument('--fast-emu', action = 'store_true', - help = 'Enter demo mode') - parser.add_argument('--client-timeout', default = 5 * 60, type = int, - help = 'Demo client timeout in seconds') + parser.add_argument('-p', '--port', default=80, + type=int, help='HTTP port') + parser.add_argument('-a', '--addr', metavar='IP', default='0.0.0.0', + help='HTTP address to bind') + parser.add_argument('-s', '--serial', default='/dev/ttyAMA0', + help='Serial device') + parser.add_argument('-b', '--baud', default=230400, type=int, + help='Serial baud rate') + parser.add_argument('--i2c-port', default=1, type=int, + help='I2C port') + parser.add_argument('--avr-addr', default=0x2b, type=int, + help='AVR I2C address') + parser.add_argument('--pwr-addr', default=0x60, type=int, + help='Power AVR I2C address') + parser.add_argument('-v', '--verbose', action='store_true', + help='Verbose output') + parser.add_argument('-l', '--log', metavar="FILE", + help='Set a log file') + parser.add_argument('--disable-camera', action='store_true', + help='Disable the camera') + parser.add_argument('--width', default=640, type=int, + help='Camera width') + parser.add_argument('--height', default=480, type=int, + help='Camera height') + parser.add_argument('--fps', default=15, type=int, + help='Camera frames per second') + parser.add_argument('--camera-clients', default=4, + help='Maximum simultaneous camera clients') + parser.add_argument('--demo', action='store_true', + help='Enter demo mode') + parser.add_argument('--debug', default=0, type=int, + help='Enable debug mode and set frequency in seconds') + parser.add_argument('--fast-emu', action='store_true', + help='Enter demo mode') + parser.add_argument('--client-timeout', default=5 * 60, type=int, + help='Demo client timeout in seconds') return parser.parse_args() @@ -170,16 +110,15 @@ def run(): # Create ioloop ioloop = tornado.ioloop.IOLoop.current() - # Set ObjGraph signal handler - if args.debug: Debugger(ioloop, args.debug) - # Start server web = Web(args, ioloop) try: ioloop.start() - except KeyboardInterrupt: on_exit() + except KeyboardInterrupt: + on_exit() -if __name__ == '__main__': run() +if __name__ == '__main__': + run() diff --git a/src/resources/buildbotics.nc b/src/resources/buildbotics.nc deleted file mode 100644 index 8c5ddb0..0000000 --- a/src/resources/buildbotics.nc +++ /dev/null @@ -1,403 +0,0 @@ -G21 -(File: 'buildbotics_logo.tpl') -G0 Z3 -F1600 -M3 S10000 -M6 T2 -G0 X59.25 Y5.85 -G1 Z-1.5 -G1 X61.68 Y6.7 -G1 X63.86 Y8.07 -G1 X65.68 Y9.89 -G1 X67.05 Y12.07 -G1 X67.9 Y14.5 -G1 X68.2 Y17.09 -G1 Y56.6 -G1 X67.73 Y59.04 -G1 X50.8 -G1 Y34.9 -G1 X50.65 Y34.55 -G1 X50.3 Y34.4 -G1 X23.46 -G1 X23.1 Y34.55 -G1 X22.96 Y34.9 -G1 X22.98 Y49.88 -G1 X22.96 Y59.05 -G1 X22.41 -G1 X19.26 -G1 X6.04 -G1 X5.56 Y56.53 -G1 Y17.09 -G1 X5.85 Y14.5 -G1 X6.7 Y12.07 -G1 X8.07 Y9.89 -G1 X9.89 Y8.07 -G1 X12.07 Y6.7 -G1 X14.5 Y5.85 -G1 X17.09 Y5.56 -G1 X56.67 -G1 X59.25 Y5.85 -G0 Z3 -G0 X64.26 Y64.72 -G1 Z-1.5 -G1 X61.78 Y66.52 -G1 X58.91 Y67.68 -G1 X56.54 Y68.08 -G1 X17.22 -G1 X14.84 Y67.68 -G1 X11.97 Y66.52 -G1 X9.49 Y64.72 -G1 X8.08 Y63.16 -G1 X27.35 -G1 X27.89 Y63.45 -G1 X27.96 Y63.48 -G1 X31.48 Y64.75 -G1 X31.52 Y64.76 -G1 X31.56 Y64.77 -G1 X35.19 Y65.41 -G1 X35.26 -G1 X35.97 Y65.44 -G1 X36.04 Y65.45 -G1 X36.07 -G1 X36.82 Y65.44 -G1 X36.83 -G1 X36.89 -G1 X36.95 -G1 X36.97 -G1 X37.72 Y65.43 -G1 X37.74 -G1 X37.8 -G1 X37.81 -G1 X37.88 -G1 X37.89 -G1 X38.65 Y65.38 -G1 X38.68 -G1 X38.75 Y65.37 -G1 X39.38 Y65.32 -G1 X39.44 Y65.31 -G1 X42.68 Y64.64 -G1 X42.76 Y64.62 -G1 X45.87 Y63.44 -G1 X45.93 Y63.41 -G1 X46.4 Y63.16 -G1 X65.67 -G1 X64.26 Y64.72 -G0 Z3 -G0 X36.88 Y9.4 -G1 Z-1.5 -G1 X37.31 Y9.64 -G1 X39.58 Y13.48 -G1 X39.63 Y13.6 -G1 X39.65 Y13.73 -G1 Y27.54 -G1 X41.67 -G1 Y25.39 -G1 X41.75 Y25.12 -G1 X41.97 Y24.93 -G1 X46.41 Y22.92 -G1 Y19.97 -G1 X45.44 -G1 X45.08 Y19.82 -G1 X44.94 Y19.47 -G1 Y13.73 -G1 X45.08 Y13.38 -G1 X45.44 Y13.23 -G1 X49.94 Y13.24 -G1 X50.29 Y13.39 -G1 X50.44 Y13.74 -G1 Y19.47 -G1 X50.29 Y19.83 -G1 X49.93 Y19.97 -G1 X48.92 -G1 Y23.61 -G1 X48.84 Y23.88 -G1 X48.63 Y24.06 -G1 X44.19 Y26.12 -G1 Y27.54 -G1 X49.22 -G1 X49.33 Y27.56 -G1 X49.44 Y27.6 -G1 X50.13 Y27.94 -G1 X50.25 Y28.02 -G1 X50.34 Y28.13 -G1 X50.73 Y28.77 -G1 X50.78 Y28.89 -G1 X50.8 Y29.03 -G1 Y33.05 -G1 Y34.25 -G1 Y34.65 -G1 X50.66 Y35.01 -G1 X50.3 Y35.15 -G1 X23.46 -G1 X23.1 Y35.01 -G1 X22.96 Y34.65 -G1 Y29.07 -G1 X22.97 Y28.94 -G1 X23.02 Y28.82 -G1 X23.4 Y28.17 -G1 X23.49 Y28.06 -G1 X23.6 Y27.98 -G1 X24.29 Y27.6 -G1 X24.4 Y27.56 -G1 X24.52 Y27.54 -G1 X25.55 -G1 Y26.4 -G1 X23.4 Y25.52 -G1 X23.17 Y25.33 -G1 X23.09 Y25.06 -G1 Y17.54 -G1 X23.23 Y17.19 -G1 X23.59 Y17.04 -G1 X24.6 -G1 Y10.36 -G1 X24.62 Y10.23 -G1 X24.66 Y10.11 -G1 X24.8 Y9.88 -G1 X24.88 Y9.77 -G1 X24.99 Y9.68 -G1 X25.25 Y9.54 -G1 X25.37 Y9.5 -G1 X25.49 Y9.48 -G1 X26.53 -G1 X26.65 Y9.49 -G1 X26.76 Y9.54 -G1 X27.01 Y9.66 -G1 X27.12 Y9.74 -G1 X27.21 Y9.85 -G1 X27.35 Y10.09 -G1 X27.41 Y10.22 -G1 X27.43 Y10.35 -G1 Y10.43 -G1 X27.47 Y17.04 -G1 X28.57 -G1 X28.92 Y17.19 -G1 X29.07 Y17.54 -G1 Y24.64 -G1 X30.72 Y25.3 -G1 X30.95 Y25.49 -G1 X31.03 Y25.77 -G1 X31.02 Y27.54 -G1 X34.03 -G1 Y13.73 -G1 X34.05 Y13.59 -G1 X34.1 Y13.47 -G1 X36.45 Y9.64 -G1 X36.88 Y9.4 -G0 Z3 -G0 X49.94 Y10.82 -G1 Z-1.5 -G1 X50.29 Y10.97 -G1 X50.44 Y11.32 -G1 Y13.34 -G1 X50.29 Y13.69 -G1 X49.94 Y13.84 -G1 X45.44 -G1 X45.08 Y13.69 -G1 X44.94 Y13.34 -G1 Y11.32 -G1 X45.08 Y10.97 -G1 X45.44 Y10.82 -G1 X49.94 -G0 Z3 -G0 X48.46 Y9.7 -G1 Z-1.5 -G1 X48.59 Y9.72 -G1 X48.71 Y9.77 -G1 X50.03 Y10.53 -G1 X50.21 Y10.71 -G1 X50.28 Y10.96 -G1 X50.14 Y11.31 -G1 X49.78 Y11.46 -G1 X45.62 -G1 X45.14 Y11.09 -G1 X45.37 Y10.53 -G1 X46.69 Y9.77 -G1 X46.81 Y9.72 -G1 X46.94 Y9.7 -G1 X48.46 -G0 Z3 -G0 X50.3 Y34.4 -G1 Z-1.5 -G1 X50.66 Y34.55 -G1 X50.8 Y34.9 -G1 Y49.88 -G1 X50.79 Y59.52 -G1 X50.76 Y59.69 -G1 X50.67 Y59.84 -G1 X50.09 Y60.52 -G1 X50.06 Y60.55 -G1 X50.02 Y60.58 -G1 X47.89 Y62.26 -G1 X47.85 Y62.28 -G1 X47.81 Y62.31 -G1 X44.46 Y64.03 -G1 X44.41 Y64.05 -G1 X44.37 Y64.06 -G1 X40.69 Y65.1 -G1 X40.62 Y65.12 -G1 X37.86 Y65.45 -G1 X37.8 Y65.46 -G1 X36.89 Y65.44 -G1 X36.83 -G1 X36.82 -G1 X36.07 Y65.45 -G1 X36.04 Y65.44 -G1 X35.97 -G1 X35.1 Y65.41 -G1 X35.04 Y65.4 -G1 X32.44 Y64.99 -G1 X32.37 Y64.97 -G1 X28.94 Y63.9 -G1 X28.89 Y63.88 -G1 X28.85 Y63.86 -G1 X25.74 Y62.2 -G1 X25.7 Y62.18 -G1 X25.66 Y62.15 -G1 X23.68 Y60.56 -G1 X23.65 Y60.53 -G1 X23.62 Y60.5 -G1 X23.08 Y59.87 -G1 X22.99 Y59.71 -G1 X22.96 Y59.54 -G1 X22.98 Y49.88 -G1 X22.96 Y34.9 -G1 X23.1 Y34.55 -G1 X23.46 Y34.4 -G1 X50.3 -G0 Z3 -G0 X55.2 Y43.67 -G1 Z-1.5 -G1 Y51.34 -G1 X55.11 Y51.94 -G1 X54.83 Y52.88 -G1 X54.39 Y53.88 -G1 X53.8 Y54.85 -G1 X53.09 Y55.74 -G1 X52.28 Y56.47 -G1 X51.41 Y56.98 -G1 X51.07 Y57.09 -G1 Y43.67 -G1 X55.2 -G0 Z3 -G0 X22.69 Y43.63 -G1 Z-1.5 -G1 Y57.09 -G1 X22.35 Y56.98 -G1 X21.47 Y56.47 -G1 X20.67 Y55.74 -G1 X19.95 Y54.85 -G1 X19.36 Y53.88 -G1 X18.92 Y52.88 -G1 X18.64 Y51.94 -G1 X18.55 Y51.34 -G1 Y43.63 -G1 X22.69 -G0 Z3 -G0 X28.55 Y35.84 -G1 Z-0.99 -G1 X30.11 Y36.15 -G1 X31.43 Y37.03 -G1 X32.32 Y38.35 -G1 X32.63 Y39.91 -G1 X32.32 Y41.47 -G1 X31.43 Y42.79 -G1 X30.11 Y43.68 -G1 X28.55 Y43.99 -G1 X26.99 Y43.68 -G1 X25.67 Y42.79 -G1 X24.79 Y41.47 -G1 X24.48 Y39.91 -G1 X24.79 Y38.35 -G1 X25.67 Y37.03 -G1 X26.99 Y36.15 -G1 X28.55 Y35.84 -G0 Z3 -G0 X45.33 Y35.93 -G1 Z-0.99 -G1 X46.88 Y36.24 -G1 X48.21 Y37.12 -G1 X49.09 Y38.45 -G1 X49.4 Y40 -G1 X49.09 Y41.56 -G1 X48.21 Y42.88 -G1 X46.88 Y43.77 -G1 X45.33 Y44.08 -G1 X43.77 Y43.77 -G1 X42.45 Y42.88 -G1 X41.56 Y41.56 -G1 X41.25 Y40 -G1 X41.56 Y38.45 -G1 X42.45 Y37.12 -G1 X43.77 Y36.24 -G1 X45.33 Y35.93 -G0 Z3 -G0 X45.2 Y39.12 -G1 Z-0.99 -G1 X45.7 Y39.19 -G1 X46.07 Y39.52 -G1 X46.22 Y40 -G1 X46.07 Y40.49 -G1 X45.7 Y40.81 -G1 X45.2 Y40.89 -G1 X44.74 Y40.68 -G1 X44.47 Y40.26 -G1 Y39.75 -G1 X44.74 Y39.33 -G1 X45.2 Y39.12 -G0 Z3 -G0 X28.43 Y39.03 -G1 Z-0.99 -G1 X28.92 Y39.1 -G1 X29.3 Y39.43 -G1 X29.44 Y39.91 -G1 X29.3 Y40.4 -G1 X28.92 Y40.72 -G1 X28.43 Y40.8 -G1 X27.97 Y40.59 -G1 X27.7 Y40.16 -G1 Y39.66 -G1 X27.97 Y39.24 -G1 X28.43 Y39.03 -G0 Z3 -G0 X55.76 Y0 -G1 Z-1.5 -G1 X59.27 Y0.35 -G1 X62.65 Y1.37 -G1 X65.76 Y3.03 -G1 X68.49 Y5.27 -G1 X70.73 Y8 -G1 X72.39 Y11.11 -G1 X73.42 Y14.49 -G1 X73.76 Y18 -G1 Y55.69 -G1 X73.42 Y59.2 -G1 X72.39 Y62.57 -G1 X70.73 Y65.69 -G1 X68.49 Y68.41 -G1 X65.76 Y70.65 -G1 X62.65 Y72.31 -G1 X59.27 Y73.34 -G1 X55.76 Y73.69 -G1 X18 -G1 X14.49 Y73.34 -G1 X11.11 Y72.31 -G1 X8 Y70.65 -G1 X5.27 Y68.41 -G1 X3.03 Y65.69 -G1 X1.37 Y62.57 -G1 X0.35 Y59.2 -G1 X0 Y55.69 -G1 Y18 -G1 X0.35 Y14.49 -G1 X1.37 Y11.11 -G1 X3.03 Y8 -G1 X5.27 Y5.27 -G1 X8 Y3.03 -G1 X11.11 Y1.37 -G1 X14.49 Y0.35 -G1 X18 Y0 -G1 X55.76 -G0 Z3 -M5 -G0 X40 Y75 -M2 diff --git a/src/resources/config-template.json b/src/resources/config-template.json index 5495a73..fad50fb 100644 --- a/src/resources/config-template.json +++ b/src/resources/config-template.json @@ -502,14 +502,14 @@ }, "probe-fast-seek": { "type": "float", - "unit": "mm/m", + "unit": "mm/min", "min": 0, "max": 1000, "default": 200 }, "probe-slow-seek": { "type": "float", - "unit": "mm/m", + "unit": "mm/min", "min": 0, "max": 1000, "default": 25 diff --git a/src/splash/buildbotics.plymouth b/src/splash/buildbotics.plymouth deleted file mode 100644 index 5ce2ae8..0000000 --- a/src/splash/buildbotics.plymouth +++ /dev/null @@ -1,8 +0,0 @@ -[Plymouth Theme] -Name=buildbotics -Description=Buildbotics boot splash -ModuleName=script - -[script] -ImageDir=/usr/share/plymouth/themes/buildbotics -ScriptFile=/usr/share/plymouth/themes/buildbotics/buildbotics.script diff --git a/src/splash/splash.png b/src/splash/splash.png deleted file mode 100644 index 274371e..0000000 Binary files a/src/splash/splash.png and /dev/null differ diff --git a/src/svelte-components/package-lock.json b/src/svelte-components/package-lock.json index 9b7bc07..25137e5 100644 --- a/src/svelte-components/package-lock.json +++ b/src/svelte-components/package-lock.json @@ -8,19 +8,21 @@ "name": "svelte-components", "version": "0.0.0", "devDependencies": { - "@sveltejs/kit": "^1.0.0-next.357", - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.49", + "@sveltejs/kit": "^1.0.0-next.392", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "@tsconfig/svelte": "^3.0.0", "node-sass": "^7.0.1", "polyfill-object.fromentries": "^1.0.1", "smui-theme": "^6.0.0-beta.16", - "svelte": "^3.48.0", + "string.prototype.matchall": "^4.0.7", + "svelte": "^3.49.0", "svelte-check": "^2.8.0", "svelte-material-ui": "^6.0.0-beta.16", "svelte-preprocess": "^4.10.7", + "svelte-tiny-virtual-list": "^2.0.5", "tslib": "^2.4.0", "typescript": "^4.7.4", - "vite": "^2.9.13" + "vite": "^3.0.2" } }, "node_modules/@babel/code-frame": { @@ -127,9 +129,9 @@ "dev": true }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true, "engines": { "node": ">=6.0.0" @@ -1514,46 +1516,46 @@ } }, "node_modules/@sveltejs/kit": { - "version": "1.0.0-next.357", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.357.tgz", - "integrity": "sha512-nCAehVybIEpQNnPu61V/EFVdfDb1nBSiQUfW9EcSSDEUbyAMCVBOKZZuzQ0qQDp3xniqRkyDzpBA4wN+ADxHBw==", + "version": "1.0.0-next.392", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.392.tgz", + "integrity": "sha512-od4rDJ/Soq0I7mda7sTbAnNKERHSDEGNa7QBpLA859xgBkwC1JnEIymYOh9dm+hMyHhB0bUoRoaur0qxKLqOOw==", "dev": true, "dependencies": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.48", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "chokidar": "^3.5.3", - "sade": "^1.8.1", - "vite": "^2.9.10" + "sade": "^1.8.1" }, "bin": { "svelte-kit": "svelte-kit.js" }, "engines": { - "node": ">=16.7" + "node": ">=16.9" }, "peerDependencies": { - "svelte": "^3.44.0" + "svelte": "^3.44.0", + "vite": "^3.0.0" } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.49", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", - "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz", + "integrity": "sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^4.2.1", "debug": "^4.3.4", "deepmerge": "^4.2.2", - "kleur": "^4.1.4", + "kleur": "^4.1.5", "magic-string": "^0.26.2", "svelte-hmr": "^0.14.12" }, "engines": { - "node": "^14.13.1 || >= 16" + "node": "^14.18.0 || >= 16" }, "peerDependencies": { "diff-match-patch": "^1.0.5", "svelte": "^3.44.0", - "vite": "^2.9.0" + "vite": "^3.0.0" }, "peerDependenciesMeta": { "diff-match-patch": { @@ -1583,9 +1585,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", - "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", "dev": true }, "node_modules/@types/normalize-package-data": { @@ -1867,6 +1869,19 @@ "node": ">= 10" } }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -2126,6 +2141,22 @@ "node": ">=0.10.0" } }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -2209,6 +2240,60 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -2216,9 +2301,9 @@ "dev": true }, "node_modules/esbuild": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz", - "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", "dev": true, "hasInstallScript": true, "bin": { @@ -2228,32 +2313,32 @@ "node": ">=12" }, "optionalDependencies": { - "esbuild-android-64": "0.14.48", - "esbuild-android-arm64": "0.14.48", - "esbuild-darwin-64": "0.14.48", - "esbuild-darwin-arm64": "0.14.48", - "esbuild-freebsd-64": "0.14.48", - "esbuild-freebsd-arm64": "0.14.48", - "esbuild-linux-32": "0.14.48", - "esbuild-linux-64": "0.14.48", - "esbuild-linux-arm": "0.14.48", - "esbuild-linux-arm64": "0.14.48", - "esbuild-linux-mips64le": "0.14.48", - "esbuild-linux-ppc64le": "0.14.48", - "esbuild-linux-riscv64": "0.14.48", - "esbuild-linux-s390x": "0.14.48", - "esbuild-netbsd-64": "0.14.48", - "esbuild-openbsd-64": "0.14.48", - "esbuild-sunos-64": "0.14.48", - "esbuild-windows-32": "0.14.48", - "esbuild-windows-64": "0.14.48", - "esbuild-windows-arm64": "0.14.48" + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" } }, "node_modules/esbuild-android-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz", - "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", "cpu": [ "x64" ], @@ -2267,9 +2352,9 @@ } }, "node_modules/esbuild-android-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz", - "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", "cpu": [ "arm64" ], @@ -2283,9 +2368,9 @@ } }, "node_modules/esbuild-darwin-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz", - "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", "cpu": [ "x64" ], @@ -2299,9 +2384,9 @@ } }, "node_modules/esbuild-darwin-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz", - "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", "cpu": [ "arm64" ], @@ -2315,9 +2400,9 @@ } }, "node_modules/esbuild-freebsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz", - "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", "cpu": [ "x64" ], @@ -2331,9 +2416,9 @@ } }, "node_modules/esbuild-freebsd-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz", - "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", "cpu": [ "arm64" ], @@ -2347,9 +2432,9 @@ } }, "node_modules/esbuild-linux-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz", - "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", "cpu": [ "ia32" ], @@ -2363,9 +2448,9 @@ } }, "node_modules/esbuild-linux-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz", - "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", "cpu": [ "x64" ], @@ -2379,9 +2464,9 @@ } }, "node_modules/esbuild-linux-arm": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz", - "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", "cpu": [ "arm" ], @@ -2395,9 +2480,9 @@ } }, "node_modules/esbuild-linux-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz", - "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", "cpu": [ "arm64" ], @@ -2411,9 +2496,9 @@ } }, "node_modules/esbuild-linux-mips64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz", - "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", "cpu": [ "mips64el" ], @@ -2427,9 +2512,9 @@ } }, "node_modules/esbuild-linux-ppc64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz", - "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", "cpu": [ "ppc64" ], @@ -2443,9 +2528,9 @@ } }, "node_modules/esbuild-linux-riscv64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz", - "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", "cpu": [ "riscv64" ], @@ -2459,9 +2544,9 @@ } }, "node_modules/esbuild-linux-s390x": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz", - "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", "cpu": [ "s390x" ], @@ -2475,9 +2560,9 @@ } }, "node_modules/esbuild-netbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz", - "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", "cpu": [ "x64" ], @@ -2491,9 +2576,9 @@ } }, "node_modules/esbuild-openbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz", - "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", "cpu": [ "x64" ], @@ -2507,9 +2592,9 @@ } }, "node_modules/esbuild-sunos-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz", - "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", "cpu": [ "x64" ], @@ -2523,9 +2608,9 @@ } }, "node_modules/esbuild-windows-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz", - "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", "cpu": [ "ia32" ], @@ -2539,9 +2624,9 @@ } }, "node_modules/esbuild-windows-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz", - "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", "cpu": [ "x64" ], @@ -2555,9 +2640,9 @@ } }, "node_modules/esbuild-windows-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz", - "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "cpu": [ "arm64" ], @@ -2732,6 +2817,33 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -2773,6 +2885,20 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", @@ -2782,6 +2908,22 @@ "node": ">=0.10.0" } }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -2919,6 +3061,15 @@ "node": ">= 0.4.0" } }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2928,6 +3079,45 @@ "node": ">=8" } }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -3078,10 +3268,24 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "node_modules/internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "node_modules/is-arrayish": { @@ -3090,6 +3294,18 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -3102,6 +3318,34 @@ "node": ">=8" } }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -3114,6 +3358,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -3150,6 +3409,18 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3159,6 +3430,21 @@ "node": ">=0.12.0" } }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -3168,12 +3454,82 @@ "node": ">=0.10.0" } }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -3817,6 +4173,42 @@ "node": ">=0.10.0" } }, + "node_modules/object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -4030,9 +4422,9 @@ } }, "node_modules/psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "node_modules/punycode": { @@ -4198,6 +4590,23 @@ "node": ">=8" } }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -4300,9 +4709,9 @@ } }, "node_modules/rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz", + "integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -4412,9 +4821,9 @@ } }, "node_modules/sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -4498,6 +4907,20 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -4529,12 +4952,12 @@ } }, "node_modules/socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "dev": true, "dependencies": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" }, "engines": { @@ -4726,6 +5149,53 @@ "node": ">=8" } }, + "node_modules/string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4775,9 +5245,9 @@ } }, "node_modules/svelte": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz", - "integrity": "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", + "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", "dev": true, "engines": { "node": ">= 8" @@ -4941,10 +5411,16 @@ "sourcemap-codec": "^1.4.8" } }, + "node_modules/svelte-tiny-virtual-list": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.5.tgz", + "integrity": "sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==", + "dev": true + }, "node_modules/svelte2tsx": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.11.tgz", - "integrity": "sha512-Is95G1wqNvEUJZ9DITRS2zfMwVJRZztMduPs1vJJ0cm65WUg/avBl5vBXjHycQL/qmFpaqa3NG4qWnf7bCHPag==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.12.tgz", + "integrity": "sha512-43ayMivmh1IDCgb+4YDf54YuOJZGCUKFpp37RbfjGgNU+Pmb9HhP+zRXa1pMh4mwSTBfqZS0FbJZP3Q8CSxvvg==", "dev": true, "dependencies": { "dedent-js": "^1.0.1", @@ -5070,6 +5546,21 @@ "node": ">=4.2.0" } }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -5138,21 +5629,21 @@ } }, "node_modules/vite": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz", - "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.2.tgz", + "integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==", "dev": true, "dependencies": { - "esbuild": "^0.14.27", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": "^2.59.0" + "esbuild": "^0.14.47", + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": ">=12.2.0" + "node": "^14.18.0 || >=16.0.0" }, "optionalDependencies": { "fsevents": "~2.3.2" @@ -5160,7 +5651,8 @@ "peerDependencies": { "less": "*", "sass": "*", - "stylus": "*" + "stylus": "*", + "terser": "^5.4.0" }, "peerDependenciesMeta": { "less": { @@ -5171,6 +5663,9 @@ }, "stylus": { "optional": true + }, + "terser": { + "optional": true } } }, @@ -5205,6 +5700,22 @@ "node": ">= 8" } }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -5375,9 +5886,9 @@ "dev": true }, "@jridgewell/resolve-uri": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.8.tgz", - "integrity": "sha512-YK5G9LaddzGbcucK4c8h5tWFmMPBvRZ/uyWmN1/SbBdIvqGUdWGkJ5BAaccgs6XbzVLsqbPJrBSFwKv3kT9i7w==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", "dev": true }, "@jridgewell/sourcemap-codec": { @@ -6744,27 +7255,26 @@ } }, "@sveltejs/kit": { - "version": "1.0.0-next.357", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.357.tgz", - "integrity": "sha512-nCAehVybIEpQNnPu61V/EFVdfDb1nBSiQUfW9EcSSDEUbyAMCVBOKZZuzQ0qQDp3xniqRkyDzpBA4wN+ADxHBw==", + "version": "1.0.0-next.392", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-1.0.0-next.392.tgz", + "integrity": "sha512-od4rDJ/Soq0I7mda7sTbAnNKERHSDEGNa7QBpLA859xgBkwC1JnEIymYOh9dm+hMyHhB0bUoRoaur0qxKLqOOw==", "dev": true, "requires": { - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.48", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "chokidar": "^3.5.3", - "sade": "^1.8.1", - "vite": "^2.9.10" + "sade": "^1.8.1" } }, "@sveltejs/vite-plugin-svelte": { - "version": "1.0.0-next.49", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.49.tgz", - "integrity": "sha512-AKh0Ka8EDgidnxWUs8Hh2iZLZovkETkefO99XxZ4sW4WGJ7VFeBx5kH/NIIGlaNHLcrIvK3CK0HkZwC3Cici0A==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.1.tgz", + "integrity": "sha512-PorCgUounn0VXcpeJu+hOweZODKmGuLHsLomwqSj+p26IwjjGffmYQfVHtiTWq+NqaUuuHWWG7vPge6UFw4Aeg==", "dev": true, "requires": { "@rollup/pluginutils": "^4.2.1", "debug": "^4.3.4", "deepmerge": "^4.2.2", - "kleur": "^4.1.4", + "kleur": "^4.1.5", "magic-string": "^0.26.2", "svelte-hmr": "^0.14.12" } @@ -6788,9 +7298,9 @@ "dev": true }, "@types/node": { - "version": "18.0.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.1.tgz", - "integrity": "sha512-CmR8+Tsy95hhwtZBKJBs0/FFq4XX7sDZHlGGf+0q+BRZfMbOTkzkj0AFAuTyXbObDIoanaBBW0+KEW+m3N16Wg==", + "version": "18.0.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.6.tgz", + "integrity": "sha512-/xUq6H2aQm261exT6iZTMifUySEt4GR5KX8eYyY+C4MSNPqSh9oNIP7tz2GLKTlFaiBbgZNxffoR3CVRG+cljw==", "dev": true }, "@types/normalize-package-data": { @@ -7020,6 +7530,16 @@ "unique-filename": "^1.1.1" } }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -7211,6 +7731,16 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -7282,6 +7812,48 @@ "is-arrayish": "^0.2.1" } }, + "es-abstract": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", + "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.1", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.4", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "regexp.prototype.flags": "^1.4.3", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, "es6-promise": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", @@ -7289,170 +7861,170 @@ "dev": true }, "esbuild": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.48.tgz", - "integrity": "sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.49.tgz", + "integrity": "sha512-/TlVHhOaq7Yz8N1OJrjqM3Auzo5wjvHFLk+T8pIue+fhnhIMpfAzsG6PLVMbFveVxqD2WOp3QHei+52IMUNmCw==", "dev": true, "requires": { - "esbuild-android-64": "0.14.48", - "esbuild-android-arm64": "0.14.48", - "esbuild-darwin-64": "0.14.48", - "esbuild-darwin-arm64": "0.14.48", - "esbuild-freebsd-64": "0.14.48", - "esbuild-freebsd-arm64": "0.14.48", - "esbuild-linux-32": "0.14.48", - "esbuild-linux-64": "0.14.48", - "esbuild-linux-arm": "0.14.48", - "esbuild-linux-arm64": "0.14.48", - "esbuild-linux-mips64le": "0.14.48", - "esbuild-linux-ppc64le": "0.14.48", - "esbuild-linux-riscv64": "0.14.48", - "esbuild-linux-s390x": "0.14.48", - "esbuild-netbsd-64": "0.14.48", - "esbuild-openbsd-64": "0.14.48", - "esbuild-sunos-64": "0.14.48", - "esbuild-windows-32": "0.14.48", - "esbuild-windows-64": "0.14.48", - "esbuild-windows-arm64": "0.14.48" + "esbuild-android-64": "0.14.49", + "esbuild-android-arm64": "0.14.49", + "esbuild-darwin-64": "0.14.49", + "esbuild-darwin-arm64": "0.14.49", + "esbuild-freebsd-64": "0.14.49", + "esbuild-freebsd-arm64": "0.14.49", + "esbuild-linux-32": "0.14.49", + "esbuild-linux-64": "0.14.49", + "esbuild-linux-arm": "0.14.49", + "esbuild-linux-arm64": "0.14.49", + "esbuild-linux-mips64le": "0.14.49", + "esbuild-linux-ppc64le": "0.14.49", + "esbuild-linux-riscv64": "0.14.49", + "esbuild-linux-s390x": "0.14.49", + "esbuild-netbsd-64": "0.14.49", + "esbuild-openbsd-64": "0.14.49", + "esbuild-sunos-64": "0.14.49", + "esbuild-windows-32": "0.14.49", + "esbuild-windows-64": "0.14.49", + "esbuild-windows-arm64": "0.14.49" } }, "esbuild-android-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz", - "integrity": "sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.14.49.tgz", + "integrity": "sha512-vYsdOTD+yi+kquhBiFWl3tyxnj2qZJsl4tAqwhT90ktUdnyTizgle7TjNx6Ar1bN7wcwWqZ9QInfdk2WVagSww==", "dev": true, "optional": true }, "esbuild-android-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz", - "integrity": "sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.49.tgz", + "integrity": "sha512-g2HGr/hjOXCgSsvQZ1nK4nW/ei8JUx04Li74qub9qWrStlysaVmadRyTVuW32FGIpLQyc5sUjjZopj49eGGM2g==", "dev": true, "optional": true }, "esbuild-darwin-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz", - "integrity": "sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.49.tgz", + "integrity": "sha512-3rvqnBCtX9ywso5fCHixt2GBCUsogNp9DjGmvbBohh31Ces34BVzFltMSxJpacNki96+WIcX5s/vum+ckXiLYg==", "dev": true, "optional": true }, "esbuild-darwin-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz", - "integrity": "sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.49.tgz", + "integrity": "sha512-XMaqDxO846srnGlUSJnwbijV29MTKUATmOLyQSfswbK/2X5Uv28M9tTLUJcKKxzoo9lnkYPsx2o8EJcTYwCs/A==", "dev": true, "optional": true }, "esbuild-freebsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz", - "integrity": "sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.49.tgz", + "integrity": "sha512-NJ5Q6AjV879mOHFri+5lZLTp5XsO2hQ+KSJYLbfY9DgCu8s6/Zl2prWXVANYTeCDLlrIlNNYw8y34xqyLDKOmQ==", "dev": true, "optional": true }, "esbuild-freebsd-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz", - "integrity": "sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.49.tgz", + "integrity": "sha512-lFLtgXnAc3eXYqj5koPlBZvEbBSOSUbWO3gyY/0+4lBdRqELyz4bAuamHvmvHW5swJYL7kngzIZw6kdu25KGOA==", "dev": true, "optional": true }, "esbuild-linux-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz", - "integrity": "sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.49.tgz", + "integrity": "sha512-zTTH4gr2Kb8u4QcOpTDVn7Z8q7QEIvFl/+vHrI3cF6XOJS7iEI1FWslTo3uofB2+mn6sIJEQD9PrNZKoAAMDiA==", "dev": true, "optional": true }, "esbuild-linux-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz", - "integrity": "sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.49.tgz", + "integrity": "sha512-hYmzRIDzFfLrB5c1SknkxzM8LdEUOusp6M2TnuQZJLRtxTgyPnZZVtyMeCLki0wKgYPXkFsAVhi8vzo2mBNeTg==", "dev": true, "optional": true }, "esbuild-linux-arm": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz", - "integrity": "sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.49.tgz", + "integrity": "sha512-iE3e+ZVv1Qz1Sy0gifIsarJMQ89Rpm9mtLSRtG3AH0FPgAzQ5Z5oU6vYzhc/3gSPi2UxdCOfRhw2onXuFw/0lg==", "dev": true, "optional": true }, "esbuild-linux-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz", - "integrity": "sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.49.tgz", + "integrity": "sha512-KLQ+WpeuY+7bxukxLz5VgkAAVQxUv67Ft4DmHIPIW+2w3ObBPQhqNoeQUHxopoW/aiOn3m99NSmSV+bs4BSsdA==", "dev": true, "optional": true }, "esbuild-linux-mips64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz", - "integrity": "sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.49.tgz", + "integrity": "sha512-n+rGODfm8RSum5pFIqFQVQpYBw+AztL8s6o9kfx7tjfK0yIGF6tm5HlG6aRjodiiKkH2xAiIM+U4xtQVZYU4rA==", "dev": true, "optional": true }, "esbuild-linux-ppc64le": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz", - "integrity": "sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.49.tgz", + "integrity": "sha512-WP9zR4HX6iCBmMFH+XHHng2LmdoIeUmBpL4aL2TR8ruzXyT4dWrJ5BSbT8iNo6THN8lod6GOmYDLq/dgZLalGw==", "dev": true, "optional": true }, "esbuild-linux-riscv64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz", - "integrity": "sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.49.tgz", + "integrity": "sha512-h66ORBz+Dg+1KgLvzTVQEA1LX4XBd1SK0Fgbhhw4akpG/YkN8pS6OzYI/7SGENiN6ao5hETRDSkVcvU9NRtkMQ==", "dev": true, "optional": true }, "esbuild-linux-s390x": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz", - "integrity": "sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.49.tgz", + "integrity": "sha512-DhrUoFVWD+XmKO1y7e4kNCqQHPs6twz6VV6Uezl/XHYGzM60rBewBF5jlZjG0nCk5W/Xy6y1xWeopkrhFFM0sQ==", "dev": true, "optional": true }, "esbuild-netbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz", - "integrity": "sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.49.tgz", + "integrity": "sha512-BXaUwFOfCy2T+hABtiPUIpWjAeWK9P8O41gR4Pg73hpzoygVGnj0nI3YK4SJhe52ELgtdgWP/ckIkbn2XaTxjQ==", "dev": true, "optional": true }, "esbuild-openbsd-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz", - "integrity": "sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.49.tgz", + "integrity": "sha512-lP06UQeLDGmVPw9Rg437Btu6J9/BmyhdoefnQ4gDEJTtJvKtQaUcOQrhjTq455ouZN4EHFH1h28WOJVANK41kA==", "dev": true, "optional": true }, "esbuild-sunos-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz", - "integrity": "sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.49.tgz", + "integrity": "sha512-4c8Zowp+V3zIWje329BeLbGh6XI9c/rqARNaj5yPHdC61pHI9UNdDxT3rePPJeWcEZVKjkiAS6AP6kiITp7FSw==", "dev": true, "optional": true }, "esbuild-windows-32": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz", - "integrity": "sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.49.tgz", + "integrity": "sha512-q7Rb+J9yHTeKr9QTPDYkqfkEj8/kcKz9lOabDuvEXpXuIcosWCJgo5Z7h/L4r7rbtTH4a8U2FGKb6s1eeOHmJA==", "dev": true, "optional": true }, "esbuild-windows-64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz", - "integrity": "sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.49.tgz", + "integrity": "sha512-+Cme7Ongv0UIUTniPqfTX6mJ8Deo7VXw9xN0yJEN1lQMHDppTNmKwAM3oGbD/Vqff+07K2gN0WfNkMohmG+dVw==", "dev": true, "optional": true }, "esbuild-windows-arm64": { - "version": "0.14.48", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz", - "integrity": "sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g==", + "version": "0.14.49", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.49.tgz", + "integrity": "sha512-v+HYNAXzuANrCbbLFJ5nmO3m5y2PGZWLe3uloAkLt87aXiO2mZr3BTmacZdjwNkNEHuH3bNtN8cak+mzVjVPfA==", "dev": true, "optional": true }, @@ -7584,6 +8156,24 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, "gauge": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz", @@ -7616,12 +8206,33 @@ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, + "get-intrinsic": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", + "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "get-stdin": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", "integrity": "sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==", "dev": true }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -7727,12 +8338,42 @@ "function-bind": "^1.1.1" } }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -7855,10 +8496,21 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, + "internal-slot": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", + "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, "ip": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", - "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", "dev": true }, "is-arrayish": { @@ -7867,6 +8519,15 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -7876,6 +8537,22 @@ "binary-extensions": "^2.0.0" } }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", + "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", + "dev": true + }, "is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -7885,6 +8562,15 @@ "has": "^1.0.3" } }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -7912,24 +8598,85 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, + "is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -8429,6 +9176,30 @@ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, + "object-inspect": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -8584,9 +9355,9 @@ } }, "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", "dev": true }, "punycode": { @@ -8706,6 +9477,17 @@ "strip-indent": "^3.0.0" } }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -8779,9 +9561,9 @@ } }, "rollup": { - "version": "2.75.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.75.7.tgz", - "integrity": "sha512-VSE1iy0eaAYNCxEXaleThdFXqZJ42qDBatAwrfnPlENEZ8erQ+0LYX4JXOLPceWfZpV1VtZwZ3dFCuOZiSyFtQ==", + "version": "2.77.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.77.0.tgz", + "integrity": "sha512-vL8xjY4yOQEw79DvyXLijhnhh+R/O9zpF/LEgkCebZFtb6ELeN9H3/2T0r8+mp+fFTBHZ5qGpOpW2ela2zRt3g==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -8850,9 +9632,9 @@ } }, "sass": { - "version": "1.53.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", - "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.54.0.tgz", + "integrity": "sha512-C4zp79GCXZfK0yoHZg+GxF818/aclhp9F48XBu/+bm9vXEVAYov9iU3FBVRMq3Hx3OA4jfKL+p2K9180mEh0xQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -8912,6 +9694,17 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -8936,12 +9729,12 @@ } }, "socks": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", - "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.0.tgz", + "integrity": "sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==", "dev": true, "requires": { - "ip": "^1.1.5", + "ip": "^2.0.0", "smart-buffer": "^4.2.0" } }, @@ -9105,6 +9898,44 @@ "strip-ansi": "^6.0.1" } }, + "string.prototype.matchall": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz", + "integrity": "sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.1", + "get-intrinsic": "^1.1.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.1", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", + "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, + "string.prototype.trimstart": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", + "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.19.5" + } + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -9139,9 +9970,9 @@ "dev": true }, "svelte": { - "version": "3.48.0", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.48.0.tgz", - "integrity": "sha512-fN2YRm/bGumvjUpu6yI3BpvZnpIm9I6A7HR4oUNYd7ggYyIwSA/BX7DJ+UXXffLp6XNcUijyLvttbPVCYa/3xQ==", + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", + "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", "dev": true }, "svelte-check": { @@ -9241,10 +10072,16 @@ } } }, + "svelte-tiny-virtual-list": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/svelte-tiny-virtual-list/-/svelte-tiny-virtual-list-2.0.5.tgz", + "integrity": "sha512-xg9ckb8UeeIme4/5qlwCrl2QNmUZ8SCQYZn3Ji83cUsoASqRNy3KWjpmNmzYvPDqCHSZjruBBsoB7t5hwuzw5g==", + "dev": true + }, "svelte2tsx": { - "version": "0.5.11", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.11.tgz", - "integrity": "sha512-Is95G1wqNvEUJZ9DITRS2zfMwVJRZztMduPs1vJJ0cm65WUg/avBl5vBXjHycQL/qmFpaqa3NG4qWnf7bCHPag==", + "version": "0.5.12", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.5.12.tgz", + "integrity": "sha512-43ayMivmh1IDCgb+4YDf54YuOJZGCUKFpp37RbfjGgNU+Pmb9HhP+zRXa1pMh4mwSTBfqZS0FbJZP3Q8CSxvvg==", "dev": true, "requires": { "dedent-js": "^1.0.1", @@ -9338,6 +10175,18 @@ "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -9399,16 +10248,16 @@ } }, "vite": { - "version": "2.9.13", - "resolved": "https://registry.npmjs.org/vite/-/vite-2.9.13.tgz", - "integrity": "sha512-AsOBAaT0AD7Mhe8DuK+/kE4aWYFMx/i0ZNi98hJclxb4e0OhQcZYUrvLjIaQ8e59Ui7txcvKMiJC1yftqpQoDw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-3.0.2.tgz", + "integrity": "sha512-TAqydxW/w0U5AoL5AsD9DApTvGb2iNbGs3sN4u2VdT1GFkQVUfgUldt+t08TZgi23uIauh1TUOQJALduo9GXqw==", "dev": true, "requires": { - "esbuild": "^0.14.27", + "esbuild": "^0.14.47", "fsevents": "~2.3.2", - "postcss": "^8.4.13", - "resolve": "^1.22.0", - "rollup": "^2.59.0" + "postcss": "^8.4.14", + "resolve": "^1.22.1", + "rollup": "^2.75.6" } }, "webidl-conversions": { @@ -9436,6 +10285,19 @@ "isexe": "^2.0.0" } }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", diff --git a/src/svelte-components/package.json b/src/svelte-components/package.json index f507672..3b40fd4 100644 --- a/src/svelte-components/package.json +++ b/src/svelte-components/package.json @@ -11,18 +11,20 @@ "check": "svelte-check --tsconfig ./tsconfig.json" }, "devDependencies": { - "@sveltejs/kit": "^1.0.0-next.357", - "@sveltejs/vite-plugin-svelte": "^1.0.0-next.49", + "@sveltejs/kit": "^1.0.0-next.392", + "@sveltejs/vite-plugin-svelte": "^1.0.1", "@tsconfig/svelte": "^3.0.0", "node-sass": "^7.0.1", "polyfill-object.fromentries": "^1.0.1", "smui-theme": "^6.0.0-beta.16", - "svelte": "^3.48.0", + "string.prototype.matchall": "^4.0.7", + "svelte": "^3.49.0", "svelte-check": "^2.8.0", "svelte-material-ui": "^6.0.0-beta.16", "svelte-preprocess": "^4.10.7", + "svelte-tiny-virtual-list": "^2.0.5", "tslib": "^2.4.0", "typescript": "^4.7.4", - "vite": "^2.9.13" + "vite": "^3.0.2" } } diff --git a/src/svelte-components/src/components/ConfigTemplatedInput.svelte b/src/svelte-components/src/components/ConfigTemplatedInput.svelte new file mode 100644 index 0000000..a5f2950 --- /dev/null +++ b/src/svelte-components/src/components/ConfigTemplatedInput.svelte @@ -0,0 +1,131 @@ + + +{#if template} +
+ + + {#if template.values} + + {:else if template.type === "bool"} + + {:else if template.type === "float"} + + {:else if template.type === "int"} + + {:else if template.type === "string"} + + {:else if template.type == "text"} +