Ajout FishPeper

This commit is contained in:
Serge NOEL
2026-04-21 12:19:15 +02:00
parent 6744da3f88
commit 0c361a2440
2160 changed files with 589301 additions and 1 deletions

3
cncjs/.bowerrc Normal file
View File

@@ -0,0 +1,3 @@
{
"directory": "bower_components"
}

107
cncjs/.circleci/config.yml Normal file
View File

@@ -0,0 +1,107 @@
# https://circleci.com/blog/persisting-data-in-workflows-when-to-use-caching-artifacts-and-workspaces/
version: 2.1
orbs:
browser-tools: circleci/browser-tools@1.1.3
workflows:
version: 2
build-n-deploy:
jobs:
- build
- deploy:
requires:
- build
# https://circleci.com/docs/2.0/executor-types/
jobs:
build:
docker:
- image: cimg/node:12.22-browsers
steps:
- browser-tools/install-browser-tools
- run:
name: Configuration
command: |
npm config set loglevel warn
npm config set scripts-prepend-node-path auto
- checkout
- run:
name: Setup environment variables
command: |
echo "export CI_BRANCH=${CIRCLE_BRANCH}" >> $BASH_ENV
echo "export CI_BUILD_NUMBER=${CIRCLE_BUILD_NUM}" >> $BASH_ENV
echo "export CI_COMMIT=${CIRCLE_SHA1}" >> $BASH_ENV
echo "export CI_COMMIT_SHORT=${CIRCLE_SHA1:0:8}" >> $BASH_ENV
echo "export CI_TAG=${CIRCLE_TAG}" >> $BASH_ENV
- run:
name: Install system packages
command: |
sudo apt-get update
- run:
name: Check version
command: |
git --version
node --version
java --version
google-chrome --version
npm --version
yarn --version
- run:
name: Install packages
command: |
yarn
- run:
name: Build
command: |
yarn clean
yarn lint
yarn test
if [[ -z "$CI_TAG" ]]; then
yarn build-latest
else
yarn build
fi
- run:
name: Archive build artifacts
command: |
tar -zcvf ci.tar.gz --directory dist cncjs
- persist_to_workspace:
# Must be an absolute path, or relative path from working_directory.
# This is a directory on the container which is taken to be the root directory of the workspace.
root: .
paths:
- ci.tar.gz
deploy:
docker:
- image: cimg/node:12.22
steps:
- setup_remote_docker:
version: 19.03.13
- checkout
- run:
name: Setup environment variables
command: |
echo "export CI_BRANCH=${CIRCLE_BRANCH}" >> $BASH_ENV
- attach_workspace:
# Must be absolute path or relative path from working_directory
at: workspace
- run:
name: Extract build artifacts
command: |
mkdir -p dist
tar zxvf workspace/ci.tar.gz --directory dist
- run:
name: Build Docker image
command: |
DOCKER_BRANCH_TAG=$(echo $CI_BRANCH | sed -e 's/\//-/g')
DOCKER_REPO=cncjs/cncjs
echo "DOCKER_BRANCH_TAG=$DOCKER_BRANCH_TAG"
echo "DOCKER_REPO=$DOCKER_REPO"
echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin
docker build -f Dockerfile -t $DOCKER_REPO:$DOCKER_BRANCH_TAG .
docker images
docker push $DOCKER_REPO:$DOCKER_BRANCH_TAG

5
cncjs/.cncrc.default Normal file
View File

@@ -0,0 +1,5 @@
{
"watchDirectory": "",
"accessTokenLifetime": "30d",
"allowRemoteAccess": false
}

2
cncjs/.eslintignore Normal file
View File

@@ -0,0 +1,2 @@
# /node_modules and /bower_components ignored by default
dist/

37
cncjs/.eslintrc.js Normal file
View File

@@ -0,0 +1,37 @@
const path = require('path');
module.exports = {
extends: 'trendmicro',
parser: 'babel-eslint',
env: {
browser: true,
node: true
},
settings: {
'import/resolver': {
webpack: {
config: {
resolve: {
modules: [
path.resolve(__dirname, 'src'),
'node_modules'
],
extensions: ['.js', '.jsx']
}
}
}
}
},
rules: {
'max-lines-per-function': [1, {
max: 512,
skipBlankLines: true,
skipComments: true
}],
'react/jsx-no-bind': [1, {
allowArrowFunctions: true
}],
'react/prefer-stateless-function': 0,
'react/no-access-state-in-setstate': 0
}
};

8
cncjs/.gitattributes vendored Normal file
View File

@@ -0,0 +1,8 @@
# Set the default behavior
* text=auto
# Git will always convert line endings to LF on checkout. You should use this for files that must keep LF endings, even on Windows.
*.css text eol=lf
*.js text eol=lf
*.jsx text eol=lf
*.sh text eol=lf

12
cncjs/.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: cncjs
ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

33
cncjs/.github/ISSUE_TEMPLATE.md vendored Normal file
View File

@@ -0,0 +1,33 @@
#### Description
Describe the issue or feature request in detail. Take a screenshot or record a video will be helpful.
#### Versions
- CNCjs: 1.9.x
- Node.js: 6.x
- NPM: 5.x
#### How Do You Install CNCjs?
- [x] NPM
- [ ] Download the CNCjs Desktop Application
#### CNC Controller
- [x] Grbl
- [ ] Smoothieware
- [ ] TinyG/g2core
#### Hardware
- [x] Raspberry Pi
- [ ] Desktop or Laptop
- [ ] Mobile Device
#### Operating System
- [x] Not Applicable
- [ ] Windows
- [ ] Mac
- [ ] Linux

9
cncjs/.gitignore vendored Normal file
View File

@@ -0,0 +1,9 @@
node_modules
npm-debug.log
package-lock.json
/.eslintcache
/.nyc_output
/coverage
/dist
/output
/releases

6
cncjs/.npmignore Normal file
View File

@@ -0,0 +1,6 @@
tmp
npm-debug.log
/.nyc_output
/coverage
/output
/releases

35
cncjs/.stylintrc Normal file
View File

@@ -0,0 +1,35 @@
{
"blocks": false,
"brackets": "always",
"colons": "always",
"colors": false,
"commaSpace": "always",
"commentSpace": false,
"cssLiteral": "never",
"depthLimit": false,
"duplicates": false,
"efficient": "always",
"extendPref": false,
"globalDupe": false,
"indentPref": false,
"leadingZero": "never",
"maxErrors": false,
"maxWarnings": false,
"mixed": false,
"namingConvention": false,
"namingConventionStrict": false,
"none": "never",
"noImportant": true,
"parenSpace": false,
"placeholders": "always",
"prefixVarsWithDollar": "always",
"quotePref": false,
"semicolons": "always",
"sortOrder": false,
"stackedProperties": "never",
"trailingWhitespace": "never",
"universal": false,
"valid": true,
"zeroUnits": "never",
"zIndexNormalize": false
}

1
cncjs/CHANGELOG.md Normal file
View File

@@ -0,0 +1 @@
All notable changes are described on the [Releases](https://github.com/cheton/cnc/releases) page.

231
cncjs/CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,231 @@
# Contributing
## Index
* [Troubleshooting](CONTRIBUTING.md#troubleshooting)
* [Code Contributions](CONTRIBUTING.md#code-contributions)
* [Keeping a Fork Up-to-date](CONTRIBUTING.md#keeping-a-fork-up-to-date)
* [Running Local Development Server](CONTRIBUTING.md#running-local-development-server)
* [Running Production Build](CONTRIBUTING.md#running-production-build)
* [Build Desktop Apps](CONTRIBUTING.md#build-desktop-apps)
* [Localization](CONTRIBUTING.md#localization)
* [Translation Validation](CONTRIBUTING.md#translation-validation)
## Troubleshooting
https://github.com/cncjs/cncjs/wiki/Troubleshooting
## Code Contributions
### Step 1: Fork
Fork the project [on GitHub](https://github.com/cncjs/cncjs) and check out your copy locally.
![image](https://cloud.githubusercontent.com/assets/447801/16153930/28241308-34db-11e6-81b6-dd8222f044b4.png)
```bash
$ git clone git@github.com:username/cncjs.git
$ cd cncjs
$ git remote add upstream git://github.com/cncjs/cncjs.git
```
### Step 2: Branch
Create a feature branch and before starting:
```bash
$ git checkout -b my-feature-branch -t origin/master
```
### Step 3: Install
Run `npm install` to install the dependencies in the local node_modules folder:
```bash
$ npm install -g npm
$ npm install
```
### Step 4: Commit
Make sure git knows your name and email address:
```bash
$ git config --global user.name "User Name"
$ git config --global user.email "user.email@example.com"
```
Writing good commit logs is important. A commit log should describe what changed and why.
### Step 5: Rebase
Use `git rebase` (not `git merge`) to sync your work from time to time.
```bash
$ git fetch upstream
$ git rebase upstream/master
```
### Step 6: Build
Run `npm run prepare` to make sure the build succeed:
```bash
$ npm run prepare
```
### Step 7: Push
```bash
$ git push origin my-feature-branch
```
Go to https://github.com/username/cncjs and select your feature branch. Click on the <kbd>New pull request</kbd> button and fill out the form.
![image](https://cloud.githubusercontent.com/assets/447801/16153975/6a41541c-34db-11e6-997c-5781b8fa8f68.png)
## Keeping a Fork Up-to-date
### Clone your fork
```bash
git clone git@github.com:USERNAME/cncjs.git
```
### Add remote from original repository in your forked repository
```bash
cd cncjs
git remote add upstream git://github.com/cncjs/cncjs.git
git fetch upstream
```
### Updating your fork from original repo to keep up with their changes
```bash
git pull upstream master
```
### Push the local branch to the remote repository
```bash
git pull origin master
git push origin master
```
## Running Local Development Server
Make sure you have Node.js 4 or later verions installed, and run `npm run dev` to start a local development server for development and testing. Every code changes will trigger webpack Hot Module Replacement (HMR) which will be really useful while developing in React.
```bash
$ npm install # Ensure that packages are installed
$ npm run dev # It may take several minutes...
: : :
Server is listening on 0.0.0.0:8000
```
Connect to http://localhost:8000 and wait until bundle finished.
```bash
webpack: wait until bundle finished: /__webpack_hmr
: : :
webpack: bundle is now VALID
```
Now you're ready to go!
## Running Production Build
```bash
$ npm install # Ensure that packages are installed
$ npm run prepare
$ ./bin/cncjs -vv
: : :
Server is listening on 0.0.0.0:8000
```
## Build Desktop Apps
#### Mac
```bash
$ npm install # Ensure that packages are installed
$ npm run prepare && npm run build:mac-x64
$ ls -al output/osx/
```
#### Windows x86
```bash
$ npm install # Ensure that packages are installed
$ npm run prepare && npm run build:win-ia32
$ ls -al output/win-ia32/
```
#### Windows x64
```bash
$ npm install # Ensure that packages are installed
$ npm run prepare && npm run build:win-x64
$ ls -al output/win/
```
#### Linux x86
```bash
$ npm install # Ensure that packages are installed
$ npm run prepare && npm run build:linux-ia32
$ ls -al output/linux-ia32/
```
#### Linux x64
```bash
$ npm install # Ensure that packages are installed
$ npm run prepare && npm run build:linux-x64
$ ls -al output/linux/
```
## Localization
If you'd like to help contribute translations, you can fork the repository, update resource files in the [src/app/i18n](https://github.com/cncjs/cncjs/tree/master/src/app/i18n) directory or in the [src/server/i18n](https://github.com/cncjs/cncjs/tree/master/src/server/i18n) directory, and create a pull request to submit your changes.
### Fork the repository
To fork the cncjs repository, click the <b>Fork</b> button in the header of the repository.
![image](https://user-images.githubusercontent.com/447801/30472117-d757e742-9a2d-11e7-80f8-4ba9ffba97d8.png)
When its finished, youll be taken to your copy of the cncjs repository. Now you can update the resource files on GitHub, or clone it to your computer.
If you're using <b>GitHub for Desktop</b> application, navigate over to the toolbar, open the <b>Clone or download</b> dropdown, and click <b>Open in Desktop</b> to clone cncjs/cncjs to your computer and use it in GitHub Desktop.
![image](https://user-images.githubusercontent.com/447801/30471510-956b51fe-9a2b-11e7-9e43-c5e3fa19e0cb.png)
### Making and pushing changes
Go ahead and make a few changes to the project using your favorite text editor. When youre ready to submit your changes, type up a commit summary in <b>GitHub for Desktop</b>, and click <b>Commit to master</b>.
![image](https://user-images.githubusercontent.com/447801/30475410-568ff97c-9a39-11e7-9e25-a924ad910deb.png)
You can continue to make more changes and create new commits. When youre ready to push your changes, click on the <b>Sync</b> button to synchronize master with the remote server.
![image](https://user-images.githubusercontent.com/447801/30475598-f5b90a34-9a39-11e7-870a-2517f124dbba.png)
### Creating the pull request
1. Head on over to the repository on GitHub.com where your project lives. For your example, it would be at `https://www.github.com/<your_username>/cncjs`.
![image](https://user-images.githubusercontent.com/447801/30475866-ce417044-9a3a-11e7-814f-c991a92a3be3.png)
2. To the right of the branch menu, click <b>New pull request</b>.<br>
![image](https://user-images.githubusercontent.com/447801/30476056-66f33548-9a3b-11e7-9d9a-e2d010cbc379.png)
3. Click <b>Create pull request</b>.
![image](https://user-images.githubusercontent.com/447801/30476803-bd3b1428-9a3d-11e7-8588-90d77f3680b5.png)
4. That's done.
## Translation Validation
You can validate the translation by copying translated resource files to the installed directory. Note that your path may differ based on the Node installation path you have in place.
```bash
$ cd $(dirname `which cncjs`)/../lib/node_modules/cncjs/dist/app/i18n/
$ pwd
/home/cheton/.nvm/versions/node/v10.15.3/lib/node_modules/cncjs/dist/app/i18n
```
To verify your changes during runtime, it's recommended that you open <b>Developer Tools</b> and disable browser cache. For example:
##### Step 1: Open Developer Tools and click [Settings]
![image](https://cloud.githubusercontent.com/assets/447801/16014196/cc4b730c-31c2-11e6-9f78-c84347d12190.png)
##### Step 2: Disable cache
![image](https://cloud.githubusercontent.com/assets/447801/16014264/1d32e872-31c3-11e6-9178-6cc06bd0f6b5.png)
Now you can copy resource files to the <b>dist/cncjs/app/i18n</b> directory and refresh your browser to see new updates.
<b>Note that you should not close DevTools to make sure your browser won't cache anything.</b>

54
cncjs/Dockerfile Normal file
View File

@@ -0,0 +1,54 @@
# BUILD STAGE
FROM debian:bullseye as build-stage
ENV BUILD_DIR /tmp/build
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION v12.22.1
ENV NODE_ENV production
ENV NODE_PATH $NVM_DIR/$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH
RUN apt-get update -y && apt-get install -y -q --no-install-recommends \
apt-utils \
build-essential \
ca-certificates \
python3 \
python3-pip \
curl \
git \
udev
RUN git clone https://github.com/nvm-sh/nvm.git "$NVM_DIR" \
&& cd "$NVM_DIR" \
&& git checkout `git describe --abbrev=0 --tags --match "v[0-9]*" $(git rev-list --tags --max-count=1)` \
&& . "$NVM_DIR/nvm.sh" \
&& nvm install "$NODE_VERSION" \
&& nvm alias default "$NODE_VERSION" \
&& nvm use --delete-prefix default
COPY ./dist/cncjs $BUILD_DIR/cncjs
COPY ./entrypoint $BUILD_DIR/cncjs/
WORKDIR $BUILD_DIR/cncjs
RUN npm install -g npm@latest && npm install -g yarn && yarn --production
# FINAL STAGE
FROM debian:bullseye
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION v12.22.1
ENV NODE_ENV production
ENV NODE_PATH $NVM_DIR/$NODE_VERSION/lib/node_modules
ENV PATH $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH
RUN apt-get update -y && apt-get install -y -q --no-install-recommends \
apt-utils \
ca-certificates \
udev
WORKDIR /opt/cncjs
EXPOSE 8000
ENTRYPOINT ["/opt/cncjs/entrypoint"]
COPY --from=build-stage /root/.nvm $NVM_DIR
COPY --from=build-stage /tmp/build/cncjs /opt/cncjs

22
cncjs/LICENSE Normal file
View File

@@ -0,0 +1,22 @@
The MIT License (MIT)
Copyright (c) 2015-2017 Cheton Wu
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.

338
cncjs/README.md Normal file
View File

@@ -0,0 +1,338 @@
# CNCjs [![Backers on Open Collective](https://opencollective.com/cncjs/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/cncjs/sponsors/badge.svg)](#sponsors) [![Travis CI Build Status](https://travis-ci.org/cncjs/cncjs.svg)](https://travis-ci.org/cncjs/cncjs) [![AppVeyor Build status](https://ci.appveyor.com/api/projects/status/qxx53wq32w3edule?svg=true)](https://ci.appveyor.com/project/cheton/cncjs) [![Coverage Status](https://coveralls.io/repos/github/cncjs/cncjs/badge.svg?branch=master)](https://coveralls.io/github/cncjs/cncjs?branch=master)
[![NPM](https://nodei.co/npm/cncjs.png?downloads=true&stars=true)](https://www.npmjs.com/package/cncjs)
![cncjs](https://raw.githubusercontent.com/cncjs/cncjs/master/media/banner.png)
CNCjs is a full-featured web-based interface for CNC controllers running [Grbl](https://github.com/grbl/grbl), [Marlin](https://github.com/MarlinFirmware/Marlin), [Smoothieware](https://github.com/Smoothieware/Smoothieware), or [TinyG](https://github.com/synthetos/TinyG).
For a more complete introduction, see the [Introduction](https://github.com/cncjs/cncjs/wiki/Introduction) section of the wiki page.
![cncjs](https://cloud.githubusercontent.com/assets/447801/24392019/aa2d725e-13c4-11e7-9538-fd5f746a2130.png)
## Features
* Supported controllers
- [Grbl](https://github.com/gnea/grbl) ([Download](https://github.com/gnea/grbl/releases))
- [Grbl-Mega](https://github.com/gnea/grbl-Mega) ([Download](https://github.com/gnea/grbl-Mega/releases))
- [Marlin](https://github.com/MarlinFirmware/Marlin) ([Download](http://marlinfw.org/meta/download/))
- [Smoothieware](https://github.com/Smoothieware/Smoothieware) ([Download](https://github.com/Smoothieware/Smoothieware/tree/edge/FirmwareBin))
- [TinyG](https://github.com/synthetos/TinyG) (_Recommend: firmware version 0.97 build 449.xx_) ([Download](http://synthetos.github.io/))
- [g2core](https://github.com/synthetos/g2)
* [Desktop App for Linux, Mac OS X, and Windows](https://github.com/cncjs/cncjs/wiki/Desktop-App)
* 6-axis digital readout (DRO)
* Tool path 3D visualization
* Simultaneously communicate with multiple clients
* Responsive view for small screen display with device width less than 720px
- <i>Safari on an iPhone 5S</i> [\[1\]](https://cloud.githubusercontent.com/assets/447801/15633749/b817cd4a-25e7-11e6-9beb-600c65ea1324.PNG) [\[2\]](https://cloud.githubusercontent.com/assets/447801/15633750/b819b5f6-25e7-11e6-8bfe-d3e6247e443b.PNG)
* Customizable workspace
* [Custom widget](https://github.com/cncjs/cncjs-widget-boilerplate) (since 1.9.10)
* Custom MDI (Multiple Document Interface) command buttons (since 1.9.13)
* My Account
* Commands
* Events
* [Keyboard Shortcuts](https://cnc.js.org/docs/user-guide/#keyboard-shortcuts)
* [Contour ShuttleXpress](https://cnc.js.org/docs/user-guide/#contour-shuttlexpress)
* Multi-Language Support
* Watch Directory
* [Tool Change](https://github.com/cncjs/cncjs/wiki/Tool-Change) (since 1.9.11)
* Z-Probe
## Custom Widgets
* [cncjs-widget-boilerplate](https://github.com/cncjs/cncjs-widget-boilerplate) - Creating custom widgets for CNCjs.
## Pendants
### Boilerplate Code
* [cncjs-pendant-boilerplate](https://github.com/cncjs/cncjs-pendant-boilerplate) - A bare minimum example to develop a cncjs pendant.
### Existing Pendants
* [cncjs-pendant-keyboard](https://github.com/cncjs/cncjs-pendant-keyboard) - A simple pendant (using wireless keyboard or usb) to CNCJS.
* [cncjs-pendant-numpad](https://github.com/mariolukas/cncjs-pendant-numpad) - A simple pendant (using wireless numpad or usb) to CNCJS.
* [cncjs-pendant-lcd](https://github.com/cncjs/cncjs-pendant-lcd) - CNCjs Web Kiosk for Raspberry Pi Touch Displays.
* [cncjs-pendant-ps3](https://github.com/cncjs/cncjs-pendant-ps3) - Dual Shock / PS3 Bluetooth Remote Pendant for CNCjs.
* [cncjs-pendant-raspi-gpio](https://github.com/cncjs/cncjs-pendant-raspi-gpio) - Simple Raspberry Pi GPIO Pendant control for CNCjs.
## Tablet UI
* [cncjs-pendant-tinyweb](https://github.com/cncjs/cncjs-pendant-tinyweb) - A tiny web console for small 320x240 LCD display.<br>
![cncjs-pendant-tinyweb](https://raw.githubusercontent.com/cncjs/cncjs/master/media/tinyweb-axes.png)
* [cncjs-shopfloor-tablet](https://github.com/cncjs/cncjs-shopfloor-tablet) - A simplified UI for cncjs optimized for tablet computers in a production (shop floor) environment.<br>
![cncjs-shopfloor-tablet](https://user-images.githubusercontent.com/4861133/33970662-4a8244b2-e018-11e7-92ab-5a379e3de461.PNG)
## Browser Support
![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png)<br>Chrome | ![Edge](https://raw.github.com/alrra/browser-logos/master/src/edge/edge_48x48.png)<br>Edge | ![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png)<br>Firefox | ![IE](https://raw.github.com/alrra/browser-logos/master/src/archive/internet-explorer_9-11/internet-explorer_9-11_48x48.png)<br>IE | ![Opera](https://raw.github.com/alrra/browser-logos/master/src/opera/opera_48x48.png)<br>Opera | ![Safari](https://raw.github.com/alrra/browser-logos/master/src/safari/safari_48x48.png)<br>Safari
--- | --- | --- | --- | --- | --- |
Yes | Yes | Yes| Not supported | Yes | Yes |
## Supported Node.js Versions
Version | Supported Level
:------- |:---------------
4 | Dropped support
6 | Supported
8 | Supported
10 | Recommended
12 | Recommended
## Getting Started
### Node.js Installation
Node.js 8 or higher is recommended. You can install [Node Version Manager](https://github.com/creationix/nvm) to manage multiple Node.js versions. If you have `git` installed, just clone the `nvm` repo, and check out the latest version:
```
git clone https://github.com/creationix/nvm.git ~/.nvm
cd ~/.nvm
git checkout `git describe --abbrev=0 --tags`
cd ..
. ~/.nvm/nvm.sh
```
Add these lines to your `~/.bash_profile`, `~/.bashrc`, or `~/.profile` file to have it automatically sourced upon login:
```bash
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" # This loads nvm
```
Once installed, you can select Node.js versions with:
```
nvm install 10
nvm use 10
```
It's also recommended that you upgrade npm to the latest version. To upgrade, run:
```
npm install npm@latest -g
```
### Installation
Install cncjs as a non-root user, or the [serialport](https://github.com/node-serialport/node-serialport) module may not install correctly on some platforms like Raspberry Pi.
```
npm install -g cncjs
```
If you're going to use sudo or root to install cncjs, you need to specify the `--unsafe-perm` option to run npm as the root account.
```
sudo npm install --unsafe-perm -g cncjs
```
Check out [https://github.com/cncjs/cncjs/wiki/Installation](https://github.com/cncjs/cncjs/wiki/Installation) for other installation methods.
### Upgrade
Run `npm install -g cncjs@latest` to install the latest version. To determine the version, use `cncjs -V`.
### Usage
Run `cncjs` to start the server, and visit `http://yourhostname:8000/` to view the web interface. Pass `--help` to `cncjs` for more options.
```
pi@rpi3$ cncjs -h
Usage: cncjs [options]
Options:
-V, --version output the version number
-p, --port <port> Set listen port (default: 8000)
-H, --host <host> Set listen address or hostname (default: 0.0.0.0)
-b, --backlog <backlog> Set listen backlog (default: 511)
-c, --config <filename> Set config file (default: ~/.cncrc)
-v, --verbose Increase the verbosity level (-v, -vv, -vvv)
-m, --mount <route-path>:<target> Add a mount point for serving static files
-w, --watch-directory <path> Watch a directory for changes
--access-token-lifetime <lifetime> Access token lifetime in seconds or a time span string (default: 30d)
--allow-remote-access Allow remote access to the server (default: false)
--controller <type> Specify CNC controller: Grbl|Marlin|Smoothie|TinyG|g2core (default: '')
-h, --help output usage information
Examples:
$ cncjs -vv
$ cncjs --mount /pendant:/home/pi/tinyweb
$ cncjs --mount /widget:~+/widget --mount /pendant:~/pendant
$ cncjs --mount /widget:https://cncjs.github.io/cncjs-widget-boilerplate/v1/
$ cncjs --watch-directory /home/pi/watch
$ cncjs --access-token-lifetime 60d # e.g. 3600, 30m, 12h, 30d
$ cncjs --allow-remote-access
$ cncjs --controller Grbl
```
Instead of passing command line options for `--watch-directory`, `--access-token-lifetime`, `--allow-remote-access`, and `--controller`, you can create a `~/.cncrc` file that contains the following configuration in JSON format:
```json
{
"mountPoints": [
{
"route": "/pendant",
"target": "/home/pi/tinyweb"
},
{
"route": "/widget",
"target": "https://cncjs.github.io/cncjs-widget-boilerplate/v1/"
}
],
"watchDirectory": "/path/to/dir",
"accessTokenLifetime": "30d",
"allowRemoteAccess": false,
"controller": ""
}
```
To troubleshoot issues, run:
```
cncjs -vvv
```
### Configuration File
The configuration file <b>.cncrc</b> contains settings that are equivalent to the cncjs command-line options. The configuration file is stored in user's home directory. To find out the actual location of the home directory, do the following:
* Linux/Mac
```sh
echo $HOME
```
* Windows
```sh
echo %USERPROFILE%
```
Check out an example configuration file [here](https://github.com/cncjs/cncjs/blob/master/examples/.cncrc).
### File Format
See https://github.com/cncjs/cncjs/issues/242#issuecomment-352294549 for a detailed explanation.
```json
{
"ports": [
{
"comName": "/dev/ttyAMA0",
"manufacturer": ""
}
],
"baudrates": [115200, 250000],
"mountPoints": [
{
"route": "/widget",
"target": "https://cncjs.github.io/cncjs-widget-boilerplate/v1/"
}
],
"watchDirectory": "/path/to/dir",
"accessTokenLifetime": "30d",
"allowRemoteAccess": false,
"controller": "",
"state": {
"checkForUpdates": true,
"controller": {
"exception": {
"ignoreErrors": false
}
}
},
"commands": [
{
"title": "Update (root user)",
"commands": "sudo npm install -g cncjs@latest --unsafe-perm; pkill -f cncjs"
},
{
"title": "Update (non-root user)",
"commands": "npm install -g cncjs@latest; pkill -f cncjs"
},
{
"title": "Reboot",
"commands": "sudo /sbin/reboot"
},
{
"title": "Shutdown",
"commands": "sudo /sbin/shutdown"
}
],
"events": [],
"macros": [],
"users": []
}
```
## Documentation
https://cnc.js.org/docs/
## Examples
There are several *.gcode files in the [examples](https://github.com/cncjs/cncjs/tree/master/examples) directory. You can use the GCode widget to load a GCode file and make a trial run.
If you don't have a CAM software, try using [jscut](http://jscut.org/) to create G-Code from *.svg. It's a simple CAM package that runs in the browser.
Check out a live demo at http://jscut.org/jscut.html.
## Contributions
Use [GitHub issues](https://github.com/cncjs/cncjs/issues) for requests.
Pull requests welcome! Learn how to [contribute](CONTRIBUTING.md).
## Localization
You can help translate resource files in both of [app](https://github.com/cncjs/cncjs/tree/master/src/app/i18n) and [server](https://github.com/cncjs/cncjs/tree/master/src/server/i18n) directories from English to other languages. Check out [Localization guide](https://github.com/cncjs/cncjs/blob/master/CONTRIBUTING.md#localization) to learn how to get started. If you are not familiar with GitHub development, you can [open an issue](https://github.com/cncjs/cncjs/issues) or send your translations to cheton@gmail.com.
Locale | Language | Status | Contributors
:----- | :------- | :----- | :-----------
[cs](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/cs) | Čeština (Czech) | ✔ | [Miroslav Zuzelka](https://github.com/dronecz)
[de](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/de) | Deutsch (German) | ✔ | [Thorsten Godau](https://github.com/dl9sec), [Max B.](https://github.com/mbs38)
[es](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/es) | Español (Spanish) | ✔ | [Juan Biondi](https://github.com/yeyeto2788)
[fr](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/fr) | Français (French) | ✔ | [Simon Maillard](https://github.com/maisim), [CorentinBrulé](https://github.com/CorentinBrule)
[hu](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/hu) | Magyar (Hungarian) | ✔ | Sipos Péter
[it](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/it) | Italiano (Italian) | ✔ | [vince87](https://github.com/vince87)
[ja](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/ja) | 日本語 (Japanese) | ✔ | [Naoki Okamoto](https://github.com/toonaoki)
[nl](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/nl) | Nederlands (Netherlands) | ✔ | [dutchpatriot](https://github.com/dutchpatriot)
[pt-br](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/pt-br) | Português (Brasil) | ✔ | [cmsteinBR](https://github.com/cmsteinBR)
[ru](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/ru) | Ру́сский (Russian) | ✔ | [Denis Yusupov](https://github.com/minithc)
[tr](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/tr) | Türkçe (Turkish) | ✔ | Ali GÜNDOĞDU
[zh-cn](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/zh-cn) | 简体中文 (Simplified Chinese) | ✔ | [Mandy Chien](https://github.com/MandyChien), [Terry Lee](https://github.com/TerryShampoo)
[zh-tw](https://github.com/cncjs/cncjs/tree/master/src/web/i18n/zh-tw) | 繁體中文 (Traditional Chinese) | ✔ | [Cheton Wu](https://github.com/cheton)
## Donate
If you would like to support this project, you can make a donation using PayPal. Thank you!
[![Donate](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=38CYN33CWPBR2)
## Contributors
This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)].
<a href="graphs/contributors"><img src="https://opencollective.com/cncjs/contributors.svg?width=890&button=false" /></a>
## Backers
Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/cncjs#backer)]
<a href="https://opencollective.com/cncjs#backers" target="_blank"><img src="https://opencollective.com/cncjs/backers.svg?width=890"></a>
## Sponsors
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/cncjs#sponsor)]
<a href="https://opencollective.com/cncjs/sponsor/0/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/1/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/2/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/3/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/4/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/5/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/6/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/7/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/8/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/cncjs/sponsor/9/website" target="_blank"><img src="https://opencollective.com/cncjs/sponsor/9/avatar.svg"></a>
## License
Licensed under the [MIT License](https://raw.githubusercontent.com/cncjs/cncjs/master/LICENSE).

502
cncjs/appveyor.yml Normal file
View File

@@ -0,0 +1,502 @@
# https://stefanscherer.github.io/use-appveyor-to-build-multi-arch-docker-image/
version: "{build}-{branch}"
environment:
matrix:
#- job_name: Linux build (i386)
# appveyor_build_worker_image: Ubuntu
# nodejs_version: "12"
# ARCH: i386
- job_name: Linux build (amd64)
appveyor_build_worker_image: Ubuntu2004
nodejs_version: "12"
ARCH: amd64
- job_name: Linux build (arm)
appveyor_build_worker_image: Ubuntu2004
nodejs_version: "12"
ARCH: arm
- job_name: Linux build (arm64)
appveyor_build_worker_image: Ubuntu2004
nodejs_version: "12"
ARCH: arm64
- job_name: macOS build (x64)
appveyor_build_worker_image: macos
nodejs_version: "12"
ARCH: x64
- job_name: Windows build (x64)
appveyor_build_worker_image: Visual Studio 2019
nodejs_version: "12"
ARCH: x64
- job_name: Windows build (x86)
appveyor_build_worker_image: Visual Studio 2019
nodejs_version: "12"
ARCH: x86
global:
GITHUB_TOKEN:
secure: G9Qlv8MYhgvYlUxWWUiDdfIUTrKcia16HAdzkVydWqC+wo60XrC8nk1Q2R9WKGXx
for:
# Linux
-
matrix:
only:
#- job_name: Linux build (i386)
- job_name: Linux build (amd64)
- job_name: Linux build (arm)
- job_name: Linux build (arm64)
fast_finish: true
init:
- uname -a
- git --version
- git config --global core.autocrlf false
- git config --global user.name "AppVeyor"
- git config --global user.email "appveyor@ci.appveyor.com"
- sh: |
export CI_BRANCH=$APPVEYOR_REPO_BRANCH
export CI_BUILD_NUMBER=$APPVEYOR_BUILD_NUMBER
export CI_COMMIT=$APPVEYOR_REPO_COMMIT
export CI_COMMIT_SHORT=${APPVEYOR_REPO_COMMIT:0:8}
export CI_COMMIT_TIMESTAMP=$APPVEYOR_REPO_COMMIT_TIMESTAMP
export CI_TAG=$APPVEYOR_REPO_TAG_NAME
echo "• ARCH=$ARCH"
echo "• CI_BRANCH=$CI_BRANCH"
echo "• CI_BUILD_NUMBER=$CI_BUILD_NUMBER"
echo "• CI_COMMIT=$CI_COMMIT"
echo "• CI_COMMIT_SHORT=$CI_COMMIT_SHORT"
echo "• CI_COMMIT_TIMESTAMP=$CI_COMMIT_TIMESTAMP"
echo "• CI_TAG=$CI_TAG"
install:
# https://github.com/cfillion/reapack/blob/master/.appveyor.yml
- |
sudo cp -af /etc/apt/sources.list /etc/apt/sources.list.old
sudo sed -i '/arch=/! s/^deb/deb [arch=amd64,i386]/' /etc/apt/sources.list
awk '
$3 !~ /ubuntu\.com/ { next }
$1 == "deb" {
$2 = "[arch=armhf,arm64]";
$3 = "http://ports.ubuntu.com/ubuntu-ports/"
} 1' /etc/apt/sources.list | sudo dd of=/etc/apt/sources.list.d/ports.list
diff -uN /etc/apt/sources.list.old /etc/apt/sources.list
cat /etc/apt/sources.list.d/ports.list
- sudo dpkg --print-architecture
- sudo dpkg --add-architecture arm64
- sudo dpkg --add-architecture armhf
#- sudo dpkg --add-architecture i386
- sudo dpkg --print-foreign-architectures
- sudo apt-get update
- sudo apt-get install --no-install-recommends -y icnsutils graphicsmagick gcc-multilib g++-multilib rpm
- nvm install $nodejs_version
- npm config set loglevel warn
- npm config set scripts-prepend-node-path auto
- npm install -g npm
- npm install -g yarn
- yarn
build_script:
- sh: |
yarn clean
yarn lint
yarn test
if [[ -z "$CI_TAG" ]]; then
yarn build-latest
else
yarn build
fi
- sh: |
# i386
if [[ "$ARCH" == "i386" ]]; then
GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
PRODUCT_NAME=CNCjs
yarn build:linux-ia32
ls -al output output/*
mkdir -p releases/linux
cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.i686.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.i686.rpm"
cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}-i386.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-i386.AppImage"
cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_i386.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-i386.deb"
pushd releases/linux
ln -sf ../../output/linux-ia32-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-ia32"
tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-ia32.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-ia32"
rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-ia32";
popd
ls -al releases/linux/*
if [[ "$CI_BRANCH" == "master" && -z "$CI_TAG" ]]; then
yarn github-release delete \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
"*-linux-i386.AppImage" \
"*-linux-i386.deb" \
"*-linux.i686.rpm" \
"*-linux-ia32.tar.gz";
yarn github-release upload \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
--body="${COMMIT_LOG}" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.i686.rpm" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-i386.AppImage" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-i386.deb" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-ia32.tar.gz";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.i686.rpm";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-i386.AppImage";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-i386.deb";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-ia32.tar.gz";
fi
fi
- sh: |
# amd64
if [[ "$ARCH" == "amd64" ]]; then
GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
PRODUCT_NAME=CNCjs
yarn build:linux-x64
ls -al output output/*
mkdir -p releases/linux
cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.x86_64.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.x86_64.rpm"
cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x86_64.AppImage"
cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_amd64.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-amd64.deb"
pushd releases/linux
ln -sf ../../output/linux-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64"
tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64"
rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64"
popd
ls -al releases/linux/*
if [[ "$CI_BRANCH" == "master" && -z "$CI_TAG" ]]; then
yarn github-release delete \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
"*-linux.x86_64.rpm" \
"*-linux-x86_64.AppImage" \
"*-linux-amd64.deb" \
"*-linux-x64.tar.gz";
yarn github-release upload \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
--body="${GIT_COMMIT_LOG}" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.x86_64.rpm" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x86_64.AppImage" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-amd64.deb" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64.tar.gz";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.x86_64.rpm";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x86_64.AppImage";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-amd64.deb";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-x64.tar.gz";
fi
fi
- sh: |
# arm
if [[ "$ARCH" == "arm" ]]; then
GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
PRODUCT_NAME=CNCjs
yarn build:linux-armv7l
ls -al output output/*
mkdir -p releases/linux
cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.armv7l.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.armv7l.rpm"
cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}-armv7l.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.AppImage"
cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_armv7l.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.deb"
pushd releases/linux
ln -sf ../../output/linux-armv7l-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l"
tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l"
rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l"
popd
ls -al releases/linux/*
if [[ "$CI_BRANCH" == "master" && -z "$CI_TAG" ]]; then
yarn github-release delete \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
"*-linux.armv7l.rpm" \
"*-linux-armv7l.AppImage" \
"*-linux-armv7l.deb" \
"*-linux-armv7l.tar.gz";
yarn github-release upload \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
--body="${GIT_COMMIT_LOG}" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.armv7l.rpm" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.AppImage" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.deb" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.tar.gz";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.armv7l.rpm";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.AppImage";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.deb";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-armv7l.tar.gz";
fi
fi
- sh: |
# arm64
if [[ "$ARCH" == "arm64" ]]; then
GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
PRODUCT_NAME=CNCjs
yarn build:linux-arm64
ls -al output output/*
mkdir -p releases/linux
cp -af "output/${PACKAGE_NAME}-${PACKAGE_VERSION}.arm64.rpm" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.arm64.rpm"
cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}-arm64.AppImage" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.AppImage"
cp -af "output/${PACKAGE_NAME}_${PACKAGE_VERSION}_arm64.deb" "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.deb"
pushd releases/linux
ln -sf ../../output/linux-arm64-unpacked "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64"
tar zcfh "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.tar.gz" "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64"
rm -f "${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64"
popd
ls -al releases/linux/*
if [[ "$CI_BRANCH" == "master" && -z "$CI_TAG" ]]; then
yarn github-release delete \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
"*-linux.arm64.rpm" \
"*-linux-arm64.AppImage" \
"*-linux-arm64.deb" \
"*-linux-arm64.tar.gz";
yarn github-release upload \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
--body="${GIT_COMMIT_LOG}" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.arm64.rpm" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.AppImage" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.deb" \
"releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.tar.gz";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux.arm64.rpm";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.AppImage";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.deb";
rm -f "releases/linux/${PACKAGE_NAME}-${PACKAGE_VERSION}-linux-arm64.tar.gz";
fi
fi
test: off
# Packaging artifacts
# https://www.appveyor.com/docs/packaging-artifacts
artifacts:
- path: releases/linux/*
# Publishing artifacts to GitHub Releases
# https://www.appveyor.com/docs/deployment/github
deploy:
- provider: GitHub
auth_token:
secure: G9Qlv8MYhgvYlUxWWUiDdfIUTrKcia16HAdzkVydWqC+wo60XrC8nk1Q2R9WKGXx
draft: false
prerelease: false
on:
appveyor_repo_tag: true # deploy on tag push only
nodejs_version: "12"
# macOS
-
matrix:
only:
- job_name: macOS build (x64)
fast_finish: true
init:
- uname -a
- git --version
- git config --global core.autocrlf false
- git config --global user.name "AppVeyor"
- git config --global user.email "appveyor@ci.appveyor.com"
- sh: |
export CI_BRANCH=$APPVEYOR_REPO_BRANCH
export CI_BUILD_NUMBER=$APPVEYOR_BUILD_NUMBER
export CI_COMMIT=$APPVEYOR_REPO_COMMIT
export CI_COMMIT_SHORT=${APPVEYOR_REPO_COMMIT:0:8}
export CI_COMMIT_TIMESTAMP=$APPVEYOR_REPO_COMMIT_TIMESTAMP
export CI_TAG=$APPVEYOR_REPO_TAG_NAME
echo "• ARCH=$ARCH"
echo "• CI_BRANCH=$CI_BRANCH"
echo "• CI_BUILD_NUMBER=$CI_BUILD_NUMBER"
echo "• CI_COMMIT=$CI_COMMIT"
echo "• CI_COMMIT_SHORT=$CI_COMMIT_SHORT"
echo "• CI_COMMIT_TIMESTAMP=$CI_COMMIT_TIMESTAMP"
echo "• CI_TAG=$CI_TAG"
install:
- nvm install $nodejs_version
- security import "scripts/certs/Certum-Code-Signing-CA-SHA2.cer" -k ~/Library/Keychains/login.keychain -T /usr/bin/codesign
- npm config set loglevel warn
- npm config set scripts-prepend-node-path auto
- npm install -g npm
- npm install -g yarn
- yarn
build_script:
- sh: |
yarn clean
yarn lint
yarn test
if [[ -z "$CI_TAG" ]]; then
yarn build-latest
else
yarn build
fi
- sh: |
# x64
if [[ "$ARCH" == "x64" ]]; then
GIT_COMMIT_LOG=`git log -1 --format='%ci %H %s'`
PACKAGE_NAME=`node -e "console.log(require('./src/package.json').name)"`
PACKAGE_VERSION=`node -e "console.log(require('./src/package.json').version)"`
PRODUCT_NAME=CNCjs
yarn build:macos-x64
ls -al output output/*
mkdir -p releases/macos
cp -af "output/${PRODUCT_NAME}-${PACKAGE_VERSION}.dmg" "releases/macos/${PACKAGE_NAME}-${PACKAGE_VERSION}-macos.x64.dmg"
ls -al releases/macos/*
if [[ "$CI_BRANCH" == "master" && -z "$CI_TAG" ]]; then
yarn github-release delete \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
"*-macos.x64.dmg";
yarn github-release upload \
--owner=cncjs \
--repo=cncjs \
--tag="${CI_BRANCH}-latest" \
--release-name="${CI_BRANCH}" \
--body="${GIT_COMMIT_LOG}" \
"releases/macos/${PACKAGE_NAME}-${PACKAGE_VERSION}-macos.x64.dmg";
rm -f "releases/macos/${PACKAGE_NAME}-${PACKAGE_VERSION}-macos.x64.dmg";
fi
fi
test: off
# Packaging artifacts
# https://www.appveyor.com/docs/packaging-artifacts
artifacts:
- path: releases/macos/*
# Publishing artifacts to GitHub Releases
# https://www.appveyor.com/docs/deployment/github
deploy:
- provider: GitHub
auth_token:
secure: 14dS/9loZ4uMoKGOHGkagaYp5oS30HSIQcPB0FEa7aTEfpb2VJQiUms82hv8nWxY
draft: false
prerelease: false
on:
appveyor_repo_tag: true # deploy on tag push only
nodejs_version: "12"
# Windows
-
matrix:
only:
- job_name: Windows build (x64)
- job_name: Windows build (x86)
fast_finish: true
init:
- git --version
- git config --global core.autocrlf false
- git config --global user.name "AppVeyor"
- git config --global user.email "appveyor@ci.appveyor.com"
- ps: |
$env:CI_BRANCH = $env:APPVEYOR_REPO_BRANCH
$env:CI_BUILD_NUMBER = $env:APPVEYOR_BUILD_NUMBER
$env:CI_COMMIT = $env:APPVEYOR_REPO_COMMIT
$env:CI_COMMIT_SHORT = ${env:APPVEYOR_REPO_COMMIT}.SubString(0,8)
$env:CI_COMMIT_TIMESTAMP = $env:APPVEYOR_REPO_COMMIT_TIMESTAMP
$env:CI_TAG = $env:APPVEYOR_REPO_TAG_NAME
Write-Host "• ARCH=$env:ARCH"
Write-Host "• CI_BRANCH=$env:CI_BRANCH"
Write-Host "• CI_BUILD_NUMBER=$env:CI_BUILD_NUMBER"
Write-Host "• CI_COMMIT=$env:CI_COMMIT"
Write-Host "• CI_COMMIT_SHORT=$env:CI_COMMIT_SHORT"
Write-Host "• CI_COMMIT_TIMESTAMP=$env:CI_COMMIT_TIMESTAMP"
Write-Host "• CI_TAG=$env:CI_TAG"
install:
- ps: Install-Product node $env:nodejs_version
- npm config set loglevel warn
- npm config set scripts-prepend-node-path auto
- npm install -g npm
- npm install -g yarn
- yarn
build_script:
- ps: |
yarn clean
yarn lint
yarn test
if (-not $env:CI_TAG) {
yarn build-latest
} else {
yarn build
}
- ps: |
if ($env:ARCH -eq "x64") {
$GIT_COMMIT_LOG = git log -1 --format='%ci %H %s'
$PACKAGE_NAME = node -e "console.log(require('./src/package.json').name)"
$PACKAGE_VERSION = node -e "console.log(require('./src/package.json').version)"
$PRODUCT_NAME = "CNCjs"
mkdir -Force -Path releases\windows
yarn build:windows-x64
Get-ChildItem output
Copy-Item "output\${PRODUCT_NAME} Setup ${PACKAGE_VERSION}.exe" "releases\windows\${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x64.exe"
Get-ChildItem releases\windows
if ($env:CI_BRANCH -eq "master" -And -not $env:CI_TAG) {
yarn github-release delete --owner=cncjs --repo=cncjs --tag="${env:CI_BRANCH}-latest" --release-name="${env:CI_BRANCH}" "*-windows-x64.exe"
yarn github-release upload --owner=cncjs --repo=cncjs --tag="${env:CI_BRANCH}-latest" --release-name="${env:CI_BRANCH}" --body="${GIT_COMMIT_LOG}" "releases\windows\${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x64.exe"
Remove-Item "releases\windows\${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x64.exe"
}
}
- ps: |
if ($env:ARCH -eq "x86") {
$GIT_COMMIT_LOG = git log -1 --format='%ci %H %s'
$PACKAGE_NAME = node -e "console.log(require('./src/package.json').name)"
$PACKAGE_VERSION = node -e "console.log(require('./src/package.json').version)"
$PRODUCT_NAME = "CNCjs"
mkdir -Force -Path releases\windows
yarn build:windows-ia32
Get-ChildItem output
Copy-Item "output\${PRODUCT_NAME} Setup ${PACKAGE_VERSION}.exe" "releases\windows\${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x86.exe"
Get-ChildItem releases\windows
if ($env:CI_BRANCH -eq "master" -And -not $env:CI_TAG) {
yarn github-release delete --owner=cncjs --repo=cncjs --tag="${env:CI_BRANCH}-latest" --release-name="${env:CI_BRANCH}" "*-windows-x86.exe"
yarn github-release upload --owner=cncjs --repo=cncjs --tag="${env:CI_BRANCH}-latest" --release-name="${env:CI_BRANCH}" --body="${GIT_COMMIT_LOG}" "releases\windows\${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x86.exe"
Remove-Item "releases\windows\${PACKAGE_NAME}-${PACKAGE_VERSION}-windows-x86.exe"
}
}
test: off
# Packaging artifacts
# https://www.appveyor.com/docs/packaging-artifacts
artifacts:
- path: releases\windows\*
# Publishing artifacts to GitHub Releases
# https://www.appveyor.com/docs/deployment/github
deploy:
- provider: GitHub
auth_token:
secure: 14dS/9loZ4uMoKGOHGkagaYp5oS30HSIQcPB0FEa7aTEfpb2VJQiUms82hv8nWxY
draft: false
prerelease: false
on:
appveyor_repo_tag: true # deploy on tag push only
nodejs_version: "12"

10
cncjs/babel.config.js Normal file
View File

@@ -0,0 +1,10 @@
module.exports = {
extends: '@trendmicro/babel-config',
presets: [
'@babel/preset-env',
'@babel/preset-react'
],
plugins: [
'lodash'
]
};

15
cncjs/bin/cnc Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env node
require('@babel/polyfill');
const chalk = require('chalk');
console.warn(chalk.yellow('Warning: The "cnc" executable is deprecated and will be removed in the next major release. Use "cncjs" instead to avoid deprecation.\n'));
const launchServer = (process.env.NODE_ENV === 'development')
? require('../output/server-cli').default
: require('../dist/cncjs/server-cli').default;
launchServer().catch(err => {
console.error('Error:', err);
});

11
cncjs/bin/cncjs Executable file
View File

@@ -0,0 +1,11 @@
#!/usr/bin/env node
require('@babel/polyfill');
const launchServer = (process.env.NODE_ENV === 'development')
? require('../output/cncjs/server-cli').default
: require('../dist/cncjs/server-cli').default;
launchServer().catch(err => {
console.error('Error:', err);
});

22
cncjs/build.config.js Normal file
View File

@@ -0,0 +1,22 @@
module.exports = {
languages: [
'en', // English (default)
'cs', // Czech
'de', // German
'es', // Spanish
'fr', // French
'hu', // Hungarian
'it', // Italian
'ja', // Japanese
'nl', // Nederlands
'pt-br', // Portuguese (Brazil)
'pt-pt', // Portuguese (Portugal)
'ru', // Russian
'tr', // Turkish
'zh-cn', // Simplified Chinese
'zh-tw' // Traditional Chinese
],
analytics: {
trackingId: 'UA-107017110-1'
}
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.9 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 303 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 315 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 282 KiB

9
cncjs/entrypoint Executable file
View File

@@ -0,0 +1,9 @@
#!/usr/bin/env node
require('@babel/polyfill');
const launchServer = require('/opt/cncjs/server-cli').default;
launchServer().catch(err => {
console.error('Error:', err);
});

43
cncjs/examples/.cncrc Normal file
View File

@@ -0,0 +1,43 @@
{
"ports": [
{
"comName": "/dev/ttyAMA0",
"manufacturer": ""
}
],
"baudrates": [115200, 250000],
"mountPoints": [
{
"route": "/widget",
"target": "https://cncjs.github.io/cncjs-widget-boilerplate/v1/"
}
],
"watchDirectory": "/path/to/dir",
"accessTokenLifetime": "30d",
"allowRemoteAccess": false,
"controller": "",
"state": {
"checkForUpdates": true
},
"commands": [
{
"title": "Update (root user)",
"commands": "sudo npm install -g cncjs@latest --unsafe-perm; pkill -f cncjs"
},
{
"title": "Update (non-root user)",
"commands": "npm install -g cncjs@latest; pkill -f cncjs"
},
{
"title": "Reboot",
"commands": "sudo /sbin/reboot"
},
{
"title": "Shutdown",
"commands": "sudo /sbin/shutdown"
}
],
"events": [],
"macros": [],
"users": []
}

View File

@@ -0,0 +1,988 @@
N1 (Credit to Shapeoko Wiki for this calibration file)
N2 G17 G21 G90
N3 F355
N4 G1 Z-1
N5 G1 Z1
N6 G0 X0 Y0
N7 G17 G21 G90
N8 G0 Z1
N9 G0 X-17.75 Y-17.5
N10 G1 Z-3.0
N11 G1 X-17.75 Y-17.5
N12 G1 X-17.5 Y-17.75
N13 G1 X-18.5 Y-18.5
N14 G1 Y-15.7
N15 G1 X-15.7 Y-18.5
N16 G1 X-18.5
N17 G1 X-20 Y-20
N18 G1 Y-12
N19 G1 X-12 Y-20
N20 G1 X-20 Y-20
N21 G1 X-21.5 Y-21.5
N22 G1 Y-8.45
N23 G1 X-8.45 Y-21.5
N24 G1 X-21.5 Y-21.5
N25 G1 X-23 Y-23
N26 G1 Y-4.83
N27 G1 X-4.83 Y-23
N28 G1 X-23 Y-23
N29 G1 X-24.5 Y-24.5
N30 G1 Y-1.2
N31 G1 X-1.2 Y-24.5
N32 G1 X-24.5 Y-24.5
N33 G1 X-25 Y-25
N34 G1 Y0
N35 G1 X0 Y-25
N36 G1 X-25 Y-25
N37 G0 Z1
N38 G0 X17.75 Y-17.5
N39 G1 Z-3.0
N40 G1 X17.75 Y-17.5
N41 G1 X17.5 Y-17.75
N42 G1 X18.5 Y-18.5
N43 G1 Y-15.7
N44 G1 X15.7 Y-18.5
N45 G1 X18.5
N46 G1 X20 Y-20
N47 G1 Y-12
N48 G1 X12 Y-20
N49 G1 X20 Y-20
N50 G1 X21.5 Y-21.5
N51 G1 Y-8.45
N52 G1 X8.45 Y-21.5
N53 G1 X21.5 Y-21.5
N54 G1 X23 Y-23
N55 G1 Y-4.83
N56 G1 X4.83 Y-23
N57 G1 X23 Y-23
N58 G1 X24.5 Y-24.5
N59 G1 Y-1.2
N60 G1 X1.2 Y-24.5
N61 G1 X24.5 Y-24.5
N62 G1 X25 Y-25
N63 G1 Y0
N64 G1 X0 Y-25
N65 G1 X25 Y-25
N66 G0 Z1
N67 G0 X17.75 Y17.5
N68 G1 Z-3.0
N69 G1 X17.75 Y17.5
N70 G1 X17.5 Y17.75
N71 G1 X18.5 Y18.5
N72 G1 Y15.7
N73 G1 X15.7 Y18.5
N74 G1 X18.5
N75 G1 X20 Y20
N76 G1 Y12
N77 G1 X12 Y20
N78 G1 X20 Y20
N79 G1 X21.5 Y21.5
N80 G1 Y8.45
N81 G1 X8.45 Y21.5
N82 G1 X21.5 Y21.5
N83 G1 X23 Y23
N84 G1 Y4.83
N85 G1 X4.83 Y23
N86 G1 X23 Y23
N87 G1 X24.5 Y24.5
N88 G1 Y1.2
N89 G1 X1.2 Y24.5
N90 G1 X24.5 Y24.5
N91 G1 X25 Y25
N92 G1 Y0
N93 G1 X0 Y25
N94 G1 X25 Y25
N95 G0 Z1
N96 G0 X-17.75 Y17.5
N97 G1 Z-3.0
N98 G1 X-17.75 Y17.5
N99 G1 X-17.5 Y17.75
N100 G1 X-18.5 Y18.5
N101 G1 Y15.7
N102 G1 X-15.7 Y18.5
N103 G1 X-18.5
N104 G1 X-20 Y20
N105 G1 Y12
N106 G1 X-12 Y20
N107 G1 X-20 Y20
N108 G1 X-21.5 Y21.5
N109 G1 Y8.45
N110 G1 X-8.45 Y21.5
N111 G1 X-21.5 Y21.5
N112 G1 X-23 Y23
N113 G1 Y4.83
N114 G1 X-4.83 Y23
N115 G1 X-23 Y23
N116 G1 X-24.5 Y24.5
N117 G1 Y1.2
N118 G1 X-1.2 Y24.5
N119 G1 X-24.5 Y24.5
N120 G1 X-25 Y25
N121 G1 Y0
N122 G1 X-0 Y25
N123 G1 X-25 Y25
N124 G0 Z1
N125 G0 X0 Y0
N126 G17 G21 G90
N127 G0 Z1
N128 G0 X-17.75 Y-17.5
N129 G1 Z-3.5
N130 G1 X-17.75 Y-17.5
N131 G1 X-17.5 Y-17.75
N132 G1 X-18.5 Y-18.5
N133 G1 Y-15.7
N134 G1 X-15.7 Y-18.5
N135 G1 X-18.5
N136 G1 X-20 Y-20
N137 G1 Y-12
N138 G1 X-12 Y-20
N139 G1 X-20 Y-20
N140 G1 X-21.5 Y-21.5
N141 G1 Y-8.45
N142 G1 X-8.45 Y-21.5
N143 G1 X-21.5 Y-21.5
N144 G1 X-23 Y-23
N145 G1 Y-4.83
N146 G1 X-4.83 Y-23
N147 G1 X-23 Y-23
N148 G1 X-24.5 Y-24.5
N149 G1 Y-1.2
N150 G1 X-1.2 Y-24.5
N151 G1 X-24.5 Y-24.5
N152 G1 X-25 Y-25
N153 G1 Y0
N154 G1 X0 Y-25
N155 G1 X-25 Y-25
N156 G0 Z1
N157 G0 X17.75 Y-17.5
N158 G1 Z-3.5
N159 G1 X17.75 Y-17.5
N160 G1 X17.5 Y-17.75
N161 G1 X18.5 Y-18.5
N162 G1 Y-15.7
N163 G1 X15.7 Y-18.5
N164 G1 X18.5
N165 G1 X20 Y-20
N166 G1 Y-12
N167 G1 X12 Y-20
N168 G1 X20 Y-20
N169 G1 X21.5 Y-21.5
N170 G1 Y-8.45
N171 G1 X8.45 Y-21.5
N172 G1 X21.5 Y-21.5
N173 G1 X23 Y-23
N174 G1 Y-4.83
N175 G1 X4.83 Y-23
N176 G1 X23 Y-23
N177 G1 X24.5 Y-24.5
N178 G1 Y-1.2
N179 G1 X1.2 Y-24.5
N180 G1 X24.5 Y-24.5
N181 G1 X25 Y-25
N182 G1 Y0
N183 G1 X0 Y-25
N184 G1 X25 Y-25
N185 G0 Z1
N186 G0 X17.75 Y17.5
N187 G1 Z-3.5
N188 G1 X17.75 Y17.5
N189 G1 X17.5 Y17.75
N190 G1 X18.5 Y18.5
N191 G1 Y15.7
N192 G1 X15.7 Y18.5
N193 G1 X18.5
N194 G1 X20 Y20
N195 G1 Y12
N196 G1 X12 Y20
N197 G1 X20 Y20
N198 G1 X21.5 Y21.5
N199 G1 Y8.45
N200 G1 X8.45 Y21.5
N201 G1 X21.5 Y21.5
N202 G1 X23 Y23
N203 G1 Y4.83
N204 G1 X4.83 Y23
N205 G1 X23 Y23
N206 G1 X24.5 Y24.5
N207 G1 Y1.2
N208 G1 X1.2 Y24.5
N209 G1 X24.5 Y24.5
N210 G1 X25 Y25
N211 G1 Y0
N212 G1 X0 Y25
N213 G1 X25 Y25
N214 G0 Z1
N215 G0 X-17.75 Y17.5
N216 G1 Z-3.5
N217 G1 X-17.75 Y17.5
N218 G1 X-17.5 Y17.75
N219 G1 X-18.5 Y18.5
N220 G1 Y15.7
N221 G1 X-15.7 Y18.5
N222 G1 X-18.5
N223 G1 X-20 Y20
N224 G1 Y12
N225 G1 X-12 Y20
N226 G1 X-20 Y20
N227 G1 X-21.5 Y21.5
N228 G1 Y8.45
N229 G1 X-8.45 Y21.5
N230 G1 X-21.5 Y21.5
N231 G1 X-23 Y23
N232 G1 Y4.83
N233 G1 X-4.83 Y23
N234 G1 X-23 Y23
N235 G1 X-24.5 Y24.5
N236 G1 Y1.2
N237 G1 X-1.2 Y24.5
N238 G1 X-24.5 Y24.5
N239 G1 X-25 Y25
N240 G1 Y0
N241 G1 X-0 Y25
N242 G1 X-25 Y25
N243 G0 Z1
N244 G0 X0 Y0
N245 G17 G21 G90
N246 G0 Z1
N247 G0 X-17.75 Y-17.5
N248 G1 Z-4.0
N249 G1 X-17.75 Y-17.5
N250 G1 X-17.5 Y-17.75
N251 G1 X-18.5 Y-18.5
N252 G1 Y-15.7
N253 G1 X-15.7 Y-18.5
N254 G1 X-18.5
N255 G1 X-20 Y-20
N256 G1 Y-12
N257 G1 X-12 Y-20
N258 G1 X-20 Y-20
N259 G1 X-21.5 Y-21.5
N260 G1 Y-8.45
N261 G1 X-8.45 Y-21.5
N262 G1 X-21.5 Y-21.5
N263 G1 X-23 Y-23
N264 G1 Y-4.83
N265 G1 X-4.83 Y-23
N266 G1 X-23 Y-23
N267 G1 X-24.5 Y-24.5
N268 G1 Y-1.2
N269 G1 X-1.2 Y-24.5
N270 G1 X-24.5 Y-24.5
N271 G1 X-25 Y-25
N272 G1 Y0
N273 G1 X0 Y-25
N274 G1 X-25 Y-25
N275 G0 Z1
N276 G0 X17.75 Y-17.5
N277 G1 Z-4.0
N278 G1 X17.75 Y-17.5
N279 G1 X17.5 Y-17.75
N280 G1 X18.5 Y-18.5
N281 G1 Y-15.7
N282 G1 X15.7 Y-18.5
N283 G1 X18.5
N284 G1 X20 Y-20
N285 G1 Y-12
N286 G1 X12 Y-20
N287 G1 X20 Y-20
N288 G1 X21.5 Y-21.5
N289 G1 Y-8.45
N290 G1 X8.45 Y-21.5
N291 G1 X21.5 Y-21.5
N292 G1 X23 Y-23
N293 G1 Y-4.83
N294 G1 X4.83 Y-23
N295 G1 X23 Y-23
N296 G1 X24.5 Y-24.5
N297 G1 Y-1.2
N298 G1 X1.2 Y-24.5
N299 G1 X24.5 Y-24.5
N300 G1 X25 Y-25
N301 G1 Y0
N302 G1 X0 Y-25
N303 G1 X25 Y-25
N304 G0 Z1
N305 G0 X17.75 Y17.5
N306 G1 Z-4.0
N307 G1 X17.75 Y17.5
N308 G1 X17.5 Y17.75
N309 G1 X18.5 Y18.5
N310 G1 Y15.7
N311 G1 X15.7 Y18.5
N312 G1 X18.5
N313 G1 X20 Y20
N314 G1 Y12
N315 G1 X12 Y20
N316 G1 X20 Y20
N317 G1 X21.5 Y21.5
N318 G1 Y8.45
N319 G1 X8.45 Y21.5
N320 G1 X21.5 Y21.5
N321 G1 X23 Y23
N322 G1 Y4.83
N323 G1 X4.83 Y23
N324 G1 X23 Y23
N325 G1 X24.5 Y24.5
N326 G1 Y1.2
N327 G1 X1.2 Y24.5
N328 G1 X24.5 Y24.5
N329 G1 X25 Y25
N330 G1 Y0
N331 G1 X0 Y25
N332 G1 X25 Y25
N333 G0 Z1
N334 G0 X-17.75 Y17.5
N335 G1 Z-4.0
N336 G1 X-17.75 Y17.5
N337 G1 X-17.5 Y17.75
N338 G1 X-18.5 Y18.5
N339 G1 Y15.7
N340 G1 X-15.7 Y18.5
N341 G1 X-18.5
N342 G1 X-20 Y20
N343 G1 Y12
N344 G1 X-12 Y20
N345 G1 X-20 Y20
N346 G1 X-21.5 Y21.5
N347 G1 Y8.45
N348 G1 X-8.45 Y21.5
N349 G1 X-21.5 Y21.5
N350 G1 X-23 Y23
N351 G1 Y4.83
N352 G1 X-4.83 Y23
N353 G1 X-23 Y23
N354 G1 X-24.5 Y24.5
N355 G1 Y1.2
N356 G1 X-1.2 Y24.5
N357 G1 X-24.5 Y24.5
N358 G1 X-25 Y25
N359 G1 Y0
N360 G1 X-0 Y25
N361 G1 X-25 Y25
N362 G0 Z1
N363 G0 X0 Y0
N364 G17 G21 G90
N365 G0 Z1
N366 G0 X-17.75 Y-17.5
N367 G1 Z-4.5
N368 G1 X-17.75 Y-17.5
N369 G1 X-17.5 Y-17.75
N370 G1 X-18.5 Y-18.5
N371 G1 Y-15.7
N372 G1 X-15.7 Y-18.5
N373 G1 X-18.5
N374 G1 X-20 Y-20
N375 G1 Y-12
N376 G1 X-12 Y-20
N377 G1 X-20 Y-20
N378 G1 X-21.5 Y-21.5
N379 G1 Y-8.45
N380 G1 X-8.45 Y-21.5
N381 G1 X-21.5 Y-21.5
N382 G1 X-23 Y-23
N383 G1 Y-4.83
N384 G1 X-4.83 Y-23
N385 G1 X-23 Y-23
N386 G1 X-24.5 Y-24.5
N387 G1 Y-1.2
N388 G1 X-1.2 Y-24.5
N389 G1 X-24.5 Y-24.5
N390 G1 X-25 Y-25
N391 G1 Y0
N392 G1 X0 Y-25
N393 G1 X-25 Y-25
N394 G0 Z1
N395 G0 X17.75 Y-17.5
N396 G1 Z-4.5
N397 G1 X17.75 Y-17.5
N398 G1 X17.5 Y-17.75
N399 G1 X18.5 Y-18.5
N400 G1 Y-15.7
N401 G1 X15.7 Y-18.5
N402 G1 X18.5
N403 G1 X20 Y-20
N404 G1 Y-12
N405 G1 X12 Y-20
N406 G1 X20 Y-20
N407 G1 X21.5 Y-21.5
N408 G1 Y-8.45
N409 G1 X8.45 Y-21.5
N410 G1 X21.5 Y-21.5
N411 G1 X23 Y-23
N412 G1 Y-4.83
N413 G1 X4.83 Y-23
N414 G1 X23 Y-23
N415 G1 X24.5 Y-24.5
N416 G1 Y-1.2
N417 G1 X1.2 Y-24.5
N418 G1 X24.5 Y-24.5
N419 G1 X25 Y-25
N420 G1 Y0
N421 G1 X0 Y-25
N422 G1 X25 Y-25
N423 G0 Z1
N424 G0 X17.75 Y17.5
N425 G1 Z-4.5
N426 G1 X17.75 Y17.5
N427 G1 X17.5 Y17.75
N428 G1 X18.5 Y18.5
N429 G1 Y15.7
N430 G1 X15.7 Y18.5
N431 G1 X18.5
N432 G1 X20 Y20
N433 G1 Y12
N434 G1 X12 Y20
N435 G1 X20 Y20
N436 G1 X21.5 Y21.5
N437 G1 Y8.45
N438 G1 X8.45 Y21.5
N439 G1 X21.5 Y21.5
N440 G1 X23 Y23
N441 G1 Y4.83
N442 G1 X4.83 Y23
N443 G1 X23 Y23
N444 G1 X24.5 Y24.5
N445 G1 Y1.2
N446 G1 X1.2 Y24.5
N447 G1 X24.5 Y24.5
N448 G1 X25 Y25
N449 G1 Y0
N450 G1 X0 Y25
N451 G1 X25 Y25
N452 G0 Z1
N453 G0 X-17.75 Y17.5
N454 G1 Z-4.5
N455 G1 X-17.75 Y17.5
N456 G1 X-17.5 Y17.75
N457 G1 X-18.5 Y18.5
N458 G1 Y15.7
N459 G1 X-15.7 Y18.5
N460 G1 X-18.5
N461 G1 X-20 Y20
N462 G1 Y12
N463 G1 X-12 Y20
N464 G1 X-20 Y20
N465 G1 X-21.5 Y21.5
N466 G1 Y8.45
N467 G1 X-8.45 Y21.5
N468 G1 X-21.5 Y21.5
N469 G1 X-23 Y23
N470 G1 Y4.83
N471 G1 X-4.83 Y23
N472 G1 X-23 Y23
N473 G1 X-24.5 Y24.5
N474 G1 Y1.2
N475 G1 X-1.2 Y24.5
N476 G1 X-24.5 Y24.5
N477 G1 X-25 Y25
N478 G1 Y0
N479 G1 X-0 Y25
N480 G1 X-25 Y25
N481 G0 Z1
N482 G0 X0 Y0
N483 G17 G21 G90
N484 G0 Z1
N485 G0 X-17.75 Y-17.5
N486 G1 Z-5.0
N487 G1 X-17.75 Y-17.5
N488 G1 X-17.5 Y-17.75
N489 G1 X-18.5 Y-18.5
N490 G1 Y-15.7
N491 G1 X-15.7 Y-18.5
N492 G1 X-18.5
N493 G1 X-20 Y-20
N494 G1 Y-12
N495 G1 X-12 Y-20
N496 G1 X-20 Y-20
N497 G1 X-21.5 Y-21.5
N498 G1 Y-8.45
N499 G1 X-8.45 Y-21.5
N500 G1 X-21.5 Y-21.5
N501 G1 X-23 Y-23
N502 G1 Y-4.83
N503 G1 X-4.83 Y-23
N504 G1 X-23 Y-23
N505 G1 X-24.5 Y-24.5
N506 G1 Y-1.2
N507 G1 X-1.2 Y-24.5
N508 G1 X-24.5 Y-24.5
N509 G1 X-25 Y-25
N510 G1 Y0
N511 G1 X0 Y-25
N512 G1 X-25 Y-25
N513 G0 Z1
N514 G0 X17.75 Y-17.5
N515 G1 Z-5.0
N516 G1 X17.75 Y-17.5
N517 G1 X17.5 Y-17.75
N518 G1 X18.5 Y-18.5
N519 G1 Y-15.7
N520 G1 X15.7 Y-18.5
N521 G1 X18.5
N522 G1 X20 Y-20
N523 G1 Y-12
N524 G1 X12 Y-20
N525 G1 X20 Y-20
N526 G1 X21.5 Y-21.5
N527 G1 Y-8.45
N528 G1 X8.45 Y-21.5
N529 G1 X21.5 Y-21.5
N530 G1 X23 Y-23
N531 G1 Y-4.83
N532 G1 X4.83 Y-23
N533 G1 X23 Y-23
N534 G1 X24.5 Y-24.5
N535 G1 Y-1.2
N536 G1 X1.2 Y-24.5
N537 G1 X24.5 Y-24.5
N538 G1 X25 Y-25
N539 G1 Y0
N540 G1 X0 Y-25
N541 G1 X25 Y-25
N542 G0 Z1
N543 G0 X17.75 Y17.5
N544 G1 Z-5.0
N545 G1 X17.75 Y17.5
N546 G1 X17.5 Y17.75
N547 G1 X18.5 Y18.5
N548 G1 Y15.7
N549 G1 X15.7 Y18.5
N550 G1 X18.5
N551 G1 X20 Y20
N552 G1 Y12
N553 G1 X12 Y20
N554 G1 X20 Y20
N555 G1 X21.5 Y21.5
N556 G1 Y8.45
N557 G1 X8.45 Y21.5
N558 G1 X21.5 Y21.5
N559 G1 X23 Y23
N560 G1 Y4.83
N561 G1 X4.83 Y23
N562 G1 X23 Y23
N563 G1 X24.5 Y24.5
N564 G1 Y1.2
N565 G1 X1.2 Y24.5
N566 G1 X24.5 Y24.5
N567 G1 X25 Y25
N568 G1 Y0
N569 G1 X0 Y25
N570 G1 X25 Y25
N571 G0 Z1
N572 G0 X-17.75 Y17.5
N573 G1 Z-5.0
N574 G1 X-17.75 Y17.5
N575 G1 X-17.5 Y17.75
N576 G1 X-18.5 Y18.5
N577 G1 Y15.7
N578 G1 X-15.7 Y18.5
N579 G1 X-18.5
N580 G1 X-20 Y20
N581 G1 Y12
N582 G1 X-12 Y20
N583 G1 X-20 Y20
N584 G1 X-21.5 Y21.5
N585 G1 Y8.45
N586 G1 X-8.45 Y21.5
N587 G1 X-21.5 Y21.5
N588 G1 X-23 Y23
N589 G1 Y4.83
N590 G1 X-4.83 Y23
N591 G1 X-23 Y23
N592 G1 X-24.5 Y24.5
N593 G1 Y1.2
N594 G1 X-1.2 Y24.5
N595 G1 X-24.5 Y24.5
N596 G1 X-25 Y25
N597 G1 Y0
N598 G1 X-0 Y25
N599 G1 X-25 Y25
N600 G0 Z1
N601 G0 X0 Y0
N602 G0 Z1
N603 G0 X-21 Y-21
N604 G1 Z-5.5
N605 G1 X-21 Y-20
N606 G3 X-20 Y-21 I21 J20
N607 G1 X-21 Y-21
N608 G1 X-22.5 Y-22.5
N609 G1 Y-15.8
N610 G3 X-15.8 Y-22.5 I22.5 J15.8
N611 G1 X-22.5
N612 G1 X-24 Y-24
N613 G1 Y-10
N614 G3 X-10 Y-24 I24 J10
N615 G1 X-24
N616 G1 X-25 Y-25
N617 G1 Y0
N618 G3 X0 Y-25 I25 J0
N619 G1 X-25
N620 G0 Z1
N621 G0 X21 Y-21
N622 G1 Z-5.5
N623 G1 X20
N624 G3 X21 Y-20 I20 J21
N625 G1 Y-21
N626 G1 X22.5 Y-22.5
N627 G1 X15.8
N628 G3 X22.5 Y-15.8 I-15.8 J22.5
N629 G1 Y-22.5
N630 G1 X24 Y-24
N631 G1 X10
N632 G3 X24 Y-10 I-10 J24
N633 G1 Y-24
N634 G1 X25 Y-25
N635 G1 X0
N636 G3 X25 Y0 I0 J25
N637 G1 Y-25
N638 G1 Z1
N639 G0 X21 Y21
N640 G1 Z-5.5
N641 G1 X21 Y20
N642 G3 X20 Y21 I-21 J-20
N643 G1 X21 Y21
N644 G1 X22.5 Y22.5
N645 G1 Y15.8
N646 G3 X15.8 Y22.5 I-22.5 J-15.8
N647 G1 X22.5
N648 G1 X24 Y24
N649 G1 Y10
N650 G3 X10 Y24 I-24 J-10
N651 G1 X24
N652 G1 X25 Y25
N653 G1 Y0
N654 G3 X0 Y25 I-25 J0
N655 G1 X25
N656 G0 Z1
N657 G0 X-21 Y21
N658 G1 Z-5.5
N659 G1 X-20
N660 G3 X-21 Y20 I20 J-21
N661 G1 Y21
N662 G1 X-22.5 Y22.5
N663 G1 X-15.8
N664 G3 X-22.5 Y15.8 I15.8 J-22.5
N665 G1 Y22.5
N666 G1 X-24 Y24
N667 G1 X-10
N668 G3 X-24 Y10 I10 J-24
N669 G1 Y24
N670 G1 X-25 Y25
N671 G1 X0
N672 G3 X-25 Y0 I0 J-25
N673 G1 Y25
N674 G0 Z1
N675 G0 X-21 Y-21
N676 G1 Z-6
N677 G1 X-21 Y-20
N678 G3 X-20 Y-21 I21 J20
N679 G1 X-21 Y-21
N680 G1 X-22.5 Y-22.5
N681 G1 Y-15.8
N682 G3 X-15.8 Y-22.5 I22.5 J15.8
N683 G1 X-22.5
N684 G1 X-24 Y-24
N685 G1 Y-10
N686 G3 X-10 Y-24 I24 J10
N687 G1 X-24
N688 G1 X-25 Y-25
N689 G1 Y0
N690 G3 X0 Y-25 I25 J0
N691 G1 X-25
N692 G0 Z1
N693 G0 X21 Y-21
N694 G1 Z-6
N695 G1 X20
N696 G3 X21 Y-20 I20 J21
N697 G1 Y-21
N698 G1 X22.5 Y-22.5
N699 G1 X15.8
N700 G3 X22.5 Y-15.8 I-15.8 J22.5
N701 G1 Y-22.5
N702 G1 X24 Y-24
N703 G1 X10
N704 G3 X24 Y-10 I-10 J24
N705 G1 Y-24
N706 G1 X25 Y-25
N707 G1 X0
N708 G3 X25 Y0 I0 J25
N709 G1 Y-25
N710 G1 Z1
N711 G0 X21 Y21
N712 G1 Z-6
N713 G1 X21 Y20
N714 G3 X20 Y21 I-21 J-20
N715 G1 X21 Y21
N716 G1 X22.5 Y22.5
N717 G1 Y15.8
N718 G3 X15.8 Y22.5 I-22.5 J-15.8
N719 G1 X22.5
N720 G1 X24 Y24
N721 G1 Y10
N722 G3 X10 Y24 I-24 J-10
N723 G1 X24
N724 G1 X25 Y25
N725 G1 Y0
N726 G3 X0 Y25 I-25 J0
N727 G1 X25
N728 G0 Z1
N729 G0 X-21 Y21
N730 G1 Z-6
N731 G1 X-20
N732 G3 X-21 Y20 I20 J-21
N733 G1 Y21
N734 G1 X-22.5 Y22.5
N735 G1 X-15.8
N736 G3 X-22.5 Y15.8 I15.8 J-22.5
N737 G1 Y22.5
N738 G1 X-24 Y24
N739 G1 X-10
N740 G3 X-24 Y10 I10 J-24
N741 G1 Y24
N742 G1 X-25 Y25
N743 G1 X0
N744 G3 X-25 Y0 I0 J-25
N745 G1 Y25
N746 G0 Z1
N747 G0 X-21 Y-21
N748 G1 Z-6.5
N749 G1 X-21 Y-20
N750 G3 X-20 Y-21 I21 J20
N751 G1 X-21 Y-21
N752 G1 X-22.5 Y-22.5
N753 G1 Y-15.8
N754 G3 X-15.8 Y-22.5 I22.5 J15.8
N755 G1 X-22.5
N756 G1 X-24 Y-24
N757 G1 Y-10
N758 G3 X-10 Y-24 I24 J10
N759 G1 X-24
N760 G1 X-25 Y-25
N761 G1 Y0
N762 G3 X0 Y-25 I25 J0
N763 G1 X-25
N764 G0 Z1
N765 G0 X21 Y-21
N766 G1 Z-6.5
N767 G1 X20
N768 G3 X21 Y-20 I20 J21
N769 G1 Y-21
N770 G1 X22.5 Y-22.5
N771 G1 X15.8
N772 G3 X22.5 Y-15.8 I-15.8 J22.5
N773 G1 Y-22.5
N774 G1 X24 Y-24
N775 G1 X10
N776 G3 X24 Y-10 I-10 J24
N777 G1 Y-24
N778 G1 X25 Y-25
N779 G1 X0
N780 G3 X25 Y0 I0 J25
N781 G1 Y-25
N782 G1 Z1
N783 G0 X21 Y21
N784 G1 Z-6.5
N785 G1 X21 Y20
N786 G3 X20 Y21 I-21 J-20
N787 G1 X21 Y21
N788 G1 X22.5 Y22.5
N789 G1 Y15.8
N790 G3 X15.8 Y22.5 I-22.5 J-15.8
N791 G1 X22.5
N792 G1 X24 Y24
N793 G1 Y10
N794 G3 X10 Y24 I-24 J-10
N795 G1 X24
N796 G1 X25 Y25
N797 G1 Y0
N798 G3 X0 Y25 I-25 J0
N799 G1 X25
N800 G0 Z1
N801 G0 X-21 Y21
N802 G1 Z-6.5
N803 G1 X-20
N804 G3 X-21 Y20 I20 J-21
N805 G1 Y21
N806 G1 X-22.5 Y22.5
N807 G1 X-15.8
N808 G3 X-22.5 Y15.8 I15.8 J-22.5
N809 G1 Y22.5
N810 G1 X-24 Y24
N811 G1 X-10
N812 G3 X-24 Y10 I10 J-24
N813 G1 Y24
N814 G1 X-25 Y25
N815 G1 X0
N816 G3 X-25 Y0 I0 J-25
N817 G1 Y25
N818 G0 Z1
N819 G0 X-21 Y-21
N820 G1 Z-7
N821 G1 X-21 Y-20
N822 G3 X-20 Y-21 I21 J20
N823 G1 X-21 Y-21
N824 G1 X-22.5 Y-22.5
N825 G1 Y-15.8
N826 G3 X-15.8 Y-22.5 I22.5 J15.8
N827 G1 X-22.5
N828 G1 X-24 Y-24
N829 G1 Y-10
N830 G3 X-10 Y-24 I24 J10
N831 G1 X-24
N832 G1 X-25 Y-25
N833 G1 Y0
N834 G3 X0 Y-25 I25 J0
N835 G1 X-25
N836 G0 Z1
N837 G0 X21 Y-21
N838 G1 Z-7
N839 G1 X20
N840 G3 X21 Y-20 I20 J21
N841 G1 Y-21
N842 G1 X22.5 Y-22.5
N843 G1 X15.8
N844 G3 X22.5 Y-15.8 I-15.8 J22.5
N845 G1 Y-22.5
N846 G1 X24 Y-24
N847 G1 X10
N848 G3 X24 Y-10 I-10 J24
N849 G1 Y-24
N850 G1 X25 Y-25
N851 G1 X0
N852 G3 X25 Y0 I0 J25
N853 G1 Y-25
N854 G1 Z1
N855 G0 X21 Y21
N856 G1 Z-7
N857 G1 X21 Y20
N858 G3 X20 Y21 I-21 J-20
N859 G1 X21 Y21
N860 G1 X22.5 Y22.5
N861 G1 Y15.8
N862 G3 X15.8 Y22.5 I-22.5 J-15.8
N863 G1 X22.5
N864 G1 X24 Y24
N865 G1 Y10
N866 G3 X10 Y24 I-24 J-10
N867 G1 X24
N868 G1 X25 Y25
N869 G1 Y0
N870 G3 X0 Y25 I-25 J0
N871 G1 X25
N872 G0 Z1
N873 G0 X-21 Y21
N874 G1 Z-7
N875 G1 X-20
N876 G3 X-21 Y20 I20 J-21
N877 G1 Y21
N878 G1 X-22.5 Y22.5
N879 G1 X-15.8
N880 G3 X-22.5 Y15.8 I15.8 J-22.5
N881 G1 Y22.5
N882 G1 X-24 Y24
N883 G1 X-10
N884 G3 X-24 Y10 I10 J-24
N885 G1 Y24
N886 G1 X-25 Y25
N887 G1 X0
N888 G3 X-25 Y0 I0 J-25
N889 G1 Y25
N890 G0 Z1
N891 G0 X-21 Y-21
N892 G1 Z-7.5
N893 G1 X-21 Y-20
N894 G3 X-20 Y-21 I21 J20
N895 G1 X-21 Y-21
N896 G1 X-22.5 Y-22.5
N897 G1 Y-15.8
N898 G3 X-15.8 Y-22.5 I22.5 J15.8
N899 G1 X-22.5
N900 G1 X-24 Y-24
N901 G1 Y-10
N902 G3 X-10 Y-24 I24 J10
N903 G1 X-24
N904 G1 X-25 Y-25
N905 G1 Y0
N906 G3 X0 Y-25 I25 J0
N907 G1 X-25
N908 G0 Z1
N909 G0 X21 Y-21
N910 G1 Z-7.5
N911 G1 X20
N912 G3 X21 Y-20 I20 J21
N913 G1 Y-21
N914 G1 X22.5 Y-22.5
N915 G1 X15.8
N916 G3 X22.5 Y-15.8 I-15.8 J22.5
N917 G1 Y-22.5
N918 G1 X24 Y-24
N919 G1 X10
N920 G3 X24 Y-10 I-10 J24
N921 G1 Y-24
N922 G1 X25 Y-25
N923 G1 X0
N924 G3 X25 Y0 I0 J25
N925 G1 Y-25
N926 G1 Z1
N927 G0 X21 Y21
N928 G1 Z-7.5
N929 G1 X21 Y20
N930 G3 X20 Y21 I-21 J-20
N931 G1 X21 Y21
N932 G1 X22.5 Y22.5
N933 G1 Y15.8
N934 G3 X15.8 Y22.5 I-22.5 J-15.8
N935 G1 X22.5
N936 G1 X24 Y24
N937 G1 Y10
N938 G3 X10 Y24 I-24 J-10
N939 G1 X24
N940 G1 X25 Y25
N941 G1 Y0
N942 G3 X0 Y25 I-25 J0
N943 G1 X25
N944 G0 Z1
N945 G0 X-21 Y21
N946 G1 Z-7.5
N947 G1 X-20
N948 G3 X-21 Y20 I20 J-21
N949 G1 Y21
N950 G1 X-22.5 Y22.5
N951 G1 X-15.8
N952 G3 X-22.5 Y15.8 I15.8 J-22.5
N953 G1 Y22.5
N954 G1 X-24 Y24
N955 G1 X-10
N956 G3 X-24 Y10 I10 J-24
N957 G1 Y24
N958 G1 X-25 Y25
N959 G1 X0
N960 G3 X-25 Y0 I0 J-25
N961 G1 Y25
N962 G0 Z1
N963 G0 X-25 Y-25
N964 G1 Z-8
N965 G1 X25
N966 G1 Y25
N967 G1 X-25
N968 G1 Y-25
N969 G1 Z-8.5
N970 G1 X25
N971 G1 Y25
N972 G1 X-25
N973 G1 Y-25
N974 G1 Z-9
N975 G1 X25
N976 G1 Y25
N977 G1 X-25
N978 G1 Y-25
N979 G1 Z-9.5
N980 G1 X25
N981 G1 Y25
N982 G1 X-25
N983 G1 Y-25
N984 G1 Z-10
N985 G1 X25
N986 G1 Y25
N987 G1 X-25
N988 G1 Y-25

View File

@@ -0,0 +1,3 @@
G17
G1 X0Y20 F200
G2 X20Y0 I0 J-20.0

View File

@@ -0,0 +1,3 @@
G17
G1 X0Y20 F200
G2 X20Y0 I0 J-20.0

View File

@@ -0,0 +1,3 @@
G18
G1 X0Z20 F200
G2 X20Z0 I0 K-20.0

View File

@@ -0,0 +1,3 @@
G19
G1 Y0Z20 F200
G2 Y20Z0 J0 K-20.0

View File

@@ -0,0 +1,11 @@
G17 G20 G90 G94 G54
G0 Z0.25
X-0.5 Y0.
Z0.1
G01 Z0. F5.
G02 X0. Y0.5 I0.5 J0. F2.5
X0.5 Y0. I0. J-0.5
X0. Y-0.5 I-0.5 J0.
X-0.5 Y0. I0. J0.5
G01 Z0.1 F5.
G00 X0. Y0. Z0.25

View File

@@ -0,0 +1,8 @@
G17 G21 G90 G94 G54
G0 X-5 Y0 Z0 F200
G2 X0 Y5 I5 J0 F200
G02 X5 Y0 I0 J-5
G02 X0 Y-5 I-5 J0
G02 X-5 Y0 I0 J5
G01 Z1 F500
G00 X0 Y0 Z5

View File

@@ -0,0 +1,18 @@
N45 G0 X-2. Y.75
N46 G1 Z-.5 F10.
N47 Y.5 F30. S2000
N48 G2 J-1.1
N49 G1 Y.75
N50 Z.2
N51 G0 X.75 Y-3.4
N52 G1 Z-.5 F10.
N53 X.5 F30.
N54 G2 I-1.1
N55 X.75
N56 Z.2
N57 G0 X-4.75 Y-3.4
N58 G1 Z-.5 F10.
N59 X-4.5 F30.
N60 G2 I1.1
N61 G1 X-4.75
N62 Z.2

View File

@@ -0,0 +1,10 @@
G21
G00 X0 Y0 Z50
G01 Z0 F250
X10 Y10
Y50
X40
G02 X50 Y40 I0 J-10
G01 Y20
G02 X40 Y10 I-10 J0
G01 X10

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,16 @@
G17
G20
G91
G01 Z-0.6533 F100.
G42 D08
G01 X0.0235 Y-0.0939 F10.
G03 X0.0939 Y0.0939 Z0.0179 R0.0939
G03 X-0.1179 Y0.1179 Z0.0179 R0.1179
G03 X-0.1185 Y-0.1185 Z0.0179 R0.1185
G03 X0.1191 Y-0.1191 Z0.0179 R0.1191 F16.
G03 X0.1196 Y0.1196 Z0.0179 R0.1196
G03 X-0.1202 Y0.1202 Z0.0179 R0.1202 F26.
G03 X-0.1207 Y-0.1207 Z0.0179 R0.1207
G03 X0.1213 Y-0.1213 Z0.0179 R0.1213
G03 X0.1218 Y0.1218 Z0.0179 R0.1218
G03 X-0.0975 Y0.0975 Z0.0179 R0.0975

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="300.000000pt" height="225.000000pt" viewBox="0 0 300.000000 225.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.10, written by Peter Selinger 2001-2011
</metadata>
<g transform="translate(0.000000,225.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M1090 1490 c-136 -24 -210 -99 -210 -215 0 -110 54 -167 215 -230
119 -46 155 -74 155 -121 0 -81 -100 -112 -255 -78 -38 8 -82 17 -97 21 l-28
6 0 -71 0 -71 58 -12 c90 -20 257 -17 320 5 105 36 161 113 162 219 0 105 -46
163 -169 213 -189 76 -213 96 -197 158 15 60 154 74 299 30 15 -5 17 2 17 60
0 74 5 70 -105 86 -79 11 -101 11 -165 0z"/>
<path d="M2393 1469 c-150 -58 -236 -250 -205 -459 20 -140 67 -215 167 -268
46 -25 60 -27 165 -27 65 0 133 6 158 13 l42 13 0 68 0 69 -62 -20 c-91 -28
-183 -22 -233 16 -59 45 -80 102 -80 221 0 109 13 159 52 206 61 72 149 82
301 34 21 -7 22 -5 22 63 l0 71 -37 10 c-66 19 -231 13 -290 -10z"/>
<path d="M262 1423 l3 -58 138 -3 137 -3 0 -207 c0 -114 -5 -224 -10 -244 -17
-59 -53 -81 -125 -76 -34 2 -79 13 -103 25 l-43 21 3 -71 3 -70 40 -15 c59
-21 180 -21 237 1 65 25 123 92 137 158 6 29 11 167 11 324 l0 275 -215 0
-216 0 3 -57z"/>
<path d="M1520 1101 l0 -381 143 0 c78 0 162 5 187 11 99 22 190 103 226 200
9 24 19 90 21 148 9 162 -19 254 -96 324 -71 64 -95 70 -298 75 l-183 4 0
-381z m313 245 c78 -33 110 -103 111 -241 0 -87 -3 -107 -25 -156 -35 -75 -77
-101 -175 -107 l-74 -5 0 262 0 261 65 0 c36 0 80 -6 98 -14z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
{
"ports": [
{
"comName": "/dev/ttyFAKE",
"manufacturer": "grbl-sim"
}
]
}

View File

@@ -0,0 +1,32 @@
#!/bin/bash
FAKETTY=/dev/ttyFAKE
GRBLSIM="./grbl_sim.exe"
# Kill the socat process running in background
trap "ctrl_c" 2
ctrl_c() {
printf "\nTerminating grbl-sim.\n"
for child in $(jobs -p); do
sudo kill $child
done
exit
}
if [ ! -e $GRBLSIM ];then
printf "Build grbl-sim with 'make' first.\nIf the output is not named $GRBLSIM this script needs to be updated.\n"
exit
fi
sudo socat PTY,raw,link=$FAKETTY,echo=0 "EXEC:'$GRBLSIM -n -s step.out -b block.out',pty,raw,echo=0"&
# Wait for socat to setup the link then change permission
sleep 1
sudo chmod a+rw /dev/ttyFAKE
printf "grbl-sim running on $FAKETTY\n"
printf "Press [CTRL+C] to stop.\n"
while true
do
sleep 100
done

View File

@@ -0,0 +1,5 @@
# cncjs-pendant-ps3
Dual Shock / PS3 Bluetooth Remote Pendant for CNCjs
#### This project has been moved to https://github.com/cncjs/cncjs-pendant-ps3.

View File

@@ -0,0 +1,5 @@
# cncjs-pendant-tinyweb
A tiny web console for small 320x240 LCD display
#### This project has been moved to https://github.com/cncjs/cncjs-pendant-tinyweb.

View File

@@ -0,0 +1,78 @@
/* eslint no-console: 0 */
/* eslint strict: 0 */
const fs = require('fs');
const chalk = require('chalk');
const languages = require('./build.config').languages;
module.exports = {
src: [
'src/app/**/*.{html,hbs,js,jsx}',
// Use ! to filter out files or directories
'!src/app/{vendor,i18n}/**',
'!test/**',
'!**/node_modules/**'
],
dest: './',
options: {
debug: false,
removeUnusedKeys: true,
sort: false,
func: {
list: [], // Use an empty array to bypass the default list: i18n.t, i18next.t
extensions: ['.js', '.jsx']
},
trans: {
component: 'I18n',
i18nKey: 'i18nKey',
defaultsKey: 'defaults',
extensions: ['.js', '.jsx'],
fallbackKey: function(ns, value) {
return value;
}
},
lngs: languages,
ns: [
'gcode',
'resource' // default
],
defaultNs: 'resource',
defaultValue: (lng, ns, key) => {
if (lng === 'en') {
return key; // Use key as value for base language
}
return ''; // Return empty string for other languages
},
resource: {
loadPath: 'src/app/i18n/{{lng}}/{{ns}}.json',
savePath: 'src/app/i18n/{{lng}}/{{ns}}.json', // or 'src/app/i18n/${lng}/${ns}.saveAll.json'
jsonIndent: 4
},
nsSeparator: ':', // namespace separator
keySeparator: '.', // key separator
interpolation: {
prefix: '{{',
suffix: '}}'
}
},
transform: function(file, enc, done) {
'use strict';
const parser = this.parser;
const content = fs.readFileSync(file.path, enc);
let count = 0;
parser.parseFuncFromString(content, { list: ['i18n._', 'i18n.__'] }, (key, options) => {
parser.set(key, Object.assign({}, options, {
nsSeparator: false,
keySeparator: false
}));
++count;
});
if (count > 0) {
console.log(`[i18next-scanner] transform: count=${chalk.cyan(count)}, file=${chalk.yellow(JSON.stringify(file.relative))}`);
}
done();
}
};

View File

@@ -0,0 +1,66 @@
/* eslint no-console: 0 */
/* eslint strict: 0 */
const fs = require('fs');
const chalk = require('chalk');
const languages = require('./build.config').languages;
module.exports = {
options: {
debug: false,
removeUnusedKeys: false,
sort: false,
func: {
list: ['i18n.t', 't'],
extensions: ['.js', '.jsx']
},
trans: {
component: 'I18n',
i18nKey: 'i18nKey',
defaultsKey: 'defaults',
extensions: ['.js', '.jsx'],
fallbackKey: function(ns, value) {
return value;
}
},
lngs: languages,
ns: [
'resource' // default
],
defaultNs: 'resource',
defaultValue: '__L10N__', // to indicate that a default value has not been defined for the key
resource: {
loadPath: 'src/server/i18n/{{lng}}/{{ns}}.json',
savePath: 'src/server/i18n/{{lng}}/{{ns}}.json', // or 'src/server/i18n/${lng}/${ns}.saveAll.json'
jsonIndent: 4
},
nsSeparator: ':', // namespace separator
keySeparator: '.', // key separator
pluralSeparator: '_', // plural separator
contextSeparator: '_', // context separator
interpolation: {
prefix: '{{',
suffix: '}}'
}
},
transform: function(file, enc, done) {
'use strict';
const parser = this.parser;
const content = fs.readFileSync(file.path, enc);
let count = 0;
parser.parseFuncFromString(content, { list: ['i18n._', 'i18n.__'] }, (key, options) => {
parser.set(key, Object.assign({}, options, {
nsSeparator: false,
keySeparator: false
}));
++count;
});
if (count > 0) {
console.log(`[i18next-scanner] transform: count=${chalk.cyan(count)}, file=${chalk.yellow(JSON.stringify(file.relative))}`);
}
done();
}
};

19
cncjs/index.hbs Normal file
View File

@@ -0,0 +1,19 @@
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>{{title}}</title>
<meta name="description" content="">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-capable" content="yes">
<link rel="shortcut icon" href="{{webroot}}favicon.ico">
</head>
<body>
<div id="loading" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);">
<div style="background: transparent url('{{webroot}}images/32x32/loading.gif') no-repeat 0 0; height: 32px; width: 32px; display: block; margin: 0 auto;"></div>
<div style="font-family: Arial, Helvetica, sans-serif; font-size: 13px; font-weight: normal; color: #222; text-align: center; margin-top: 10px;">{{loading}}</div>
</div>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

BIN
cncjs/media/banner.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
cncjs/media/banner2.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

BIN
cncjs/media/cnc.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 584 KiB

BIN
cncjs/media/cncjs.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 329 KiB

BIN
cncjs/media/events.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 KiB

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M896 1440v-1088q-148 0-273 73t-198 198-73 273 73 273 198 198 273 73zm768-544q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 321 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M896 622l201 306h-402zm365 530h94l-459-691-459 691h94l104-160h522zm403-256q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 319 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-896q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h896q26 0 45 19t19 45zm256-384v128q0 26-19 45t-45 19h-1408q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1408q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-640q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h640q26 0 45 19t19 45z"/></svg>

After

Width:  |  Height:  |  Size: 509 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm0-384v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm0-384v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm0-384v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45z"/></svg>

After

Width:  |  Height:  |  Size: 505 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-1280q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1280q26 0 45 19t19 45zm256-384v128q0 26-19 45t-45 19h-1536q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1536q26 0 45 19t19 45zm-384-384v128q0 26-19 45t-45 19h-1152q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1152q26 0 45 19t19 45z"/></svg>

After

Width:  |  Height:  |  Size: 513 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1792 1344v128q0 26-19 45t-45 19h-1664q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1664q26 0 45 19t19 45zm0-384v128q0 26-19 45t-45 19h-1280q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1280q26 0 45 19t19 45zm0-384v128q0 26-19 45t-45 19h-1536q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1536q26 0 45 19t19 45zm0-384v128q0 26-19 45t-45 19h-1152q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h1152q26 0 45 19t19 45z"/></svg>

After

Width:  |  Height:  |  Size: 505 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M576 1408q0-53-37.5-90.5t-90.5-37.5-90.5 37.5-37.5 90.5 37.5 90.5 90.5 37.5 90.5-37.5 37.5-90.5zm-384-512h384v-256h-158q-14 2-22 9l-195 195q-7 12-9 22v30zm1280 512q0-53-37.5-90.5t-90.5-37.5-90.5 37.5-37.5 90.5 37.5 90.5 90.5 37.5 90.5-37.5 37.5-90.5zm128-672v-192q0-14-9-23t-23-9h-224v-224q0-14-9-23t-23-9h-192q-14 0-23 9t-9 23v224h-224q-14 0-23 9t-9 23v192q0 14 9 23t23 9h224v224q0 14 9 23t23 9h192q14 0 23-9t9-23v-224h224q14 0 23-9t9-23zm256-544v1152q0 26-19 45t-45 19h-192q0 106-75 181t-181 75-181-75-75-181h-384q0 106-75 181t-181 75-181-75-75-181h-128q-26 0-45-19t-19-45 19-45 45-19v-416q0-26 13-58t32-51l198-198q19-19 51-32t58-13h160v-320q0-26 19-45t45-19h1152q26 0 45 19t19 45z"/></svg>

After

Width:  |  Height:  |  Size: 792 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M960 256q0-26-19-45t-45-19-45 19-19 45 19 45 45 19 45-19 19-45zm832 928v352q0 22-20 30-8 2-12 2-13 0-23-9l-93-93q-119 143-318.5 226.5t-429.5 83.5-429.5-83.5-318.5-226.5l-93 93q-9 9-23 9-4 0-12-2-20-8-20-30v-352q0-14 9-23t23-9h352q22 0 30 20 8 19-7 35l-100 100q67 91 189.5 153.5t271.5 82.5v-647h-192q-26 0-45-19t-19-45v-128q0-26 19-45t45-19h192v-163q-58-34-93-92.5t-35-128.5q0-106 75-181t181-75 181 75 75 181q0 70-35 128.5t-93 92.5v163h192q26 0 45 19t19 45v128q0 26-19 45t-45 19h-192v647q149-20 271.5-82.5t189.5-153.5l-100-100q-15-16-7-35 8-20 30-20h352q14 0 23 9t9 23z"/></svg>

After

Width:  |  Height:  |  Size: 677 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M685 483q16 0 27.5-11.5t11.5-27.5-11.5-27.5-27.5-11.5-27 11.5-11 27.5 11 27.5 27 11.5zm422 0q16 0 27-11.5t11-27.5-11-27.5-27-11.5-27.5 11.5-11.5 27.5 11.5 27.5 27.5 11.5zm-812 184q42 0 72 30t30 72v430q0 43-29.5 73t-72.5 30-73-30-30-73v-430q0-42 30-72t73-30zm1060 19v666q0 46-32 78t-77 32h-75v227q0 43-30 73t-73 30-73-30-30-73v-227h-138v227q0 43-30 73t-73 30q-42 0-72-30t-30-73l-1-227h-74q-46 0-78-32t-32-78v-666h918zm-232-405q107 55 171 153.5t64 215.5h-925q0-117 64-215.5t172-153.5l-71-131q-7-13 5-20 13-6 20 6l72 132q95-42 201-42t201 42l72-132q7-12 20-6 12 7 5 20zm477 488v430q0 43-30 73t-73 30q-42 0-72-30t-30-73v-430q0-43 30-72.5t72-29.5q43 0 73 29.5t30 72.5z"/></svg>

After

Width:  |  Height:  |  Size: 771 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1209 378l-114 328 117 21q165-451 165-518 0-56-38-56-57 0-130 225zm-299 687l33 88q37-42 71-67l-33-5.5-38.5-7-32.5-8.5zm-292-896q0 98 159 521 18-10 49-10 15 0 75 5l-121-351q-75-220-123-220-19 0-29 17.5t-10 37.5zm-79 759q0 36 51.5 119t117.5 153 100 70q14 0 25.5-13t11.5-27q0-24-32-102-13-32-32-72t-47.5-89-61.5-81-62-32q-20 0-45.5 27t-25.5 47zm-158 335q0 41 25 104 59 145 183.5 227t281.5 82q227 0 382-170 152-169 152-427 0-43-1-67t-11.5-62-30.5-56q-56-49-211.5-75.5t-270.5-26.5q-37 0-49 11-12 5-12 35 0 34 21.5 60t55.5 40 77.5 23.5 87.5 11.5 85 4 70 0h23q24 0 40 19 15 19 19 55-28 28-96 54-61 22-93 46-64 46-108.5 114t-44.5 137q0 31 18.5 88.5t18.5 87.5l-3 12q-4 12-4 14-137-10-146-216-8 2-41 2 2 7 2 21 0 53-40.5 89.5t-94.5 36.5q-82 0-166.5-78t-84.5-159q0-34 33-67 52 64 60 76 77 104 133 104 12 0 26.5-8.5t14.5-20.5q0-34-87.5-145t-116.5-111q-43 0-70 44.5t-27 90.5zm-114 9q0-101 42.5-163t136.5-88q-28-74-28-104 0-62 61-123t122-61q29 0 70 15-163-462-163-567 0-80 41-130.5t119-50.5q131 0 325 581 6 17 8 23 6-16 29-79.5t43.5-118.5 54-127.5 64.5-123 70.5-86.5 76.5-36q71 0 112 49t41 122q0 108-159 550 61 15 100.5 46t58.5 78 26 93.5 7 110.5q0 150-47 280t-132 225-211 150-278 55q-111 0-223-42-149-57-258-191.5t-109-286.5z"/></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1395 864q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23zm0-384q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 414 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1011 1376q0 13-10 23l-50 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l50 50q10 10 10 23t-10 23l-393 393 393 393q10 10 10 23zm384 0q0 13-10 23l-50 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l50 50q10 10 10 23t-10 23l-393 393 393 393q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 419 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M979 960q0 13-10 23l-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23zm384 0q0 13-10 23l-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 415 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1395 1312q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23zm0-384q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 421 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1395 736q0 13-10 23l-466 466q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l393 393 393-393q10-10 23-10t23 10l50 50q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 263 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1203 544q0 13-10 23l-393 393 393 393q10 10 10 23t-10 23l-50 50q-10 10-23 10t-23-10l-466-466q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l50 50q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 265 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1171 960q0 13-10 23l-466 466q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l393-393-393-393q-10-10-10-23t10-23l50-50q10-10 23-10t23 10l466 466q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 264 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1395 1184q0 13-10 23l-50 50q-10 10-23 10t-23-10l-393-393-393 393q-10 10-23 10t-23-10l-50-50q-10-10-10-23t10-23l466-466q10-10 23-10t23 10l466 466q10 10 10 23z"/></svg>

After

Width:  |  Height:  |  Size: 267 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1585 1215q-39 125-123 250-129 196-257 196-49 0-140-32-86-32-151-32-61 0-142 33-81 34-132 34-152 0-301-259-147-261-147-503 0-228 113-374 112-144 284-144 72 0 177 30 104 30 138 30 45 0 143-34 102-34 173-34 119 0 213 65 52 36 104 100-79 67-114 118-65 94-65 207 0 124 69 223t158 126zm-376-1173q0 61-29 136-30 75-93 138-54 54-108 72-37 11-104 17 3-149 78-257 74-107 250-148 1 3 2.5 11t2.5 11q0 4 .5 10t.5 10z"/></svg>

After

Width:  |  Height:  |  Size: 513 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1088 832q0-26-19-45t-45-19h-256q-26 0-45 19t-19 45 19 45 45 19h256q26 0 45-19t19-45zm576-192v960q0 26-19 45t-45 19h-1408q-26 0-45-19t-19-45v-960q0-26 19-45t45-19h1408q26 0 45 19t19 45zm64-448v256q0 26-19 45t-45 19h-1536q-26 0-45-19t-19-45v-256q0-26 19-45t45-19h1536q26 0 45 19t19 45z"/></svg>

After

Width:  |  Height:  |  Size: 393 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1920 1536v128h-2048v-1536h128v1408h1920zm-384-1024l256 896h-1664v-576l448-576 576 576z"/></svg>

After

Width:  |  Height:  |  Size: 196 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1412 897q0-27-18-45l-91-91q-18-18-45-18t-45 18l-189 189v-502q0-26-19-45t-45-19h-128q-26 0-45 19t-19 45v502l-189-189q-19-19-45-19t-45 19l-91 91q-18 18-18 45t18 45l362 362 91 91q18 18 45 18t45-18l91-91 362-362q18-18 18-45zm252-1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 472 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1408 960v-128q0-26-19-45t-45-19h-502l189-189q19-19 19-45t-19-45l-91-91q-18-18-45-18t-45 18l-362 362-91 91q-18 18-18 45t18 45l91 91 362 362q18 18 45 18t45-18l91-91q18-18 18-45t-18-45l-189-189h502q26 0 45-19t19-45zm256-64q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 465 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1248 928q0 12-10 24l-319 319q-11 9-23 9t-23-9l-320-320q-15-16-7-35 8-20 30-20h192v-352q0-14 9-23t23-9h192q14 0 23 9t9 23v352h192q14 0 23 9t9 23zm-352-576q-148 0-273 73t-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273-73-273-198-198-273-73zm768 544q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 504 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1280 800v192q0 13-9.5 22.5t-22.5 9.5h-352v192q0 14-9 23t-23 9q-12 0-24-10l-319-319q-9-9-9-23t9-23l320-320q9-9 23-9 13 0 22.5 9.5t9.5 22.5v192h352q13 0 22.5 9.5t9.5 22.5zm160 96q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 524 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1280 896q0 14-9 23l-320 320q-9 9-23 9-13 0-22.5-9.5t-9.5-22.5v-192h-352q-13 0-22.5-9.5t-9.5-22.5v-192q0-13 9.5-22.5t22.5-9.5h352v-192q0-14 9-23t23-9q12 0 24 10l319 319q9 9 9 23zm160 0q0-148-73-273t-198-198-273-73-273 73-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273zm224 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 531 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1246 876q-8 20-30 20h-192v352q0 14-9 23t-23 9h-192q-14 0-23-9t-9-23v-352h-192q-14 0-23-9t-9-23q0-12 10-24l319-319q11-9 23-9t23 9l320 320q15 16 7 35zm-350-524q-148 0-273 73t-198 198-73 273 73 273 198 198 273 73 273-73 198-198 73-273-73-273-198-198-273-73zm768 544q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 508 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1413 896q0-27-18-45l-91-91-362-362q-18-18-45-18t-45 18l-91 91q-18 18-18 45t18 45l189 189h-502q-26 0-45 19t-19 45v128q0 26 19 45t45 19h502l-189 189q-19 19-19 45t19 45l91 91q18 18 45 18t45-18l362-362 91-91q18-18 18-45zm251 0q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 468 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1412 895q0-27-18-45l-362-362-91-91q-18-18-45-18t-45 18l-91 91-362 362q-18 18-18 45t18 45l91 91q18 18 45 18t45-18l189-189v502q0 26 19 45t45 19h128q26 0 45-19t19-45v-502l189 189q19 19 45 19t45-19l91-91q18-18 18-45zm252 1q0 209-103 385.5t-279.5 279.5-385.5 103-385.5-103-279.5-279.5-103-385.5 103-385.5 279.5-279.5 385.5-103 385.5 103 279.5 279.5 103 385.5z"/></svg>

After

Width:  |  Height:  |  Size: 464 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1675 832q0 53-37 90l-651 652q-39 37-91 37-53 0-90-37l-651-652q-38-36-38-90 0-53 38-91l74-75q39-37 91-37 53 0 90 37l294 294v-704q0-52 38-90t90-38h128q52 0 90 38t38 90v704l294-294q37-37 90-37 52 0 91 37l75 75q37 39 37 91z"/></svg>

After

Width:  |  Height:  |  Size: 329 B

View File

@@ -0,0 +1 @@
<svg width="1792" height="1792" viewBox="0 0 1792 1792" xmlns="http://www.w3.org/2000/svg"><path d="M1664 896v128q0 53-32.5 90.5t-84.5 37.5h-704l293 294q38 36 38 90t-38 90l-75 76q-37 37-90 37-52 0-91-37l-651-652q-37-37-37-90 0-52 37-91l651-650q38-38 91-38 52 0 90 38l75 74q38 38 38 91t-38 91l-293 293h704q52 0 84.5 37.5t32.5 90.5z"/></svg>

After

Width:  |  Height:  |  Size: 339 B

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