diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
deleted file mode 100644
index 431fc60..0000000
--- a/.github/workflows/main.yml
+++ /dev/null
@@ -1,68 +0,0 @@
-name: Build
-
-on:
-  workflow_dispatch:
-  pull_request:
-  push:
-    branches:
-      - '**'
-
-jobs:
-  native:
-    strategy:
-      fail-fast: false
-      matrix:
-        # Disabling the linux build for now
-        # os: [ubuntu-latest, macos-latest, windows-latest]
-        os: [macos-latest, windows-latest]
-    runs-on: ${{ matrix.os }}
-    steps:
-      - uses: actions/checkout@v3
-        with:
-          submodules: true
-
-      - uses: actions/setup-node@v3
-        with:
-          node-version: 18
-
-      - name: JUCE Linux Dependencies
-        shell: bash
-        if: ${{ matrix.os == 'ubuntu-latest' }}
-        run: |
-          sudo apt-get update
-          sudo apt-get install -y freeglut3-dev
-          sudo apt-get install -y g++
-          sudo apt-get install -y libasound2-dev
-          sudo apt-get install -y libcurl4-openssl-dev
-          sudo apt-get install -y libfreetype6-dev
-          sudo apt-get install -y libjack-jackd2-dev
-          sudo apt-get install -y libx11-dev
-          sudo apt-get install -y libxcomposite-dev
-          sudo apt-get install -y libxcursor-dev
-          sudo apt-get install -y libxinerama-dev
-          sudo apt-get install -y libxrandr-dev
-          sudo apt-get install -y mesa-common-dev
-
-      - name: Build
-        shell: bash
-        run: |
-          set -x
-          set -e
-
-          npm install
-          npm run build
-
-      - name: Artifact naming
-        shell: bash
-        run: |
-          echo "ARTIFACT_DATESTRING=$(date +'%Y-%m-%d')" >> $GITHUB_ENV
-          echo "ARTIFACT_OS=$(echo $RUNNER_OS | tr '[:upper:]' '[:lower:]')" >> $GITHUB_ENV
-
-      - uses: actions/upload-artifact@v3
-        with:
-          name: srvb-${{ env.ARTIFACT_OS }}-${{ env.ARTIFACT_DATESTRING }}
-          path: |
-            native/build/scripted/SRVB_artefacts/Release/VST3/
-            native/build/scripted/SRVB_artefacts/Release/AU/
-            !native/build/scripted/SRVB_artefacts/Release/VST3/*.lib
-            !native/build/scripted/SRVB_artefacts/Release/VST3/*.exp
diff --git a/.gitignore b/.gitignore
index 126959e..7792296 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ pnpm-debug.log*
 lerna-debug.log*
 
 # Builds
+native
 node_modules
 build
 dist
diff --git a/.gitmodules b/.gitmodules
index e1c24ee..bd547be 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -6,4 +6,5 @@
 	url = https://github.com/juce-framework/JUCE.git
 [submodule "choc"]
 	path = native/choc
-	url = https://github.com/nick-thompson/choc.git
+	url = https://github.com/cristianvogel/choc
+	branch = cristians-edits
diff --git a/README.md b/README.md
index 5b360d9..922266a 100644
--- a/README.md
+++ b/README.md
@@ -1,93 +1 @@
-# SRVB
-
-SRVB is a small digital reverb audio plugin (VST3/AU) for MacOS and Windows.
-
-This project demonstrates one way to write an audio plugin using JavaScript and
-familiar web technologies, and while there are several variants on this approach,
-it is meant to be both a compelling example and a good starting point for audio
-plugins made with a similar architecture.
-
-## Overview
-
-The software architecture in this plugin is much like [Tauri](https://tauri.app/) and similar to
-[Electron](https://www.electronjs.org/). The user interface is a simple Vite, React, and Tailwind app
-at the root of the repository, which is packaged into the plugin app bundle and loaded into a native
-webview instance owned by the plugin at runtime.
-
-The audio processing algorithm in the `dsp/` directory is also written in
-JavaScript using [Elementary](https://elementary.audio), and is run in a separate
-engine which directs the underlying native plugin audio processing. The native
-plugin itself provides the harness for these two frontend JavaScript bundles,
-and interfaces with the plugin host (typically a DAW) to coordinate the user
-interface and the audio processing loop.
-
-## Elementary
-
-If you're new to Elementary Audio, [Elementary](https://elementary.audio) is a JavaScript/C++ library for building audio applications.
-
-* **Declarative:** Elementary makes it simple to create interactive audio processes through functional, declarative programming. Describe your audio process as a function of your application state, and Elementary will efficiently update the underlying audio engine as necessary.
-* **Dynamic:** Most audio processing frameworks and tools facilitate building static processes. But what happens as your audio requirements change throughout the user journey? Elementary is designed to facilitate and adapt to the dynamic nature of modern audio applications.
-* **Portable:** By decoupling the JavaScript API from the underlying audio engine (the "what" from the "how"), Elementary enables writing portable applications. Whether the underlying engine is running in the browser, an audio plugin, or an embedded device, the JavaScript layer remains the same.
-
-Find more in the [Elementary repository on GitHub](https://github.com/elemaudio/elementary) and the documentation [on the website](https://elementary.audio/).
-
-## Getting Started
-
-### Dependencies
-
-Before running the following steps, please make sure you have the following dependencies installed and
-available at the command line:
-
-* [CMake](https://cmake.org/)
-* [Node.js](https://nodejs.org/en)
-* Bash: the build steps below expect to run scripts in a Bash environment. For Windows machines, consider running the following steps in a Git Bash environment, or with WSL.
-
-Next, we fetch the SRVB project and its dependencies,
-
-```bash
-# Clone the project with its submodules
-git clone --recurse-submodules https://github.com/elemaudio/srvb.git
-cd srvb
-
-# Install npm dependencies
-npm install
-```
-
-### Develop
-```bash
-npm run dev
-```
-
-In develop mode, the native plugin is compiled to fetch its JavaScript assets from localhost, where subsequently we
-run the Vite dev server to serve those assets. This arrangement enables Vite's hot reloading behavior for developing
-the plugin while it's running inside a host.
-
-### Release
-```bash
-npm run build
-```
-
-In release builds, the JavaScript bundles are packaged into the plugin app bundle so that the resulting bundle
-is relocatable, thereby enabling distribution to end users.
-
-### Troubleshooting
-
-* After a successful build with either `npm run dev` or `npm run build`, you
-  should have local plugin binaries built and copied into the correct
-  audio plugin directories on your machine. If you don't see them, look in
-  `./native/build/scripted/SRVB_artefacts` and copy them manually
-* **Note**: the CMake build on Windows attempts to copy the VST3 plugin binary
-  into `C:\Program Files`, a step that requires admin permissions. Therefore
-  you should either run your build as an admin, or disable the copy plugin step
-  in `native/CMakeLists.txt` and manually copy the plugin binary after build.
-* **Note**: especially on MacOS, certain plugin hosts such as Ableton Live have
-  strict security settings that prevent them from recognizing local unsigned
-  binaries. You'll want to either add a codesign step to your build, or
-  configure the security settings of your host to address this.
-
-## License
-
-[MIT](./LICENSE.md)
-
-This project also uses [JUCE](https://juce.com/), which is licensed GPLv3. Please consult JUCE's license
-agreement if you intend to distribute your own plugin based on this template.
+# Under construction
diff --git a/dsp/main.js b/dsp/main.js
index 7057940..3b89585 100644
--- a/dsp/main.js
+++ b/dsp/main.js
@@ -2,7 +2,6 @@ import {Renderer, el} from '@elemaudio/core';
 import {RefMap} from './RefMap';
 import srvb from './srvb';
 
-
 // This project demonstrates writing a small FDN reverb effect in Elementary.
 //
 // First, we initialize a custom Renderer instance that marshals our instruction
@@ -20,7 +19,7 @@ let refs = new RefMap(core);
 let prevState = null;
 
 function shouldRender(prevState, nextState) {
-  return (prevState === null) || (prevState.sampleRate !== nextState.sampleRate);
+  return (prevState === null) || (nextState ===null) || (prevState.sampleRate !== nextState.sampleRate);
 }
 
 // The important piece: here we register a state change callback with the native
diff --git a/how_to_update_choc.md b/how_to_update_choc.md
new file mode 100644
index 0000000..5d0769d
--- /dev/null
+++ b/how_to_update_choc.md
@@ -0,0 +1,166 @@
+Important to update CHOC that is used in the native/choc submodule and also probably in Elementary submodule
+
+here is copilot guide.
+
+
+cristianvogel: npm command to install everything including git submodules
+
+GitHub Copilot: ```bash
+npm install && git submodule update --init --recursive
+```
+
+cristianvogel: remove all cache of git submodules
+
+GitHub Copilot: ```bash
+git submodule deinit -f --all && git rm -rf .git/modules
+```
+
+cristianvogel: fatal: No url found for submodule path 'native/choc' in .gitmodules
+
+
+There is no url registred in .gitmodules file
+
+GitHub Copilot: To resolve the issue of a missing URL for the submodule path 'native/choc' in the [`.gitmodules`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.gitmodules%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.gitmodules") file, you need to add the submodule information for 'native/choc' to the [`.gitmodules`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.gitmodules%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.gitmodules") file. This involves specifying the path and URL of the submodule. Here's how you can do it:
+
+1. Open the [`.gitmodules`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.gitmodules%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.gitmodules") file in your editor.
+2. Add the following lines to register the 'native/choc' submodule:
+
+```properties
+[submodule "choc"]
+	path = native/choc
+	url = <URL_TO_CHOC_GIT_REPOSITORY>
+```
+
+Replace `<URL_TO_CHOC_GIT_REPOSITORY>` with the actual URL of the 'choc' Git repository.
+
+3. Save the `.gitmodules` file.
+4. Run the following commands in your terminal to synchronize your local configuration:
+
+```bash
+git submodule init
+git submodule update
+```
+
+This will initialize the new submodule and clone it into the specified path.
+
+cristianvogel: i am trying to remove this submodule referenence but it dosn't seem to de-install
+
+GitHub Copilot: To remove a submodule reference, such as `elementary` or `juce`, from your Git repository, you need to follow these steps. Let's use `elementary` as an example:
+
+1. **Delete the submodule entry from [`.gitmodules`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.gitmodules%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.gitmodules") file**: Open the [`.gitmodules`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.gitmodules%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.gitmodules") file and remove the section related to `elementary`.
+
+    ```properties
+    [submodule "elementary"]
+    path = native/elementary
+    url = https://github.com/elemaudio/elementary.git
+    ```
+
+2. **Stage the `.gitmodules` changes**: After editing the `.gitmodules` file, stage the changes for commit.
+
+    ```bash
+    git add .gitmodules
+    ```
+
+3. **Delete the submodule section from [`.git/config`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.git%2Fconfig%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.git/config")**: Open your [`.git/config`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.git%2Fconfig%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.git/config") file in a text editor and remove the submodule section related to `elementary`.
+
+    ```ini
+    [submodule "elementary"]
+        url = https://github.com/elemaudio/elementary.git
+    ```
+
+4. **Unstage and remove the submodule files**: Run the following commands to unstage the submodule path and then remove the submodule directory from your working directory.
+
+    ```bash
+    git rm --cached native/elementary
+    rm -rf native/elementary
+    ```
+
+5. **Remove the submodule's [`.git`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.git%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.git") directory**: Delete the [`.git`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.git%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.git") directory located in the submodule's directory. Since you've already removed the directory in the previous step, this is more of a general step if you need to manually remove any leftover [`.git`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.git%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.git") directories.
+
+6. **Commit your changes**: Commit the removal of the submodule.
+
+    ```bash
+    git commit -m "Removed elementary submodule"
+    ```
+
+7. **Delete the submodule's entry from the `.git/modules` directory**: Finally, remove the submodule's data from the `.git/modules` directory.
+
+    ```bash
+    rm -rf .git/modules/native/elementary
+    ```
+
+Repeat these steps for any other submodule you wish to remove, such as `juce`. Make sure to adjust the paths and names accordingly.
+
+cristianvogel: how do i specifiy a specific branch and commit for a submodule
+
+GitHub Copilot: To specify a specific branch and commit for a submodule in Git, follow these steps:
+
+1. **Navigate to the submodule directory**: First, change your current working directory to the submodule's directory.
+
+    ```bash
+    cd path/to/submodule
+    ```
+
+    Replace `path/to/submodule` with the actual path to your submodule, such as `native/elementary`.
+
+2. **Checkout the specific branch**: Checkout the branch you want to track in the submodule.
+
+    ```bash
+    git checkout branch-name
+    ```
+
+    Replace `branch-name` with the name of the branch you want to use.
+
+3. **Pull or reset to the specific commit**: If you want the latest commit from that branch, you can simply pull. However, if you need a specific commit, use `git reset` or `git checkout` to move to that commit.
+
+    - To pull the latest changes (if you're tracking a branch):
+
+        ```bash
+        git pull
+        ```
+
+    - To move to a specific commit:
+
+        ```bash
+        git reset --hard commit-hash
+        ```
+
+        or
+
+        ```bash
+        git checkout commit-hash
+        ```
+
+    Replace `commit-hash` with the hash of the commit you want to use.
+
+4. **Update the submodule reference in the main project**: After you have checked out the specific branch and commit in the submodule, navigate back to the root of your main project and stage the submodule changes.
+
+    ```bash
+    cd ../..
+    git add path/to/submodule
+    ```
+
+    This adds the new state of the submodule to your main project.
+
+5. **Commit the change**: Commit the update to the submodule reference in your main project.
+
+    ```bash
+    git commit -m "Update submodule to specific branch and commit"
+    ```
+
+6. **(Optional) Push the changes**: If you want these changes to be reflected in the remote repository, push them.
+
+    ```bash
+    git push
+    ```
+
+**Note**: If you want to ensure that the submodule is always checked out to a specific branch when others clone or pull from the main repository, you can add the `branch` option to the [`.gitmodules`](command:_github.copilot.openRelativePath?%5B%7B%22scheme%22%3A%22file%22%2C%22authority%22%3A%22%22%2C%22path%22%3A%22%2FUsers%2Fcristianvogel%2FDesktop%2FProgramming%2FSRVB-withCablesUI%2Fsrvb-fork%2F.gitmodules%22%2C%22query%22%3A%22%22%2C%22fragment%22%3A%22%22%7D%5D "/Users/cristianvogel/Desktop/Programming/SRVB-withCablesUI/srvb-fork/.gitmodules") file. This doesn't lock the submodule to a specific commit but ensures the specified branch is checked out.
+
+```properties
+[submodule "submodule-name"]
+	path = path/to/submodule
+	url = https://example.com/submodule.git
+	branch = branch-name
+```
+
+Replace `submodule-name`, `path/to/submodule`, `https://example.com/submodule.git`, and `branch-name` with your submodule's name, path, URL, and branch name, respectively. After adding the branch to `.gitmodules`, remember to commit and push the `.gitmodules` file as well.
\ No newline at end of file
diff --git a/index.html b/index.html
index 6c396ed..c9a1df2 100644
--- a/index.html
+++ b/index.html
@@ -1,12 +1,41 @@
 <!DOCTYPE html>
 <html lang="en">
   <head>
-    <meta charset="UTF-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <title>Elementary Effects Plugin</title>
+    <title>Four GL Dials</title>
+    <style>
+      body {
+        margin: 0;
+        background-color: #000;
+        color: #fff;
+        font-family: Helvetica, Arial, sans-serif;
+        overflow: hidden; /* disable scrolling / rubberband effect on mobile */
+        height: 100vh;
+      }
+
+      canvas {
+        display: block;
+        position: absolute;
+        outline: 0;
+      }
+
+      * {
+        /* disable on touch highlights of html elements, especially on mobile! */
+        -webkit-tap-highlight-color: transparent;
+        -webkit-touch-callout: none;
+        -webkit-user-select: auto;
+        -moz-user-select: none;
+        -ms-user-select: none;
+        user-select: auto;
+      }
+    </style>
+
+    <meta charset="utf-8" />
+    
   </head>
   <body>
-    <div id="root"></div>
-    <script type="module" src="/src/main.jsx"></script>
+
+    <div id="app"></div>
+    <script type="module" src="/src/main.ts"></script>
+    
   </body>
 </html>
diff --git a/native/CMakeLists.txt b/native/CMakeLists.txt
index b25ac63..d1bf4a4 100644
--- a/native/CMakeLists.txt
+++ b/native/CMakeLists.txt
@@ -1,8 +1,8 @@
 cmake_minimum_required(VERSION 3.15)
-project(Elem_SRVB VERSION 0.1.0)
+project(NEL_SRVB VERSION 0.1.0)
 
 
-set(TARGET_NAME SRVB)
+set(TARGET_NAME NEL_SRVB)
 set(ASSETS_DIR ${CMAKE_SOURCE_DIR}/../dist/)
 
 option(JUCE_ENABLE_MODULE_SOURCE_GROUPS "Enable Module Source Groups" ON)
@@ -12,34 +12,93 @@ option(ELEM_DEV_LOCALHOST "Run against localhost for static assets" OFF)
 add_subdirectory(juce)
 add_subdirectory(elementary/runtime)
 
+if (WIN32)
+  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+    set(PC_ARCH "x64")
+  else()
+    set(PC_ARCH "x32")
+  endif()
+endif()
+
 juce_add_plugin(${TARGET_NAME}
-  BUNDLE_ID "audio.elementary.srvb"
-  COMPANY_NAME "Elementary Audio"
-  COMPANY_WEBSITE "https://www.elementary.audio"
-  COMPANY_EMAIL "nick@elementary.audio"
-  PLUGIN_MANUFACTURER_CODE Elem       # A four-character manufacturer id with at least one upper-case character
-  PLUGIN_CODE Srvb                    # A unique four-character plugin id with at least one upper-case character
+  BUNDLE_ID "audio.neverenginelabs.NEL_SRVB"
+  COMPANY_NAME "NeverEngineLabs"
+  COMPANY_WEBSITE "https://neverenginelabs.com"
+  COMPANY_EMAIL "support@neverenginelabs.com"
+  PLUGIN_MANUFACTURER_CODE NLVB       # A four-character manufacturer id with at least one upper-case character
+  PLUGIN_CODE ShRv                    # A unique four-character plugin id with at least one upper-case character
   COPY_PLUGIN_AFTER_BUILD FALSE       # We enable this manually below after adding a copy step
-  APP_SANDBOX_ENABLED TRUE
+  APP_SANDBOX_ENABLED TRUE 
   APP_SANDBOX_OPTIONS com.apple.security.network.client com.apple.security.files.user-selected.read-write
   FORMATS AU VST3                     # The formats to build. Other valid formats are: AAX Unity VST AU AUv3
-  PRODUCT_NAME ${TARGET_NAME})        # The name of the final executable, which can differ from the target name
+  PRODUCT_NAME "NELShifterMesh_${CMAKE_OSX_ARCHITECTURES}${PC_ARCH}_${BUILD_VERSION}")        # The name of the final executable, which can differ from the target name
+
+  # Keyzy Client Library
+  # Replace KeyzyClientLibraryX.X.X with your actual library version
+
+set(KeyzyClientLibrary_VERSION "v143")
+
+if(WIN32)
+  if(MSVC_VERSION EQUAL 1910) # VS 2017
+      set(VS_VERSION "VS2017")
+  elseif(MSVC_VERSION EQUAL 1920) # VS 2019
+      set(VS_VERSION "VS2019")
+  elseif(MSVC_VERSION GREATER_EQUAL 1930) # VS 2022 or later
+      set(VS_VERSION "VS2022")
+  endif()
+
+  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
+      set(ARCH "64")
+  else()
+      set(ARCH "86")
+  endif()
+
+  # Set MD or MT based on your project requirements
+  set(MD_MT "MD")
+
+  set(DEBUG_OR_RELEASE "$<$<CONFIG:Debug>:D>$<$<CONFIG:Release>:R>")
+
+  set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/KeyzyClientLibrary/${VS_VERSION}/${DEBUG_OR_RELEASE}${ARCH}${MD_MT}_x64_${KeyzyClientLibrary_VERSION})
+
+  target_link_libraries(${TARGET_NAME} PRIVATE ${LIB_DIR}/Lib/KeyzyClient.lib)
+
+elseif(APPLE)
+  if(IOS)
+      set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/KeyzyClientLibrary/XcodeiOS)
+  else()
+      # Choose the correct library based on your target architectures
+      set(LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/KeyzyClientLibrary/XcodeAppleSiliconIntel64)
+  endif()
+
+  find_library(KEYZY_CLIENT_LIB KeyzyClient PATHS ${LIB_DIR}/Lib)
+  if(NOT KEYZY_CLIENT_LIB)
+      message(FATAL_ERROR "KeyzyClient library not found")
+  endif()
+  target_link_libraries(${TARGET_NAME} PRIVATE ${KEYZY_CLIENT_LIB})
+endif()
+
+target_include_directories(${TARGET_NAME} PRIVATE
+  $<BUILD_INTERFACE:${LIB_DIR}/Include>)
 
 # Copy static assets post build
 if (NOT ELEM_DEV_LOCALHOST)
   get_target_property(ACTIVE_TARGETS ${TARGET_NAME} JUCE_ACTIVE_PLUGIN_TARGETS)
-  foreach(ACTIVE_TARGET IN LISTS ACTIVE_TARGETS)
-    message(STATUS "Adding resource copy step from ${ASSETS_DIR} for ${ACTIVE_TARGET}")
-
-    get_target_property(ARTIFACT_FILE ${ACTIVE_TARGET} JUCE_PLUGIN_ARTEFACT_FILE)
-    set(RESOURCE_DIR "${ARTIFACT_FILE}/Contents/Resources/")
-
-    add_custom_command(TARGET ${ACTIVE_TARGET} POST_BUILD
-      COMMAND ${CMAKE_COMMAND} -E rm -rf "${RESOURCE_DIR}/dist"
-      COMMAND ${CMAKE_COMMAND} -E make_directory "${RESOURCE_DIR}/dist"
-      COMMAND ${CMAKE_COMMAND} -E copy_directory "${ASSETS_DIR}" "${RESOURCE_DIR}/dist"
-      VERBATIM)
-  endforeach()
+foreach(ACTIVE_TARGET IN LISTS ACTIVE_TARGETS)
+  message(STATUS "Adding resource copy step from ${ASSETS_DIR} for ${ACTIVE_TARGET}")
+
+  get_target_property(ARTIFACT_FILE ${ACTIVE_TARGET} JUCE_PLUGIN_ARTEFACT_FILE)
+  set(RESOURCE_DIR "${ARTIFACT_FILE}/Contents/Resources/")
+
+add_custom_command(TARGET ${ACTIVE_TARGET} POST_BUILD
+  COMMAND ${CMAKE_COMMAND} -E rm -rf "${RESOURCE_DIR}/dist"
+  COMMAND ${CMAKE_COMMAND} -E echo "Removed directory: ${RESOURCE_DIR}/dist"
+  COMMAND ${CMAKE_COMMAND} -E make_directory "${RESOURCE_DIR}/dist"
+  COMMAND ${CMAKE_COMMAND} -E echo "Created directory: ${RESOURCE_DIR}/dist"
+  COMMAND ${CMAKE_COMMAND} -E copy_directory "${ASSETS_DIR}" "${RESOURCE_DIR}/dist"
+  COMMAND ${CMAKE_COMMAND} -E echo "Copied directory: ${ASSETS_DIR} to ${RESOURCE_DIR}/dist"
+  VERBATIM)
+
+endforeach()
 endif()
 
 # Enable copy step
@@ -50,35 +109,42 @@ endif()
 target_sources(${TARGET_NAME}
   PRIVATE
   PluginProcessor.cpp
-  WebViewEditor.cpp)
+  WebViewEditor.cpp
+  )
 
 target_include_directories(${TARGET_NAME}
   PRIVATE
   ${CMAKE_CURRENT_SOURCE_DIR}/choc/gui
-  ${CMAKE_CURRENT_SOURCE_DIR}/choc/javascript)
+  ${CMAKE_CURRENT_SOURCE_DIR}/choc/javascript
+)
 
 target_compile_features(${TARGET_NAME}
   PRIVATE
   cxx_std_17)
 
-target_compile_definitions(${TARGET_NAME}
+
+  target_compile_definitions(${TARGET_NAME}
   PRIVATE
   ELEM_DEV_LOCALHOST=${ELEM_DEV_LOCALHOST}
   JUCE_VST3_CAN_REPLACE_VST2=0
   JUCE_USE_CURL=0)
 
-target_link_libraries(${TARGET_NAME}
+  target_link_libraries(${TARGET_NAME}
   PRIVATE
   juce::juce_audio_basics
-  juce::juce_audio_devices
-  juce::juce_audio_plugin_client
+  # juce::juce_audio_devices
+  # juce::juce_audio_plugin_client
   juce::juce_audio_processors
   juce::juce_audio_utils
-  juce::juce_core
-  juce::juce_data_structures
-  juce::juce_dsp
-  juce::juce_events
-  juce::juce_graphics
-  juce::juce_gui_basics
+  # juce::juce_core
+  # juce::juce_data_structures
+  # juce::juce_dsp
+  # juce::juce_events
+  # juce::juce_graphics
+  # juce::juce_gui_basics
   juce::juce_gui_extra
-  runtime)
+  runtime
+  )
+
+
+
diff --git a/native/PluginProcessor.cpp b/native/PluginProcessor.cpp
index 2b7ab85..2de7224 100644
--- a/native/PluginProcessor.cpp
+++ b/native/PluginProcessor.cpp
@@ -3,19 +3,18 @@
 
 #include <choc_javascript_QuickJS.h>
 
-
 //==============================================================================
 // A quick helper for locating bundled asset files
 juce::File getAssetsDirectory()
 {
 #if JUCE_MAC
     auto assetsDir = juce::File::getSpecialLocation(juce::File::SpecialLocationType::currentApplicationFile)
-        .getChildFile("Contents/Resources/dist");
+                         .getChildFile("Contents/Resources/dist");
 #elif JUCE_WINDOWS
     auto assetsDir = juce::File::getSpecialLocation(juce::File::SpecialLocationType::currentExecutableFile) // Plugin.vst3/Contents/<arch>/Plugin.vst3
-        .getParentDirectory()  // Plugin.vst3/Contents/<arch>/
-        .getParentDirectory()  // Plugin.vst3/Contents/
-        .getChildFile("Resources/dist");
+                         .getParentDirectory()                                                              // Plugin.vst3/Contents/<arch>/
+                         .getParentDirectory()                                                              // Plugin.vst3/Contents/
+                         .getChildFile("Resources/dist");
 #else
 #error "We only support Mac and Windows here yet."
 #endif
@@ -25,10 +24,11 @@ juce::File getAssetsDirectory()
 
 //==============================================================================
 EffectsPluginProcessor::EffectsPluginProcessor()
-     : AudioProcessor (BusesProperties()
-                       .withInput  ("Input",  juce::AudioChannelSet::stereo(), true)
-                       .withOutput ("Output", juce::AudioChannelSet::stereo(), true))
-     , jsContext(choc::javascript::createQuickJSContext())
+    : AudioProcessor(BusesProperties()
+                         .withInput("Input", juce::AudioChannelSet::stereo(), true)
+                         .withOutput("Output", juce::AudioChannelSet::stereo(), true)),
+      jsContext(choc::javascript::createQuickJSContext()),
+      jsContext2(choc::javascript::createQuickJSContext())
 {
     // Initialize parameters from the manifest file
 #if ELEM_DEV_LOCALHOST
@@ -43,55 +43,146 @@ EffectsPluginProcessor::EffectsPluginProcessor()
     auto manifestFileContents = manifestFile.loadFileAsString().toStdString();
 #endif
 
-    auto manifest = elem::js::parseJSON(manifestFileContents);
+    const auto manifest = elem::js::parseJSON(manifestFileContents);
 
     if (!manifest.isObject())
         return;
 
-    auto parameters = manifest.getWithDefault("parameters", elem::js::Array());
+    const auto parameters = manifest.getWithDefault("parameters", elem::js::Array());
+    createParameters(parameters);
 
-    for (size_t i = 0; i < parameters.size(); ++i) {
-        auto descrip = parameters[i];
+    // The view state property has to have some value so that when state is loaded
+    // from the host, the key exists and is populated.
+   meshState.insert_or_assign(MESH_STATE_PROPERTY, "{}" );
+}
 
-        if (!descrip.isObject())
+EffectsPluginProcessor::~EffectsPluginProcessor()
+{
+    for (auto &p : getParameters())
+    {
+        p->removeListener(this);
+    }
+}
+
+//==============================================================================
+void EffectsPluginProcessor::createParameters(const std::vector<elem::js::Value> &parameters)
+{
+    for (const auto &parameter : parameters)
+    {
+        if (!parameter.isObject())
             continue;
 
-        auto paramId = descrip.getWithDefault("paramId", elem::js::String("unknown"));
-        auto name = descrip.getWithDefault("name", elem::js::String("Unknown"));
-        auto minValue = descrip.getWithDefault("min", elem::js::Number(0));
-        auto maxValue = descrip.getWithDefault("max", elem::js::Number(1));
-        auto defValue = descrip.getWithDefault("defaultValue", elem::js::Number(0));
+        auto paramId = parameter.getWithDefault("paramId", elem::js::String("unknown"));
+        auto name = parameter.getWithDefault("name", elem::js::String("Unknown"));
+        auto minValue = parameter.getWithDefault("min", elem::js::Number(0));
+        auto maxValue = parameter.getWithDefault("max", elem::js::Number(1));
+        auto defaultValue = parameter.getWithDefault("defaultValue", elem::js::Number(0));
+        auto step = parameter.getWithDefault("step", elem::js::Number(0));
 
-        auto* p = new juce::AudioParameterFloat(
+        auto *p = new juce::AudioParameterFloat(
             juce::ParameterID(paramId, 1),
             name,
-            {static_cast<float>(minValue), static_cast<float>(maxValue)},
-            defValue
-        );
+            {static_cast<float>(minValue), static_cast<float>(maxValue), static_cast<float>(step)},
+            static_cast<float>(defaultValue));
+
+        // Keep a map from parameter ID to the juce audio parameter
+        // to avoid looping over the parameter list every time one changes
+        parameterMap.insert({paramId, p});
 
         p->addListener(this);
         addParameter(p);
 
         // Push a new ParameterReadout onto the list to represent this parameter
-        paramReadouts.emplace_back(ParameterReadout { static_cast<float>(defValue), false });
+        parameterReadouts.emplace_back(ParameterReadout{static_cast<float>(defaultValue), false});
 
         // Update our state object with the default parameter value
-        state.insert_or_assign(paramId, defValue);
+        state.insert_or_assign(paramId, defaultValue);
     }
 }
 
-EffectsPluginProcessor::~EffectsPluginProcessor()
+juce::AudioProcessorEditor *EffectsPluginProcessor::createEditor()
 {
-    for (auto& p : getParameters())
+    const auto editor = new WebViewEditor(this, getAssetsDirectory(), 905, 600);
+    
+
+    // -----------
+    // semi-online license activation
+    // -----------
+    // From docs:
+    // You may need to use semi-online activation without giving a serial number.
+    // First two cases are:
+    // 1- You may choose to renew weekly the offline license of the users with Semi Online activation.
+    // You don't want to ask the serial number again and again.
+    // 2- You may set Offline License Life (recommended) to 30 days. After 30 days, the offline license
+    // will be INVALID. Then you will need to activate it again without a serial number.
+    editor->handleUnlockEvent = [this](choc::value::Value &v)
     {
-        p->removeListener(this);
-    }
-}
+        const bool hasSerial = v.hasObjectMember("serial") && v["serial"].isString() && v["serial"].getString().length() > 0;
+        bool shouldActivate = licenseStatus != Keyzy::LicenseStatus::VALID;
 
-//==============================================================================
-juce::AudioProcessorEditor* EffectsPluginProcessor::createEditor()
-{
-    return new WebViewEditor(this, getAssetsDirectory(), 800, 704);
+        if (!hasSerial && shouldActivate)
+        {
+            licenseStatus = licenseActivator.activateSemiOnline();
+        }
+        else if (hasSerial && shouldActivate && hasSerial)
+        {
+            const auto serial = v["serial"].getString();
+            licenseStatus = licenseActivator.activateSemiOnline(serial.data());
+        }
+
+        sendJavascriptToUI("globalThis.__onUnlock__('" + unlock::errorStatuses(licenseStatus) + "')");
+        // also send back the current host info
+        juce::PluginHostType hostType;
+        std::string hostDescription = static_cast<const char *>(hostType.getHostDescription());
+        sendJavascriptToUI("globalThis.__hostInfo__('" + hostDescription + "')");
+    };
+
+    editor->ready = [this]()
+    {
+        // Flush the error log queue to the UI
+        while (!errorLogQueue.empty())
+        {
+            auto sent = sendJavascriptToUI(errorLogQueue.front());
+            errorLogQueue.pop();
+        }
+        dispatchStateChange();
+        dispatchMeshStateChange();
+    };
+
+    
+    // When setting a parameter value, we simply tell the host. This will in turn fire
+    // a parameterValueChanged event, which will catch and propagate through dispatching
+    // a state change event
+    editor->setParameterValue = [this](const std::string &paramId, float value)
+    {
+        if (parameterMap.count(paramId) > 0)
+        {
+            parameterMap[paramId]->setValueNotifyingHost(value);
+        }
+    };
+
+    editor->setMeshState = [this](choc::value::Value &v)
+    {
+        meshState.insert_or_assign(MESH_STATE_PROPERTY, v.toString());
+        dispatchStateChange();
+      //  dispatchMeshStateChange();   <--- was causing feedback loop! 
+    };
+
+
+
+
+#if ELEM_DEV_LOCALHOST
+    editor->reload = [this]()
+    {
+        initJavaScriptEngine();
+        initSecondJavaScriptEngine();
+        dispatchStateChange();
+        dispatchMeshStateChange();
+    };
+
+#endif
+
+    return editor;
 }
 
 bool EffectsPluginProcessor::hasEditor() const
@@ -102,7 +193,7 @@ bool EffectsPluginProcessor::hasEditor() const
 //==============================================================================
 const juce::String EffectsPluginProcessor::getName() const
 {
-    return JucePlugin_Name;
+    return "NELShifterMesh";
 }
 
 bool EffectsPluginProcessor::acceptsMidi() const
@@ -122,14 +213,14 @@ bool EffectsPluginProcessor::isMidiEffect() const
 
 double EffectsPluginProcessor::getTailLengthSeconds() const
 {
-    return 0.0;
+    return 3.0;
 }
 
 //==============================================================================
 int EffectsPluginProcessor::getNumPrograms()
 {
-    return 1;   // NB: some hosts don't cope very well if you tell them there are 0 programs,
-                // so this should be at least 1, even if you're not really implementing programs.
+    return 1; // NB: some hosts don't cope very well if you tell them there are 0 programs,
+              // so this should be at least 1, even if you're not really implementing programs.
 }
 
 int EffectsPluginProcessor::getCurrentProgram()
@@ -137,12 +228,12 @@ int EffectsPluginProcessor::getCurrentProgram()
     return 0;
 }
 
-void EffectsPluginProcessor::setCurrentProgram (int /* index */) {}
-const juce::String EffectsPluginProcessor::getProgramName (int /* index */) { return {}; }
-void EffectsPluginProcessor::changeProgramName (int /* index */, const juce::String& /* newName */) {}
+void EffectsPluginProcessor::setCurrentProgram(int /* index */) {}
+const juce::String EffectsPluginProcessor::getProgramName(int /* index */) { return {}; }
+void EffectsPluginProcessor::changeProgramName(int /* index */, const juce::String & /* newName */) {}
 
 //==============================================================================
-void EffectsPluginProcessor::prepareToPlay (double sampleRate, int samplesPerBlock)
+void EffectsPluginProcessor::prepareToPlay(double sampleRate, int samplesPerBlock)
 {
     // Some hosts call `prepareToPlay` on the real-time thread, some call it on the main thread.
     // To address the discrepancy, we check whether anything has changed since our last known
@@ -151,11 +242,12 @@ void EffectsPluginProcessor::prepareToPlay (double sampleRate, int samplesPerBlo
     //
     // JUCE will synchronously handle the async update if it understands
     // that we're already on the main thread.
-    if (sampleRate != lastKnownSampleRate || samplesPerBlock != lastKnownBlockSize) {
+    if (sampleRate != lastKnownSampleRate || samplesPerBlock != lastKnownBlockSize)
+    {
         lastKnownSampleRate = sampleRate;
         lastKnownBlockSize = samplesPerBlock;
 
-        shouldInitialize.store(true);
+        runtimeSwapRequired.store(true);
     }
 
     // Now that the environment is set up, push our current state
@@ -168,42 +260,59 @@ void EffectsPluginProcessor::releaseResources()
     // spare memory, etc.
 }
 
-bool EffectsPluginProcessor::isBusesLayoutSupported (const AudioProcessor::BusesLayout& layouts) const
+bool EffectsPluginProcessor::isBusesLayoutSupported(const AudioProcessor::BusesLayout &layouts) const
 {
     return true;
 }
 
-void EffectsPluginProcessor::processBlock (juce::AudioBuffer<float>& buffer, juce::MidiBuffer& /* midiMessages */)
+void EffectsPluginProcessor::processBlock(juce::AudioBuffer<float> &buffer, juce::MidiBuffer & /* midiMessages */)
 {
+
+    // If the license is invalid, we clear the buffer and return
+    if (licenseStatus != Keyzy::LicenseStatus::VALID)
+    {
+        buffer.clear();
+        return;
+    }
+
     // Copy the input so that our input and output buffers are distinct
     scratchBuffer.makeCopyOf(buffer, true);
 
-    // Clear the output buffer to prevent any garbage if our runtime isn't ready
-    buffer.clear();
-
     // Process the elementary runtime
-    if (runtime != nullptr) {
+    if (runtime != nullptr && !runtimeSwapRequired)
+
+    {
         runtime->process(
-            const_cast<const float**>(scratchBuffer.getArrayOfWritePointers()),
+            const_cast<const float **>(scratchBuffer.getArrayOfWritePointers()),
             getTotalNumInputChannels(),
-            const_cast<float**>(buffer.getArrayOfWritePointers()),
+            const_cast<float **>(buffer.getArrayOfWritePointers()),
             buffer.getNumChannels(),
             buffer.getNumSamples(),
-            nullptr
-        );
+            nullptr);
+    }
+    else
+    {
+        // Clear the output buffer to prevent any garbage if our runtime isn't ready
+        buffer.clear();
+    }
+
+    if (runtimeSwapRequired)
+    {
+        shouldInitialize.store(true);
+        triggerAsyncUpdate();
     }
 }
 
-void EffectsPluginProcessor::parameterValueChanged (int parameterIndex, float newValue)
+void EffectsPluginProcessor::parameterValueChanged(int parameterIndex, float newValue)
 {
     // Mark the updated parameter value in the dirty list
-    auto& pr = *std::next(paramReadouts.begin(), parameterIndex);
+    auto &readout = *std::next(parameterReadouts.begin(), parameterIndex);
 
-    pr.store({ newValue, true });
+    readout.store({newValue, true});
     triggerAsyncUpdate();
 }
 
-void EffectsPluginProcessor::parameterGestureChanged (int, bool)
+void EffectsPluginProcessor::parameterGestureChanged(int, bool)
 {
     // Not implemented
 }
@@ -213,33 +322,35 @@ void EffectsPluginProcessor::handleAsyncUpdate()
 {
     // First things first, we check the flag to identify if we should initialize the Elementary
     // runtime and engine.
-    if (shouldInitialize.exchange(false)) {
-        // TODO: This is definitely not thread-safe! It could delete a Runtime instance while
-        // the real-time thread is using it. Depends on when the host will call prepareToPlay.
+    if (shouldInitialize.exchange(false))
+    {
         runtime = std::make_unique<elem::Runtime<float>>(lastKnownSampleRate, lastKnownBlockSize);
         initJavaScriptEngine();
+        initSecondJavaScriptEngine();
+        runtimeSwapRequired.store(false);
     }
 
     // Next we iterate over the current parameter values to update our local state
     // object, which we in turn dispatch into the JavaScript engine
-    auto& params = getParameters();
+    auto &params = getParameters();
 
     // Reduce over the changed parameters to resolve our updated processor state
-    for (size_t i = 0; i < paramReadouts.size(); ++i)
+    for (size_t i = 0; i < parameterReadouts.size(); ++i)
     {
         // We atomically exchange an arbitrary value with a dirty flag false, because
         // we know that the next time we exchange, if the dirty flag is still false, the
         // value can be considered arbitrary. Only when we exchange and find the dirty flag
         // true do we consider the value as having been written by the processor since
         // we last looked.
-        auto& current = *std::next(paramReadouts.begin(), i);
-        auto pr = current.exchange({0.0f, false});
+        auto &current = *std::next(parameterReadouts.begin(), i);
+        const auto pr = current.exchange({0.0f, false});
 
         if (pr.dirty)
         {
-            if (auto* pf = dynamic_cast<juce::AudioParameterFloat*>(params[i])) {
+            if (const auto *pf = dynamic_cast<juce::AudioParameterFloat *>(params[i]))
+            {
                 auto paramId = pf->paramID.toStdString();
-                state.insert_or_assign(paramId, elem::js::Number(pr.value));
+                state.insert_or_assign(paramId, static_cast<elem::js::Number>(pr.value));
             }
         }
     }
@@ -252,183 +363,256 @@ void EffectsPluginProcessor::initJavaScriptEngine()
     jsContext = choc::javascript::createQuickJSContext();
 
     // Install some native interop functions in our JavaScript environment
-    jsContext.registerFunction("__postNativeMessage__", [this](choc::javascript::ArgumentList args) {
-        auto const batch = elem::js::parseJSON(args[0]->toString());
-        auto const rc = runtime->applyInstructions(batch);
+    jsContext.registerFunction(NATIVE_MESSAGE_FUNCTION_NAME, [this](choc::javascript::ArgumentList args)
+                               {
+        const auto batch = elem::js::parseJSON(args[0]->toString());
+        const auto rc = runtime->applyInstructions(batch);
 
         if (rc != elem::ReturnCode::Ok()) {
             dispatchError("Runtime Error", elem::ReturnCode::describe(rc));
         }
 
-        return choc::value::Value();
-    });
-
-    jsContext.registerFunction("__log__", [this](choc::javascript::ArgumentList args) {
-        const auto* kDispatchScript = R"script(
-(function() {
-  console.log(...JSON.parse(%));
-  return true;
-})();
-)script";
-
-        // Forward logs to the editor if it's available; then logs show up in one place.
-        //
-        // If not available, we fall back to std out.
-        if (auto* editor = static_cast<WebViewEditor*>(getActiveEditor())) {
-            auto v = choc::value::createEmptyArray();
-
-            for (size_t i = 0; i < args.numArgs; ++i) {
-                v.addArrayElement(*args[i]);
-            }
-
-            auto expr = juce::String(kDispatchScript).replace("%", elem::js::serialize(choc::json::toString(v))).toStdString();
-            editor->getWebViewPtr()->evaluateJavascript(expr);
-        } else {
-            for (size_t i = 0; i < args.numArgs; ++i) {
-                DBG(choc::json::toString(*args[i]));
-            }
-        }
-
-        return choc::value::Value();
-    });
+        return choc::value::Value(); });
 
     // A simple shim to write various console operations to our native __log__ handler
-    jsContext.evaluate(R"shim(
-(function() {
-  if (typeof globalThis.console === 'undefined') {
-    globalThis.console = {
-      log(...args) {
-        __log__('[embedded:log]', ...args);
-      },
-      warn(...args) {
-          __log__('[embedded:warn]', ...args);
-      },
-      error(...args) {
-          __log__('[embedded:error]', ...args);
-      }
-    };
-  }
-})();
-    )shim");
+    jsContext.evaluateExpression(jsFunctions::consoleLogScript);
 
-    // Load and evaluate our Elementary js main file
-#if ELEM_DEV_LOCALHOST
-    auto dspEntryFile = juce::URL("http://localhost:5173/dsp.main.js");
-    auto dspEntryFileContents = dspEntryFile.readEntireTextStream().toStdString();
-#else
-    auto dspEntryFile = getAssetsDirectory().getChildFile("dsp.main.js");
+    const auto dspEntryFileContents = loadDspEntryFileContents();
 
-    if (!dspEntryFile.existsAsFile())
+    if (dspEntryFileContents.has_value())
+    {
+        jsContext.evaluateExpression(dspEntryFileContents.value());
+    }
+    else
+    {
         return;
-
-    auto dspEntryFileContents = dspEntryFile.loadFileAsString().toStdString();
-#endif
-    jsContext.evaluate(dspEntryFileContents);
+    }
 
     // Re-hydrate from current state
-    const auto* kHydrateScript = R"script(
-(function() {
-  if (typeof globalThis.__receiveHydrationData__ !== 'function')
-    return false;
+    const auto expr = serialize(jsFunctions::hydrateScript, runtime->snapshot());
+    jsContext.evaluateExpression(expr);
+}
+
+void EffectsPluginProcessor::initSecondJavaScriptEngine()
+{
+    jsContext2 = choc::javascript::createQuickJSContext();
+
+    // Install some native interop functions in our JavaScript environment
+    jsContext2.registerFunction(NATIVE_MESSAGE_FUNCTION_NAME, [this](choc::javascript::ArgumentList args)
+                               {
+        const auto batch = elem::js::parseJSON(args[0]->toString());
+        
+       // const auto rc = runtime->applyInstructions(batch);
+        // if (rc != elem::ReturnCode::Ok()) {
+        //     dispatchError("Runtime Error", elem::ReturnCode::describe(rc));
+        // }
 
-  globalThis.__receiveHydrationData__(%);
-  return true;
-})();
-)script";
+        return choc::value::Value(); });
 
-    auto expr = juce::String(kHydrateScript).replace("%", elem::js::serialize(elem::js::serialize(runtime->snapshot()))).toStdString();
-    jsContext.evaluate(expr);
+   
+    const auto patchEntryFileContents = loadPatchEntryFileContents();
+
+    if (patchEntryFileContents.has_value())
+    {
+        jsContext2.evaluateExpression(patchEntryFileContents.value());
+    }
+    else
+    {
+        return;
+    }
+
+   
 }
 
 void EffectsPluginProcessor::dispatchStateChange()
 {
-    const auto* kDispatchScript = R"script(
-(function() {
-  if (typeof globalThis.__receiveStateChange__ !== 'function')
-    return false;
-
-  globalThis.__receiveStateChange__(%);
-  return true;
-})();
-)script";
-
     // Need the double serialize here to correctly form the string script. The first
     // serialize produces the payload we want, the second serialize ensures we can replace
     // the % character in the above block and produce a valid javascript expression.
     auto localState = state;
-    localState.insert_or_assign("sampleRate", lastKnownSampleRate);
-
-    auto expr = juce::String(kDispatchScript).replace("%", elem::js::serialize(elem::js::serialize(localState))).toStdString();
-
+    localState.insert_or_assign(SAMPLE_RATE_PROPERTY, lastKnownSampleRate);
+    const auto expr = serialize(jsFunctions::dispatchScript, localState);
     // First we try to dispatch to the UI if it's available, because running this step will
     // just involve placing a message in a queue.
-    if (auto* editor = static_cast<WebViewEditor*>(getActiveEditor())) {
-        editor->getWebViewPtr()->evaluateJavascript(expr);
+    sendJavascriptToUI(expr);
+    // Next we dispatch to the local engine which will evaluate any necessary JavaScript synchronously
+    // here on the main thread
+    try
+    {
+        jsContext.evaluateExpression(expr);
+    }
+    catch (std::exception &e)
+    {
+        dispatchError("DSP JS:", e.what());
     }
+}
 
+void EffectsPluginProcessor::dispatchMeshStateChange()
+{
+    // Need the double serialize here to correctly form the string script. The first
+    // serialize produces the payload we want, the second serialize ensures we can replace
+    // the % character in the above block and produce a valid javascript expression.
+    auto localState = meshState;
+    const auto expr = serialize(jsFunctions::dispatchMeshStateScript, localState);
+    // First we try to dispatch to the UI if it's available, because running this step will
+    // just involve placing a message in a queue.
+    sendJavascriptToUI(expr);
     // Next we dispatch to the local engine which will evaluate any necessary JavaScript synchronously
     // here on the main thread
-    jsContext.evaluate(expr);
+    try
+    {
+        jsContext.evaluateExpression(expr);
+    }
+    catch (std::exception &e)
+    {
+        dispatchError("DSP JS:", e.what());
+    }
 }
 
-void EffectsPluginProcessor::dispatchError(std::string const& name, std::string const& message)
+void EffectsPluginProcessor::dispatchError(std::string const &name, std::string const &message)
 {
-    const auto* kDispatchScript = R"script(
-(function() {
-  if (typeof globalThis.__receiveError__ !== 'function')
-    return false;
-
-  let e = new Error(%);
-  e.name = @;
-
-  globalThis.__receiveError__(e);
-  return true;
-})();
-)script";
-
     // Need the serialize here to correctly form the string script.
-    auto expr = juce::String(kDispatchScript).replace("@", elem::js::serialize(name)).replace("%", elem::js::serialize(message)).toStdString();
+    const auto expr = juce::String(jsFunctions::errorScript).replace("@", elem::js::serialize(name)).replace("%", elem::js::serialize(message)).toStdString();
 
     // First we try to dispatch to the UI if it's available, because running this step will
     // just involve placing a message in a queue.
-    if (auto* editor = static_cast<WebViewEditor*>(getActiveEditor())) {
-        editor->getWebViewPtr()->evaluateJavascript(expr);
+    if (!sendJavascriptToUI(expr))
+    {
+        if (errorLogQueue.size() == MAX_ERROR_LOG_QUEUE_SIZE)
+        {
+            errorLogQueue.pop();
+        }
+        errorLogQueue.push(expr);
     }
 
     // Next we dispatch to the local engine which will evaluate any necessary JavaScript synchronously
     // here on the main thread
-    jsContext.evaluate(expr);
+    jsContext.evaluateExpression(expr);
+}
+
+std::optional<std::string> EffectsPluginProcessor::loadDspEntryFileContents() const
+{
+    // Load and evaluate our Elementary js main file
+#if ELEM_DEV_LOCALHOST
+    auto dspEntryFile = juce::URL("http://localhost:5173/dsp.main.js");
+    auto dspEntryFileContents = dspEntryFile.readEntireTextStream().toStdString();
+#else
+    auto dspEntryFile = getAssetsDirectory().getChildFile(MAIN_DSP_JS_FILE);
+
+    if (!dspEntryFile.existsAsFile())
+        return std::nullopt;
+
+    auto dspEntryFileContents = dspEntryFile.loadFileAsString().toStdString();
+#endif
+
+    return dspEntryFileContents;
+}
+
+std::optional<std::string> EffectsPluginProcessor::loadPatchEntryFileContents() const
+{
+    // Load and evaluate our Elementary js main file
+#if ELEM_DEV_LOCALHOST
+    auto patchEntryFile = juce::URL("http://localhost:5173/patch.main.js");
+    auto patchEntryFileContents = patchEntryFile.readEntireTextStream().toStdString();
+#else
+    auto patchEntryFile = getAssetsDirectory().getChildFile(MAIN_PATCH_JS_FILE);
+
+    if (!patchEntryFile.existsAsFile())
+        return std::nullopt;
+
+    auto patchEntryFileContents = patchEntryFile.loadFileAsString().toStdString();
+#endif
+
+    return patchEntryFileContents;
+}
+
+
+bool EffectsPluginProcessor::sendJavascriptToUI(const std::string &expr) const
+{
+    if (const auto *editor = dynamic_cast<WebViewEditor *>(getActiveEditor()))
+    {
+        editor->executeJavascript(expr);
+        return true;
+    }
+    return false;
+}
+
+std::string EffectsPluginProcessor::serialize(const std::string &function, const elem::js::Object &data, const juce::String &replacementChar)
+{
+    return juce::String(function).replace(replacementChar, elem::js::serialize(elem::js::serialize(data))).toStdString();
+}
+
+std::string EffectsPluginProcessor::serialize(const std::string &function, const choc::value::Value &data, const juce::String &replacementChar)
+{
+    return juce::String(function).replace(replacementChar, choc::json::toString(data)).toStdString();
 }
 
 //==============================================================================
-void EffectsPluginProcessor::getStateInformation (juce::MemoryBlock& destData)
+void EffectsPluginProcessor::getStateInformation(juce::MemoryBlock &destData)
 {
-    auto serialized = elem::js::serialize(state);
-    destData.replaceAll((void *) serialized.c_str(), serialized.size());
+
+    // serialise the secondary store for meshData
+    // then insert it into the data to be stored by the host
+    state.insert_or_assign(MESH_STATE_PROPERTY, meshState.at(MESH_STATE_PROPERTY));
+    // seriliase the whole package
+    const auto serializedState = elem::js::serialize(state);
+    // stash
+    destData.replaceAll((void *)serializedState.c_str(), serializedState.size());
+    // remove the meshData from the active param state updates
+    // so the meshData doesn't get sent on every update
+    state.erase(MESH_STATE_PROPERTY);
 }
 
-void EffectsPluginProcessor::setStateInformation (const void* data, int sizeInBytes)
+void EffectsPluginProcessor::setStateInformation(const void *data, int sizeInBytes)
 {
-    try {
-        auto str = std::string(static_cast<const char*>(data), sizeInBytes);
-        auto parsed = elem::js::parseJSON(str);
+    auto parsed = elem::js::parseJSON("{}");
+    // restore the data the host stashed previously
+    const auto jsonString = std::string(static_cast<const char *>(data), sizeInBytes);
+    // try to deserialise the whole stashed data string
+    try
+    {
+        parsed = elem::js::parseJSON(jsonString);
+    }
+    catch (...)
+    {
+        dispatchError("Stored data error:", parsed.toString());
+    }
+
+    // try to re-assign the local stores from the stashed data
+    try
+    {
         auto o = parsed.getObject();
-        for (auto  &i: o) {
-            std::map<std::string, elem::js::Value>::iterator it;
-            it = state.find(i.first);
-            if (it != state.end()) {
-                state.insert_or_assign(i.first, i.second);
+        for (auto &[key, value] : o)
+        {
+            if (key != MESH_STATE_PROPERTY)
+            {
+                if (state.count(key) > 0)
+                {
+                    state.insert_or_assign(key, value);
+                }
+            }
+            else
+            {
+                meshState.insert_or_assign(MESH_STATE_PROPERTY, value);
             }
         }
-    } catch(...) {
+          dispatchStateChange();
+    dispatchMeshStateChange();
+    }
+
+    catch (...)
+    {
         // Failed to parse the incoming state, or the state we did parse was not actually
-        // an object type. How you handle it is up to you, here we just ignore it
+        // an object type. How you handle it is up to you.
+        dispatchError("State Error", "Failed to restore mesh!");
     }
+
+  
 }
 
 //==============================================================================
 // This creates new instances of the plugin..
-juce::AudioProcessor* JUCE_CALLTYPE createPluginFilter()
+juce::AudioProcessor *JUCE_CALLTYPE createPluginFilter()
 {
     return new EffectsPluginProcessor();
 }
diff --git a/native/PluginProcessor.h b/native/PluginProcessor.h
index d828257..efe4129 100644
--- a/native/PluginProcessor.h
+++ b/native/PluginProcessor.h
@@ -6,6 +6,7 @@
 #include <choc_javascript.h>
 #include <elem/Runtime.h>
 
+#include <KeyzyLicenseActivator.h>
 
 //==============================================================================
 class EffectsPluginProcessor
@@ -14,21 +15,23 @@ class EffectsPluginProcessor
       private juce::AsyncUpdater
 {
 public:
+    void createParameters(const std::vector<elem::js::Value> &parameters);
+
     //==============================================================================
     EffectsPluginProcessor();
     ~EffectsPluginProcessor() override;
 
     //==============================================================================
-    juce::AudioProcessorEditor* createEditor() override;
+    juce::AudioProcessorEditor *createEditor() override;
     bool hasEditor() const override;
 
     //==============================================================================
-    void prepareToPlay (double sampleRate, int samplesPerBlock) override;
+    void prepareToPlay(double sampleRate, int samplesPerBlock) override;
     void releaseResources() override;
 
-    bool isBusesLayoutSupported (const juce::AudioProcessor::BusesLayout& layouts) const override;
+    bool isBusesLayoutSupported(const juce::AudioProcessor::BusesLayout &layouts) const override;
 
-    void processBlock (juce::AudioBuffer<float>&, juce::MidiBuffer&) override;
+    void processBlock(juce::AudioBuffer<float> &, juce::MidiBuffer &) override;
 
     //==============================================================================
     const juce::String getName() const override;
@@ -41,55 +44,289 @@ class EffectsPluginProcessor
     //==============================================================================
     int getNumPrograms() override;
     int getCurrentProgram() override;
-    void setCurrentProgram (int index) override;
-    const juce::String getProgramName (int index) override;
-    void changeProgramName (int index, const juce::String& newName) override;
+    void setCurrentProgram(int index) override;
+    const juce::String getProgramName(int index) override;
+    void changeProgramName(int index, const juce::String &newName) override;
 
     //==============================================================================
-    void getStateInformation (juce::MemoryBlock& destData) override;
-    void setStateInformation (const void* data, int sizeInBytes) override;
+    void getStateInformation(juce::MemoryBlock &destData) override;
+    void setStateInformation(const void *data, int sizeInBytes) override;
 
     //==============================================================================
     /** Implement the AudioProcessorParameter::Listener interface. */
-    void parameterValueChanged (int parameterIndex, float newValue) override;
-    void parameterGestureChanged (int parameterIndex, bool gestureIsStarting) override;
+    void parameterValueChanged(int parameterIndex, float newValue) override;
+    void parameterGestureChanged(int parameterIndex, bool gestureIsStarting) override;
 
     //==============================================================================
     /** Implement the AsyncUpdater interface. */
     void handleAsyncUpdate() override;
 
     //==============================================================================
+
     /** Internal helper for initializing the embedded JS engine. */
     void initJavaScriptEngine();
+    void initSecondJavaScriptEngine();
 
     /** Internal helper for propagating processor state changes. */
     void dispatchStateChange();
-    void dispatchError(std::string const& name, std::string const& message);
+
+    /** INternal helper for mesh data view state changes */
+    void dispatchMeshStateChange();
+
+    /** error to UI */
+    void dispatchError(std::string const &name, std::string const &message);
 
 private:
+    std::string MESH_STATE_PROPERTY = "meshState";
+
+    std::string MAIN_DSP_JS_FILE = "dsp.main.js";
+
+    std::string MAIN_PATCH_JS_FILE = "patch.main.js";
+
+    std::string SAMPLE_RATE_PROPERTY = "sampleRate";
+
+    std::string NATIVE_MESSAGE_FUNCTION_NAME = "__postNativeMessage__";
+
+    std::string LOG_FUNCTION_NAME = "__log__";
+
+    // The maximum number of error messages to keep in the queue
+    size_t MAX_ERROR_LOG_QUEUE_SIZE = 200;
+
+    std::optional<std::string> loadDspEntryFileContents() const;
+
+    std::optional<std::string> loadPatchEntryFileContents() const;
+
+    /**
+     *
+     * @param expr javascript expression to evaluate in the view context
+     * @return true if the view exists, false if not
+     */
+    bool sendJavascriptToUI(const std::string &expr) const;
+
+    static std::string serialize(const std::string &function, const elem::js::Object &data, const juce::String &replacementChar = "%");
+    static std::string serialize(const std::string &function, const choc::value::Value &data, const juce::String &replacementChar = "%");
+
     //==============================================================================
-    std::atomic<bool> shouldInitialize { false };
+    std::atomic<bool> runtimeSwapRequired{false};
+    std::atomic<bool> shouldInitialize{false};
     double lastKnownSampleRate = 0;
     int lastKnownBlockSize = 0;
 
+    //===== js stores and context  ==//
     elem::js::Object state;
+    elem::js::Object meshState;
     choc::javascript::Context jsContext;
+    choc::javascript::Context jsContext2;
 
     juce::AudioBuffer<float> scratchBuffer;
 
     std::unique_ptr<elem::Runtime<float>> runtime;
 
+    std::map<std::string, juce::AudioParameterFloat *> parameterMap;
+    std::queue<std::string> errorLogQueue;
+
     //==============================================================================
     // A simple "dirty list" abstraction here for propagating realtime parameter
     // value changes
-    struct ParameterReadout {
+    struct ParameterReadout
+    {
         float value = 0;
         bool dirty = false;
     };
 
-    std::list<std::atomic<ParameterReadout>> paramReadouts;
+    std::list<std::atomic<ParameterReadout>> parameterReadouts;
     static_assert(std::atomic<ParameterReadout>::is_always_lock_free);
 
     //==============================================================================
-    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (EffectsPluginProcessor)
+    // Keyzy License Activator
+    //     Keyzy::ProductData productData{"YOUR_APP_ID", "YOUR_API_KEY", "YOUR_PRODUCT_CODE", "YOUR_CRYPTION_KEY"};
+
+    Keyzy::ProductData productData // hidden
+    Keyzy::KeyzyLicenseActivator licenseActivator{productData};
+    Keyzy::LicenseStatus licenseStatus = Keyzy::LicenseStatus::NOT_AUTHORIZED;
+
+    //==============================================================================
+    JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(EffectsPluginProcessor)
 };
+
+namespace unlock
+{
+    inline std::string errorStatuses(Keyzy::LicenseStatus status)
+    {
+        switch (status)
+        {
+        case Keyzy::LicenseStatus::EXPIRED:
+            return "Expired";
+
+        case Keyzy::LicenseStatus::INVALID:
+            return "Invalid";
+
+        case Keyzy::LicenseStatus::NOT_AUTHORIZED:
+            return "Not authorized";
+
+        case Keyzy::LicenseStatus::SERIAL_INVALID:
+            return "Serial invalid";
+
+        case Keyzy::LicenseStatus::PRODUCT_NOT_EXIST:
+            return "Product does not exist";
+
+        case Keyzy::LicenseStatus::PRODUCT_NOT_EXIST_FOR_USER:
+            return "Product does not exist";
+
+        case Keyzy::LicenseStatus::PRODUCT_NOT_ACTIVE:
+            return "Product is not active";
+
+        case Keyzy::LicenseStatus::SKU_NOT_EXIST:
+            return "SKU does not exist";
+
+        case Keyzy::LicenseStatus::SKU_NOT_ACTIVE:
+            return "SKU is not active";
+
+        case Keyzy::LicenseStatus::REACHED_MAX_NUMBER_OF_HOST:
+            return "Reached maximum number of host";
+
+        case Keyzy::LicenseStatus::PRODUCT_NOT_EXIST_FOR_SKU:
+            return "Product does not exist for this SKU";
+
+        case Keyzy::LicenseStatus::ACTIVATION_DEACTIVATED:
+            return "Activation is deactivated";
+
+        case Keyzy::LicenseStatus::SUBSCRIPTION_LICENSE_EXPIRED:
+            return "Subscription license expired!";
+
+        case Keyzy::LicenseStatus::SUBSCRIPTION_LICENSE_NOT_STARTED:
+            return "Subscription license not started!";
+
+        case Keyzy::LicenseStatus::TRIAL_LICENSE_EXPIRED:
+            return "Trial license expired!";
+
+        case Keyzy::LicenseStatus::TRIAL_LICENSE_NOT_STARTED:
+            return "Trial license not started!";
+
+        case Keyzy::LicenseStatus::CANNOT_KEEP_SERIAL:
+            return "Cannot keep serial!";
+
+        case Keyzy::LicenseStatus::CANNOT_KEEP_LICENSE_FILE:
+            return "Cannot keep license file!";
+
+        case Keyzy::LicenseStatus::ACTIVATION_DELETED:
+            return "Activation deleted!";
+
+        case Keyzy::LicenseStatus::CLIENT_SERIAL_DOES_NOT_EXIST:
+            return "Client serial does not exist!";
+
+        case Keyzy::LicenseStatus::CONNECTION_ERROR:
+            return "Connection Error!";
+
+        case Keyzy::LicenseStatus::TOO_MANY_REQUESTS:
+            return "Too Many Requests!";
+
+        case Keyzy::LicenseStatus::NO_ACTIVE_SUBSCRIPTION:
+            return "No Active Subscription!";
+
+        case Keyzy::LicenseStatus::CURRENT_LICENSE_DOES_NOT_EXIST:
+            return "Current license does not exist!";
+
+        case Keyzy::LicenseStatus::UPGRADE_LICENSE_DOES_NOT_EXIST:
+            return "Upgrade license does not exist!";
+
+        case Keyzy::LicenseStatus::UPGRADE_LICENSE_DOES_NOT_MATCH:
+            return "Upgrade license does not match for upgrade with current license!";
+
+        case Keyzy::LicenseStatus::ANOTHER_TRIAL_LICENSE_ALREADY_ACTIVATED:
+            return "Another trial license has already been activated on this device!";
+
+        case Keyzy::LicenseStatus::SKU_NUMBER_VALIDATION:
+            return "sku_number parameter cannot be validated!";
+
+        case Keyzy::LicenseStatus::PRODUCT_CODE_VALIDATION:
+            return "product_code parameter cannot be validated!";
+
+        case Keyzy::LicenseStatus::NAME_VALIDATION:
+            return "name parameter cannot be validated!";
+
+        case Keyzy::LicenseStatus::EMAIL_VALIDATION:
+            return "email parameter cannot be validated!";
+
+        case Keyzy::LicenseStatus::NO_FREE_LICENSES:
+            return "You do not have any free licenses for this sku. Please generate new licenses for this sku!";
+
+        case Keyzy::LicenseStatus::NAME_OR_EMAIL_VALIDATION:
+            return "Either the name or email filed must be filled!";
+
+        case Keyzy::LicenseStatus::LICENSE_NOT_EXIST_NOT_ASSIGNED_DEALER_ALREADY_DEPOSITED:
+            return "The license does not exist or is not assigned to a dealer or is already deposited!";
+
+        case Keyzy::LicenseStatus::VALID: // Just in case
+            return "Valid";
+
+        default:
+            return "Unknown";
+        }
+    }
+}
+
+namespace jsFunctions
+{
+    inline auto consoleLogScript = R"shim(
+(function() {
+  if (typeof globalThis.console === 'undefined') {
+    globalThis.console = {
+      log(...args) {
+        __log__('[embedded:log]', ...args);
+      },
+      warn(...args) {
+          __log__('[embedded:warn]', ...args);
+      },
+      error(...args) {
+          __log__('[embedded:error]', ...args);
+      }
+    };
+  }
+})();
+    )shim";
+
+    inline auto hydrateScript = R"script(
+(function() {
+  if (typeof globalThis.__receiveHydrationData__ !== 'function')
+    return false;
+
+  globalThis.__receiveHydrationData__(%);
+  return true;
+})();
+)script";
+
+    inline auto dispatchScript = R"script(
+(function() {
+  if (typeof globalThis.__receiveStateChange__ !== 'function')
+    return false;
+
+  globalThis.__receiveStateChange__(%);
+  return true;
+})();
+)script";
+
+    //// seperated for Mesh state send
+    inline auto dispatchMeshStateScript = R"script(
+(function() {
+  if (typeof globalThis.__receiveMeshStateChange__ !== 'function')
+    return false;
+
+  globalThis.__receiveMeshStateChange__(%);
+  return true;
+})();
+)script";
+
+    inline auto errorScript = R"script(
+(function() {
+  if (typeof globalThis.__receiveError__ !== 'function')
+    return false;
+
+  let e = new Error(%);
+  e.name = @;
+
+  globalThis.__receiveError__(e);
+  return true;
+})();
+)script";
+}
diff --git a/native/WebViewEditor.cpp b/native/WebViewEditor.cpp
index 5a39609..a2873ba 100644
--- a/native/WebViewEditor.cpp
+++ b/native/WebViewEditor.cpp
@@ -1,22 +1,23 @@
 #include "PluginProcessor.h"
 #include "WebViewEditor.h"
 
-
 // A helper for reading numbers from a choc::Value, which seems to opportunistically parse
 // JSON numbers into ints or 32-bit floats whenever it wants.
-double numberFromChocValue(const choc::value::ValueView& v) {
+double numberFromChocValue(const choc::value::ValueView &v)
+{
     return (
-        v.isFloat32() ? (double) v.getFloat32()
-            : (v.isFloat64() ? v.getFloat64()
-                : (v.isInt32() ? (double) v.getInt32()
-                    : (double) v.getInt64())));
+        v.isFloat32() ? (double)v.getFloat32()
+                      : (v.isFloat64() ? v.getFloat64()
+                                       : (v.isInt32() ? (double)v.getInt32()
+                                                      : (double)v.getInt64())));
 }
 
-std::string getMimeType(std::string const& ext) {
-    static std::unordered_map<std::string, std::string> mimeTypes {
-        { ".html",   "text/html" },
-        { ".js",     "application/javascript" },
-        { ".css",    "text/css" },
+std::string getMimeType(std::string const &ext)
+{
+    static std::unordered_map<std::string, std::string> mimeTypes{
+        {".html", "text/html"},
+        {".js", "application/javascript"},
+        {".css", "text/css"},
     };
 
     if (mimeTypes.count(ext) > 0)
@@ -26,19 +27,22 @@ std::string getMimeType(std::string const& ext) {
 }
 
 //==============================================================================
-WebViewEditor::WebViewEditor(juce::AudioProcessor* proc, juce::File const& assetDirectory, int width, int height)
+WebViewEditor::WebViewEditor(juce::AudioProcessor *proc, juce::File const &assetDirectory, int width, int height)
     : juce::AudioProcessorEditor(proc)
 {
-    setSize(720, 444);
+    setSize(width, height);
+    setResizable(true, false);
 
     choc::ui::WebView::Options opts;
 
 #if JUCE_DEBUG
-    opts.enableDebugMode = true;
+    opts.enableDebugMode = false;
 #endif
 
-#if ! ELEM_DEV_LOCALHOST
-    opts.fetchResource = [=](const choc::ui::WebView::Options::Path& p) -> std::optional<choc::ui::WebView::Options::Resource> {
+#if !ELEM_DEV_LOCALHOST
+    opts.enableDebugMode = false;
+    opts.fetchResource = [=](const choc::ui::WebView::Options::Path &p) -> std::optional<choc::ui::WebView::Options::Resource>
+    {
         auto relPath = "." + (p == "/" ? "/index.html" : p);
         auto f = assetDirectory.getChildFile(relPath);
         juce::MemoryBlock mb;
@@ -46,93 +50,95 @@ WebViewEditor::WebViewEditor(juce::AudioProcessor* proc, juce::File const& asset
         if (!f.existsAsFile() || !f.loadFileAsData(mb))
             return {};
 
-        return choc::ui::WebView::Options::Resource {
-            std::vector<uint8_t>(mb.begin(), mb.end()),
-            getMimeType(f.getFileExtension().toStdString())
-        };
+        return choc::ui::WebView::Options::Resource{
+            std::string(mb.begin(), mb.end()),
+            getMimeType(f.getFileExtension().toStdString())};
+
+
+
+
+
     };
 #endif
 
-    webView = std::make_unique<choc::ui::WebView>(opts);
+        webView = std::make_unique<choc::ui::WebView>(opts);
 
 #if JUCE_MAC
-    viewContainer.setView(webView->getViewHandle());
+        viewContainer.setView(webView->getViewHandle());
 #elif JUCE_WINDOWS
     viewContainer.setHWND(webView->getViewHandle());
 #else
 #error "We only support MacOS and Windows here yet."
 #endif
 
-    addAndMakeVisible(viewContainer);
-    viewContainer.setBounds({0, 0, 720, 440});
+        addAndMakeVisible(viewContainer);
+        viewContainer.setBounds({0, 0, 905, 600});
 
-    // Install message passing handlers
-    webView->bind("__postNativeMessage__", [=](const choc::value::ValueView& args) -> choc::value::Value {
+        // Install message passing handlers
+        webView->bind(POST_NATIVE_MESSAGE, [=](const choc::value::ValueView &args) -> choc::value::Value
+                      {
         if (args.isArray()) {
-            auto eventName = args[0].getString();
+            const auto eventName = args[0].getString();
 
             // When the webView loads it should send a message telling us that it has established
             // its message-passing hooks and is ready for a state dispatch
-            if (eventName == "ready") {
-                if (auto* ptr = dynamic_cast<EffectsPluginProcessor*>(getAudioProcessor())) {
-                    ptr->dispatchStateChange();
-                }
+            if (eventName == READY_EVENT) {
+                ready();
             }
 
-#if ELEM_DEV_LOCALHOST
-            if (eventName == "reload") {
-                if (auto* ptr = dynamic_cast<EffectsPluginProcessor*>(getAudioProcessor())) {
-                    ptr->initJavaScriptEngine();
-                    ptr->dispatchStateChange();
-                }
+            if (eventName == RELOAD_EVENT) {
+                reload();
             }
-#endif
 
-            if (eventName == "setParameterValue" && args.size() > 1) {
+            if (eventName == SET_PARAMETER_VALUE && args.size() > 1) {
                 return handleSetParameterValueEvent(args[1]);
             }
+
+            if (eventName == SET_MESH_STATE && args.size() > 1) {
+                // Take a copy of the value and pass it to the view state change handler.
+                auto value = choc::value::Value(args[1]);
+                setMeshState(value);
+            }
+
+            // For Keyzy send an unlock event with an object containing the serial number
+            if (eventName == UNLOCK_EVENT && args.size() > 1) {
+                auto value = choc::value::Value(args[1]);
+                handleUnlockEvent(value);
+            }
         }
 
-        return {};
-    });
+        return {}; 
+        });
 
 #if ELEM_DEV_LOCALHOST
-    webView->navigate("http://localhost:5173");
+        webView->navigate("http://localhost:5173");
 #endif
-}
+    }
 
-choc::ui::WebView* WebViewEditor::getWebViewPtr()
-{
-    return webView.get();
-}
+    void  WebViewEditor::paint(juce::Graphics &g)
+    {
+    }
 
-void WebViewEditor::paint (juce::Graphics& g)
-{
-}
+    void WebViewEditor::resized()
+    {
+        viewContainer.setBounds(getLocalBounds());
+    }
 
-void WebViewEditor::resized()
-{
-    viewContainer.setBounds(getLocalBounds());
-}
+    void WebViewEditor::executeJavascript(const std::string &script) const
+    {
+        webView->evaluateJavascript(script);
+    }
 
-//==============================================================================
-choc::value::Value WebViewEditor::handleSetParameterValueEvent(const choc::value::ValueView& e) {
-    // When setting a parameter value, we simply tell the host. This will in turn fire
-    // a parameterValueChanged event, which will catch and propagate through dispatching
-    // a state change event
-    if (e.isObject() && e.hasObjectMember("paramId") && e.hasObjectMember("value")) {
-        auto const& paramId = e["paramId"].getString();
-        double const v = numberFromChocValue(e["value"]);
-
-        for (auto& p : getAudioProcessor()->getParameters()) {
-            if (auto* pf = dynamic_cast<juce::AudioParameterFloat*>(p)) {
-                if (pf->paramID.toStdString() == paramId) {
-                    pf->setValueNotifyingHost(v);
-                    break;
-                }
-            }
+    //==============================================================================
+    choc::value::Value WebViewEditor::handleSetParameterValueEvent(const choc::value::ValueView &e) const
+    {
+        if (e.isObject() && e.hasObjectMember("paramId") && e.hasObjectMember("value"))
+        {
+            auto const &paramId = e["paramId"].getString();
+            double const v = numberFromChocValue(e["value"]);
+
+            setParameterValue(std::string{paramId}, static_cast<float>(v));
         }
-    }
 
-    return choc::value::Value();
-}
+        return {};
+    }
diff --git a/native/WebViewEditor.h b/native/WebViewEditor.h
index 5504d10..9a9c1ed 100644
--- a/native/WebViewEditor.h
+++ b/native/WebViewEditor.h
@@ -5,7 +5,6 @@
 
 #include <choc_WebView.h>
 
-
 //==============================================================================
 // A simple juce::AudioProcessorEditor that holds a choc::WebView and sets the
 // WebView instance to cover the entire region of the editor.
@@ -13,20 +12,35 @@ class WebViewEditor : public juce::AudioProcessorEditor
 {
 public:
     //==============================================================================
-    WebViewEditor(juce::AudioProcessor* proc, juce::File const& assetDirectory, int width, int height);
+    WebViewEditor(juce::AudioProcessor *proc, juce::File const &assetDirectory, int width, int height);
+  
+    //==============================================================================
+    void paint(juce::Graphics &g) override;
+    void resized() override;
 
     //==============================================================================
-    choc::ui::WebView* getWebViewPtr();
+    // Keyzy
+    std::function<void(choc::value::Value &)> handleUnlockEvent = [](choc::value::Value &) {};
 
     //==============================================================================
-    void paint (juce::Graphics& g) override;
-    void resized() override;
+    std::function<void(choc::value::Value &)> setMeshState = [](choc::value::Value &) {};
+    std::function<void(const std::string &, float)> setParameterValue = [](const std::string &, float) {};
+    std::function<void()> reload = []() {};
+    std::function<void()> ready = []() {};
+
+    void executeJavascript(const std::string &script) const;
 
 private:
-    //==============================================================================
-    choc::value::Value handleSetParameterValueEvent(const choc::value::ValueView& e);
+    std::string POST_NATIVE_MESSAGE = "__postNativeMessage__";
+    std::string READY_EVENT = "ready";
+    std::string RELOAD_EVENT = "reload";
+    std::string SET_PARAMETER_VALUE = "setParameterValue";
+    std::string SET_MESH_STATE = "setMeshState";
+    std::string UNLOCK_EVENT = "unlock";
+    std::string HOST_INFO = "hostInfo";
+
+    choc::value::Value handleSetParameterValueEvent(const choc::value::ValueView &e) const;
 
-    //==============================================================================
     std::unique_ptr<choc::ui::WebView> webView;
 
 #if JUCE_MAC
@@ -34,6 +48,6 @@ class WebViewEditor : public juce::AudioProcessorEditor
 #elif JUCE_WINDOWS
     juce::HWNDComponent viewContainer;
 #else
- #error "We only support MacOS and Windows here yet."
+#error "We only support MacOS and Windows here yet."
 #endif
 };
diff --git a/native/choc b/native/choc
index 090fd7c..b086c62 160000
--- a/native/choc
+++ b/native/choc
@@ -1 +1 @@
-Subproject commit 090fd7cf41ea2b5d317420af45097cc22a975656
+Subproject commit b086c628c82f2e12c794ad2642b11b41ef6f50e1
diff --git a/package-lock.json b/package-lock.json
index f8a3141..37ac7ef 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,26 +9,22 @@
       "version": "0.0.0",
       "dependencies": {
         "@elemaudio/core": "^3.0.0",
-        "@heroicons/react": "^2.0.18",
-        "@use-gesture/react": "^10.2.27",
         "cpy-cli": "^4.2.0",
         "esbuild": "^0.17.8",
         "invariant": "^2.2.4",
-        "react": "^18.2.0",
-        "react-dom": "^18.2.0",
         "resize-observer-polyfill": "^1.5.1",
         "rimraf": "^5.0.0",
+        "worker-timers": "^8.0.2",
         "zustand": "^4.3.8"
       },
       "devDependencies": {
-        "@types/react": "^18.0.37",
-        "@types/react-dom": "^18.0.11",
-        "@vitejs/plugin-react": "^4.0.0",
+        "@sveltejs/vite-plugin-svelte": "^3.1.1",
         "autoprefixer": "^10.4.14",
         "concurrently": "^8.2.2",
         "postcss": "^8.4.24",
+        "svelte": "^5.0.0-next.184",
         "tailwindcss": "^3.3.2",
-        "vite": "^4.3.9",
+        "vite": "^5.0.0",
         "zx": "^7.2.3"
       }
     },
@@ -58,287 +54,43 @@
       }
     },
     "node_modules/@babel/code-frame": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
-      "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
       "dependencies": {
-        "@babel/highlight": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/compat-data": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz",
-      "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/core": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz",
-      "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
-      "dev": true,
-      "dependencies": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helpers": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.2",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/babel"
-      }
-    },
-    "node_modules/@babel/generator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz",
-      "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.22.5",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
-        "jsesc": "^2.5.1"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-compilation-targets": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
-      "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/compat-data": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.5",
-        "browserslist": "^4.21.3",
-        "lru-cache": "^5.1.1",
-        "semver": "^6.3.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0"
-      }
-    },
-    "node_modules/@babel/helper-environment-visitor": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
-      "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-function-name": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
-      "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/template": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-hoist-variables": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
-      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-imports": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
-      "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-module-transforms": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
-      "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-module-imports": "^7.22.5",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-plugin-utils": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
-      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-split-export-declaration": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz",
-      "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/types": "^7.22.5"
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/helper-string-parser": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
-      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@babel/helper-validator-identifier": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
-      "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==",
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helper-validator-option": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
-      "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/helpers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz",
-      "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==",
-      "dev": true,
-      "dependencies": {
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      },
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
       "engines": {
         "node": ">=6.9.0"
       }
     },
     "node_modules/@babel/highlight": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
-      "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
-      "dependencies": {
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
-      "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
-      "dev": true,
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-react-jsx-self": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz",
-      "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
-      }
-    },
-    "node_modules/@babel/plugin-transform-react-jsx-source": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz",
-      "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==",
-      "dev": true,
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
       "dependencies": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       },
       "engines": {
         "node": ">=6.9.0"
-      },
-      "peerDependencies": {
-        "@babel/core": "^7.0.0-0"
       }
     },
     "node_modules/@babel/runtime": {
-      "version": "7.23.2",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
-      "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
-      "dev": true,
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz",
+      "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==",
       "dependencies": {
         "regenerator-runtime": "^0.14.0"
       },
@@ -346,55 +98,6 @@
         "node": ">=6.9.0"
       }
     },
-    "node_modules/@babel/template": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
-      "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/traverse": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz",
-      "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==",
-      "dev": true,
-      "dependencies": {
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/types": "^7.22.5",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
-    "node_modules/@babel/types": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
-      "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
-      "dev": true,
-      "dependencies": {
-        "@babel/helper-string-parser": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "to-fast-properties": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/@elemaudio/core": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@elemaudio/core/-/core-3.0.0.tgz",
@@ -405,6 +108,22 @@
         "shallowequal": "^1.1.0"
       }
     },
+    "node_modules/@esbuild/aix-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "aix"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
     "node_modules/@esbuild/android-arm": {
       "version": "0.17.19",
       "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
@@ -735,14 +454,6 @@
         "node": ">=12"
       }
     },
-    "node_modules/@heroicons/react": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz",
-      "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==",
-      "peerDependencies": {
-        "react": ">= 16"
-      }
-    },
     "node_modules/@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -785,14 +496,14 @@
       }
     },
     "node_modules/@jridgewell/gen-mapping": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
-      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/set-array": "^1.2.1",
         "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
+        "@jridgewell/trace-mapping": "^0.3.24"
       },
       "engines": {
         "node": ">=6.0.0"
@@ -808,9 +519,9 @@
       }
     },
     "node_modules/@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
       "dev": true,
       "engines": {
         "node": ">=6.0.0"
@@ -823,21 +534,15 @@
       "dev": true
     },
     "node_modules/@jridgewell/trace-mapping": {
-      "version": "0.3.18",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
-      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
       "dev": true,
       "dependencies": {
-        "@jridgewell/resolve-uri": "3.1.0",
-        "@jridgewell/sourcemap-codec": "1.4.14"
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
       }
     },
-    "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": {
-      "version": "1.4.14",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-      "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
-      "dev": true
-    },
     "node_modules/@nodelib/fs.scandir": {
       "version": "2.1.5",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@@ -879,120 +584,340 @@
         "node": ">=14"
       }
     },
-    "node_modules/@types/fs-extra": {
-      "version": "11.0.3",
-      "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz",
-      "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==",
+    "node_modules/@rollup/rollup-android-arm-eabi": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz",
+      "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "dependencies": {
-        "@types/jsonfile": "*",
-        "@types/node": "*"
-      }
+      "optional": true,
+      "os": [
+        "android"
+      ]
     },
-    "node_modules/@types/jsonfile": {
-      "version": "6.1.3",
-      "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.3.tgz",
-      "integrity": "sha512-/yqTk2SZ1wIezK0hiRZD7RuSf4B3whFxFamB1kGStv+8zlWScTMcHanzfc0XKWs5vA1TkHeckBlOyM8jxU8nHA==",
+    "node_modules/@rollup/rollup-android-arm64": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz",
+      "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@types/minimist": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
-      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ=="
+      "optional": true,
+      "os": [
+        "android"
+      ]
     },
-    "node_modules/@types/node": {
-      "version": "18.18.8",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz",
-      "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==",
+    "node_modules/@rollup/rollup-darwin-arm64": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz",
+      "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==",
+      "cpu": [
+        "arm64"
+      ],
       "dev": true,
-      "dependencies": {
-        "undici-types": "~5.26.4"
-      }
-    },
-    "node_modules/@types/normalize-package-data": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
-      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
-    },
-    "node_modules/@types/prop-types": {
-      "version": "15.7.5",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
-      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
-      "dev": true
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
     },
-    "node_modules/@types/ps-tree": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.4.tgz",
-      "integrity": "sha512-CJyu2BqU/aZN/s8Ili3jiMctqXfTjCaWXirEcjRD8y1lUQZJ8eNohnal8+LXeWFs1VbdAOrCIdgATFsv+lnQ5Q==",
-      "dev": true
+    "node_modules/@rollup/rollup-darwin-x64": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz",
+      "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ]
     },
-    "node_modules/@types/react": {
-      "version": "18.2.14",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz",
-      "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==",
+    "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz",
+      "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "dependencies": {
-        "@types/prop-types": "*",
-        "@types/scheduler": "*",
-        "csstype": "^3.0.2"
-      }
+      "optional": true,
+      "os": [
+        "linux"
+      ]
     },
-    "node_modules/@types/react-dom": {
-      "version": "18.2.6",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz",
-      "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==",
+    "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz",
+      "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==",
+      "cpu": [
+        "arm"
+      ],
       "dev": true,
-      "dependencies": {
-        "@types/react": "*"
-      }
+      "optional": true,
+      "os": [
+        "linux"
+      ]
     },
-    "node_modules/@types/scheduler": {
-      "version": "0.16.3",
-      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
-      "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
-      "dev": true
+    "node_modules/@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz",
+      "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
     },
-    "node_modules/@types/which": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.1.tgz",
-      "integrity": "sha512-OJWjr4k8gS1HXuOnCmQbBrQez+xqt/zqfp5PhgbKtsmEFEuojAg23arr+TiTZZ1TORdUF9RKXb/WKEpT1dwgSg==",
-      "dev": true
+    "node_modules/@rollup/rollup-linux-arm64-musl": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz",
+      "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz",
+      "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz",
+      "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz",
+      "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz",
+      "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-linux-x64-musl": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz",
+      "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz",
+      "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
+    },
+    "node_modules/@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz",
+      "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
     },
-    "node_modules/@use-gesture/core": {
-      "version": "10.2.27",
-      "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz",
-      "integrity": "sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA=="
+    "node_modules/@rollup/rollup-win32-x64-msvc": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz",
+      "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ]
     },
-    "node_modules/@use-gesture/react": {
-      "version": "10.2.27",
-      "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.27.tgz",
-      "integrity": "sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w==",
+    "node_modules/@sveltejs/vite-plugin-svelte": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.1.tgz",
+      "integrity": "sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==",
+      "dev": true,
       "dependencies": {
-        "@use-gesture/core": "10.2.27"
+        "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0",
+        "debug": "^4.3.4",
+        "deepmerge": "^4.3.1",
+        "kleur": "^4.1.5",
+        "magic-string": "^0.30.10",
+        "svelte-hmr": "^0.16.0",
+        "vitefu": "^0.2.5"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20"
       },
       "peerDependencies": {
-        "react": ">= 16.8.0"
+        "svelte": "^4.0.0 || ^5.0.0-next.0",
+        "vite": "^5.0.0"
       }
     },
-    "node_modules/@vitejs/plugin-react": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz",
-      "integrity": "sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==",
+    "node_modules/@sveltejs/vite-plugin-svelte-inspector": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz",
+      "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==",
       "dev": true,
       "dependencies": {
-        "@babel/core": "^7.22.5",
-        "@babel/plugin-transform-react-jsx-self": "^7.22.5",
-        "@babel/plugin-transform-react-jsx-source": "^7.22.5",
-        "react-refresh": "^0.14.0"
+        "debug": "^4.3.4"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20"
       },
+      "peerDependencies": {
+        "@sveltejs/vite-plugin-svelte": "^3.0.0",
+        "svelte": "^4.0.0 || ^5.0.0-next.0",
+        "vite": "^5.0.0"
+      }
+    },
+    "node_modules/@sveltejs/vite-plugin-svelte/node_modules/svelte-hmr": {
+      "version": "0.16.0",
+      "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz",
+      "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==",
+      "dev": true,
       "engines": {
-        "node": "^14.18.0 || >=16.0.0"
+        "node": "^12.20 || ^14.13.1 || >= 16"
+      },
+      "peerDependencies": {
+        "svelte": "^3.19.0 || ^4.0.0"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "dev": true
+    },
+    "node_modules/@types/fs-extra": {
+      "version": "11.0.3",
+      "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-11.0.3.tgz",
+      "integrity": "sha512-sF59BlXtUdzEAL1u0MSvuzWd7PdZvZEtnaVkzX5mjpdWTJ8brG0jUqve3jPCzSzvAKKMHTG8F8o/WMQLtleZdQ==",
+      "dev": true,
+      "dependencies": {
+        "@types/jsonfile": "*",
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/jsonfile": {
+      "version": "6.1.3",
+      "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.3.tgz",
+      "integrity": "sha512-/yqTk2SZ1wIezK0hiRZD7RuSf4B3whFxFamB1kGStv+8zlWScTMcHanzfc0XKWs5vA1TkHeckBlOyM8jxU8nHA==",
+      "dev": true,
+      "dependencies": {
+        "@types/node": "*"
+      }
+    },
+    "node_modules/@types/minimist": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ=="
+    },
+    "node_modules/@types/node": {
+      "version": "18.18.8",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-18.18.8.tgz",
+      "integrity": "sha512-OLGBaaK5V3VRBS1bAkMVP2/W9B+H8meUfl866OrMNQqt7wDgdpWPp5o6gmIc9pB+lIQHSq4ZL8ypeH1vPxcPaQ==",
+      "dev": true,
+      "dependencies": {
+        "undici-types": "~5.26.4"
+      }
+    },
+    "node_modules/@types/normalize-package-data": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
+    },
+    "node_modules/@types/ps-tree": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.4.tgz",
+      "integrity": "sha512-CJyu2BqU/aZN/s8Ili3jiMctqXfTjCaWXirEcjRD8y1lUQZJ8eNohnal8+LXeWFs1VbdAOrCIdgATFsv+lnQ5Q==",
+      "dev": true
+    },
+    "node_modules/@types/which": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.1.tgz",
+      "integrity": "sha512-OJWjr4k8gS1HXuOnCmQbBrQez+xqt/zqfp5PhgbKtsmEFEuojAg23arr+TiTZZ1TORdUF9RKXb/WKEpT1dwgSg==",
+      "dev": true
+    },
+    "node_modules/acorn": {
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+      "dev": true,
+      "bin": {
+        "acorn": "bin/acorn"
       },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-typescript": {
+      "version": "1.4.13",
+      "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz",
+      "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==",
+      "dev": true,
       "peerDependencies": {
-        "vite": "^4.2.0"
+        "acorn": ">=8.9.0"
       }
     },
     "node_modules/aggregate-error": {
@@ -1054,6 +979,15 @@
       "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
       "dev": true
     },
+    "node_modules/aria-query": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+      "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+      "dev": true,
+      "dependencies": {
+        "dequal": "^2.0.3"
+      }
+    },
     "node_modules/arrify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz",
@@ -1098,6 +1032,15 @@
         "postcss": "^8.1.0"
       }
     },
+    "node_modules/axobject-query": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
+      "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
+      "dev": true,
+      "dependencies": {
+        "dequal": "^2.0.3"
+      }
+    },
     "node_modules/balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -1123,11 +1066,11 @@
       }
     },
     "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "dependencies": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       },
       "engines": {
         "node": ">=8"
@@ -1534,12 +1477,6 @@
         "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
-    "node_modules/convert-source-map": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "dev": true
-    },
     "node_modules/cp-file": {
       "version": "9.1.0",
       "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz",
@@ -1621,12 +1558,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/csstype": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
-      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
-      "dev": true
-    },
     "node_modules/data-uri-to-buffer": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -1653,9 +1584,9 @@
       }
     },
     "node_modules/debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
       "dev": true,
       "dependencies": {
         "ms": "2.1.2"
@@ -1711,6 +1642,24 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/dequal": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+      "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/didyoumean": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -1817,6 +1766,22 @@
         "node": ">=0.8.0"
       }
     },
+    "node_modules/esm-env": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
+      "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==",
+      "dev": true
+    },
+    "node_modules/esrap": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz",
+      "integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==",
+      "dev": true,
+      "dependencies": {
+        "@jridgewell/sourcemap-codec": "^1.4.15",
+        "@types/estree": "^1.0.1"
+      }
+    },
     "node_modules/event-stream": {
       "version": "3.3.4",
       "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
@@ -1866,6 +1831,18 @@
         "node": ">= 6"
       }
     },
+    "node_modules/fast-unique-numbers": {
+      "version": "9.0.7",
+      "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.7.tgz",
+      "integrity": "sha512-K6hYNu8ZsVb7mwmd9OKxHmw4aLa+IFiBxt1e/FZVFFta94ZgNAHqIgUtDzd7AJaVoo/CoNTgr6sj1Dbj3PQPKg==",
+      "dependencies": {
+        "@babel/runtime": "^7.24.8",
+        "tslib": "^2.6.3"
+      },
+      "engines": {
+        "node": ">=18.2.0"
+      }
+    },
     "node_modules/fastq": {
       "version": "1.15.0",
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -1898,9 +1875,9 @@
       }
     },
     "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "dependencies": {
         "to-regex-range": "^5.0.1"
       },
@@ -1990,9 +1967,9 @@
       "dev": true
     },
     "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "hasInstallScript": true,
       "optional": true,
@@ -2017,15 +1994,6 @@
         "fx": "index.js"
       }
     },
-    "node_modules/gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6.9.0"
-      }
-    },
     "node_modules/get-caller-file": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -2090,15 +2058,6 @@
         "url": "https://github.com/sponsors/isaacs"
       }
     },
-    "node_modules/globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/globby": {
       "version": "13.2.0",
       "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.0.tgz",
@@ -2290,6 +2249,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/is-reference": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
+      "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
+      "dev": true,
+      "dependencies": {
+        "@types/estree": "*"
+      }
+    },
     "node_modules/isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -2326,35 +2294,11 @@
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
-    "node_modules/jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true,
-      "bin": {
-        "jsesc": "bin/jsesc"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
     },
-    "node_modules/json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true,
-      "bin": {
-        "json5": "lib/cli.js"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/jsonfile": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -2386,6 +2330,15 @@
         "node": ">=0.10.0"
       }
     },
+    "node_modules/kleur": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/lilconfig": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
@@ -2400,6 +2353,12 @@
       "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     },
+    "node_modules/locate-character": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+      "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+      "dev": true
+    },
     "node_modules/locate-path": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -2431,13 +2390,13 @@
         "loose-envify": "cli.js"
       }
     },
-    "node_modules/lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+    "node_modules/magic-string": {
+      "version": "0.30.10",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dev": true,
       "dependencies": {
-        "yallist": "^3.0.2"
+        "@jridgewell/sourcemap-codec": "^1.4.15"
       }
     },
     "node_modules/make-dir": {
@@ -2603,9 +2562,9 @@
       }
     },
     "node_modules/nanoid": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
-      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
       "dev": true,
       "funding": [
         {
@@ -2935,10 +2894,9 @@
       }
     },
     "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
     },
     "node_modules/picomatch": {
       "version": "2.3.1",
@@ -2970,9 +2928,9 @@
       }
     },
     "node_modules/postcss": {
-      "version": "8.4.24",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz",
-      "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
+      "version": "8.4.39",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+      "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
       "dev": true,
       "funding": [
         {
@@ -2989,9 +2947,9 @@
         }
       ],
       "dependencies": {
-        "nanoid": "^3.3.6",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.1",
+        "source-map-js": "^1.2.0"
       },
       "engines": {
         "node": "^10 || ^12 || >=14"
@@ -3166,6 +3124,7 @@
       "version": "18.2.0",
       "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
       "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+      "peer": true,
       "dependencies": {
         "loose-envify": "^1.1.0"
       },
@@ -3173,32 +3132,11 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/react-dom": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
-      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
-      "dependencies": {
-        "loose-envify": "^1.1.0",
-        "scheduler": "^0.23.0"
-      },
-      "peerDependencies": {
-        "react": "^18.2.0"
-      }
-    },
-    "node_modules/react-refresh": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
-      "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/read-cache": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
-      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
-      "dev": true,
+    "node_modules/read-cache": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+      "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+      "dev": true,
       "dependencies": {
         "pify": "^2.3.0"
       }
@@ -3288,8 +3226,7 @@
     "node_modules/regenerator-runtime": {
       "version": "0.14.0",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
-      "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
-      "dev": true
+      "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
     },
     "node_modules/require-directory": {
       "version": "2.1.1",
@@ -3332,18 +3269,37 @@
       }
     },
     "node_modules/rollup": {
-      "version": "3.25.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.2.tgz",
-      "integrity": "sha512-VLnkxZMDr3jpxgtmS8pQZ0UvhslmF4ADq/9w4erkctbgjCqLW9oa89fJuXEs4ZmgyoF7Dm8rMDKSS5b5u2hHUg==",
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz",
+      "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==",
       "dev": true,
+      "dependencies": {
+        "@types/estree": "1.0.5"
+      },
       "bin": {
         "rollup": "dist/bin/rollup"
       },
       "engines": {
-        "node": ">=14.18.0",
+        "node": ">=18.0.0",
         "npm": ">=8.0.0"
       },
       "optionalDependencies": {
+        "@rollup/rollup-android-arm-eabi": "4.18.1",
+        "@rollup/rollup-android-arm64": "4.18.1",
+        "@rollup/rollup-darwin-arm64": "4.18.1",
+        "@rollup/rollup-darwin-x64": "4.18.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.18.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.18.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.18.1",
+        "@rollup/rollup-linux-arm64-musl": "4.18.1",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.18.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.18.1",
+        "@rollup/rollup-linux-x64-gnu": "4.18.1",
+        "@rollup/rollup-linux-x64-musl": "4.18.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.18.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.18.1",
+        "@rollup/rollup-win32-x64-msvc": "4.18.1",
         "fsevents": "~2.3.2"
       }
     },
@@ -3378,18 +3334,10 @@
         "tslib": "^2.1.0"
       }
     },
-    "node_modules/scheduler": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
-      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
-      "dependencies": {
-        "loose-envify": "^1.1.0"
-      }
-    },
     "node_modules/semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
       "bin": {
         "semver": "bin/semver.js"
       }
@@ -3450,9 +3398,9 @@
       }
     },
     "node_modules/source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
       "dev": true,
       "engines": {
         "node": ">=0.10.0"
@@ -3675,6 +3623,30 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
+    "node_modules/svelte": {
+      "version": "5.0.0-next.184",
+      "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.0.0-next.184.tgz",
+      "integrity": "sha512-oHWNajXOytt/5s2Ark3o/CP7bHLx+o/QZjTkCtU1dECqSmYyGqrIsoZi0Cx0VBdXAHMqI+1/T70ppaL1cL7LEw==",
+      "dev": true,
+      "dependencies": {
+        "@ampproject/remapping": "^2.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.15",
+        "@types/estree": "^1.0.5",
+        "acorn": "^8.11.3",
+        "acorn-typescript": "^1.4.13",
+        "aria-query": "^5.3.0",
+        "axobject-query": "^4.0.0",
+        "esm-env": "^1.0.0",
+        "esrap": "^1.2.2",
+        "is-reference": "^3.0.2",
+        "locate-character": "^3.0.0",
+        "magic-string": "^0.30.5",
+        "zimmerframe": "^1.1.2"
+      },
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/tailwindcss": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
@@ -3757,15 +3729,6 @@
       "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
       "dev": true
     },
-    "node_modules/to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
     "node_modules/to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -3804,10 +3767,9 @@
       "dev": true
     },
     "node_modules/tslib": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
-      "dev": true
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
+      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
     },
     "node_modules/undici-types": {
       "version": "5.26.5",
@@ -3862,65 +3824,476 @@
         "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
       }
     },
-    "node_modules/util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
-      "dev": true
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+      "dev": true
+    },
+    "node_modules/validate-npm-package-license": {
+      "version": "3.0.4",
+      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+      "dependencies": {
+        "spdx-correct": "^3.0.0",
+        "spdx-expression-parse": "^3.0.0"
+      }
+    },
+    "node_modules/vite": {
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
+      "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
+      "dev": true,
+      "dependencies": {
+        "esbuild": "^0.21.3",
+        "postcss": "^8.4.39",
+        "rollup": "^4.13.0"
+      },
+      "bin": {
+        "vite": "bin/vite.js"
+      },
+      "engines": {
+        "node": "^18.0.0 || >=20.0.0"
+      },
+      "funding": {
+        "url": "https://github.com/vitejs/vite?sponsor=1"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.3"
+      },
+      "peerDependencies": {
+        "@types/node": "^18.0.0 || >=20.0.0",
+        "less": "*",
+        "lightningcss": "^1.21.0",
+        "sass": "*",
+        "stylus": "*",
+        "sugarss": "*",
+        "terser": "^5.4.0"
+      },
+      "peerDependenciesMeta": {
+        "@types/node": {
+          "optional": true
+        },
+        "less": {
+          "optional": true
+        },
+        "lightningcss": {
+          "optional": true
+        },
+        "sass": {
+          "optional": true
+        },
+        "stylus": {
+          "optional": true
+        },
+        "sugarss": {
+          "optional": true
+        },
+        "terser": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+      "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+      "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/android-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+      "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "android"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+      "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+      "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+      "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+      "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "freebsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-arm": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+      "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+      "cpu": [
+        "arm"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+      "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+      "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+      "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+      "cpu": [
+        "loong64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+      "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+      "cpu": [
+        "mips64el"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+      "cpu": [
+        "ppc64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+      "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+      "cpu": [
+        "riscv64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+      "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+      "cpu": [
+        "s390x"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/linux-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+      "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "linux"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "netbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+      "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "openbsd"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+      "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "sunos"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+      "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+      "cpu": [
+        "arm64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
+    },
+    "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+      "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+      "cpu": [
+        "ia32"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
+      }
     },
-    "node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
-      "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
+    "node_modules/vite/node_modules/@esbuild/win32-x64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+      "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+      "cpu": [
+        "x64"
+      ],
+      "dev": true,
+      "optional": true,
+      "os": [
+        "win32"
+      ],
+      "engines": {
+        "node": ">=12"
       }
     },
-    "node_modules/vite": {
-      "version": "4.3.9",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz",
-      "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==",
+    "node_modules/vite/node_modules/esbuild": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+      "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
       "dev": true,
-      "dependencies": {
-        "esbuild": "^0.17.5",
-        "postcss": "^8.4.23",
-        "rollup": "^3.21.0"
-      },
+      "hasInstallScript": true,
       "bin": {
-        "vite": "bin/vite.js"
+        "esbuild": "bin/esbuild"
       },
       "engines": {
-        "node": "^14.18.0 || >=16.0.0"
+        "node": ">=12"
       },
       "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      },
+        "@esbuild/aix-ppc64": "0.21.5",
+        "@esbuild/android-arm": "0.21.5",
+        "@esbuild/android-arm64": "0.21.5",
+        "@esbuild/android-x64": "0.21.5",
+        "@esbuild/darwin-arm64": "0.21.5",
+        "@esbuild/darwin-x64": "0.21.5",
+        "@esbuild/freebsd-arm64": "0.21.5",
+        "@esbuild/freebsd-x64": "0.21.5",
+        "@esbuild/linux-arm": "0.21.5",
+        "@esbuild/linux-arm64": "0.21.5",
+        "@esbuild/linux-ia32": "0.21.5",
+        "@esbuild/linux-loong64": "0.21.5",
+        "@esbuild/linux-mips64el": "0.21.5",
+        "@esbuild/linux-ppc64": "0.21.5",
+        "@esbuild/linux-riscv64": "0.21.5",
+        "@esbuild/linux-s390x": "0.21.5",
+        "@esbuild/linux-x64": "0.21.5",
+        "@esbuild/netbsd-x64": "0.21.5",
+        "@esbuild/openbsd-x64": "0.21.5",
+        "@esbuild/sunos-x64": "0.21.5",
+        "@esbuild/win32-arm64": "0.21.5",
+        "@esbuild/win32-ia32": "0.21.5",
+        "@esbuild/win32-x64": "0.21.5"
+      }
+    },
+    "node_modules/vitefu": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
+      "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
+      "dev": true,
       "peerDependencies": {
-        "@types/node": ">= 14",
-        "less": "*",
-        "sass": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.4.0"
+        "vite": "^3.0.0 || ^4.0.0 || ^5.0.0"
       },
       "peerDependenciesMeta": {
-        "@types/node": {
-          "optional": true
-        },
-        "less": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
+        "vite": {
           "optional": true
         }
       }
@@ -3957,6 +4330,37 @@
         "node": ">= 8"
       }
     },
+    "node_modules/worker-timers": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.2.tgz",
+      "integrity": "sha512-Xna4rPTforH+a3/Kyukf9diO8MDdKY/nuDU77Ptx3SPi+2V/QfWGdwGUxVOk4oFyCnRoe71ZjH6axjyVWO5Nqw==",
+      "dependencies": {
+        "@babel/runtime": "^7.24.8",
+        "tslib": "^2.6.3",
+        "worker-timers-broker": "^7.0.3",
+        "worker-timers-worker": "^8.0.2"
+      }
+    },
+    "node_modules/worker-timers-broker": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-7.0.3.tgz",
+      "integrity": "sha512-LG/xWCCOg6UwRnmAzy05wCvn3jIO60AcpT/CgG3TmaYK93+biainiivSVHGK6VEBeJzETrFAKZ9JgW8gkae+Ag==",
+      "dependencies": {
+        "@babel/runtime": "^7.24.8",
+        "fast-unique-numbers": "^9.0.7",
+        "tslib": "^2.6.3",
+        "worker-timers-worker": "^8.0.2"
+      }
+    },
+    "node_modules/worker-timers-worker": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-8.0.2.tgz",
+      "integrity": "sha512-Bx8grqm3TyHLorTMBbtoL+fAMwTBgx+c4IiE23fCNinlUpqTISEa9UXR6GAjgHAB2GlZjNLgisLjx9a6CKFV3Q==",
+      "dependencies": {
+        "@babel/runtime": "^7.24.8",
+        "tslib": "^2.6.3"
+      }
+    },
     "node_modules/wrap-ansi": {
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -4089,12 +4493,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
-    },
     "node_modules/yaml": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
@@ -4170,6 +4568,12 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
+    "node_modules/zimmerframe": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
+      "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==",
+      "dev": true
+    },
     "node_modules/zustand": {
       "version": "4.3.8",
       "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz",
@@ -4268,252 +4672,38 @@
       }
     },
     "@babel/code-frame": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz",
-      "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==",
-      "requires": {
-        "@babel/highlight": "^7.22.5"
-      }
-    },
-    "@babel/compat-data": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz",
-      "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==",
-      "dev": true
-    },
-    "@babel/core": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz",
-      "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==",
-      "dev": true,
-      "requires": {
-        "@ampproject/remapping": "^2.2.0",
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.5",
-        "@babel/helper-compilation-targets": "^7.22.5",
-        "@babel/helper-module-transforms": "^7.22.5",
-        "@babel/helpers": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5",
-        "convert-source-map": "^1.7.0",
-        "debug": "^4.1.0",
-        "gensync": "^1.0.0-beta.2",
-        "json5": "^2.2.2",
-        "semver": "^6.3.0"
-      }
-    },
-    "@babel/generator": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz",
-      "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.22.5",
-        "@jridgewell/gen-mapping": "^0.3.2",
-        "@jridgewell/trace-mapping": "^0.3.17",
-        "jsesc": "^2.5.1"
-      }
-    },
-    "@babel/helper-compilation-targets": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz",
-      "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==",
-      "dev": true,
-      "requires": {
-        "@babel/compat-data": "^7.22.5",
-        "@babel/helper-validator-option": "^7.22.5",
-        "browserslist": "^4.21.3",
-        "lru-cache": "^5.1.1",
-        "semver": "^6.3.0"
-      }
-    },
-    "@babel/helper-environment-visitor": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz",
-      "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==",
-      "dev": true
-    },
-    "@babel/helper-function-name": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz",
-      "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      }
-    },
-    "@babel/helper-hoist-variables": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
-      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.22.5"
-      }
-    },
-    "@babel/helper-module-imports": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz",
-      "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.22.5"
-      }
-    },
-    "@babel/helper-module-transforms": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz",
-      "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-module-imports": "^7.22.5",
-        "@babel/helper-simple-access": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      }
-    },
-    "@babel/helper-plugin-utils": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz",
-      "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==",
-      "dev": true
-    },
-    "@babel/helper-simple-access": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
-      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
-      "dev": true,
-      "requires": {
-        "@babel/types": "^7.22.5"
-      }
-    },
-    "@babel/helper-split-export-declaration": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz",
-      "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==",
-      "dev": true,
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
+      "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
       "requires": {
-        "@babel/types": "^7.22.5"
+        "@babel/highlight": "^7.24.7",
+        "picocolors": "^1.0.0"
       }
     },
-    "@babel/helper-string-parser": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
-      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
-      "dev": true
-    },
     "@babel/helper-validator-identifier": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz",
-      "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ=="
-    },
-    "@babel/helper-validator-option": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz",
-      "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==",
-      "dev": true
-    },
-    "@babel/helpers": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz",
-      "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==",
-      "dev": true,
-      "requires": {
-        "@babel/template": "^7.22.5",
-        "@babel/traverse": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      }
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+      "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w=="
     },
     "@babel/highlight": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz",
-      "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==",
-      "requires": {
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "chalk": "^2.0.0",
-        "js-tokens": "^4.0.0"
-      }
-    },
-    "@babel/parser": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz",
-      "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==",
-      "dev": true
-    },
-    "@babel/plugin-transform-react-jsx-self": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz",
-      "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==",
-      "dev": true,
+      "version": "7.24.7",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
+      "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
       "requires": {
-        "@babel/helper-plugin-utils": "^7.22.5"
-      }
-    },
-    "@babel/plugin-transform-react-jsx-source": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz",
-      "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-plugin-utils": "^7.22.5"
+        "@babel/helper-validator-identifier": "^7.24.7",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0",
+        "picocolors": "^1.0.0"
       }
     },
     "@babel/runtime": {
-      "version": "7.23.2",
-      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
-      "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
-      "dev": true,
+      "version": "7.24.8",
+      "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.8.tgz",
+      "integrity": "sha512-5F7SDGs1T72ZczbRwbGO9lQi0NLjQxzl6i4lJxLxfW9U5UluCSyEJeniWvnhl3/euNiqQVbo8zruhsDfid0esA==",
       "requires": {
         "regenerator-runtime": "^0.14.0"
       }
     },
-    "@babel/template": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz",
-      "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/types": "^7.22.5"
-      }
-    },
-    "@babel/traverse": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz",
-      "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==",
-      "dev": true,
-      "requires": {
-        "@babel/code-frame": "^7.22.5",
-        "@babel/generator": "^7.22.5",
-        "@babel/helper-environment-visitor": "^7.22.5",
-        "@babel/helper-function-name": "^7.22.5",
-        "@babel/helper-hoist-variables": "^7.22.5",
-        "@babel/helper-split-export-declaration": "^7.22.5",
-        "@babel/parser": "^7.22.5",
-        "@babel/types": "^7.22.5",
-        "debug": "^4.1.0",
-        "globals": "^11.1.0"
-      }
-    },
-    "@babel/types": {
-      "version": "7.22.5",
-      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz",
-      "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==",
-      "dev": true,
-      "requires": {
-        "@babel/helper-string-parser": "^7.22.5",
-        "@babel/helper-validator-identifier": "^7.22.5",
-        "to-fast-properties": "^2.0.0"
-      }
-    },
     "@elemaudio/core": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/@elemaudio/core/-/core-3.0.0.tgz",
@@ -4524,6 +4714,13 @@
         "shallowequal": "^1.1.0"
       }
     },
+    "@esbuild/aix-ppc64": {
+      "version": "0.21.5",
+      "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+      "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+      "dev": true,
+      "optional": true
+    },
     "@esbuild/android-arm": {
       "version": "0.17.19",
       "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.19.tgz",
@@ -4656,12 +4853,6 @@
       "integrity": "sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==",
       "optional": true
     },
-    "@heroicons/react": {
-      "version": "2.0.18",
-      "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.0.18.tgz",
-      "integrity": "sha512-7TyMjRrZZMBPa+/5Y8lN0iyvUU/01PeMGX2+RE7cQWpEUIcb4QotzUObFkJDejj/HUH4qjP/eQ0gzzKs2f+6Yw==",
-      "requires": {}
-    },
     "@isaacs/cliui": {
       "version": "8.0.2",
       "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
@@ -4690,81 +4881,224 @@
         }
       }
     },
-    "@jridgewell/gen-mapping": {
-      "version": "0.3.3",
-      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
-      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+    "@jridgewell/gen-mapping": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+      "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/set-array": "^1.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.24"
+      }
+    },
+    "@jridgewell/resolve-uri": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
+      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
+      "dev": true
+    },
+    "@jridgewell/set-array": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+      "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+      "dev": true
+    },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+      "dev": true
+    },
+    "@jridgewell/trace-mapping": {
+      "version": "0.3.25",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+      "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "@nodelib/fs.scandir": {
+      "version": "2.1.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+      "requires": {
+        "@nodelib/fs.stat": "2.0.5",
+        "run-parallel": "^1.1.9"
+      }
+    },
+    "@nodelib/fs.stat": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
+    },
+    "@nodelib/fs.walk": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+      "requires": {
+        "@nodelib/fs.scandir": "2.1.5",
+        "fastq": "^1.6.0"
+      }
+    },
+    "@pkgjs/parseargs": {
+      "version": "0.11.0",
+      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+      "optional": true
+    },
+    "@rollup/rollup-android-arm-eabi": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.1.tgz",
+      "integrity": "sha512-lncuC4aHicncmbORnx+dUaAgzee9cm/PbIqgWz1PpXuwc+sa1Ct83tnqUDy/GFKleLiN7ZIeytM6KJ4cAn1SxA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-android-arm64": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.1.tgz",
+      "integrity": "sha512-F/tkdw0WSs4ojqz5Ovrw5r9odqzFjb5LIgHdHZG65dFI1lWTWRVy32KDJLKRISHgJvqUeUhdIvy43fX41znyDg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-darwin-arm64": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.1.tgz",
+      "integrity": "sha512-vk+ma8iC1ebje/ahpxpnrfVQJibTMyHdWpOGZ3JpQ7Mgn/3QNHmPq7YwjZbIE7km73dH5M1e6MRRsnEBW7v5CQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-darwin-x64": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.1.tgz",
+      "integrity": "sha512-IgpzXKauRe1Tafcej9STjSSuG0Ghu/xGYH+qG6JwsAUxXrnkvNHcq/NL6nz1+jzvWAnQkuAJ4uIwGB48K9OCGA==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-gnueabihf": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.1.tgz",
+      "integrity": "sha512-P9bSiAUnSSM7EmyRK+e5wgpqai86QOSv8BwvkGjLwYuOpaeomiZWifEos517CwbG+aZl1T4clSE1YqqH2JRs+g==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm-musleabihf": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.1.tgz",
+      "integrity": "sha512-5RnjpACoxtS+aWOI1dURKno11d7krfpGDEn19jI8BuWmSBbUC4ytIADfROM1FZrFhQPSoP+KEa3NlEScznBTyQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.1.tgz",
+      "integrity": "sha512-8mwmGD668m8WaGbthrEYZ9CBmPug2QPGWxhJxh/vCgBjro5o96gL04WLlg5BA233OCWLqERy4YUzX3bJGXaJgQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-arm64-musl": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.1.tgz",
+      "integrity": "sha512-dJX9u4r4bqInMGOAQoGYdwDP8lQiisWb9et+T84l2WXk41yEej8v2iGKodmdKimT8cTAYt0jFb+UEBxnPkbXEQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-powerpc64le-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.1.tgz",
+      "integrity": "sha512-V72cXdTl4EI0x6FNmho4D502sy7ed+LuVW6Ym8aI6DRQ9hQZdp5sj0a2usYOlqvFBNKQnLQGwmYnujo2HvjCxQ==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-riscv64-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.1.tgz",
+      "integrity": "sha512-f+pJih7sxoKmbjghrM2RkWo2WHUW8UbfxIQiWo5yeCaCM0TveMEuAzKJte4QskBp1TIinpnRcxkquY+4WuY/tg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-s390x-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.1.tgz",
+      "integrity": "sha512-qb1hMMT3Fr/Qz1OKovCuUM11MUNLUuHeBC2DPPAWUYYUAOFWaxInaTwTQmc7Fl5La7DShTEpmYwgdt2hG+4TEg==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-gnu": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.1.tgz",
+      "integrity": "sha512-7O5u/p6oKUFYjRbZkL2FLbwsyoJAjyeXHCU3O4ndvzg2OFO2GinFPSJFGbiwFDaCFc+k7gs9CF243PwdPQFh5g==",
+      "dev": true,
+      "optional": true
+    },
+    "@rollup/rollup-linux-x64-musl": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.1.tgz",
+      "integrity": "sha512-pDLkYITdYrH/9Cv/Vlj8HppDuLMDUBmgsM0+N+xLtFd18aXgM9Nyqupb/Uw+HeidhfYg2lD6CXvz6CjoVOaKjQ==",
       "dev": true,
-      "requires": {
-        "@jridgewell/set-array": "^1.0.1",
-        "@jridgewell/sourcemap-codec": "^1.4.10",
-        "@jridgewell/trace-mapping": "^0.3.9"
-      }
+      "optional": true
     },
-    "@jridgewell/resolve-uri": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
-      "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
-      "dev": true
+    "@rollup/rollup-win32-arm64-msvc": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.1.tgz",
+      "integrity": "sha512-W2ZNI323O/8pJdBGil1oCauuCzmVd9lDmWBBqxYZcOqWD6aWqJtVBQ1dFrF4dYpZPks6F+xCZHfzG5hYlSHZ6g==",
+      "dev": true,
+      "optional": true
     },
-    "@jridgewell/set-array": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
-      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
-      "dev": true
+    "@rollup/rollup-win32-ia32-msvc": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.1.tgz",
+      "integrity": "sha512-ELfEX1/+eGZYMaCIbK4jqLxO1gyTSOIlZr6pbC4SRYFaSIDVKOnZNMdoZ+ON0mrFDp4+H5MhwNC1H/AhE3zQLg==",
+      "dev": true,
+      "optional": true
     },
-    "@jridgewell/sourcemap-codec": {
-      "version": "1.4.15",
-      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
-      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
-      "dev": true
+    "@rollup/rollup-win32-x64-msvc": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.1.tgz",
+      "integrity": "sha512-yjk2MAkQmoaPYCSu35RLJ62+dz358nE83VfTePJRp8CG7aMg25mEJYpXFiD+NcevhX8LxD5OP5tktPXnXN7GDw==",
+      "dev": true,
+      "optional": true
     },
-    "@jridgewell/trace-mapping": {
-      "version": "0.3.18",
-      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz",
-      "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==",
+    "@sveltejs/vite-plugin-svelte": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.1.tgz",
+      "integrity": "sha512-rimpFEAboBBHIlzISibg94iP09k/KYdHgVhJlcsTfn7KMBhc70jFX/GRWkRdFCc2fdnk+4+Bdfej23cMDnJS6A==",
       "dev": true,
       "requires": {
-        "@jridgewell/resolve-uri": "3.1.0",
-        "@jridgewell/sourcemap-codec": "1.4.14"
+        "@sveltejs/vite-plugin-svelte-inspector": "^2.1.0",
+        "debug": "^4.3.4",
+        "deepmerge": "^4.3.1",
+        "kleur": "^4.1.5",
+        "magic-string": "^0.30.10",
+        "svelte-hmr": "^0.16.0",
+        "vitefu": "^0.2.5"
       },
       "dependencies": {
-        "@jridgewell/sourcemap-codec": {
-          "version": "1.4.14",
-          "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
-          "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
-          "dev": true
+        "svelte-hmr": {
+          "version": "0.16.0",
+          "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz",
+          "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==",
+          "dev": true,
+          "requires": {}
         }
       }
     },
-    "@nodelib/fs.scandir": {
-      "version": "2.1.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
-      "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
-      "requires": {
-        "@nodelib/fs.stat": "2.0.5",
-        "run-parallel": "^1.1.9"
-      }
-    },
-    "@nodelib/fs.stat": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
-      "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="
-    },
-    "@nodelib/fs.walk": {
-      "version": "1.2.8",
-      "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
-      "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+    "@sveltejs/vite-plugin-svelte-inspector": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz",
+      "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==",
+      "dev": true,
       "requires": {
-        "@nodelib/fs.scandir": "2.1.5",
-        "fastq": "^1.6.0"
+        "debug": "^4.3.4"
       }
     },
-    "@pkgjs/parseargs": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
-      "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
-      "optional": true
+    "@types/estree": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
+      "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
+      "dev": true
     },
     "@types/fs-extra": {
       "version": "11.0.3",
@@ -4804,74 +5138,30 @@
       "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
       "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
     },
-    "@types/prop-types": {
-      "version": "15.7.5",
-      "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz",
-      "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==",
-      "dev": true
-    },
     "@types/ps-tree": {
       "version": "1.1.4",
       "resolved": "https://registry.npmjs.org/@types/ps-tree/-/ps-tree-1.1.4.tgz",
       "integrity": "sha512-CJyu2BqU/aZN/s8Ili3jiMctqXfTjCaWXirEcjRD8y1lUQZJ8eNohnal8+LXeWFs1VbdAOrCIdgATFsv+lnQ5Q==",
       "dev": true
     },
-    "@types/react": {
-      "version": "18.2.14",
-      "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz",
-      "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==",
-      "dev": true,
-      "requires": {
-        "@types/prop-types": "*",
-        "@types/scheduler": "*",
-        "csstype": "^3.0.2"
-      }
-    },
-    "@types/react-dom": {
-      "version": "18.2.6",
-      "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz",
-      "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==",
-      "dev": true,
-      "requires": {
-        "@types/react": "*"
-      }
-    },
-    "@types/scheduler": {
-      "version": "0.16.3",
-      "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz",
-      "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==",
-      "dev": true
-    },
     "@types/which": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/@types/which/-/which-3.0.1.tgz",
       "integrity": "sha512-OJWjr4k8gS1HXuOnCmQbBrQez+xqt/zqfp5PhgbKtsmEFEuojAg23arr+TiTZZ1TORdUF9RKXb/WKEpT1dwgSg==",
       "dev": true
     },
-    "@use-gesture/core": {
-      "version": "10.2.27",
-      "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz",
-      "integrity": "sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA=="
-    },
-    "@use-gesture/react": {
-      "version": "10.2.27",
-      "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.27.tgz",
-      "integrity": "sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w==",
-      "requires": {
-        "@use-gesture/core": "10.2.27"
-      }
+    "acorn": {
+      "version": "8.12.1",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz",
+      "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==",
+      "dev": true
     },
-    "@vitejs/plugin-react": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.1.tgz",
-      "integrity": "sha512-g25lL98essfeSj43HJ0o4DMp0325XK0ITkxpgChzJU/CyemgyChtlxfnRbjfwxDGCTRxTiXtQAsdebQXKMRSOA==",
+    "acorn-typescript": {
+      "version": "1.4.13",
+      "resolved": "https://registry.npmjs.org/acorn-typescript/-/acorn-typescript-1.4.13.tgz",
+      "integrity": "sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==",
       "dev": true,
-      "requires": {
-        "@babel/core": "^7.22.5",
-        "@babel/plugin-transform-react-jsx-self": "^7.22.5",
-        "@babel/plugin-transform-react-jsx-source": "^7.22.5",
-        "react-refresh": "^0.14.0"
-      }
+      "requires": {}
     },
     "aggregate-error": {
       "version": "4.0.1",
@@ -4917,6 +5207,15 @@
       "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
       "dev": true
     },
+    "aria-query": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz",
+      "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==",
+      "dev": true,
+      "requires": {
+        "dequal": "^2.0.3"
+      }
+    },
     "arrify": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz",
@@ -4936,6 +5235,15 @@
         "postcss-value-parser": "^4.2.0"
       }
     },
+    "axobject-query": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz",
+      "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==",
+      "dev": true,
+      "requires": {
+        "dequal": "^2.0.3"
+      }
+    },
     "balanced-match": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -4958,11 +5266,11 @@
       }
     },
     "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+      "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
       "requires": {
-        "fill-range": "^7.0.1"
+        "fill-range": "^7.1.1"
       }
     },
     "browserslist": {
@@ -5233,12 +5541,6 @@
         }
       }
     },
-    "convert-source-map": {
-      "version": "1.9.0",
-      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
-      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==",
-      "dev": true
-    },
     "cp-file": {
       "version": "9.1.0",
       "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-9.1.0.tgz",
@@ -5290,12 +5592,6 @@
       "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
       "dev": true
     },
-    "csstype": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
-      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==",
-      "dev": true
-    },
     "data-uri-to-buffer": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
@@ -5312,9 +5608,9 @@
       }
     },
     "debug": {
-      "version": "4.3.4",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
-      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "version": "4.3.5",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
+      "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
       "dev": true,
       "requires": {
         "ms": "2.1.2"
@@ -5346,6 +5642,18 @@
         }
       }
     },
+    "deepmerge": {
+      "version": "4.3.1",
+      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+      "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+      "dev": true
+    },
+    "dequal": {
+      "version": "2.0.3",
+      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
+      "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
+      "dev": true
+    },
     "didyoumean": {
       "version": "1.2.2",
       "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
@@ -5436,6 +5744,22 @@
       "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
       "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="
     },
+    "esm-env": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz",
+      "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==",
+      "dev": true
+    },
+    "esrap": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/esrap/-/esrap-1.2.2.tgz",
+      "integrity": "sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==",
+      "dev": true,
+      "requires": {
+        "@jridgewell/sourcemap-codec": "^1.4.15",
+        "@types/estree": "^1.0.1"
+      }
+    },
     "event-stream": {
       "version": "3.3.4",
       "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
@@ -5478,6 +5802,15 @@
         }
       }
     },
+    "fast-unique-numbers": {
+      "version": "9.0.7",
+      "resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-9.0.7.tgz",
+      "integrity": "sha512-K6hYNu8ZsVb7mwmd9OKxHmw4aLa+IFiBxt1e/FZVFFta94ZgNAHqIgUtDzd7AJaVoo/CoNTgr6sj1Dbj3PQPKg==",
+      "requires": {
+        "@babel/runtime": "^7.24.8",
+        "tslib": "^2.6.3"
+      }
+    },
     "fastq": {
       "version": "1.15.0",
       "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
@@ -5497,9 +5830,9 @@
       }
     },
     "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "version": "7.1.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+      "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
       "requires": {
         "to-regex-range": "^5.0.1"
       }
@@ -5561,9 +5894,9 @@
       "dev": true
     },
     "fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
       "dev": true,
       "optional": true
     },
@@ -5578,12 +5911,6 @@
       "integrity": "sha512-rIYQBmx85Jfhd3pkSw06YPgvSvfTi022ZXTeFDkcCZGCs5nt3sjqFBGtcMFe1TR2S00RDz63be0ab5mhCiOLBw==",
       "dev": true
     },
-    "gensync": {
-      "version": "1.0.0-beta.2",
-      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
-      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
-      "dev": true
-    },
     "get-caller-file": {
       "version": "2.0.5",
       "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
@@ -5629,12 +5956,6 @@
         "is-glob": "^4.0.3"
       }
     },
-    "globals": {
-      "version": "11.12.0",
-      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
-      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
-      "dev": true
-    },
     "globby": {
       "version": "13.2.0",
       "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.0.tgz",
@@ -5777,6 +6098,15 @@
       "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
       "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg=="
     },
+    "is-reference": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz",
+      "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==",
+      "dev": true,
+      "requires": {
+        "@types/estree": "*"
+      }
+    },
     "isexe": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -5802,23 +6132,11 @@
       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
     },
-    "jsesc": {
-      "version": "2.5.2",
-      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
-      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
-      "dev": true
-    },
     "json-parse-even-better-errors": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
       "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
     },
-    "json5": {
-      "version": "2.2.3",
-      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
-      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
-      "dev": true
-    },
     "jsonfile": {
       "version": "6.1.0",
       "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
@@ -5839,6 +6157,12 @@
       "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
       "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
     },
+    "kleur": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+      "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+      "dev": true
+    },
     "lilconfig": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz",
@@ -5850,6 +6174,12 @@
       "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
       "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
     },
+    "locate-character": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+      "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+      "dev": true
+    },
     "locate-path": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -5872,13 +6202,13 @@
         "js-tokens": "^3.0.0 || ^4.0.0"
       }
     },
-    "lru-cache": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+    "magic-string": {
+      "version": "0.30.10",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz",
+      "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==",
       "dev": true,
       "requires": {
-        "yallist": "^3.0.2"
+        "@jridgewell/sourcemap-codec": "^1.4.15"
       }
     },
     "make-dir": {
@@ -6000,9 +6330,9 @@
       }
     },
     "nanoid": {
-      "version": "3.3.6",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
-      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "version": "3.3.7",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+      "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
       "dev": true
     },
     "nested-error-stacks": {
@@ -6217,10 +6547,9 @@
       }
     },
     "picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
-      "dev": true
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
+      "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew=="
     },
     "picomatch": {
       "version": "2.3.1",
@@ -6240,14 +6569,14 @@
       "dev": true
     },
     "postcss": {
-      "version": "8.4.24",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz",
-      "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==",
+      "version": "8.4.39",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.39.tgz",
+      "integrity": "sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==",
       "dev": true,
       "requires": {
-        "nanoid": "^3.3.6",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
+        "nanoid": "^3.3.7",
+        "picocolors": "^1.0.1",
+        "source-map-js": "^1.2.0"
       }
     },
     "postcss-import": {
@@ -6341,25 +6670,11 @@
       "version": "18.2.0",
       "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
       "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==",
+      "peer": true,
       "requires": {
         "loose-envify": "^1.1.0"
       }
     },
-    "react-dom": {
-      "version": "18.2.0",
-      "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz",
-      "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==",
-      "requires": {
-        "loose-envify": "^1.1.0",
-        "scheduler": "^0.23.0"
-      }
-    },
-    "react-refresh": {
-      "version": "0.14.0",
-      "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz",
-      "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==",
-      "dev": true
-    },
     "read-cache": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -6425,8 +6740,7 @@
     "regenerator-runtime": {
       "version": "0.14.0",
       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
-      "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
-      "dev": true
+      "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA=="
     },
     "require-directory": {
       "version": "2.1.1",
@@ -6453,11 +6767,28 @@
       }
     },
     "rollup": {
-      "version": "3.25.2",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.25.2.tgz",
-      "integrity": "sha512-VLnkxZMDr3jpxgtmS8pQZ0UvhslmF4ADq/9w4erkctbgjCqLW9oa89fJuXEs4ZmgyoF7Dm8rMDKSS5b5u2hHUg==",
-      "dev": true,
-      "requires": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.1.tgz",
+      "integrity": "sha512-Elx2UT8lzxxOXMpy5HWQGZqkrQOtrVDDa/bm9l10+U4rQnVzbL/LgZ4NOM1MPIDyHk69W4InuYDF5dzRh4Kw1A==",
+      "dev": true,
+      "requires": {
+        "@rollup/rollup-android-arm-eabi": "4.18.1",
+        "@rollup/rollup-android-arm64": "4.18.1",
+        "@rollup/rollup-darwin-arm64": "4.18.1",
+        "@rollup/rollup-darwin-x64": "4.18.1",
+        "@rollup/rollup-linux-arm-gnueabihf": "4.18.1",
+        "@rollup/rollup-linux-arm-musleabihf": "4.18.1",
+        "@rollup/rollup-linux-arm64-gnu": "4.18.1",
+        "@rollup/rollup-linux-arm64-musl": "4.18.1",
+        "@rollup/rollup-linux-powerpc64le-gnu": "4.18.1",
+        "@rollup/rollup-linux-riscv64-gnu": "4.18.1",
+        "@rollup/rollup-linux-s390x-gnu": "4.18.1",
+        "@rollup/rollup-linux-x64-gnu": "4.18.1",
+        "@rollup/rollup-linux-x64-musl": "4.18.1",
+        "@rollup/rollup-win32-arm64-msvc": "4.18.1",
+        "@rollup/rollup-win32-ia32-msvc": "4.18.1",
+        "@rollup/rollup-win32-x64-msvc": "4.18.1",
+        "@types/estree": "1.0.5",
         "fsevents": "~2.3.2"
       }
     },
@@ -6478,18 +6809,10 @@
         "tslib": "^2.1.0"
       }
     },
-    "scheduler": {
-      "version": "0.23.0",
-      "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz",
-      "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==",
-      "requires": {
-        "loose-envify": "^1.1.0"
-      }
-    },
     "semver": {
-      "version": "6.3.0",
-      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-      "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="
     },
     "shallowequal": {
       "version": "1.1.0",
@@ -6526,9 +6849,9 @@
       "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew=="
     },
     "source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
+      "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
       "dev": true
     },
     "spawn-command": {
@@ -6694,6 +7017,27 @@
       "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
       "dev": true
     },
+    "svelte": {
+      "version": "5.0.0-next.184",
+      "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.0.0-next.184.tgz",
+      "integrity": "sha512-oHWNajXOytt/5s2Ark3o/CP7bHLx+o/QZjTkCtU1dECqSmYyGqrIsoZi0Cx0VBdXAHMqI+1/T70ppaL1cL7LEw==",
+      "dev": true,
+      "requires": {
+        "@ampproject/remapping": "^2.2.1",
+        "@jridgewell/sourcemap-codec": "^1.4.15",
+        "@types/estree": "^1.0.5",
+        "acorn": "^8.11.3",
+        "acorn-typescript": "^1.4.13",
+        "aria-query": "^5.3.0",
+        "axobject-query": "^4.0.0",
+        "esm-env": "^1.0.0",
+        "esrap": "^1.2.2",
+        "is-reference": "^3.0.2",
+        "locate-character": "^3.0.0",
+        "magic-string": "^0.30.5",
+        "zimmerframe": "^1.1.2"
+      }
+    },
     "tailwindcss": {
       "version": "3.3.2",
       "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz",
@@ -6762,12 +7106,6 @@
       "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
       "dev": true
     },
-    "to-fast-properties": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
-      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
-      "dev": true
-    },
     "to-regex-range": {
       "version": "5.0.1",
       "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -6794,10 +7132,9 @@
       "dev": true
     },
     "tslib": {
-      "version": "2.6.2",
-      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
-      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
-      "dev": true
+      "version": "2.6.3",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
+      "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
     },
     "undici-types": {
       "version": "5.26.5",
@@ -6843,17 +7180,211 @@
       }
     },
     "vite": {
-      "version": "4.3.9",
-      "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.9.tgz",
-      "integrity": "sha512-qsTNZjO9NoJNW7KnOrgYwczm0WctJ8m/yqYAMAK9Lxt4SoySUfS5S8ia9K7JHpa3KEeMfyF8LoJ3c5NeBJy6pg==",
+      "version": "5.3.3",
+      "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.3.tgz",
+      "integrity": "sha512-NPQdeCU0Dv2z5fu+ULotpuq5yfCS1BzKUIPhNbP3YBfAMGJXbt2nS+sbTFu+qchaqWTD+H3JK++nRwr6XIcp6A==",
       "dev": true,
       "requires": {
-        "esbuild": "^0.17.5",
-        "fsevents": "~2.3.2",
-        "postcss": "^8.4.23",
-        "rollup": "^3.21.0"
+        "esbuild": "^0.21.3",
+        "fsevents": "~2.3.3",
+        "postcss": "^8.4.39",
+        "rollup": "^4.13.0"
+      },
+      "dependencies": {
+        "@esbuild/android-arm": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+          "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/android-arm64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+          "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/android-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+          "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/darwin-arm64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+          "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/darwin-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+          "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/freebsd-arm64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+          "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/freebsd-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+          "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-arm": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+          "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-arm64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+          "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-ia32": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+          "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-loong64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+          "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-mips64el": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+          "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-ppc64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+          "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-riscv64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+          "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-s390x": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+          "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/linux-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+          "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/netbsd-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+          "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/openbsd-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+          "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/sunos-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+          "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/win32-arm64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+          "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/win32-ia32": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+          "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+          "dev": true,
+          "optional": true
+        },
+        "@esbuild/win32-x64": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+          "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+          "dev": true,
+          "optional": true
+        },
+        "esbuild": {
+          "version": "0.21.5",
+          "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+          "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+          "dev": true,
+          "requires": {
+            "@esbuild/aix-ppc64": "0.21.5",
+            "@esbuild/android-arm": "0.21.5",
+            "@esbuild/android-arm64": "0.21.5",
+            "@esbuild/android-x64": "0.21.5",
+            "@esbuild/darwin-arm64": "0.21.5",
+            "@esbuild/darwin-x64": "0.21.5",
+            "@esbuild/freebsd-arm64": "0.21.5",
+            "@esbuild/freebsd-x64": "0.21.5",
+            "@esbuild/linux-arm": "0.21.5",
+            "@esbuild/linux-arm64": "0.21.5",
+            "@esbuild/linux-ia32": "0.21.5",
+            "@esbuild/linux-loong64": "0.21.5",
+            "@esbuild/linux-mips64el": "0.21.5",
+            "@esbuild/linux-ppc64": "0.21.5",
+            "@esbuild/linux-riscv64": "0.21.5",
+            "@esbuild/linux-s390x": "0.21.5",
+            "@esbuild/linux-x64": "0.21.5",
+            "@esbuild/netbsd-x64": "0.21.5",
+            "@esbuild/openbsd-x64": "0.21.5",
+            "@esbuild/sunos-x64": "0.21.5",
+            "@esbuild/win32-arm64": "0.21.5",
+            "@esbuild/win32-ia32": "0.21.5",
+            "@esbuild/win32-x64": "0.21.5"
+          }
+        }
       }
     },
+    "vitefu": {
+      "version": "0.2.5",
+      "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz",
+      "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==",
+      "dev": true,
+      "requires": {}
+    },
     "web-streams-polyfill": {
       "version": "3.2.1",
       "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz",
@@ -6874,6 +7405,37 @@
         "isexe": "^2.0.0"
       }
     },
+    "worker-timers": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-8.0.2.tgz",
+      "integrity": "sha512-Xna4rPTforH+a3/Kyukf9diO8MDdKY/nuDU77Ptx3SPi+2V/QfWGdwGUxVOk4oFyCnRoe71ZjH6axjyVWO5Nqw==",
+      "requires": {
+        "@babel/runtime": "^7.24.8",
+        "tslib": "^2.6.3",
+        "worker-timers-broker": "^7.0.3",
+        "worker-timers-worker": "^8.0.2"
+      }
+    },
+    "worker-timers-broker": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-7.0.3.tgz",
+      "integrity": "sha512-LG/xWCCOg6UwRnmAzy05wCvn3jIO60AcpT/CgG3TmaYK93+biainiivSVHGK6VEBeJzETrFAKZ9JgW8gkae+Ag==",
+      "requires": {
+        "@babel/runtime": "^7.24.8",
+        "fast-unique-numbers": "^9.0.7",
+        "tslib": "^2.6.3",
+        "worker-timers-worker": "^8.0.2"
+      }
+    },
+    "worker-timers-worker": {
+      "version": "8.0.2",
+      "resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-8.0.2.tgz",
+      "integrity": "sha512-Bx8grqm3TyHLorTMBbtoL+fAMwTBgx+c4IiE23fCNinlUpqTISEa9UXR6GAjgHAB2GlZjNLgisLjx9a6CKFV3Q==",
+      "requires": {
+        "@babel/runtime": "^7.24.8",
+        "tslib": "^2.6.3"
+      }
+    },
     "wrap-ansi": {
       "version": "8.1.0",
       "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
@@ -6964,12 +7526,6 @@
       "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
       "dev": true
     },
-    "yallist": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
-      "dev": true
-    },
     "yaml": {
       "version": "2.3.1",
       "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz",
@@ -7026,6 +7582,12 @@
       "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
       "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
     },
+    "zimmerframe": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.2.tgz",
+      "integrity": "sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==",
+      "dev": true
+    },
     "zustand": {
       "version": "4.3.8",
       "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.3.8.tgz",
diff --git a/package.json b/package.json
index 0d3eed2..7883378 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
     "dev": "npm run dev-native && concurrently \"npm run dev-dsp\" \"vite\"",
     "dev-native": "zx scripts/build-native.mjs --dev",
     "dev-dsp": "esbuild dsp/main.js --watch --bundle --outfile=public/dsp.main.js",
+    "dev-ui": "vite",
     "build-native": "zx scripts/build-native.mjs",
     "build-dsp": "esbuild dsp/main.js --bundle --outfile=public/dsp.main.js",
     "build-ui": "vite build",
@@ -18,26 +19,22 @@
   },
   "dependencies": {
     "@elemaudio/core": "^3.0.0",
-    "@heroicons/react": "^2.0.18",
-    "@use-gesture/react": "^10.2.27",
     "cpy-cli": "^4.2.0",
     "esbuild": "^0.17.8",
     "invariant": "^2.2.4",
-    "react": "^18.2.0",
-    "react-dom": "^18.2.0",
     "resize-observer-polyfill": "^1.5.1",
     "rimraf": "^5.0.0",
+    "worker-timers": "^8.0.2",
     "zustand": "^4.3.8"
   },
   "devDependencies": {
-    "@types/react": "^18.0.37",
-    "@types/react-dom": "^18.0.11",
-    "@vitejs/plugin-react": "^4.0.0",
+    "@sveltejs/vite-plugin-svelte": "^3.1.1",
     "autoprefixer": "^10.4.14",
     "concurrently": "^8.2.2",
     "postcss": "^8.4.24",
+    "svelte": "^5.0.0-next.184",
     "tailwindcss": "^3.3.2",
-    "vite": "^4.3.9",
+    "vite": "^5.0.0",
     "zx": "^7.2.3"
   }
 }
diff --git a/public/assets/65bbe44771656d76fa1e7e54_voro.png b/public/assets/65bbe44771656d76fa1e7e54_voro.png
new file mode 100644
index 0000000..804cfe9
Binary files /dev/null and b/public/assets/65bbe44771656d76fa1e7e54_voro.png differ
diff --git a/public/assets/ChivoMono-Medium-msdf.json b/public/assets/ChivoMono-Medium-msdf.json
new file mode 100644
index 0000000..f018459
--- /dev/null
+++ b/public/assets/ChivoMono-Medium-msdf.json
@@ -0,0 +1 @@
+{"pages":["ChivoMono-Medium.png"],"chars":[{"id":106,"index":315,"char":"j","width":16,"height":42,"xoffset":2,"yoffset":11,"xadvance":25,"chnl":15,"x":0,"y":0,"page":0},{"id":81,"index":149,"char":"Q","width":27,"height":39,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":0,"y":43,"page":0},{"id":103,"index":285,"char":"g","width":26,"height":37,"xoffset":0,"yoffset":16,"xadvance":25,"chnl":15,"x":17,"y":0,"page":0},{"id":98,"index":251,"char":"b","width":23,"height":35,"xoffset":2,"yoffset":11,"xadvance":25,"chnl":15,"x":0,"y":83,"page":0},{"id":100,"index":258,"char":"d","width":23,"height":35,"xoffset":0,"yoffset":11,"xadvance":25,"chnl":15,"x":0,"y":119,"page":0},{"id":102,"index":284,"char":"f","width":23,"height":35,"xoffset":1,"yoffset":10,"xadvance":25,"chnl":15,"x":0,"y":155,"page":0},{"id":48,"index":462,"char":"0","width":24,"height":34,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":0,"y":191,"page":0},{"id":51,"index":465,"char":"3","width":25,"height":34,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":24,"y":83,"page":0},{"id":54,"index":468,"char":"6","width":25,"height":34,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":28,"y":38,"page":0},{"id":56,"index":470,"char":"8","width":25,"height":34,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":44,"y":0,"page":0},{"id":57,"index":471,"char":"9","width":25,"height":34,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":24,"y":118,"page":0},{"id":67,"index":30,"char":"C","width":26,"height":34,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":24,"y":153,"page":0},{"id":71,"index":65,"char":"G","width":26,"height":34,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":25,"y":188,"page":0},{"id":79,"index":115,"char":"O","width":27,"height":34,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":50,"y":73,"page":0},{"id":83,"index":156,"char":"S","width":26,"height":34,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":54,"y":35,"page":0},{"id":104,"index":292,"char":"h","width":23,"height":34,"xoffset":1,"yoffset":11,"xadvance":25,"chnl":15,"x":70,"y":0,"page":0},{"id":105,"index":296,"char":"i","width":23,"height":34,"xoffset":2,"yoffset":11,"xadvance":25,"chnl":15,"x":50,"y":108,"page":0},{"id":107,"index":318,"char":"k","width":24,"height":34,"xoffset":1,"yoffset":11,"xadvance":25,"chnl":15,"x":51,"y":143,"page":0},{"id":108,"index":321,"char":"l","width":23,"height":34,"xoffset":1,"yoffset":11,"xadvance":25,"chnl":15,"x":74,"y":108,"page":0},{"id":49,"index":463,"char":"1","width":24,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":25,"y":223,"page":0},{"id":50,"index":464,"char":"2","width":25,"height":33,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":50,"y":223,"page":0},{"id":52,"index":466,"char":"4","width":26,"height":33,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":78,"y":70,"page":0},{"id":53,"index":467,"char":"5","width":25,"height":33,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":81,"y":35,"page":0},{"id":55,"index":469,"char":"7","width":24,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":94,"y":0,"page":0},{"id":65,"index":1,"char":"A","width":28,"height":33,"xoffset":-2,"yoffset":12,"xadvance":25,"chnl":15,"x":52,"y":178,"page":0},{"id":66,"index":29,"char":"B","width":25,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":76,"y":143,"page":0},{"id":68,"index":36,"char":"D","width":26,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":98,"y":104,"page":0},{"id":69,"index":42,"char":"E","width":23,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":105,"y":69,"page":0},{"id":70,"index":63,"char":"F","width":23,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":107,"y":34,"page":0},{"id":72,"index":72,"char":"H","width":23,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":119,"y":0,"page":0},{"id":73,"index":76,"char":"I","width":21,"height":33,"xoffset":2,"yoffset":12,"xadvance":25,"chnl":15,"x":76,"y":212,"page":0},{"id":74,"index":93,"char":"J","width":22,"height":33,"xoffset":2,"yoffset":12,"xadvance":25,"chnl":15,"x":81,"y":177,"page":0},{"id":75,"index":95,"char":"K","width":26,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":102,"y":138,"page":0},{"id":76,"index":97,"char":"L","width":22,"height":33,"xoffset":2,"yoffset":12,"xadvance":25,"chnl":15,"x":125,"y":103,"page":0},{"id":77,"index":105,"char":"M","width":25,"height":33,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":129,"y":68,"page":0},{"id":78,"index":106,"char":"N","width":23,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":131,"y":34,"page":0},{"id":80,"index":147,"char":"P","width":25,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":143,"y":0,"page":0},{"id":82,"index":150,"char":"R","width":27,"height":33,"xoffset":1,"yoffset":12,"xadvance":25,"chnl":15,"x":98,"y":211,"page":0},{"id":84,"index":164,"char":"T","width":26,"height":33,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":104,"y":172,"page":0},{"id":85,"index":170,"char":"U","width":24,"height":33,"xoffset":0,"yoffset":12,"xadvance":25,"chnl":15,"x":129,"y":137,"page":0},{"id":86,"index":197,"char":"V","width":28,"height":33,"xoffset":-2,"yoffset":12,"xadvance":25,"chnl":15,"x":148,"y":102,"page":0},{"id":87,"index":198,"char":"W","width":29,"height":33,"xoffset":-2,"yoffset":12,"xadvance":25,"chnl":15,"x":126,"y":206,"page":0},{"id":88,"index":203,"char":"X","width":29,"height":33,"xoffset":-2,"yoffset":12,"xadvance":25,"chnl":15,"x":131,"y":171,"page":0},{"id":89,"index":204,"char":"Y","width":28,"height":33,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":154,"y":136,"page":0},{"id":90,"index":213,"char":"Z","width":26,"height":33,"xoffset":-1,"yoffset":12,"xadvance":25,"chnl":15,"x":156,"y":205,"page":0},{"id":112,"index":370,"char":"p","width":23,"height":33,"xoffset":2,"yoffset":19,"xadvance":25,"chnl":15,"x":161,"y":170,"page":0},{"id":113,"index":372,"char":"q","width":23,"height":33,"xoffset":0,"yoffset":19,"xadvance":25,"chnl":15,"x":183,"y":204,"page":0},{"id":116,"index":388,"char":"t","width":24,"height":33,"xoffset":0,"yoffset":13,"xadvance":25,"chnl":15,"x":207,"y":0,"page":0},{"id":121,"index":428,"char":"y","width":25,"height":33,"xoffset":0,"yoffset":20,"xadvance":25,"chnl":15,"x":177,"y":0,"page":0},{"id":119,"index":422,"char":"w","width":29,"height":25,"xoffset":-2,"yoffset":20,"xadvance":25,"chnl":15,"x":207,"y":34,"page":0},{"id":43,"index":663,"char":"+","width":26,"height":25,"xoffset":0,"yoffset":20,"xadvance":25,"chnl":15,"x":177,"y":34,"page":0},{"id":97,"index":223,"char":"a","width":25,"height":26,"xoffset":1,"yoffset":19,"xadvance":25,"chnl":15,"x":155,"y":60,"page":0},{"id":99,"index":252,"char":"c","width":23,"height":26,"xoffset":0,"yoffset":19,"xadvance":25,"chnl":15,"x":0,"y":226,"page":0},{"id":101,"index":263,"char":"e","width":24,"height":26,"xoffset":0,"yoffset":19,"xadvance":25,"chnl":15,"x":232,"y":0,"page":0},{"id":109,"index":328,"char":"m","width":25,"height":26,"xoffset":0,"yoffset":19,"xadvance":25,"chnl":15,"x":177,"y":87,"page":0},{"id":110,"index":329,"char":"n","width":23,"height":26,"xoffset":1,"yoffset":19,"xadvance":25,"chnl":15,"x":181,"y":60,"page":0},{"id":111,"index":338,"char":"o","width":24,"height":26,"xoffset":0,"yoffset":19,"xadvance":25,"chnl":15,"x":207,"y":60,"page":0},{"id":114,"index":373,"char":"r","width":26,"height":26,"xoffset":0,"yoffset":19,"xadvance":25,"chnl":15,"x":207,"y":87,"page":0},{"id":115,"index":379,"char":"s","width":23,"height":26,"xoffset":1,"yoffset":19,"xadvance":25,"chnl":15,"x":232,"y":60,"page":0},{"id":117,"index":394,"char":"u","width":25,"height":26,"xoffset":1,"yoffset":20,"xadvance":25,"chnl":15,"x":207,"y":114,"page":0},{"id":118,"index":421,"char":"v","width":26,"height":25,"xoffset":0,"yoffset":20,"xadvance":25,"chnl":15,"x":183,"y":141,"page":0},{"id":120,"index":427,"char":"x","width":25,"height":25,"xoffset":0,"yoffset":20,"xadvance":25,"chnl":15,"x":185,"y":167,"page":0},{"id":122,"index":437,"char":"z","width":21,"height":25,"xoffset":2,"yoffset":20,"xadvance":25,"chnl":15,"x":155,"y":34,"page":0},{"id":42,"index":580,"char":"*","width":22,"height":21,"xoffset":2,"yoffset":12,"xadvance":25,"chnl":15,"x":234,"y":87,"page":0},{"id":45,"index":588,"char":"-","width":15,"height":8,"xoffset":5,"yoffset":27,"xadvance":25,"chnl":15,"x":28,"y":73,"page":0},{"id":46,"index":569,"char":".","width":10,"height":10,"xoffset":8,"yoffset":35,"xadvance":25,"chnl":15,"x":76,"y":246,"page":0}],"info":{"face":"ChivoMono-Medium","size":42,"bold":0,"italic":0,"charset":[".","*","-","+","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"],"unicode":1,"stretchH":100,"smooth":1,"aa":1,"padding":[2,2,2,2],"spacing":[0,0]},"common":{"lineHeight":50,"base":41,"scaleW":256,"scaleH":256,"pages":1,"packed":0,"alphaChnl":0,"redChnl":0,"greenChnl":0,"blueChnl":0},"distanceField":{"fieldType":"msdf","distanceRange":4},"kernings":[]}
\ No newline at end of file
diff --git a/public/assets/ChivoMono-Medium.png b/public/assets/ChivoMono-Medium.png
new file mode 100644
index 0000000..5a5e872
Binary files /dev/null and b/public/assets/ChivoMono-Medium.png differ
diff --git a/public/assets/forkawesome-webfont.ttf b/public/assets/forkawesome-webfont.ttf
new file mode 100644
index 0000000..6cf62ef
Binary files /dev/null and b/public/assets/forkawesome-webfont.ttf differ
diff --git a/public/assets/lib_matcaps_Chrome_Blue_Tint-White.png b/public/assets/lib_matcaps_Chrome_Blue_Tint-White.png
new file mode 100644
index 0000000..81e23e9
Binary files /dev/null and b/public/assets/lib_matcaps_Chrome_Blue_Tint-White.png differ
diff --git a/src/App.svelte b/src/App.svelte
new file mode 100644
index 0000000..35d5fa4
--- /dev/null
+++ b/src/App.svelte
@@ -0,0 +1,47 @@
+<script type='ts'>
+  import { onMount } from "svelte";
+  import { WWTimer } from './stores/WWTimer'
+  import { fade } from "svelte/transition";
+
+  let cablesLoaded = $state(false);
+  
+  const timers = [ 
+    new WWTimer(500),
+    new WWTimer(1000),
+    new WWTimer(2000)
+]
+
+let timedOut = $state(false)
+
+  onMount( () => {
+    document.addEventListener("CABLES.jsLoaded", function () {
+      cablesLoaded = true;
+   })
+});
+
+</script> 
+
+<svelte:head>
+  <script type="text/javascript" src="/src/cables-js/patch.js" async></script>
+  <script type="module" src="/src/cables-js/loader.svelte.js" ></script> 
+</svelte:head>
+
+<canvas id="glcanvas" width="100vw" height="100vh" ></canvas>
+
+{#if cablesLoaded }
+ { timers[2].start( ()=> timedOut = true )  }
+ {#if !timedOut}
+ <pre class='console-text' out:fade>NEL SRVB</pre>
+ {/if}
+{:else}
+  <pre class='console-text' in:fade>Loading...</pre>
+{/if}
+
+<style>
+  .console-text {
+    position: absolute;
+    left: 1rem;
+    top: 1rem;
+    color: chartreuse;
+  }
+</style>
\ No newline at end of file
diff --git a/src/cables-js/loader.svelte.js b/src/cables-js/loader.svelte.js
new file mode 100644
index 0000000..2672ebc
--- /dev/null
+++ b/src/cables-js/loader.svelte.js
@@ -0,0 +1,18 @@
+
+
+document.addEventListener("CABLES.jsLoaded", function () {
+    // Now CABLES is defined, proceed with initialization
+    CABLES.patch =  new CABLES.Patch({
+      patch: CABLES.exportedPatch,
+      prefixAssetPath: "",
+      assetPath: "assets/",
+      jsPath: "js/",
+      glCanvasId: "glcanvas",
+      glCanvasResizeToWindow: true,
+      onError: (e)=> console.error(e) ,
+      onPatchLoaded: ()=> console.log("Patch loaded") ,
+      onFinishedLoading: ()=>  console.log("Cables done loading"),
+      canvas: { alpha: true, premultipliedAlpha: true }, // make canvas transparent
+    });
+  });
+
diff --git a/src/cables-js/patch.js b/src/cables-js/patch.js
new file mode 100644
index 0000000..598b070
--- /dev/null
+++ b/src/cables-js/patch.js
@@ -0,0 +1,19212 @@
+var CABLES;
+/******/ (() => { // webpackBootstrap
+/******/ 	"use strict";
+/******/ 	// The require scope
+/******/ 	var __webpack_require__ = {};
+/******/ 	
+/************************************************************************/
+/******/ 	/* webpack/runtime/define property getters */
+/******/ 	(() => {
+/******/ 		// define getter functions for harmony exports
+/******/ 		__webpack_require__.d = (exports, definition) => {
+/******/ 			for(var key in definition) {
+/******/ 				if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
+/******/ 					Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
+/******/ 				}
+/******/ 			}
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/hasOwnProperty shorthand */
+/******/ 	(() => {
+/******/ 		__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
+/******/ 	})();
+/******/ 	
+/******/ 	/* webpack/runtime/make namespace object */
+/******/ 	(() => {
+/******/ 		// define __esModule on exports
+/******/ 		__webpack_require__.r = (exports) => {
+/******/ 			if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
+/******/ 				Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
+/******/ 			}
+/******/ 			Object.defineProperty(exports, '__esModule', { value: true });
+/******/ 		};
+/******/ 	})();
+/******/ 	
+/************************************************************************/
+var __webpack_exports__ = {};
+
+// EXPORTS
+__webpack_require__.d(__webpack_exports__, {
+  "default": () => (/* binding */ core)
+});
+
+// NAMESPACE OBJECT: ./src/core/base64.js
+var base64_namespaceObject = {};
+__webpack_require__.r(base64_namespaceObject);
+__webpack_require__.d(base64_namespaceObject, {
+  "b64decTypedArray": () => (b64decTypedArray),
+  "b64encTypesArray": () => (b64encTypesArray),
+  "base64Chars": () => (base64Chars),
+  "base64lookup": () => (base64lookup)
+});
+
+// NAMESPACE OBJECT: ./src/core/utils.js
+var utils_namespaceObject = {};
+__webpack_require__.r(utils_namespaceObject);
+__webpack_require__.d(utils_namespaceObject, {
+  "UTILS": () => (UTILS),
+  "ajax": () => (ajax),
+  "ajaxSync": () => (ajaxSync),
+  "basename": () => (basename),
+  "cacheBust": () => (cacheBust),
+  "clamp": () => (clamp),
+  "cleanJson": () => (cleanJson),
+  "copyArray": () => (copyArray),
+  "filename": () => (filename),
+  "generateUUID": () => (generateUUID),
+  "getShortOpName": () => (getShortOpName),
+  "keyCodeToName": () => (keyCodeToName),
+  "logStack": () => (logStack),
+  "map": () => (map),
+  "prefixedHash": () => (prefixedHash),
+  "request": () => (request),
+  "shortId": () => (shortId),
+  "shuffleArray": () => (shuffleArray),
+  "simpleId": () => (simpleId),
+  "smoothStep": () => (smoothStep),
+  "smootherStep": () => (smootherStep),
+  "uuid": () => (uuid)
+});
+
+// NAMESPACE OBJECT: ./src/core/anim.js
+var anim_namespaceObject = {};
+__webpack_require__.r(anim_namespaceObject);
+__webpack_require__.d(anim_namespaceObject, {
+  "ANIM": () => (ANIM),
+  "Anim": () => (Anim)
+});
+
+;// CONCATENATED MODULE: ./src/core/base64.js
+const base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+// Use a lookup table to find the index.
+const _base64lookup = new Uint8Array(256);
+for (let i = 0; i < base64Chars.length; i++) _base64lookup[base64Chars.charCodeAt(i)] = i;
+
+const base64lookup = _base64lookup;
+
+const b64encTypesArray = function (arraybuffer)
+{
+    if (arraybuffer.buffer) arraybuffer = arraybuffer.buffer;
+    let bytes = new Uint8Array(arraybuffer),
+        i,
+        len = bytes.length,
+        base64 = "";
+
+    for (i = 0; i < len; i += 3)
+    {
+        base64 += base64Chars[bytes[i] >> 2];
+        base64 += base64Chars[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
+        base64 += base64Chars[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
+        base64 += base64Chars[bytes[i + 2] & 63];
+    }
+
+    if (len % 3 === 2) base64 = base64.substring(0, base64.length - 1) + "=";
+    else if (len % 3 === 1) base64 = base64.substring(0, base64.length - 2) + "==";
+
+    return base64;
+};
+
+const b64decTypedArray = function (base64)
+{
+    let bufferLength = base64.length * 0.75,
+        len = base64.length,
+        i,
+        p = 0,
+        encoded1,
+        encoded2,
+        encoded3,
+        encoded4;
+
+    if (base64[base64.length - 1] === "=")
+    {
+        bufferLength--;
+        if (base64[base64.length - 2] === "=") bufferLength--;
+    }
+
+    let arraybuffer = new ArrayBuffer(bufferLength),
+        bytes = new Uint8Array(arraybuffer);
+
+    for (i = 0; i < len; i += 4)
+    {
+        encoded1 = base64lookup[base64.charCodeAt(i)];
+        encoded2 = base64lookup[base64.charCodeAt(i + 1)];
+        encoded3 = base64lookup[base64.charCodeAt(i + 2)];
+        encoded4 = base64lookup[base64.charCodeAt(i + 3)];
+
+        bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);
+        bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
+        bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);
+    }
+
+    return arraybuffer;
+};
+
+;// CONCATENATED MODULE: ./src/core/constants.js
+const CONSTANTS = {
+    "ANIM": {
+        "EASINGS": [
+            "linear",
+            "absolute",
+            "smoothstep",
+            "smootherstep",
+            "Cubic In",
+            "Cubic Out",
+            "Cubic In Out",
+            "Expo In",
+            "Expo Out",
+            "Expo In Out",
+            "Sin In",
+            "Sin Out",
+            "Sin In Out",
+            "Quart In",
+            "Quart Out",
+            "Quart In Out",
+            "Quint In",
+            "Quint Out",
+            "Quint In Out",
+            "Back In",
+            "Back Out",
+            "Back In Out",
+            "Elastic In",
+            "Elastic Out",
+            "Bounce In",
+            "Bounce Out",
+        ],
+        "EASING_LINEAR": 0,
+        "EASING_ABSOLUTE": 1,
+        "EASING_SMOOTHSTEP": 2,
+        "EASING_SMOOTHERSTEP": 3,
+        "EASING_CUBICSPLINE": 4,
+
+        "EASING_CUBIC_IN": 5,
+        "EASING_CUBIC_OUT": 6,
+        "EASING_CUBIC_INOUT": 7,
+
+        "EASING_EXPO_IN": 8,
+        "EASING_EXPO_OUT": 9,
+        "EASING_EXPO_INOUT": 10,
+
+        "EASING_SIN_IN": 11,
+        "EASING_SIN_OUT": 12,
+        "EASING_SIN_INOUT": 13,
+
+        "EASING_BACK_IN": 14,
+        "EASING_BACK_OUT": 15,
+        "EASING_BACK_INOUT": 16,
+
+        "EASING_ELASTIC_IN": 17,
+        "EASING_ELASTIC_OUT": 18,
+
+        "EASING_BOUNCE_IN": 19,
+        "EASING_BOUNCE_OUT": 21,
+
+        "EASING_QUART_IN": 22,
+        "EASING_QUART_OUT": 23,
+        "EASING_QUART_INOUT": 24,
+
+        "EASING_QUINT_IN": 25,
+        "EASING_QUINT_OUT": 26,
+        "EASING_QUINT_INOUT": 27,
+    },
+
+    "OP": {
+        "OP_PORT_TYPE_VALUE": 0,
+        "OP_PORT_TYPE_NUMBER": 0,
+        "OP_PORT_TYPE_FUNCTION": 1,
+        "OP_PORT_TYPE_TRIGGER": 1,
+        "OP_PORT_TYPE_OBJECT": 2,
+        "OP_PORT_TYPE_TEXTURE": 2,
+        "OP_PORT_TYPE_ARRAY": 3,
+        "OP_PORT_TYPE_DYNAMIC": 4,
+        "OP_PORT_TYPE_STRING": 5,
+
+        "OP_VERSION_PREFIX": "_v",
+    },
+
+    "PORT": {
+        "PORT_DIR_IN": 0,
+        "PORT_DIR_OUT": 1,
+    },
+
+    "PACO": {
+        "PACO_CLEAR": 0,
+        "PACO_VALUECHANGE": 1,
+        "PACO_OP_DELETE": 2,
+        "PACO_UNLINK": 3,
+        "PACO_LINK": 4,
+        "PACO_LOAD": 5,
+        "PACO_OP_CREATE": 6,
+        "PACO_OP_ENABLE": 7,
+        "PACO_OP_DISABLE": 8,
+        "PACO_UIATTRIBS": 9,
+        "PACO_VARIABLES": 10,
+        "PACO_TRIGGERS": 11,
+        "PACO_PORT_SETVARIABLE": 12,
+        "PACO_PORT_SETANIMATED": 13,
+        "PACO_PORT_ANIM_UPDATED": 14,
+        "PACO_DESERIALIZE": 15
+
+    },
+};
+
+;// CONCATENATED MODULE: ./src/core/utils.js
+
+/**
+ * @external CABLES
+ * @namespace Utils
+ */
+
+
+
+const UTILS = {};
+/**
+ * Merge two Float32Arrays.
+ * @function float32Concat
+ * @memberof Utils
+ * @param {Float32Array} first Left-hand side array
+ * @param {Float32Array} second Right-hand side array
+ * @return {Float32Array}
+ * @static
+ */
+UTILS.float32Concat = function (first, second)
+{
+    if (!(first instanceof Float32Array)) first = new Float32Array(first);
+    if (!(second instanceof Float32Array)) second = new Float32Array(second);
+
+    const result = new Float32Array(first.length + second.length);
+
+    result.set(first);
+    result.set(second, first.length);
+
+    return result;
+};
+
+/**
+ * get op shortname: only last part of fullname and without version
+ * @function getShortOpName
+ * @memberof CABLES
+ * @param {String} full op name
+ * @static
+ */
+const getShortOpName = function (fullname)
+{
+    let name = fullname.split(".")[fullname.split(".").length - 1];
+
+    if (name.contains(CONSTANTS.OP.OP_VERSION_PREFIX))
+    {
+        const n = name.split(CONSTANTS.OP.OP_VERSION_PREFIX)[1];
+        name = name.substring(0, name.length - (CONSTANTS.OP.OP_VERSION_PREFIX + n).length);
+    }
+    return name;
+};
+
+/**
+ * randomize order of an array
+ * @function shuffleArray
+ * @memberof Utils
+ * @param {Array|Float32Array} array {Array} original
+ * @return {Array|Float32Array} shuffled array
+ * @static
+ */
+const shuffleArray = function (array)
+{
+    for (let i = array.length - 1; i > 0; i--)
+    {
+        const j = Math.floor(Math.seededRandom() * (i + 1));
+        const temp = array[i];
+        array[i] = array[j];
+        array[j] = temp;
+    }
+    return array;
+};
+
+
+/**
+ * generate a short "relativly unique" id
+ * @function shortId
+ * @memberof Utils
+ * @return {String} generated ID
+ * @static
+ */
+
+const _shortIds = {};
+const _shortId = function ()
+{
+    let str = Math.random().toString(36).substr(2, 9);
+
+    if (_shortIds.hasOwnProperty(str)) str = _shortId();
+    _shortIds[str] = true;
+    return str;
+};
+const shortId = _shortId;
+
+
+/**
+ * generate a UUID
+ * @function uuid
+ * @memberof Utils
+ * @return {String} generated UUID
+ * @static
+ */
+const _uuid = function ()
+{
+    let d = new Date().getTime();
+    const uuid = "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) =>
+    {
+        const r = (d + Math.random() * 16) % 16 | 0;
+        d = Math.floor(d / 16);
+        return (c == "x" ? r : (r & 0x3) | 0x8).toString(16);
+    });
+    return uuid;
+};
+const uuid = _uuid;
+const generateUUID = _uuid;
+
+
+
+function cleanJson(obj)
+{
+    for (const i in obj)
+    {
+        if (obj[i] && typeof objValue === "object" && obj[i].constructor === Object) obj[i] = cleanJson(obj[i]);
+
+        if (obj[i] === null || obj[i] === undefined) delete obj[i];
+        else if (Array.isArray(obj[i]) && obj[i].length == 0) delete obj[i];
+    }
+
+    return obj;
+}
+
+
+/**
+ * @see http://stackoverflow.com/q/7616461/940217
+ * @return {string}
+ */
+const _prefixedHash = function (str, prefix = "id")
+{
+    let hash = 0;
+    if (Array.prototype.reduce)
+    {
+        hash = str.split("").reduce((a, b) => { a = ((a << 5) - a) + b.charCodeAt(0); return a & a; }, 0);
+    }
+    else
+    {
+        if (str.length > 0)
+        {
+            for (let i = 0; i < str.length; i++)
+            {
+                let character = str.charCodeAt(i);
+                hash = ((hash << 5) - hash) + character;
+                hash &= hash; // Convert to 32bit integer
+            }
+        }
+    }
+    return prefix + "" + hash;
+};
+const prefixedHash = _prefixedHash;
+
+/**
+ * generate a simple ID
+ * @function simpleId
+ * @memberof Utils
+ * @return {Number} new id
+ * @static
+ */
+let simpleIdCounter = 0;
+const simpleId = function ()
+{
+    simpleIdCounter++;
+    return simpleIdCounter;
+};
+
+/**
+ * smoothStep a value
+ * @function smoothStep
+ * @memberof Utils
+ * @function
+ * @param {Number} value value to be smoothed [0-1]
+ * @return {Number} smoothed value
+ * @static
+ */
+const smoothStep = function (perc)
+{
+    const x = Math.max(0, Math.min(1, (perc - 0) / (1 - 0)));
+    perc = x * x * (3 - 2 * x); // smoothstep
+    return perc;
+};
+
+/**
+ * smootherstep a value
+ * @function smootherStep
+ * @memberof Utils
+ * @param value {Number} value to be smoothed [0-1]
+ * @return {Number} smoothed value
+ * @static
+ */
+const smootherStep = function (perc)
+{
+    const x = Math.max(0, Math.min(1, (perc - 0) / (1 - 0)));
+    perc = x * x * x * (x * (x * 6 - 15) + 10); // smootherstep
+    return perc;
+};
+
+
+/**
+ * clamp number / make sure its between min/max
+ * @function clamp
+ * @memberof Utils
+ * @param {Number} value value to be mapped
+ * @param {Number} min minimum value
+ * @param {Number} max maximum value
+ * @static
+ */
+const clamp = function (value, min, max)
+{
+    return Math.min(Math.max(value, min), max);
+};
+
+/**
+ * map a value in a range to a value in another range
+ * @function map
+ * @memberof Utils
+ * @param {Number} value value to be mapped
+ * @param {Number} oldMin old range minimum value
+ * @param {Number} oldMax old range maximum value
+ * @param {Number} newMin new range minimum value
+ * @param {Number} newMax new range maximum value
+ * @return {Number} mapped value
+ * @static
+ */
+const map = function (x, _oldMin, _oldMax, _newMin, _newMax, _easing)
+{
+    if (x >= _oldMax) return _newMax;
+    if (x <= _oldMin) return _newMin;
+
+    let reverseInput = false;
+    const oldMin = Math.min(_oldMin, _oldMax);
+    const oldMax = Math.max(_oldMin, _oldMax);
+    if (oldMin != _oldMin) reverseInput = true;
+
+    let reverseOutput = false;
+    const newMin = Math.min(_newMin, _newMax);
+    const newMax = Math.max(_newMin, _newMax);
+    if (newMin != _newMin) reverseOutput = true;
+
+    let portion = 0;
+    let r = 0;
+
+    if (reverseInput) portion = ((oldMax - x) * (newMax - newMin)) / (oldMax - oldMin);
+    else portion = ((x - oldMin) * (newMax - newMin)) / (oldMax - oldMin);
+
+    if (reverseOutput) r = newMax - portion;
+    else r = portion + newMin;
+
+    if (!_easing) return r;
+    if (_easing == 1)
+    {
+        // smoothstep
+        x = Math.max(0, Math.min(1, (r - _newMin) / (_newMax - _newMin)));
+        return _newMin + x * x * (3 - 2 * x) * (_newMax - _newMin);
+    }
+    if (_easing == 2)
+    {
+        // smootherstep
+        x = Math.max(0, Math.min(1, (r - _newMin) / (_newMax - _newMin)));
+        return _newMin + x * x * x * (x * (x * 6 - 15) + 10) * (_newMax - _newMin);
+    }
+
+    return r;
+};
+
+/**
+ * @namespace Math
+ */
+/**
+ * set random seed for seededRandom()
+ * @memberof Math
+ * @type Number
+ * @static
+ */
+Math.randomSeed = 1;
+
+
+Math.setRandomSeed = function (seed)
+{
+    // https://github.com/cables-gl/cables_docs/issues/622
+    Math.randomSeed = seed * 50728129;
+    if (seed != 0)
+    {
+        Math.randomSeed = Math.seededRandom() * 17624813;
+        Math.randomSeed = Math.seededRandom() * 9737333;
+    }
+};
+
+
+/**
+ * generate a seeded random number
+ * @function seededRandom
+ * @memberof Math
+ * @param {Number} max minimum possible random number
+ * @param {Number} min maximum possible random number
+ * @return {Number} random value
+ * @static
+ */
+Math.seededRandom = function (max, min)
+{
+    if (Math.randomSeed === 0) Math.randomSeed = Math.random() * 999;
+    max = max || 1;
+    min = min || 0;
+
+    Math.randomSeed = (Math.randomSeed * 9301 + 49297) % 233280;
+    const rnd = Math.randomSeed / 233280.0;
+
+    return min + rnd * (max - min);
+};
+
+
+// ----------------------------------------------------------------
+
+/**
+ * returns true if parameter is a number
+ * @function isNumeric
+ * @memberof Utils
+ * @param {Any} value The value to check.
+ * @return {Boolean}
+ * @static
+ */
+UTILS.isNumeric = function (n)
+{
+    return !isNaN(parseFloat(n)) && isFinite(n);
+};
+
+/**
+ * returns true if parameter is array
+ * @function isArray
+ * @param {Any} value Value to check
+ * @memberof Utils
+ * @return {Boolean}
+ * @static
+ */
+UTILS.isArray = function (v)
+{
+    return Object.prototype.toString.call(v) === "[object Array]";
+};
+
+/**
+ * @namespace String
+ */
+
+/**
+ * append a linebreak to a string
+ * @function endl
+ * @memberof String
+ * @return {String} string with newline break appended ('\n')
+ */
+String.prototype.endl = function ()
+{
+    return this + "\n";
+};
+
+/**
+ * return true if string starts with prefix
+ * @function startsWith
+ * @memberof String
+ * @param {String} prefix The prefix to check.
+ * @return {Boolean}
+ */
+String.prototype.startsWith = function (prefix)
+{
+    return this.indexOf(prefix) === 0;
+};
+
+/**
+ * return true if string ends with suffix
+ * @function endsWith
+ * @memberof String
+ * @param {String} suffix
+ * @return {Boolean}
+ */
+String.prototype.endsWith = String.prototype.endsWith || function (suffix)
+{
+    return this.match(suffix + "$") == suffix;
+};
+
+/**
+ * return true if string contains string
+ * @function contains
+ * @memberof String
+ * @param {String} searchStr
+ * @return {Boolean}
+ */
+String.prototype.contains = String.prototype.contains || function (searchStr)
+{
+    return this.indexOf(searchStr) > -1;
+};
+
+
+
+// ----------------------------------------------------------------
+
+/**
+ * append a unique/random parameter to a url, so the browser is forced to reload the file, even if its cached
+ * @function cacheBust
+ * @static
+ * @memberof Utils
+ * @param {String} url The url to append the cachebuster parameter to.
+ * @return {String} url with cachebuster parameter
+ */
+const cacheBust = function (url)
+{
+    if (url.contains("?")) url += "&";
+    else url += "?";
+    return url + "cache=" + CABLES.uuid();
+};
+
+/**
+ * copy the content of an array
+ * @function copyArray
+ * @static
+ * @memberof Utils
+ * @param {Array} sourceArray
+ * @param {Array} dst optional
+ * @return {Array} dst
+ */
+const copyArray = function (src, dst)
+{
+    if (!src) return null;
+    dst = dst || [];
+    dst.length = src.length;
+    for (let i = 0; i < src.length; i++)
+    {
+        dst[i] = src[i];
+    }
+
+    return dst;
+};
+
+
+/**
+ * return the filename part of a url without extension
+ * @function basename
+ * @static
+ * @memberof Utils
+ * @param {String} url
+ * @return {String} just the filename
+ */
+const basename = function (url)
+{
+    let name = CABLES.filename(url);
+
+    const parts2 = name.split(".");
+    name = parts2[0];
+
+    return name;
+};
+
+/**
+ * output a stacktrace to the console
+ * @function logStack
+ * @static
+ * @memberof Utils
+ */
+const logStack = function ()
+{
+    console.log("logstack", (new Error()).stack);
+};
+
+/**
+ * return the filename part of a url
+ * @function filename
+ * @static
+ * @memberof Utils
+ * @param {String} url
+ * @return {String} just the filename
+ */
+const filename = function (url)
+{
+    let name = "";
+    if (!url) return "";
+
+    if (url.startsWith("data:") && url.contains(":"))
+    {
+        const parts = url.split(",");
+        return parts[0];
+    }
+
+    const parts = (url + "").split("/");
+    if (parts.length > 0)
+    {
+        const str = parts[parts.length - 1];
+        let parts2 = str.split("?");
+        name = parts2[0];
+    }
+
+    return name || "";
+};
+
+
+const ajaxSync = function (url, cb, method, post, contenttype)
+{
+    request({
+        "url": url,
+        "cb": cb,
+        "method": method,
+        "data": post,
+        "contenttype": contenttype,
+        "sync": true,
+    });
+};
+
+/**
+ * make an ajax request
+ * @function ajax
+ * @static
+ */
+const ajax = function (url, cb, method, post, contenttype, jsonP, headers = {}, options = {})
+{
+    const requestOptions = {
+        "url": url,
+        "cb": cb,
+        "method": method,
+        "data": post,
+        "contenttype": contenttype,
+        "sync": false,
+        "jsonP": jsonP,
+        "headers": headers,
+    };
+    if (options && options.credentials) requestOptions.credentials = options.credentials;
+    request(requestOptions);
+};
+
+const request = function (options)
+{
+    if (!options.hasOwnProperty("asynch")) options.asynch = true;
+
+    let xhr;
+    try
+    {
+        xhr = new XMLHttpRequest();
+    }
+    catch (e) {}
+
+    xhr.onreadystatechange = function ()
+    {
+        if (xhr.readyState != 4) return;
+
+        if (options.cb)
+        {
+            if (xhr.status == 200 || xhr.status == 0) options.cb(false, xhr.responseText, xhr);
+            else options.cb(true, xhr.responseText, xhr);
+        }
+    };
+
+    try
+    {
+        xhr.open(options.method ? options.method.toUpperCase() : "GET", options.url, !options.sync);
+    }
+    catch (e)
+    {
+        if (options.cb && e) options.cb(true, e.msg, xhr);
+    }
+
+    if (typeof options.headers === "object")
+    {
+        const keys = Object.keys(options.headers);
+        for (let i = 0; i < keys.length; i++)
+        {
+            const name = keys[i];
+            const value = options.headers[name];
+            xhr.setRequestHeader(name, value);
+        }
+    }
+
+    if (options.credentials && options.credentials !== "omit")
+    {
+        xhr.withCredentials = true;
+    }
+
+    try
+    {
+        if (!options.post && !options.data)
+        {
+            xhr.send();
+        }
+        else
+        {
+            xhr.setRequestHeader(
+                "Content-type",
+                options.contenttype ? options.contenttype : "application/x-www-form-urlencoded",
+            );
+            xhr.send(options.data || options.post);
+        }
+    }
+    catch (e)
+    {
+        if (options.cb) options.cb(true, e.msg, xhr);
+    }
+};
+
+
+const keyCodeToName = function (keyCode)
+{
+    if (!keyCode && keyCode !== 0) return "Unidentified";
+    const keys = {
+        "8": "Backspace",
+        "9": "Tab",
+        "12": "Clear",
+        "13": "Enter",
+        "16": "Shift",
+        "17": "Control",
+        "18": "Alt",
+        "19": "Pause",
+        "20": "CapsLock",
+        "27": "Escape",
+        "32": "Space",
+        "33": "PageUp",
+        "34": "PageDown",
+        "35": "End",
+        "36": "Home",
+        "37": "ArrowLeft",
+        "38": "ArrowUp",
+        "39": "ArrowRight",
+        "40": "ArrowDown",
+        "45": "Insert",
+        "46": "Delete",
+        "112": "F1",
+        "113": "F2",
+        "114": "F3",
+        "115": "F4",
+        "116": "F5",
+        "117": "F6",
+        "118": "F7",
+        "119": "F8",
+        "120": "F9",
+        "121": "F10",
+        "122": "F11",
+        "123": "F12",
+        "144": "NumLock",
+        "145": "ScrollLock",
+        "224": "Meta"
+    };
+    if (keys[keyCode])
+    {
+        return keys[keyCode];
+    }
+    else
+    {
+        return String.fromCharCode(keyCode);
+    }
+};
+// ----------------------------------------------------------------
+
+window.performance = window.performance || {
+    "offset": Date.now(),
+    "now": function now()
+    {
+        return Date.now() - this.offset;
+    },
+};
+
+
+
+;// CONCATENATED MODULE: ../shared/client/src/logger.js
+/* eslint-disable no-console */
+
+class Logger
+{
+    constructor(initiator)
+    {
+        this._logs = [];
+        this.initiator = initiator;
+    }
+
+    stack(t)
+    {
+        console.info("[" + this.initiator + "] ", t);
+        console.log((new Error()).stack);
+    }
+
+    groupCollapsed(t)
+    {
+        console.groupCollapsed("[" + this.initiator + "] " + t);
+    }
+
+    table(t)
+    {
+        console.table(t);
+    }
+
+    groupEnd()
+    {
+        console.groupEnd();
+    }
+
+    error(args)
+    {
+        console.error("[" + this.initiator + "]", ...arguments);
+        if (window.gui) window.gui.emitEvent("coreLogEvent", this.initiator, "error", arguments);
+    }
+
+    info(args)
+    {
+        console.error("[" + this.initiator + "]", ...arguments);
+        if (window.gui) window.gui.emitEvent("coreLogEvent", this.initiator, "info", arguments);
+    }
+
+    warn(args)
+    {
+        console.warn("[" + this.initiator + "]", ...arguments);
+        // console.log((new Error()).stack);
+        if (window.gui) window.gui.emitEvent("coreLogEvent", this.initiator, "warn", arguments);
+    }
+
+    verbose()
+    {
+        if ((CABLES.UI && CABLES.UI.logFilter.shouldPrint(this.initiator, ...arguments)) || !CABLES.logSilent)
+            console.log("[" + this.initiator + "]", ...arguments);
+        if (window.gui) window.gui.emitEvent("coreLogEvent", this.initiator, "verbose", arguments);
+    }
+
+    log(args)
+    {
+        if ((CABLES.UI && CABLES.UI.logFilter.shouldPrint(this.initiator, ...arguments)) || !CABLES.logSilent)
+            console.log("[" + this.initiator + "]", ...arguments);
+        if (window.gui) window.gui.emitEvent("coreLogEvent", this.initiator, "log", arguments);
+    }
+
+    userInteraction(text)
+    {
+        // this.log({ "initiator": "userinteraction", "text": text });
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/anim_key.js
+
+
+const Key = function (obj)
+{
+    this.time = 0.0;
+    this.value = 0.0;
+    // this.ui = null;
+    this.onChange = null;
+    this._easing = 0;
+    // this.bezTangIn = 0;
+    // this.bezTangOut = 0;
+    // this.bezTime = 0.5;
+    // this.bezValue = 0;
+    // this.bezTimeIn = -0.5;
+    // this.bezValueIn = 0;
+
+    this.cb = null;
+    this.cbTriggered = false;
+
+    // const bezierAnim = null;
+    // this._updateBezier = false;
+
+    this.setEasing(CONSTANTS.ANIM.EASING_LINEAR);
+    this.set(obj);
+};
+
+Key.cubicSpline = function (perc, key1, key2)
+{
+    let
+        previousPoint = key1.value,
+        previousTangent = key1.bezTangOut,
+        nextPoint = key2.value,
+        nextTangent = key2.bezTangIn;
+    let t = perc;
+    let t2 = t * t;
+    let t3 = t2 * t;
+
+    return (2 * t3 - 3 * t2 + 1) * previousPoint + (t3 - 2 * t2 + t) * previousTangent + (-2 * t3 + 3 * t2) * nextPoint + (t3 - t2) * nextTangent;
+};
+
+Key.easeCubicSpline = function (perc, key2)
+{
+    return Key.cubicSpline(perc, this, key2);
+};
+
+
+Key.linear = function (perc, key1, key2)
+{
+    return parseFloat(key1.value) + parseFloat(key2.value - key1.value) * perc;
+};
+
+Key.easeLinear = function (perc, key2)
+{
+    return Key.linear(perc, this, key2);
+};
+
+Key.easeAbsolute = function (perc, key2)
+{
+    return this.value;
+};
+
+const easeExpoIn = function (t)
+{
+    return (t = 2 ** (10 * (t - 1)));
+};
+
+Key.easeExpoIn = function (t, key2)
+{
+    t = easeExpoIn(t);
+    return Key.linear(t, this, key2);
+};
+
+const easeExpoOut = function (t)
+{
+    t = -(2 ** (-10 * t)) + 1;
+    return t;
+};
+
+Key.easeExpoOut = function (t, key2)
+{
+    t = easeExpoOut(t);
+    return Key.linear(t, this, key2);
+};
+
+const easeExpoInOut = function (t)
+{
+    t *= 2;
+    if (t < 1)
+    {
+        t = 0.5 * 2 ** (10 * (t - 1));
+    }
+    else
+    {
+        t--;
+        t = 0.5 * (-(2 ** (-10 * t)) + 2);
+    }
+    return t;
+};
+
+Key.easeExpoInOut = function (t, key2)
+{
+    t = easeExpoInOut(t);
+    return Key.linear(t, this, key2);
+};
+
+Key.easeSinIn = function (t, key2)
+{
+    t = -1 * Math.cos((t * Math.PI) / 2) + 1;
+    return Key.linear(t, this, key2);
+};
+
+Key.easeSinOut = function (t, key2)
+{
+    t = Math.sin((t * Math.PI) / 2);
+    return Key.linear(t, this, key2);
+};
+
+Key.easeSinInOut = function (t, key2)
+{
+    t = -0.5 * (Math.cos(Math.PI * t) - 1.0);
+    return Key.linear(t, this, key2);
+};
+
+const easeCubicIn = function (t)
+{
+    t = t * t * t;
+    return t;
+};
+
+Key.easeCubicIn = function (t, key2)
+{
+    t = easeCubicIn(t);
+    return Key.linear(t, this, key2);
+};
+
+
+// b 0
+// c 1/2 or 1
+// d always 1
+// easeOutCubic: function (x, t, b, c, d) {
+//     return c*((t=t/d-1)*t*t + 1) + b;
+
+Key.easeInQuint = function (t, key2)
+{
+    t = t * t * t * t * t;
+    return Key.linear(t, this, key2);
+};
+Key.easeOutQuint = function (t, key2)
+{
+    t = (t -= 1) * t * t * t * t + 1;
+    return Key.linear(t, this, key2);
+};
+Key.easeInOutQuint = function (t, key2)
+{
+    if ((t /= 0.5) < 1) t = 0.5 * t * t * t * t * t;
+    else t = 0.5 * ((t -= 2) * t * t * t * t + 2);
+    return Key.linear(t, this, key2);
+};
+
+Key.easeInQuart = function (t, key2)
+{
+    t = t * t * t * t;
+    return Key.linear(t, this, key2);
+};
+
+Key.easeOutQuart = function (t, key2)
+{
+    // return -c * ((t=t/d-1)*t*t*t - 1) + b;
+    t = -1 * ((t -= 1) * t * t * t - 1);
+    return Key.linear(t, this, key2);
+};
+
+Key.easeInOutQuart = function (t, key2)
+{
+    if ((t /= 0.5) < 1) t = 0.5 * t * t * t * t;
+    else t = -0.5 * ((t -= 2) * t * t * t - 2);
+    return Key.linear(t, this, key2);
+};
+
+Key.bounce = function (t)
+{
+    if ((t /= 1) < 1 / 2.75) t = 7.5625 * t * t;
+    else if (t < 2 / 2.75) t = 7.5625 * (t -= 1.5 / 2.75) * t + 0.75;
+    else if (t < 2.5 / 2.75) t = 7.5625 * (t -= 2.25 / 2.75) * t + 0.9375;
+    else t = 7.5625 * (t -= 2.625 / 2.75) * t + 0.984375;
+    return t;
+};
+
+Key.easeInBounce = function (t, key2)
+{
+    return Key.linear(Key.bounce(t), this, key2);
+    // return c - jQuery.easing.easeOutBounce (x, d-t, 0, c, d);
+};
+
+Key.easeOutBounce = function (t, key2)
+{
+    return Key.linear(Key.bounce(t), this, key2);
+};
+
+Key.easeInElastic = function (t, key2)
+{
+    let s = 1.70158;
+    let p = 0;
+    let a = 1;
+
+    const b = 0;
+    const d = 1;
+    const c = 1;
+
+    if (t === 0) t = b;
+    else if ((t /= d) == 1) t = b + c;
+    else
+    {
+        if (!p) p = d * 0.3;
+        if (a < Math.abs(c))
+        {
+            a = c;
+            s = p / 4;
+        }
+        else s = (p / (2 * Math.PI)) * Math.asin(c / a);
+        t = -(a * 2 ** (10 * (t -= 1)) * Math.sin(((t * d - s) * (2 * Math.PI)) / p)) + b;
+    }
+
+    return Key.linear(t, this, key2);
+};
+
+
+Key.easeOutElastic = function (t, key2)
+{
+    let s = 1.70158;
+    let p = 0;
+    let a = 1;
+
+    const b = 0;
+    const d = 1;
+    const c = 1;
+
+    if (t === 0) t = b;
+    else if ((t /= d) == 1) t = b + c;
+    else
+    {
+        if (!p) p = d * 0.3;
+        if (a < Math.abs(c))
+        {
+            a = c;
+            s = p / 4;
+        }
+        else s = (p / (2 * Math.PI)) * Math.asin(c / a);
+        t = a * 2 ** (-10 * t) * Math.sin(((t * d - s) * (2 * Math.PI)) / p) + c + b;
+    }
+
+    return Key.linear(t, this, key2);
+};
+
+Key.easeInBack = function (t, key2)
+{
+    const s = 1.70158;
+    t = t * t * ((s + 1) * t - s);
+
+    return Key.linear(t, this, key2);
+};
+
+Key.easeOutBack = function (t, key2)
+{
+    const s = 1.70158;
+    t = (t = t / 1 - 1) * t * ((s + 1) * t + s) + 1;
+
+    return Key.linear(t, this, key2);
+};
+
+Key.easeInOutBack = function (t, key2)
+{
+    let s = 1.70158;
+    const c = 1 / 2;
+    if ((t /= 1 / 2) < 1) t = c * (t * t * (((s *= 1.525) + 1) * t - s));
+    else t = c * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);
+
+    return Key.linear(t, this, key2);
+};
+
+const easeCubicOut = function (t)
+{
+    t--;
+    t = t * t * t + 1;
+    return t;
+};
+
+Key.easeCubicOut = function (t, key2)
+{
+    t = easeCubicOut(t);
+    return Key.linear(t, this, key2);
+};
+
+const easeCubicInOut = function (t)
+{
+    t *= 2;
+    if (t < 1) t = 0.5 * t * t * t;
+    else
+    {
+        t -= 2;
+        t = 0.5 * (t * t * t + 2);
+    }
+    return t;
+};
+
+Key.easeCubicInOut = function (t, key2)
+{
+    t = easeCubicInOut(t);
+    return Key.linear(t, this, key2);
+};
+
+Key.easeSmoothStep = function (perc, key2)
+{
+    // var x = Math.max(0, Math.min(1, (perc-0)/(1-0)));
+    const x = Math.max(0, Math.min(1, perc));
+    perc = x * x * (3 - 2 * x); // smoothstep
+    return Key.linear(perc, this, key2);
+};
+
+Key.easeSmootherStep = function (perc, key2)
+{
+    const x = Math.max(0, Math.min(1, (perc - 0) / (1 - 0)));
+    perc = x * x * x * (x * (x * 6 - 15) + 10); // smootherstep
+    return Key.linear(perc, this, key2);
+};
+
+Key.prototype.setEasing = function (e)
+{
+    this._easing = e;
+
+    if (this._easing == CONSTANTS.ANIM.EASING_LINEAR) this.ease = Key.easeLinear;
+    else if (this._easing == CONSTANTS.ANIM.EASING_ABSOLUTE) this.ease = Key.easeAbsolute;
+    else if (this._easing == CONSTANTS.ANIM.EASING_SMOOTHSTEP) this.ease = Key.easeSmoothStep;
+    else if (this._easing == CONSTANTS.ANIM.EASING_SMOOTHERSTEP) this.ease = Key.easeSmootherStep;
+    else if (this._easing == CONSTANTS.ANIM.EASING_CUBIC_IN) this.ease = Key.easeCubicIn;
+    else if (this._easing == CONSTANTS.ANIM.EASING_CUBIC_OUT) this.ease = Key.easeCubicOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_CUBIC_INOUT) this.ease = Key.easeCubicInOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_EXPO_IN) this.ease = Key.easeExpoIn;
+    else if (this._easing == CONSTANTS.ANIM.EASING_EXPO_OUT) this.ease = Key.easeExpoOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_EXPO_INOUT) this.ease = Key.easeExpoInOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_SIN_IN) this.ease = Key.easeSinIn;
+    else if (this._easing == CONSTANTS.ANIM.EASING_SIN_OUT) this.ease = Key.easeSinOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_SIN_INOUT) this.ease = Key.easeSinInOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_BACK_OUT) this.ease = Key.easeOutBack;
+    else if (this._easing == CONSTANTS.ANIM.EASING_BACK_IN) this.ease = Key.easeInBack;
+    else if (this._easing == CONSTANTS.ANIM.EASING_BACK_INOUT) this.ease = Key.easeInOutBack;
+    else if (this._easing == CONSTANTS.ANIM.EASING_ELASTIC_IN) this.ease = Key.easeInElastic;
+    else if (this._easing == CONSTANTS.ANIM.EASING_ELASTIC_OUT) this.ease = Key.easeOutElastic;
+    else if (this._easing == CONSTANTS.ANIM.EASING_ELASTIC_INOUT) this.ease = Key.easeElasticInOut;
+    else if (this._easing == CONSTANTS.ANIM.EASING_BOUNCE_IN) this.ease = Key.easeInBounce;
+    else if (this._easing == CONSTANTS.ANIM.EASING_BOUNCE_OUT) this.ease = Key.easeOutBounce;
+    else if (this._easing == CONSTANTS.ANIM.EASING_QUART_OUT) this.ease = Key.easeOutQuart;
+    else if (this._easing == CONSTANTS.ANIM.EASING_QUART_IN) this.ease = Key.easeInQuart;
+    else if (this._easing == CONSTANTS.ANIM.EASING_QUART_INOUT) this.ease = Key.easeInOutQuart;
+    else if (this._easing == CONSTANTS.ANIM.EASING_QUINT_OUT) this.ease = Key.easeOutQuint;
+    else if (this._easing == CONSTANTS.ANIM.EASING_QUINT_IN) this.ease = Key.easeInQuint;
+    else if (this._easing == CONSTANTS.ANIM.EASING_QUINT_INOUT) this.ease = Key.easeInOutQuint;
+    else if (this._easing == CONSTANTS.ANIM.EASING_CUBICSPLINE)
+    {
+        // this._updateBezier = true;
+        this.ease = Key.easeCubicSpline;
+    }
+    else
+    {
+        this._easing = CONSTANTS.ANIM.EASING_LINEAR;
+        this.ease = Key.easeLinear;
+    }
+};
+
+Key.prototype.trigger = function ()
+{
+    this.cb();
+    this.cbTriggered = true;
+};
+
+Key.prototype.setValue = function (v)
+{
+    this.value = v;
+    // this._updateBezier = true;
+    if (this.onChange !== null) this.onChange();
+};
+
+Key.prototype.set = function (obj)
+{
+    if (obj)
+    {
+        if (obj.e) this.setEasing(obj.e);
+        if (obj.cb)
+        {
+            this.cb = obj.cb;
+            this.cbTriggered = false;
+        }
+
+        if (obj.b)
+        {
+            // this.bezTime = obj.b[0];
+            // this.bezValue = obj.b[1];
+            // this.bezTimeIn = obj.b[2];
+            // this.bezValueIn = obj.b[3];
+            // this._updateBezier = true;
+        }
+
+        if (obj.hasOwnProperty("t")) this.time = obj.t;
+        if (obj.hasOwnProperty("time")) this.time = obj.time;
+        if (obj.hasOwnProperty("v")) this.value = obj.v;
+        else if (obj.hasOwnProperty("value")) this.value = obj.value;
+    }
+    if (this.onChange !== null) this.onChange();
+};
+
+Key.prototype.getSerialized = function ()
+{
+    const obj = {};
+    obj.t = this.time;
+    obj.v = this.value;
+    obj.e = this._easing;
+    // if (this._easing == CONSTANTS.ANIM.EASING_CUBICSPLINE) obj.b = [this.bezTime, this.bezValue, this.bezTimeIn, this.bezValueIn];
+
+    return obj;
+};
+
+Key.prototype.getEasing = function ()
+{
+    return this._easing;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/eventtarget.js
+
+
+const EventTarget = function ()
+{
+    this._log = new Logger("eventtarget");
+    this._eventCallbacks = {};
+    this._logName = "";
+    this._logEvents = false;
+    this._listeners = {};
+
+    this.addEventListener = this.on = function (which, cb, idPrefix)
+    {
+        const event =
+        {
+            "id": (idPrefix || "") + CABLES.simpleId(),
+            "name": which,
+            "cb": cb,
+        };
+        if (!this._eventCallbacks[which]) this._eventCallbacks[which] = [event];
+        else this._eventCallbacks[which].push(event);
+
+        this._listeners[event.id] = event;
+
+        return event.id;
+    };
+
+    this.hasEventListener = function (which, cb)
+    {
+        if (which && !cb)
+        {
+            // check by id
+            if (this._listeners[which]) return true;
+            else return false;
+        }
+        else
+        {
+            this._log.warn("old eventtarget function haseventlistener!");
+            if (which && cb)
+            {
+                if (this._eventCallbacks[which])
+                {
+                    const idx = this._eventCallbacks[which].indexOf(cb);
+                    if (idx == -1) return false;
+                    return true;
+                }
+            }
+        }
+    };
+
+    this.hasListenerForEventName = function (eventName)
+    {
+        return this._eventCallbacks[eventName] && this._eventCallbacks[eventName].length > 0;
+    };
+
+    this.removeEventListener = this.off = function (which, cb)
+    {
+        if (which === null || which === undefined) return;
+
+        if (!cb) // new style, remove by id, not by name/callback
+        {
+            const event = this._listeners[which];
+            if (!event)
+            {
+                this._log.log("could not find event...");
+                return;
+            }
+
+            let found = true;
+            while (found)
+            {
+                found = false;
+                let index = -1;
+                for (let i = 0; i < this._eventCallbacks[event.name].length; i++)
+                {
+                    if (this._eventCallbacks[event.name][i].id.startsWith(which)) // this._eventCallbacks[event.name][i].id == which ||
+                    {
+                        found = true;
+                        index = i;
+                    }
+                }
+
+                if (index !== -1)
+                {
+                    this._eventCallbacks[event.name].splice(index, 1);
+                    delete this._listeners[which];
+                }
+            }
+
+            return;
+        }
+
+        this._log.info("[eventtaget] ", "old function signature: removeEventListener! use listener id");
+        this._log.log((new Error()).stack);
+
+        let index = null;
+        for (let i = 0; i < this._eventCallbacks[which].length; i++)
+            if (this._eventCallbacks[which][i].cb == cb)
+                index = i;
+
+        if (index !== null)
+        {
+            delete this._eventCallbacks[index];
+        }
+        else this._log.warn("removeEventListener not found " + which);
+    };
+
+    this.logEvents = function (enabled, name)
+    {
+        this._logEvents = enabled;
+        this._logName = name;
+    };
+
+    this.emitEvent = function (which, param1, param2, param3, param4, param5, param6)
+    {
+        if (this._logEvents) this._log.log("[event] ", this._logName, which, this._eventCallbacks);
+
+        if (this._eventCallbacks[which])
+        {
+            for (let i = 0; i < this._eventCallbacks[which].length; i++)
+            {
+                if (this._eventCallbacks[which][i])
+                {
+                    this._eventCallbacks[which][i].cb(param1, param2, param3, param4, param5, param6);
+                }
+            }
+        }
+        else
+        {
+            if (this._logEvents) this._log.log("[event] has no event callback", which, this._eventCallbacks);
+        }
+    };
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/anim.js
+
+
+
+
+
+/**
+ * Keyframed interpolated animation.
+ *
+ * Available Easings:
+ * <pre>
+ * CONSTANTS.ANIM.EASING_LINEAR
+ * CONSTANTS.ANIM.EASING_ABSOLUTE
+ * CONSTANTS.ANIM.EASING_SMOOTHSTEP
+ * CONSTANTS.ANIM.EASING_SMOOTHERSTEP
+ * CONSTANTS.ANIM.EASING_CUBICSPLINE
+
+ * CONSTANTS.ANIM.EASING_CUBIC_IN
+ * CONSTANTS.ANIM.EASING_CUBIC_OUT
+ * CONSTANTS.ANIM.EASING_CUBIC_INOUT
+
+ * CONSTANTS.ANIM.EASING_EXPO_IN
+ * CONSTANTS.ANIM.EASING_EXPO_OUT
+ * CONSTANTS.ANIM.EASING_EXPO_INOUT
+
+ * CONSTANTS.ANIM.EASING_SIN_IN
+ * CONSTANTS.ANIM.EASING_SIN_OUT
+ * CONSTANTS.ANIM.EASING_SIN_INOUT
+
+ * CONSTANTS.ANIM.EASING_BACK_IN
+ * CONSTANTS.ANIM.EASING_BACK_OUT
+ * CONSTANTS.ANIM.EASING_BACK_INOUT
+
+ * CONSTANTS.ANIM.EASING_ELASTIC_IN
+ * CONSTANTS.ANIM.EASING_ELASTIC_OUT
+
+ * CONSTANTS.ANIM.EASING_BOUNCE_IN
+ * CONSTANTS.ANIM.EASING_BOUNCE_OUT
+
+ * CONSTANTS.ANIM.EASING_QUART_IN
+ * CONSTANTS.ANIM.EASING_QUART_OUT
+ * CONSTANTS.ANIM.EASING_QUART_INOUT
+
+ * CONSTANTS.ANIM.EASING_QUINT_IN
+ * CONSTANTS.ANIM.EASING_QUINT_OUT
+ * CONSTANTS.ANIM.EASING_QUINT_INOUT
+ * </pre>
+ * @hideconstructor
+ * @external CABLES
+ * @namespace Anim
+ * @class
+ * @example
+ * var anim=new CABLES.Anim();
+ * anim.setValue(0,0);  // set value 0 at 0 seconds
+ * anim.setValue(10,1); // set value 1 at 10 seconds
+ * anim.getValue(5);    // get value at 5 seconds - this returns 0.5
+ */
+
+const Anim = function (cfg)
+{
+    EventTarget.apply(this);
+
+    cfg = cfg || {};
+    this.keys = [];
+    this.onChange = null;
+    this.stayInTimeline = false;
+    this.loop = false;
+    this._log = new Logger("Anim");
+    this._lastKeyIndex = 0;
+    this._cachedIndex = 0;
+    this.name = cfg.name || null;
+
+    /**
+     * @member defaultEasing
+     * @memberof Anim
+     * @instance
+     * @type {Number}
+     */
+    this.defaultEasing = cfg.defaultEasing || CONSTANTS.ANIM.EASING_LINEAR;
+    this.onLooped = null;
+
+    this._timesLooped = 0;
+    this._needsSort = false;
+};
+
+Anim.prototype.forceChangeCallback = function ()
+{
+    if (this.onChange !== null) this.onChange();
+    this.emitEvent("onChange", this);
+};
+
+Anim.prototype.getLoop = function ()
+{
+    return this.loop;
+};
+
+Anim.prototype.setLoop = function (target)
+{
+    this.loop = target;
+    this.emitEvent("onChange", this);
+};
+
+/**
+ * returns true if animation has ended at @time
+ * checks if last key time is < time
+ * @param {Number} time
+ * @returns {Boolean}
+ * @memberof Anim
+ * @instance
+ * @function
+ */
+Anim.prototype.hasEnded = function (time)
+{
+    if (this.keys.length === 0) return true;
+    if (this.keys[this._lastKeyIndex].time <= time) return true;
+    return false;
+};
+
+Anim.prototype.isRising = function (time)
+{
+    if (this.hasEnded(time)) return false;
+    const ki = this.getKeyIndex(time);
+    if (this.keys[ki].value < this.keys[ki + 1].value) return true;
+    return false;
+};
+
+/**
+ * remove all keys from animation before time
+ * @param {Number} time
+ * @memberof Anim
+ * @instance
+ * @function
+ */
+Anim.prototype.clearBefore = function (time)
+{
+    const v = this.getValue(time);
+    const ki = this.getKeyIndex(time);
+
+    this.setValue(time, v);
+
+    if (ki > 1) this.keys.splice(0, ki);
+    this._updateLastIndex();
+};
+/**
+ * remove all keys from animation
+ * @param {Number} [time=0] set a new key at time with the old value at time
+ * @memberof Anim
+ * @instance
+ * @function
+ */
+Anim.prototype.clear = function (time)
+{
+    let v = 0;
+    if (time) v = this.getValue(time);
+    this.keys.length = 0;
+    this._updateLastIndex();
+    if (time) this.setValue(time, v);
+    if (this.onChange !== null) this.onChange();
+    this.emitEvent("onChange", this);
+};
+
+Anim.prototype.sortKeys = function ()
+{
+    this.keys.sort((a, b) => { return parseFloat(a.time) - parseFloat(b.time); });
+    this._updateLastIndex();
+    this._needsSort = false;
+    if (this.keys.length % 1000 == 0)console.log(this.name, this.keys.length);
+};
+
+Anim.prototype.getLength = function ()
+{
+    if (this.keys.length === 0) return 0;
+    return this.keys[this.keys.length - 1].time;
+};
+
+Anim.prototype.getKeyIndex = function (time)
+{
+    let index = 0;
+    let start = 0;
+    if (this._cachedIndex && this.keys.length > this._cachedIndex && time >= this.keys[this._cachedIndex].time) start = this._cachedIndex;
+    for (let i = start; i < this.keys.length; i++)
+    {
+        if (time >= this.keys[i].time) index = i;
+        if (this.keys[i].time > time)
+        {
+            if (time != 0) this._cachedIndex = index;
+            return index;
+        }
+    }
+
+    return index;
+};
+
+/**
+ * set value at time
+ * @function setValue
+ * @memberof Anim
+ * @instance
+ * @param {Number} time
+ * @param {Number} value
+ * @param {Function} [callback] callback
+ */
+Anim.prototype.setValue = function (time, value, cb)
+{
+    let found = null;
+
+    if (this.keys.length == 0 || time <= this.keys[this.keys.length - 1].time)
+        for (let i = 0; i < this.keys.length; i++)
+            if (this.keys[i].time == time)
+            {
+                found = this.keys[i];
+                this.keys[i].setValue(value);
+                this.keys[i].cb = cb;
+                break;
+            }
+
+    if (!found)
+    {
+        found = new Key(
+            {
+                "time": time,
+                "value": value,
+                "e": this.defaultEasing,
+                "cb": cb,
+            });
+        this.keys.push(found);
+
+        // if (this.keys.length % 1000 == 0)console.log(this.name, this.keys.length);
+        this._updateLastIndex();
+    }
+
+    if (this.onChange) this.onChange();
+    this.emitEvent("onChange", this);
+    this._needsSort = true;
+    return found;
+};
+
+Anim.prototype.setKeyEasing = function (index, e)
+{
+    if (this.keys[index])
+    {
+        this.keys[index].setEasing(e);
+        this.emitEvent("onChange", this);
+    }
+};
+
+Anim.prototype.getSerialized = function ()
+{
+    const obj = {};
+    obj.keys = [];
+    obj.loop = this.loop;
+
+    for (let i = 0; i < this.keys.length; i++)
+        obj.keys.push(this.keys[i].getSerialized());
+
+    return obj;
+};
+
+Anim.prototype.getKey = function (time)
+{
+    const index = this.getKeyIndex(time);
+    return this.keys[index];
+};
+
+Anim.prototype.getNextKey = function (time)
+{
+    let index = this.getKeyIndex(time) + 1;
+    if (index >= this.keys.length) index = this.keys.length - 1;
+
+    return this.keys[index];
+};
+
+Anim.prototype.isFinished = function (time)
+{
+    if (this.keys.length <= 0) return true;
+    return time > this.keys[this.keys.length - 1].time;
+};
+
+Anim.prototype.isStarted = function (time)
+{
+    if (this.keys.length <= 0) return false;
+    return time >= this.keys[0].time;
+};
+
+/**
+ * get value at time
+ * @function getValue
+ * @memberof Anim
+ * @instance
+ * @param {Number} [time] time
+ * @returns {Number} interpolated value at time
+ */
+Anim.prototype.getValue = function (time)
+{
+    if (this.keys.length === 0)
+    {
+        return 0;
+    }
+    if (this._needsSort) this.sortKeys();
+
+    if (!this.loop && time > this.keys[this._lastKeyIndex].time)
+    {
+        if (this.keys[this._lastKeyIndex].cb && !this.keys[this._lastKeyIndex].cbTriggered) this.keys[this._lastKeyIndex].trigger();
+
+        return this.keys[this._lastKeyIndex].value;
+    }
+
+    if (time < this.keys[0].time)
+    {
+        // if (this.name)console.log("A");
+
+        return this.keys[0].value;
+    }
+
+    if (this.loop && time > this.keys[this._lastKeyIndex].time)
+    {
+        const currentLoop = time / this.keys[this._lastKeyIndex].time;
+        if (currentLoop > this._timesLooped)
+        {
+            this._timesLooped++;
+            if (this.onLooped) this.onLooped();
+        }
+        time = (time - this.keys[0].time) % (this.keys[this._lastKeyIndex].time - this.keys[0].time);
+        time += this.keys[0].time;
+    }
+
+    const index = this.getKeyIndex(time);
+    if (index >= this._lastKeyIndex)
+    {
+        if (this.keys[this._lastKeyIndex].cb && !this.keys[this._lastKeyIndex].cbTriggered) this.keys[this._lastKeyIndex].trigger();
+
+        return this.keys[this._lastKeyIndex].value;
+    }
+
+
+    const index2 = index + 1;
+    const key1 = this.keys[index];
+    const key2 = this.keys[index2];
+
+    if (key1.cb && !key1.cbTriggered) key1.trigger();
+
+    if (!key2) return -1;
+
+    const perc = (time - key1.time) / (key2.time - key1.time);
+
+    if (!key1.ease) this.log._warn("has no ease", key1, key2);
+
+    return key1.ease(perc, key2);
+};
+
+Anim.prototype._updateLastIndex = function ()
+{
+    this._lastKeyIndex = this.keys.length - 1;
+};
+
+Anim.prototype.addKey = function (k)
+{
+    if (k.time === undefined)
+    {
+        this.log.warn("key time undefined, ignoring!");
+    }
+    else
+    {
+        this.keys.push(k);
+        if (this.onChange !== null) this.onChange();
+        this.emitEvent("onChange", this);
+    }
+    this._updateLastIndex();
+};
+
+Anim.prototype.easingFromString = function (str)
+{
+    if (str == "linear") return CONSTANTS.ANIM.EASING_LINEAR;
+    if (str == "absolute") return CONSTANTS.ANIM.EASING_ABSOLUTE;
+    if (str == "smoothstep") return CONSTANTS.ANIM.EASING_SMOOTHSTEP;
+    if (str == "smootherstep") return CONSTANTS.ANIM.EASING_SMOOTHERSTEP;
+
+    if (str == "Cubic In") return CONSTANTS.ANIM.EASING_CUBIC_IN;
+    if (str == "Cubic Out") return CONSTANTS.ANIM.EASING_CUBIC_OUT;
+    if (str == "Cubic In Out") return CONSTANTS.ANIM.EASING_CUBIC_INOUT;
+
+    if (str == "Expo In") return CONSTANTS.ANIM.EASING_EXPO_IN;
+    if (str == "Expo Out") return CONSTANTS.ANIM.EASING_EXPO_OUT;
+    if (str == "Expo In Out") return CONSTANTS.ANIM.EASING_EXPO_INOUT;
+
+    if (str == "Sin In") return CONSTANTS.ANIM.EASING_SIN_IN;
+    if (str == "Sin Out") return CONSTANTS.ANIM.EASING_SIN_OUT;
+    if (str == "Sin In Out") return CONSTANTS.ANIM.EASING_SIN_INOUT;
+
+    if (str == "Back In") return CONSTANTS.ANIM.EASING_BACK_IN;
+    if (str == "Back Out") return CONSTANTS.ANIM.EASING_BACK_OUT;
+    if (str == "Back In Out") return CONSTANTS.ANIM.EASING_BACK_INOUT;
+
+    if (str == "Elastic In") return CONSTANTS.ANIM.EASING_ELASTIC_IN;
+    if (str == "Elastic Out") return CONSTANTS.ANIM.EASING_ELASTIC_OUT;
+
+    if (str == "Bounce In") return CONSTANTS.ANIM.EASING_BOUNCE_IN;
+    if (str == "Bounce Out") return CONSTANTS.ANIM.EASING_BOUNCE_OUT;
+
+    if (str == "Quart Out") return CONSTANTS.ANIM.EASING_QUART_OUT;
+    if (str == "Quart In") return CONSTANTS.ANIM.EASING_QUART_IN;
+    if (str == "Quart In Out") return CONSTANTS.ANIM.EASING_QUART_INOUT;
+
+    if (str == "Quint Out") return CONSTANTS.ANIM.EASING_QUINT_OUT;
+    if (str == "Quint In") return CONSTANTS.ANIM.EASING_QUINT_IN;
+    if (str == "Quint In Out") return CONSTANTS.ANIM.EASING_QUINT_INOUT;
+};
+
+Anim.prototype.createPort = function (op, title, cb)
+{
+    const port = op.inDropDown(title, CONSTANTS.ANIM.EASINGS);
+
+    // const port = op.addInPort(
+    //     new Port(op, title, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+    //         "display": "dropdown",
+    //         "values": CONSTANTS.ANIM.EASINGS,
+    //     }),
+    // );
+
+    port.set("linear");
+    port.defaultValue = "linear";
+
+    port.onChange = function ()
+    {
+        this.defaultEasing = this.easingFromString(port.get());
+        this.emitEvent("onChangeDefaultEasing", this);
+
+        if (cb) cb();
+    }.bind(this);
+
+    return port;
+};
+
+// ------------------------------
+
+Anim.slerpQuaternion = function (time, q, animx, animy, animz, animw)
+{
+    if (!Anim.slerpQuaternion.q1)
+    {
+        Anim.slerpQuaternion.q1 = quat.create();
+        Anim.slerpQuaternion.q2 = quat.create();
+    }
+
+    const i1 = animx.getKeyIndex(time);
+    let i2 = i1 + 1;
+    if (i2 >= animx.keys.length) i2 = animx.keys.length - 1;
+
+    if (i1 == i2)
+    {
+        quat.set(q, animx.keys[i1].value, animy.keys[i1].value, animz.keys[i1].value, animw.keys[i1].value);
+    }
+    else
+    {
+        const key1Time = animx.keys[i1].time;
+        const key2Time = animx.keys[i2].time;
+        const perc = (time - key1Time) / (key2Time - key1Time);
+
+        quat.set(Anim.slerpQuaternion.q1, animx.keys[i1].value, animy.keys[i1].value, animz.keys[i1].value, animw.keys[i1].value);
+
+        quat.set(Anim.slerpQuaternion.q2, animx.keys[i2].value, animy.keys[i2].value, animz.keys[i2].value, animw.keys[i2].value);
+
+        quat.slerp(q, Anim.slerpQuaternion.q1, Anim.slerpQuaternion.q2, perc);
+    }
+    return q;
+};
+
+const ANIM = { "Key": Key };
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_link.js
+
+
+
+/**
+ * @external CABLES
+ * @namespace Link
+ * @param {Object} patch The patch object
+ * @description a link is a connection between two ops/ports -> one input and one output port
+ * @hideconstructor
+ * @class
+ */
+const Link = function (scene)
+{
+    EventTarget.apply(this);
+
+    this.id = CABLES.simpleId();
+    this.portIn = null;
+    this.portOut = null;
+    this.scene = scene; // todo: make private and rename to patch
+    this.activityCounter = 0;
+    this.ignoreInSerialize = false;
+};
+
+Link.prototype.setValue = function (v)
+{
+    if (v === undefined) this._setValue();
+    else this.portIn.set(v);
+};
+
+Link.prototype.activity = function ()
+{
+    this.activityCounter++;
+    // if(Date.now()-this.lastTime>100)
+    // {
+    //     // this.lastTime=Date.now();
+    //     // this.changesPerSecond=this.changesCounter*10;
+    //     this.changesCounter=0;
+    // }
+};
+
+Link.prototype._setValue = function ()
+{
+    if (!this.portOut)
+    {
+        this.remove();
+        return;
+    }
+    const v = this.portOut.get();
+
+    if (v == v) // NaN is the only JavaScript value that is treated as unequal to itself
+    {
+        if (this.portIn.type != CONSTANTS.OP.OP_PORT_TYPE_FUNCTION) this.activity();
+
+        if (this.portIn.get() !== v)
+        {
+            this.portIn.set(v);
+        }
+        else
+        {
+            if (this.portIn.changeAlways) this.portIn.set(v);
+            if (this.portOut.forceRefChange) this.portIn.forceChange();
+        }
+    }
+};
+
+/**
+ * @function getOtherPort
+ * @memberof Link
+ * @instance
+ * @param {Port} port
+ * @description returns the port of the link, which is not port
+ */
+Link.prototype.getOtherPort = function (p)
+{
+    if (p == this.portIn) return this.portOut;
+    return this.portIn;
+};
+
+/**
+ * @function remove
+ * @memberof Link
+ * @instance
+ * @description unlink/remove this link from all ports
+ */
+Link.prototype.remove = function ()
+{
+    if (this.portIn) this.portIn.removeLink(this);
+    if (this.portOut) this.portOut.removeLink(this);
+    if (this.scene)
+    {
+        this.scene.emitEvent("onUnLink", this.portIn, this.portOut, this);
+    }
+
+    if (this.portIn && (this.portIn.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT || this.portIn.type == CONSTANTS.OP.OP_PORT_TYPE_ARRAY))
+    {
+        this.portIn.set(null);
+        if (this.portIn.links.length > 0) this.portIn.set(this.portIn.links[0].getOtherPort(this.portIn).get());
+    }
+
+    if (this.portIn) this.portIn.op._checkLinksNeededToWork();
+    if (this.portOut) this.portOut.op._checkLinksNeededToWork();
+
+    this.portIn = null;
+    this.portOut = null;
+    this.scene = null;
+};
+
+/**
+ * @function link
+ * @memberof Link
+ * @instance
+ * @description link those two ports
+ * @param {Port} port1
+ * @param {Port} port2
+ */
+Link.prototype.link = function (p1, p2)
+{
+    if (!Link.canLink(p1, p2))
+    {
+        console.warn("[core_link] cannot link ports!", p1, p2);
+        return false;
+    }
+
+    if (p1.direction == CONSTANTS.PORT.PORT_DIR_IN)
+    {
+        this.portIn = p1;
+        this.portOut = p2;
+    }
+    else
+    {
+        this.portIn = p2;
+        this.portOut = p1;
+    }
+
+    p1.addLink(this);
+    p2.addLink(this);
+
+    this.setValue();
+
+    if (p1.onLink) p1.onLink(this);
+    if (p2.onLink) p2.onLink(this);
+
+    p1.op._checkLinksNeededToWork();
+    p2.op._checkLinksNeededToWork();
+};
+
+Link.prototype.getSerialized = function ()
+{
+    const obj = {};
+
+    obj.portIn = this.portIn.getName();
+    obj.portOut = this.portOut.getName();
+    obj.objIn = this.portIn.op.id;
+    obj.objOut = this.portOut.op.id;
+
+    return obj;
+};
+
+// --------------------------------------------
+
+/**
+ * @function canLinkText
+ * @memberof Link
+ * @instance
+ * @description return a text message with human readable reason if ports can not be linked, or can be
+ * @param {Port} port1
+ * @param {Port} port2
+ */
+Link.canLinkText = function (p1, p2)
+{
+    if (p1.direction == p2.direction)
+    {
+        let txt = "(out)";
+        if (p2.direction == CONSTANTS.PORT.PORT_DIR_IN) txt = "(in)";
+        return "can not link: same direction " + txt;
+    }
+    if (p1.op == p2.op) return "can not link: same op";
+    if (p1.type != CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC && p2.type != CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC)
+    {
+        if (p1.type != p2.type) return "can not link: different type";
+    }
+
+    if (CABLES.UI && p1.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT && p2.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT)
+    {
+        if (p1.uiAttribs.objType && p2.uiAttribs.objType)
+            if (p1.uiAttribs.objType != p2.uiAttribs.objType)
+                return "incompatible objects";
+    }
+
+
+    if (!p1) return "can not link: port 1 invalid";
+    if (!p2) return "can not link: port 2 invalid";
+
+    if (p1.direction == CONSTANTS.PORT.PORT_DIR_IN && p1.isAnimated()) return "can not link: is animated";
+    if (p2.direction == CONSTANTS.PORT.PORT_DIR_IN && p2.isAnimated()) return "can not link: is animated";
+
+    // if(p1.direction==CABLES.CONSTANTS.PORT.PORT_DIR_IN && p1.links.length>0)return 'input port already busy';
+    // if(p2.direction==CABLES.CONSTANTS.PORT.PORT_DIR_IN && p2.links.length>0)return 'input port already busy';
+    if (p1.isLinkedTo(p2)) return "ports already linked";
+
+    if ((p1.canLink && !p1.canLink(p2)) || (p2.canLink && !p2.canLink(p1))) return "Incompatible";
+
+    return "can link";
+};
+
+/**
+ * @function canLink
+ * @memberof Link
+ * @instance
+ * @description return true if ports can be linked
+ * @param {Port} port1
+ * @param {Port} port2
+ * @returns {Boolean}
+ */
+Link.canLink = function (p1, p2)
+{
+    if (!p1) return false;
+    if (!p2) return false;
+    if (p1.direction == CONSTANTS.PORT.PORT_DIR_IN && p1.isAnimated()) return false;
+    if (p2.direction == CONSTANTS.PORT.PORT_DIR_IN && p2.isAnimated()) return false;
+
+    if (p1.isHidden() || p2.isHidden()) return false;
+
+    if (p1.isLinkedTo(p2)) return false;
+
+    if (p1.direction == p2.direction) return false;
+
+    if (CABLES.UI && p1.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT && p2.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT)
+    {
+        if (p1.uiAttribs.objType && p2.uiAttribs.objType)
+        {
+            if (p1.uiAttribs.objType.indexOf("sg_") == 0 && p2.uiAttribs.objType.indexOf("sg_") == 0) return true;
+            if (p1.uiAttribs.objType != p2.uiAttribs.objType)
+                return false;
+        }
+    }
+
+    if (p1.type != p2.type && (p1.type != CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC && p2.type != CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC)) return false;
+    if (p1.type == CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC || p2.type == CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC) return true;
+
+    if (p1.op == p2.op) return false;
+
+    if (p1.canLink && !p1.canLink(p2)) return false;
+    if (p2.canLink && !p2.canLink(p1)) return false;
+
+    return true;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_port.js
+
+
+
+
+
+
+
+/**
+ * data is coming into and out of ops through input and output ports
+ * @external CABLES
+ * @namespace Port
+ * @class
+ * @hideconstructor
+ * @example
+ * const myPort=op.inString("String Port");
+ */
+const Port = function (___op, name, type, uiAttribs)
+{
+    EventTarget.apply(this);
+
+    this.data = {}; // UNUSED, DEPRECATED, only left in for backwards compatibility with userops
+    this._log = new Logger("core_port");
+    /**
+     * @type {Number}
+     * @name direction
+     * @instance
+     * @memberof Port
+     * @description direction of port (input(0) or output(1))
+     */
+    this.direction = CONSTANTS.PORT.PORT_DIR_IN;
+    this.id = String(CABLES.simpleId());
+    this._op = ___op;
+
+    /**
+     * @type {Array<Link>}
+     * @name links
+     * @instance
+     * @memberof Port
+     * @description links of port
+     */
+    this.links = [];
+    this.value = 0.0;
+    this.name = name;
+    this.type = type || CONSTANTS.OP.OP_PORT_TYPE_VALUE;
+    this.uiAttribs = uiAttribs || {};
+    this.anim = null;
+    this._oldAnimVal = -5711;
+    this.defaultValue = null;
+
+
+    this._uiActiveState = true;
+    this.ignoreValueSerialize = false;
+    this.onLinkChanged = null;
+    this.crashed = false;
+
+    this._valueBeforeLink = null;
+    this._lastAnimFrame = -1;
+    this._animated = false;
+
+    this.onValueChanged = null;
+    this.onTriggered = null;
+    this.onUiActiveStateChange = null;
+    this.changeAlways = false;
+    this.forceRefChange = false;
+
+    this._useVariableName = null;
+
+    this.activityCounter = 0;
+    this.apf = 0;
+    this.activityCounterStartFrame = 0;
+
+    this._tempLastUiValue = null;
+
+    Object.defineProperty(this, "title", {
+        get()
+        {
+            return this.uiAttribs.title || this.name;
+        } });
+
+
+    Object.defineProperty(this, "parent", {
+        get()
+        {
+            this._log.stack("use port.op, not .parent");
+            return this._op;
+        } });
+
+
+
+    Object.defineProperty(this, "op", {
+        get()
+        {
+            return this._op;
+        } });
+
+
+    Object.defineProperty(this, "val", {
+        get()
+        {
+            this._log.warn("val getter deprecated!", this);
+            this._log.stack("val getter deprecated");
+            return this.get();
+        },
+        set(v)
+        {
+            this._log.warn("val setter deprecated!", this);
+            this._log.stack("val setter deprecated");
+            this.setValue(v);
+        }
+    });
+};
+
+
+/**
+ * copy over a uiattrib from an external connected port to another port
+ * @function copyLinkedUiAttrib
+ * @memberof Port
+ * @param {which} attrib name
+ * @param {Port} source port
+ * @instance
+ * @example
+
+inArray.onLinkChanged=()=>
+{
+    if(inArray) inArray.copyLinkedUiAttrib("stride", outArray);
+};
+
+ */
+Port.prototype.copyLinkedUiAttrib = function (which, port)
+{
+    if (!CABLES.UI) return;
+    if (!this.isLinked()) return;
+
+    const attr = {};
+    attr[which] = this.links[0].getOtherPort(this).getUiAttrib(which);
+    port.setUiAttribs(attr);
+};
+
+
+// TODO make extend class for ports, like for ops only for ui
+Port.prototype.getValueForDisplay = function ()
+{
+    let str = this.value;
+
+    if (typeof this.value === "string" || this.value instanceof String)
+    {
+        if (str.length > 1000)
+        {
+            str = str.substring(0, 999);
+            str += "...";
+        }
+        if (this.uiAttribs && (this.uiAttribs.display == "boolnum"))
+        {
+            str += " - ";
+
+            if (!this.value) str += "false";
+            else str += "true";
+        }
+
+        str = str.replace(/[\u00A0-\u9999<>\&]/g, function (i)
+        {
+            return "&#" + i.charCodeAt(0) + ";";
+        });
+
+
+        if (str.length > 100) str = str.substring(0, 100);
+    }
+    else
+    {
+        str = this.value;
+    }
+    return str;
+};
+
+/**
+ * change listener for input value ports, overwrite to react to changes
+ * @function onChange
+ * @memberof Port
+ * @instance
+ * @example
+ * const myPort=op.inString("MyPort");
+ * myPort.onChange=function()
+ * {
+ *   console.log("was changed to: ",myPort.get());
+ * }
+ *
+ */
+Port.prototype.onAnimToggle = function () {};
+Port.prototype._onAnimToggle = function ()
+{
+    this.onAnimToggle();
+};
+
+
+/**
+ * @function remove
+ * @memberof Port
+ * @instance
+ * @description remove port
+ */
+Port.prototype.remove = function ()
+{
+    // this.setUiAttribs({hidePort:true});
+    this.removeLinks();
+    this._op.removePort(this);
+};
+
+/**
+ * set ui attributes
+ * @function setUiAttribs
+ * @memberof Port
+ * @instance
+ * @param {Object} newAttribs
+ * <pre>
+ * title - overwrite title of port (by default this is portname)
+ * greyout - port paramater will appear greyed out, can not be
+ * hidePort - port will be hidden from op
+ * hideParam - port params will be hidden from parameter panel
+ * showIndex - only for dropdowns - show value index (e.g. `0 - normal` )
+ * editorSyntax - set syntax highlighting theme for editor port
+ * ignoreObjTypeErrors - do not auto check object types
+ * </pre>
+ * @example
+ * myPort.setUiAttribs({greyout:true});
+ */
+Port.prototype.setUiAttribs = function (newAttribs)
+{
+    let changed = false;
+    if (!this.uiAttribs) this.uiAttribs = {};
+
+    for (const p in newAttribs)
+    {
+        if (newAttribs[p] === undefined)
+        {
+            // delete newAttribs[p];
+            delete this.uiAttribs[p];
+            continue;
+        }
+        if (this.uiAttribs[p] != newAttribs[p]) changed = true;
+        this.uiAttribs[p] = newAttribs[p];
+
+        if (p == "group" && this.indexPort) this.indexPort.setUiAttribs({ "group": newAttribs[p] });
+    }
+
+    if (newAttribs.hasOwnProperty("expose")) this._op.patch.emitEvent("subpatchExpose", this._op.uiAttribs.subPatch);
+
+    if (changed) this.emitEvent("onUiAttrChange", newAttribs, this);
+};
+
+/**
+ * get ui attributes
+ * @function getUiAttribs
+ * @memberof Port
+ * @example
+ * myPort.getUiAttribs();
+ */
+Port.prototype.getUiAttribs = function ()
+{
+    return this.uiAttribs;
+};
+
+/**
+ * get ui attribute
+ * @function getUiAttrib
+ * @memberof Port
+ * @instance
+ * @param {String} attribName
+ * <pre>
+ * attribName - return value of the ui-attribute, or null on unknown attribute
+ * </pre>
+ * @example
+ * myPort.setUiAttribs("values");
+ */
+Port.prototype.getUiAttrib = function (attribName)
+{
+    if (!this.uiAttribs || !this.uiAttribs.hasOwnProperty(attribName))
+    {
+        return null;
+    }
+    return this.uiAttribs[attribName];
+};
+
+/**
+ * @function get
+ * @memberof Port
+ * @instance
+ * @description get value of port
+ */
+Port.prototype.get = function ()
+{
+    if (this._animated && this._lastAnimFrame != this._op.patch.getFrameNum())
+    {
+        this._lastAnimFrame = this._op.patch.getFrameNum();
+        this.value = this.anim.getValue(this._op.patch.timer.getTime());
+
+        this._oldAnimVal = this.value;
+        this.forceChange();
+    }
+
+    return this.value;
+};
+
+Port.prototype.setRef = function (v)
+{
+    this.forceRefChange = true;
+    this.set(v);
+};
+
+/**
+ * @function setValue
+ * @memberof Port
+ * @instance
+ * @description set value of port / will send value to all linked ports (only for output ports)
+ */
+Port.prototype.set = Port.prototype.setValue = function (v)
+{
+    if (v === undefined) v = null;
+
+    if (this._op.enabled && !this.crashed)
+    {
+        if (v !== this.value || this.changeAlways || this.type == CONSTANTS.OP.OP_PORT_TYPE_TEXTURE || this.type == CONSTANTS.OP.OP_PORT_TYPE_ARRAY)
+        {
+            if (this._animated)
+            {
+                this.anim.setValue(this._op.patch.timer.getTime(), v);
+            }
+            else
+            {
+                try
+                {
+                    this.value = v;
+                    this.forceChange();
+                }
+                catch (ex)
+                {
+                    this.crashed = true;
+                    this.op.crashed = true;
+
+                    console.log("crash", this.op.objName);
+
+                    this.setValue = function (_v) {};
+                    this.onTriggered = function () {};
+
+                    this._log.error("onvaluechanged exception cought", ex);
+                    this._log.error(ex.stack);
+                    this._log.warn("exception in: " + this._op.name);
+
+                    if (this._op.patch.isEditorMode()) gui.showOpCrash(this._op);
+
+                    this._op.patch.emitEvent("exception", ex, this._op);
+                    if (this._op.onError) this._op.onError(ex);
+                }
+
+                if (this._op && this._op.patch && this._op.patch.isEditorMode() && this.type == CONSTANTS.OP.OP_PORT_TYPE_TEXTURE) gui.texturePreview().updateTexturePort(this);
+            }
+
+            if (this.direction == CONSTANTS.PORT.PORT_DIR_OUT) for (let i = 0; i < this.links.length; ++i) this.links[i].setValue();
+        }
+    }
+};
+
+Port.prototype.updateAnim = function ()
+{
+    if (this._animated)
+    {
+        this.value = this.get();
+
+        if (this._oldAnimVal != this.value || this.changeAlways)
+        {
+            this._oldAnimVal = this.value;
+            this.forceChange();
+        }
+        this._oldAnimVal = this.value;
+    }
+};
+
+Port.prototype.forceChange = function ()
+{
+    if (this.onValueChanged || this.onChange)
+    {
+        // very temporary: deprecated warning!!!!!!!!!
+        // if(params.length>0) this._log.warn('TOM: port has onchange params!',this._op.objName,this.name);
+    }
+    this._activity();
+    this.emitEvent("change", this.value, this);
+
+    if (this.onChange) this.onChange(this, this.value);
+    else if (this.onValueChanged) this.onValueChanged(this, this.value); // deprecated
+};
+
+/**
+ * @function getTypeString
+ * @memberof Port
+ * @instance
+ * @description get port type as string, e.g. "Function","Value"...
+ * @return {String} type
+ */
+Port.prototype.getTypeString = function ()
+{
+    if (this.type == CONSTANTS.OP.OP_PORT_TYPE_VALUE) return "Number";
+    if (this.type == CONSTANTS.OP.OP_PORT_TYPE_FUNCTION) return "Trigger";
+    if (this.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT) return "Object";
+    if (this.type == CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC) return "Dynamic";
+    if (this.type == CONSTANTS.OP.OP_PORT_TYPE_ARRAY) return "Array";
+    if (this.type == CONSTANTS.OP.OP_PORT_TYPE_STRING) return "String";
+    return "Unknown";
+};
+
+Port.prototype.deSerializeSettings = function (objPort)
+{
+    if (!objPort) return;
+    if (objPort.animated) this.setAnimated(objPort.animated);
+    if (objPort.useVariable) this.setVariableName(objPort.useVariable);
+    if (objPort.title) this.setUiAttribs({ "title": objPort.title });
+    if (objPort.expose) this.setUiAttribs({ "expose": true });
+    if (objPort.order) this.setUiAttribs({ "order": objPort.order });
+    if (objPort.multiPortNum) this.setUiAttribs({ "multiPortNum": objPort.multiPortNum });
+
+    if (objPort.anim)
+    {
+        if (!this.anim) this.anim = new Anim({ "name": "port " + this.name });
+        this._op._hasAnimPort = true;
+        this.anim.addEventListener("onChange", () =>
+        {
+            this._op.patch.emitEvent("portAnimUpdated", this._op, this, this.anim);
+        });
+        if (objPort.anim.loop) this.anim.loop = objPort.anim.loop;
+        for (const ani in objPort.anim.keys)
+        {
+            this.anim.keys.push(new ANIM.Key(objPort.anim.keys[ani]));
+        }
+        this.anim.sortKeys();
+    }
+};
+
+Port.prototype.setInitialValue = function (v)
+{
+    if (this.op.preservedPortLinks[this.name])
+    {
+        for (let i = 0; i < this.op.preservedPortLinks[this.name].length; i++)
+        {
+            const lobj = this.op.preservedPortLinks[this.name][i];
+            this.op.patch._addLink(
+                lobj.objIn,
+                lobj.objOut,
+                lobj.portIn,
+                lobj.portOut);
+        }
+    }
+
+    if (this.op.preservedPortValues && this.op.preservedPortValues.hasOwnProperty(this.name) && this.op.preservedPortValues[this.name] !== undefined)
+    {
+        this.set(this.op.preservedPortValues[this.name]);
+    }
+    else
+    if (v !== undefined) this.set(v);
+    if (v !== undefined) this.defaultValue = v;
+};
+
+Port.prototype.getSerialized = function ()
+{
+    let obj = { "name": this.getName() };
+
+
+    if (!this.ignoreValueSerialize && this.links.length === 0)
+    {
+        if (this.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT && this.value && this.value.tex) {}
+        else obj.value = this.value;
+    }
+    if (this._useVariableName) obj.useVariable = this._useVariableName;
+    if (this._animated) obj.animated = true;
+    if (this.anim) obj.anim = this.anim.getSerialized();
+    if (this.uiAttribs.multiPortNum) obj.multiPortNum = this.uiAttribs.multiPortNum;
+    if (this.uiAttribs.display == "file") obj.display = this.uiAttribs.display;
+    if (this.uiAttribs.expose)
+    {
+        obj.expose = true;
+        if (this.uiAttribs.hasOwnProperty("order")) obj.order = this.uiAttribs.order;
+    }
+    if (this.uiAttribs.title) obj.title = this.uiAttribs.title;
+    if ((this.preserveLinks || this.direction == CONSTANTS.PORT.PORT_DIR_OUT) && this.links.length > 0)
+    {
+        obj.links = [];
+        for (const i in this.links)
+        {
+            if (!this.links[i].ignoreInSerialize && (this.links[i].portIn && this.links[i].portOut)) obj.links.push(this.links[i].getSerialized());
+        }
+    }
+
+    if (this.direction == CONSTANTS.PORT.PORT_DIR_IN && this.links.length > 0)
+    {
+        for (const i in this.links)
+        {
+            if (!this.links[i].portIn || !this.links[i].portOut) continue;
+
+            const otherp = this.links[i].getOtherPort(this);
+            // check if functions exist, are defined in core_extend_ops code in ui
+            if (otherp.op.isInBlueprint2 && this.op.isInBlueprint2)
+            {
+                if (otherp.op.isInBlueprint2() && !this.op.isInBlueprint2())
+                {
+                    obj.links = obj.links || [];
+                    obj.links.push(this.links[i].getSerialized());
+                }
+            }
+        }
+    }
+
+    if (obj.links && obj.links.length == 0) delete obj.links;
+    if (this.type === CONSTANTS.OP.OP_PORT_TYPE_FUNCTION) delete obj.value;
+    if (this.type === CONSTANTS.OP.OP_PORT_TYPE_FUNCTION && this.links.length == 0) obj = null;
+    if (obj && Object.keys(obj).length == 1 && obj.name)obj = null; // obj is null if there is no real information other than name
+    cleanJson(obj);
+
+    return obj;
+};
+
+Port.prototype.shouldLink = function ()
+{
+    return true;
+};
+
+/**
+ * @function removeLinks
+ * @memberof Port
+ * @instance
+ * @description remove all links from port
+ */
+Port.prototype.removeLinks = function ()
+{
+    let count = 0;
+    while (this.links.length > 0)
+    {
+        count++;
+        if (count > 5000)
+        {
+            this._log.warn("could not delete links... / infinite loop");
+            this.links.length = 0;
+            break;
+        }
+        this.links[0].remove();
+    }
+};
+
+/**
+ * @function removeLink
+ * @memberof Port
+ * @instance
+ * @description remove all link from port
+ * @param {CABLES.Link} link
+ */
+Port.prototype.removeLink = function (link)
+{
+    for (const i in this.links)
+        if (this.links[i] == link)
+            this.links.splice(i, 1);
+
+    if (this.direction == CONSTANTS.PORT.PORT_DIR_IN)
+    {
+        if (this.type == CONSTANTS.OP.OP_PORT_TYPE_VALUE) this.setValue(this._valueBeforeLink || 0);
+        else this.setValue(this._valueBeforeLink || null);
+    }
+
+    if (CABLES.UI && this._op.checkLinkTimeWarnings) this._op.checkLinkTimeWarnings();
+
+    if (this.onLinkChanged) this.onLinkChanged();
+    this.emitEvent("onLinkChanged");
+    this._op.emitEvent("onLinkChanged");
+};
+
+/**
+ * @function getName
+ * @memberof Port
+ * @instance
+ * @description return port name
+ */
+Port.prototype.getName = function ()
+{
+    return this.name;
+};
+
+/**
+ * @function getTitle
+ * @memberof Port
+ * @instance
+ * @description return port name or title
+ */
+Port.prototype.getTitle = function ()
+{
+    if (this.uiAttribs.title) return this.uiAttribs.title;
+    return this.name;
+};
+
+Port.prototype.addLink = function (l)
+{
+    this._valueBeforeLink = this.value;
+    this.links.push(l);
+    if (CABLES.UI && this._op.checkLinkTimeWarnings) this._op.checkLinkTimeWarnings();
+
+    if (this.onLinkChanged) this.onLinkChanged();
+    this.emitEvent("onLinkChanged");
+    this._op.emitEvent("onLinkChanged");
+};
+
+/**
+ * @function getLinkTo
+ * @memberof Port
+ * @instance
+ * @param {Port} otherPort
+ * @description return link, which is linked to otherPort
+ */
+Port.prototype.getLinkTo = function (p2)
+{
+    for (const i in this.links) if (this.links[i].portIn == p2 || this.links[i].portOut == p2) return this.links[i];
+};
+
+/**
+ * @function removeLinkTo
+ * @memberof Port
+ * @instance
+ * @param {Port} otherPort
+ * @description removes link, which is linked to otherPort
+ */
+Port.prototype.removeLinkTo = function (p2)
+{
+    for (const i in this.links)
+    {
+        if (this.links[i].portIn == p2 || this.links[i].portOut == p2)
+        {
+            this.links[i].remove();
+            if (CABLES.UI && this._op.checkLinkTimeWarnings) this._op.checkLinkTimeWarnings();
+
+            if (this.onLinkChanged) this.onLinkChanged();
+            this.emitEvent("onLinkChanged");
+            return;
+        }
+    }
+};
+
+/**
+ * @function isLinkedTo
+ * @memberof Port
+ * @instance
+ * @param {Port} otherPort
+ * @description returns true if port is linked to otherPort
+ */
+Port.prototype.isLinkedTo = function (p2)
+{
+    for (const i in this.links) if (this.links[i].portIn == p2 || this.links[i].portOut == p2) return true;
+
+    return false;
+};
+
+Port.prototype._activity = function ()
+{
+    this.activityCounter++;
+};
+
+/**
+ * @function trigger
+ * @memberof Port
+ * @instance
+ * @description trigger the linked port (usually invoked on an output function port)
+ */
+Port.prototype.trigger = function ()
+{
+    const linksLength = this.links.length;
+
+    this._activity();
+    if (linksLength === 0) return;
+    if (!this._op.enabled) return;
+
+    let portTriggered = null;
+    try
+    {
+        for (let i = 0; i < linksLength; ++i)
+        {
+            if (this.links[i].portIn)
+            {
+                portTriggered = this.links[i].portIn;
+
+                portTriggered.op.patch.pushTriggerStack(portTriggered);
+                portTriggered._onTriggered();
+
+                portTriggered.op.patch.popTriggerStack();
+            }
+            if (this.links[i]) this.links[i].activity();
+        }
+    }
+    catch (ex)
+    {
+        portTriggered.op.enabled = false;
+
+        if (this._op.patch.isEditorMode())
+        {
+            this._op.patch.emitEvent("exception", ex, portTriggered.op);
+            this._op.patch.emitEvent("opcrash", portTriggered);
+            console.log("crash", portTriggered.op.objName);
+
+            if (portTriggered.op.onError) portTriggered.op.onError(ex);
+        }
+        this._log.warn("exception!");
+        this._log.error("ontriggered exception caught", ex);
+        this._log.error(ex.stack);
+        this._log.warn("exception in: " + portTriggered.op.name);
+    }
+};
+
+Port.prototype.call = function ()
+{
+    this._log.warn("call deprecated - use trigger() ");
+    this.trigger();
+};
+
+Port.prototype.execute = function ()
+{
+    this._log.warn("### execute port: " + this.getName(), this.goals.length);
+};
+
+Port.prototype.setVariableName = function (n)
+{
+    this._useVariableName = n;
+
+
+    this._op.patch.on("variableRename", (oldname, newname) =>
+    {
+        if (oldname != this._useVariableName) return;
+        this._useVariableName = newname;
+    });
+};
+
+Port.prototype.getVariableName = function ()
+{
+    return this._useVariableName;
+};
+
+Port.prototype.setVariable = function (v)
+{
+    this.setAnimated(false);
+    const attr = { "useVariable": false };
+
+    if (this._variableIn && this._varChangeListenerId)
+    {
+        this._variableIn.off(this._varChangeListenerId);
+        this._variableIn = null;
+    }
+
+    if (v)
+    {
+        this._variableIn = this._op.patch.getVar(v);
+
+        if (!this._variableIn)
+        {
+            this._log.warn("PORT VAR NOT FOUND!!!", v);
+        }
+        else
+        {
+            if (this.type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT)
+            {
+                this._varChangeListenerId = this._variableIn.on("change", () => { this.set(null); this.set(this._variableIn.getValue()); });
+            }
+            else
+            {
+                this._varChangeListenerId = this._variableIn.on("change", this.set.bind(this));
+            }
+            this.set(this._variableIn.getValue());
+        }
+        this._useVariableName = v;
+        attr.useVariable = true;
+        attr.variableName = this._useVariableName;
+    }
+    else
+    {
+        attr.variableName = this._useVariableName = null;
+        attr.useVariable = false;
+    }
+
+    this.setUiAttribs(attr);
+    this._op.patch.emitEvent("portSetVariable", this._op, this, v);
+};
+
+Port.prototype._handleNoTriggerOpAnimUpdates = function (a)
+{
+    let hasTriggerPort = false;
+    for (let i = 0; i < this._op.portsIn.length; i++)
+    {
+        if (this._op.portsIn.type == CONSTANTS.OP.OP_PORT_TYPE_FUNCTION)
+        {
+            hasTriggerPort = true;
+            break;
+        }
+    }
+
+    if (!hasTriggerPort)
+    {
+        if (a) this._notriggerAnimUpdate = this._op.patch.on("onRenderFrame",
+            () =>
+            {
+                this.updateAnim();
+            });
+        else this._op.patch.removeEventListener(this._notriggerAnimUpdate);
+    }
+};
+
+Port.prototype.setAnimated = function (a)
+{
+    if (this._animated != a)
+    {
+        this._animated = a;
+        this._op._hasAnimPort = true;
+
+        if (this._animated && !this.anim)
+        {
+            this.anim = new Anim({ "name": "port " + this.name });
+            this.anim.addEventListener("onChange", () =>
+            {
+                this._op.patch.emitEvent("portAnimUpdated", this._op, this, this.anim);
+            });
+        }
+        this._onAnimToggle();
+    }
+
+    this._handleNoTriggerOpAnimUpdates(a);
+    if (!a)
+    {
+        this.anim = null;
+    }
+
+    this.setUiAttribs({ "isAnimated": this._animated });
+};
+
+Port.prototype.toggleAnim = function ()
+{
+    this._animated = !this._animated;
+    if (this._animated && !this.anim)
+    {
+        this.anim = new Anim({ "name": "port " + this.name });
+        this.anim.addEventListener("onChange", () =>
+        {
+            this._op.patch.emitEvent("portAnimUpdated", this._op, this, this.anim);
+        });
+    }
+    this.setAnimated(this._animated);
+    this._onAnimToggle();
+    this.setUiAttribs({ "isAnimated": this._animated });
+};
+
+/**
+ * <pre>
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_VALUE = 0;
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_FUNCTION = 1;
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_OBJECT = 2;
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_TEXTURE = 2;
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_ARRAY = 3;
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC = 4;
+ * CABLES.CONSTANTS.OP.OP_PORT_TYPE_STRING = 5;
+ * </pre>
+ * @function getType
+ * @memberof Port
+ * @instance
+ * @return {Number} type of port
+ */
+Port.prototype.getType = function ()
+{
+    return this.type;
+};
+
+/**
+ * @function isLinked
+ * @memberof Port
+ * @instance
+ * @return {Boolean} true if port is linked
+ */
+Port.prototype.isLinked = function ()
+{
+    return this.links.length > 0 || this._animated || this._useVariableName != null;
+};
+
+Port.prototype.isBoundToVar = function ()
+{
+    const b = this._useVariableName != null;
+    this.uiAttribs.boundToVar = b;
+    return b;
+};
+/**
+ * @function isAnimated
+ * @memberof Port
+ * @instance
+ * @return {Boolean} true if port is animated
+ */
+Port.prototype.isAnimated = function ()
+{
+    return this._animated;
+};
+
+/**
+ * @function isHidden
+ * @memberof Port
+ * @instance
+ * @return {Boolean} true if port is hidden
+ */
+Port.prototype.isHidden = function ()
+{
+    return this.uiAttribs.hidePort;
+};
+
+/**
+ * @function onTriggered
+ * @memberof Port
+ * @instance
+ * @param {onTriggeredCallback} callback
+ * @description set callback, which will be executed when port was triggered (usually output port)
+ */
+Port.prototype._onTriggered = function (a)
+{
+    this._activity();
+    this._op.updateAnims();
+    if (this._op.enabled && this.onTriggered) this.onTriggered(a);
+};
+
+Port.prototype._onSetProfiling = function (v)
+{
+    this._op.patch.profiler.add("port", this);
+    this.setValue(v);
+    this._op.patch.profiler.add("port", null);
+};
+
+Port.prototype._onTriggeredProfiling = function ()
+{
+    if (this._op.enabled && this.onTriggered)
+    {
+        this._op.patch.profiler.add("port", this);
+        this.onTriggered();
+        this._op.patch.profiler.add("port", null);
+    }
+};
+
+
+
+Port.prototype.getUiActiveState = function ()
+{
+    return this._uiActiveState;
+};
+
+Port.prototype.setUiActiveState = function (onoff)
+{
+    this._uiActiveState = onoff;
+    if (this.onUiActiveStateChange) this.onUiActiveStateChange();
+};
+
+/**
+ * @deprecated
+ */
+Port.prototype.onValueChange = function (cb)
+{
+    this.onChange = cb;
+};
+
+/**
+ * @deprecated
+ */
+Port.prototype.hidePort = function () {};
+
+
+/**
+ * Returns the port type string, e.g. "value" based on the port type number
+ * @function portTypeNumberToString
+ * @instance
+ * @memberof Port
+ * @param {Number} type - The port type number
+ * @returns {String} - The port type as string
+ */
+Port.portTypeNumberToString = function (type)
+{
+    if (type == CONSTANTS.OP.OP_PORT_TYPE_VALUE) return "value";
+    if (type == CONSTANTS.OP.OP_PORT_TYPE_FUNCTION) return "function";
+    if (type == CONSTANTS.OP.OP_PORT_TYPE_OBJECT) return "object";
+    if (type == CONSTANTS.OP.OP_PORT_TYPE_ARRAY) return "array";
+    if (type == CONSTANTS.OP.OP_PORT_TYPE_STRING) return "string";
+    if (type == CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC) return "dynamic";
+    return "unknown";
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_port_switch.js
+
+
+
+
+class SwitchPort extends Port
+{
+    constructor(__parent, name, type, uiAttribs, indexPort)
+    {
+        super(__parent, name, type, uiAttribs);
+
+        this.get = () =>
+        {
+            let s = super.get();
+
+            if (CABLES.UI)
+            {
+                if (
+                    s === "" ||
+                    s === null ||
+                    s === undefined ||
+                    (uiAttribs.values && uiAttribs.values.indexOf(String(s)) === -1)
+                )
+                {
+                    this.op.setUiError("invalidswitch", "Invalid Value [" + this.name + "]: \"" + s + "\"");
+                }
+                else this.op.setUiError("invalidswitch", null);
+            }
+
+            if (s === null || s === undefined)s = "";
+
+            return s;
+        };
+
+        this.indexPort = indexPort;
+        this.indexPort.set = (value) =>
+        {
+            const values = uiAttribs.values;
+
+            if (!values)
+            {
+                // console.log("switch port has no values", this);
+                return;
+            }
+
+            let intValue = Math.floor(value);
+
+            intValue = Math.min(intValue, values.length - 1);
+            intValue = Math.max(intValue, 0);
+
+            this.indexPort.setValue(intValue);
+            this.set(values[intValue]);
+
+            if (this.op.patch.isEditorMode() && performance.now() - (this.lastTime || 0) > 100 && window.gui && gui.patchView.isCurrentOp(this.op))
+            {
+                gui.opParams.show(this.op);
+                this.lastTime = performance.now();
+            }
+        };
+    }
+
+    setUiAttribs(attribs)
+    {
+        const hidePort = attribs.hidePort;
+        attribs.hidePort = true;
+        super.setUiAttribs(attribs);
+        if (typeof hidePort !== "undefined")
+        {
+            this.indexPort.setUiAttribs({ hidePort });
+        }
+    }
+}
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_port_select.js
+
+
+
+
+class ValueSelectPort extends SwitchPort
+{
+    setUiAttribs(newAttribs)
+    {
+        // never unhide valuePort when indexPort is linked
+        if (this.indexPort.isLinked())
+        {
+            for (const p in newAttribs)
+            {
+                if (p == "greyout" && !newAttribs[p]) newAttribs[p] = "true";
+            }
+        }
+        super.setUiAttribs(newAttribs);
+    }
+}
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_port_multi.js
+
+
+
+const MIN_NUM_PORTS = 2;
+
+class MultiPort extends Port
+{
+    constructor(__parent, name, type, dir, uiAttribs)
+    {
+        super(__parent, name, CONSTANTS.OP.OP_PORT_TYPE_ARRAY, uiAttribs);
+
+        this.uiAttribs.multiPortNum = this.uiAttribs.multiPortNum || MIN_NUM_PORTS;
+        this.setUiAttribs({ "multiPort": true, "group": this.name, "order": -1 });
+        this.ports = [];
+        this.direction = dir;
+
+        const updateArray = () =>
+        {
+            const arr = [];
+            for (let i = 0; i < this.ports.length - 1; i++)
+            {
+                arr[i] = this.ports[i];
+            }
+
+            this.setRef(arr);
+        };
+
+
+
+
+
+        const updateUi = () =>
+        {
+            for (let i = 0; i < this.ports.length; i++)
+            {
+                let lp; // undefined to remove/not set it
+                let opacity;// undefined to remove/not set it
+                let grey;// undefined to remove/not set it
+
+                if (!this.uiAttribs.editable)grey = true;
+                if (i == 0) lp = this.ports.length;
+                if (i == this.ports.length - 1)
+                {
+                    opacity = 0.2;
+                    grey = true;
+                }
+
+                this.ports[i].setUiAttribs({ "longPort": lp, "opacity": opacity, "greyout": grey, "group": this.name });
+            }
+        };
+
+        this.removeInvalidPorts = () =>
+        {
+            for (let i = 0; i < this.ports.length; i++)
+            {
+                if (!this.ports[i]) this.ports.splice(i, 1);
+            }
+        };
+
+        this.countPorts = () =>
+        {
+            if (gui.patchView.patchRenderer.isDraggingPort())
+            {
+                clearTimeout(this.retryTo);
+                this.retryTo = setTimeout(this.countPorts.bind(this));
+                return;
+            }
+            this.retryTo = null;
+
+            let redo = false;
+            this.removeListeners();
+            this.removeInvalidPorts();
+
+            for (let i = 0; i < this.ports.length; i++)
+            {
+                if (this.ports[i] && this.ports[i].links.length > 1)
+                {
+                    const po = this.ports[i + 1];
+                    const otherPort = this.ports[i].links[0].getOtherPort(this.ports[i]);
+                    this.ports[i].links[0].remove();
+                    this.op.patch.link(this.op, po.name, otherPort.op, otherPort.name);
+                    redo = true;
+                    break;
+                }
+            }
+
+
+            let foundHole = true;
+            if (!this.uiAttribs.editable)
+                while (foundHole)
+                {
+                    foundHole = false;
+                    for (let i = this.ports.length - 1; i > 0; i--)
+                    {
+                        if (this.ports[i] && this.ports[i].links.length > 0 && this.ports[i - 1].links.length == 0)
+                        {
+                            console.log("found hole!");
+                            // found hole
+
+                            const otherPort = this.ports[i].links[0].getOtherPort(this.ports[i]);
+                            this.ports[i].links[0].remove();
+
+                            const po = this.ports[i - 1];
+
+                            if (po && this.ports[i])
+                            {
+                                console.log("move ", this.ports[i].name, "to", po.name);
+
+                                this.op.patch.link(this.op, po.name, otherPort.op, otherPort.name);
+                                foundHole = true;
+                                redo = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+
+            if (this.ports.length > 2)
+            {
+                let i = this.ports.length - 1;
+                if (!this.uiAttribs.editable)
+                {
+                    if (this.ports[i].links.length == 0 && this.ports[i - 1].links.length == 0)
+                    {
+                        this.ports[i].remove();
+                        this.ports[i] = null;
+                    }
+                }
+            }
+            this.removeInvalidPorts();
+
+            if (this.ports[this.ports.length - 1].isLinked()) this.newPort();
+
+            updateArray();
+            updateUi();
+
+            if (redo) this.countPorts();
+            else this.addListeners();
+        };
+
+        this.removeListeners = () =>
+        {
+            for (let i = 0; i < this.ports.length; i++)
+            {
+                const po = this.ports[i];
+                po.multiPortChangeListener = po.off(po.multiPortChangeListener);
+                po.multiLinkChangeListener = po.off(po.multiLinkChangeListener);
+            }
+        };
+
+        this.addListeners = () =>
+        {
+            for (let i = 0; i < this.ports.length; i++)
+            {
+                const po = this.ports[i];
+
+                if (po.multiPortChangeListener)po.multiPortChangeListener = po.off(po.multiPortChangeListener);
+                po.multiPortChangeListener = po.on("change", updateArray.bind(this));
+
+                if (po.multiPortTriggerListener)po.multiPortTriggerListener = po.off(po.multiPortTriggerListener);
+                po.multiPortTriggerListener = po.on("trigger", this.trigger());
+
+
+                if (po.multiLinkChangeListener)po.multiLinkChangeListener = po.off(po.multiLinkChangeListener);
+                po.multiLinkChangeListener = po.on("onLinkChanged", this.countPorts.bind(this));
+            }
+        };
+
+        this.newPort = () =>
+        {
+            const attrs = {};
+            if (type == CABLES.OP_PORT_TYPE_STRING) attrs.type = "string";
+            const po = new Port(this.op, name + "_" + this.ports.length, type, attrs);
+
+            po.direction = dir;
+            this.ports.push(po);
+            console.log("CONSTANTS.PORT_DIR_OUT", CONSTANTS.PORT.PORT_DIR_OUT, this.direction);
+            if (this.direction == CONSTANTS.PORT.PORT_DIR_OUT) this.op.addOutPort(po);
+            else this.op.addInPort(po);
+
+            po.setInitialValue("");
+            this.addListeners();
+
+            updateUi();
+            return po;
+        };
+
+        this.initPorts = () =>
+        {
+            for (let i = 0; i < 2; i++) this.newPort();
+            updateArray();
+            updateUi();
+        };
+
+        this.checkNum = () =>
+        {
+            if (MIN_NUM_PORTS != this.uiAttribs.multiPortNum) this.setUiAttribs({ "editable": true });
+
+            this.uiAttribs.multiPortNum = Math.max(MIN_NUM_PORTS, this.uiAttribs.multiPortNum);
+
+            while (this.ports.length < this.uiAttribs.multiPortNum) this.newPort();
+            while (this.ports.length > this.uiAttribs.multiPortNum) if (this.ports[this.ports.length - 1]) this.ports.pop().remove();
+
+            this.removeInvalidPorts();
+        };
+
+        this.incDec = (incDir) =>
+        {
+            this.setUiAttribs({ "multiPortNum": this.uiAttribs.multiPortNum + incDir });
+            this.checkNum();
+            this.setUiAttribs({ "editable": true });
+            updateUi();
+        };
+
+        this.on("onUiAttrChange", this.checkNum.bind(this));
+        this.checkNum();
+    }
+}
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_op.js
+
+
+
+
+
+
+
+
+
+/**
+ * op the class of all operators
+ * @external CABLES
+ * @namespace Op
+ * @hideconstructor
+ */
+
+/**
+ * @type {Object}
+ * @name attachments
+ * @instance
+ * @memberof Op
+ * @description access file attachments as String values
+ * @example
+ * // set shader source to attached files (files are called shader.vert / shader.frag)
+ * shader.setSource(attachments.shader_vert,attachments.shader_frag);
+ */
+
+const Ops = {};
+
+const Op = function ()
+{
+    EventTarget.apply(this);
+
+    this._log = new Logger("core_op");
+    this.data = {}; // UNUSED, DEPRECATED, only left in for backwards compatibility with userops
+    this.storage = {}; // op-specific data to be included in export
+    this._objName = "";
+    this.portsOut = [];
+    this.portsIn = [];
+    this.portsInData = []; // original loaded patch data
+    this.opId = ""; // unique op id
+    this.uiAttribs = {};
+    this.enabled = true;
+    this.patch = arguments[0];
+    this.name = arguments[1];
+    this.preservedPortValues = {};
+    this.preservedPortLinks = {};
+
+    this._linkTimeRules = {
+        "needsLinkedToWork": [],
+        "needsParentOp": null
+    };
+
+    this.shouldWork = {};
+    this.hasUiErrors = false;
+    this._uiErrors = {};
+    this._hasAnimPort = false;
+
+    if (arguments[1])
+    {
+        this._shortOpName = CABLES.getShortOpName(arguments[1]);
+        this.getTitle();
+    }
+
+    this.id = arguments[2] || shortId(); // instance id
+    this.onAddPort = null;
+    this.onCreate = null;
+    this.onResize = null;
+    this.onLoaded = null;
+    this.onDelete = null;
+    this.onUiAttrChange = null;
+    this.onError = null;
+
+    this._instances = null;
+
+    /**
+     * overwrite this to prerender shader and meshes / will be called by op `loadingStatus`
+     * @function preRender
+     * @memberof Op
+     * @instance
+     */
+    this.preRender = null;
+
+    /**
+     * overwrite this to initialize your op
+     * @function init
+     * @memberof Op
+     * @instance
+     */
+    this.init = null;
+
+    Object.defineProperty(this, "objName", { get() { return this._objName; } });
+    Object.defineProperty(this, "shortName", { get() { return this._shortOpName; } });
+
+    if (this.initUi) this.initUi();
+};
+
+{
+    Op.prototype.clearUiAttrib = function (name)
+    {
+        const obj = {};
+        obj.name = null;
+        this.uiAttrib(obj);
+    };
+
+    Op.prototype.checkMainloopExists = function ()
+    {
+        if (!CABLES.UI) return;
+        if (!this.patch.cgl.mainloopOp) this.setUiError("nomainloop", "patch should have a mainloop to use this op");
+        else this.setUiError("nomainloop", null);
+    };
+
+    Op.prototype.getTitle = function ()
+    {
+        if (!this.uiAttribs) return "nouiattribs" + this.name;
+
+        if ((this.uiAttribs.title === undefined || this.uiAttribs.title === "") && this.objName.indexOf("Ops.Ui.") == -1)
+            this.uiAttribs.title = this._shortOpName;
+
+        if (this.uiAttribs.title === undefined) this.uiAttribs.title = this._shortOpName;
+
+        return this.uiAttribs.title;
+    };
+
+    Op.prototype.setTitle = function (name)
+    {
+        const doEmitEvent = this.name != name;
+        this.name = name;
+
+        if (this.uiAttribs.title != name) this.uiAttr({ "title": name });
+        if (doEmitEvent) this.emitEvent("onTitleChange", name);
+    };
+
+    Op.prototype.setStorage = function (newAttribs)
+    {
+        if (!newAttribs) return;
+        this.storage = this.storage || {};
+
+        let changed = false;
+        for (const p in newAttribs)
+        {
+            if (this.storage[p] != newAttribs[p]) changed = true;
+            this.storage[p] = newAttribs[p];
+        }
+
+        if (changed) this.emitEvent("onStorageChange", newAttribs);
+    };
+
+    Op.prototype.isSubPatchOp = function ()
+    {
+        if (this.storage) return (this.storage.subPatchVer || 0);
+    };
+
+    const _setUiAttrib = function (newAttribs)
+    {
+        if (!newAttribs) return;
+
+        if (newAttribs.error || newAttribs.warning || newAttribs.hint)
+        {
+            this._log.warn("old ui error/warning attribute in " + this.name + ", use op.setUiError !", newAttribs);
+        }
+
+
+
+        if (typeof newAttribs != "object") this._log.error("op.uiAttrib attribs are not of type object");
+        if (!this.uiAttribs) this.uiAttribs = {};
+
+
+        let emitMove = false;
+        if (
+            CABLES.UI &&
+            newAttribs.hasOwnProperty("translate") &&
+            (
+                !this.uiAttribs.translate ||
+                this.uiAttribs.translate.x != newAttribs.translate.x ||
+                this.uiAttribs.translate.y != newAttribs.translate.y
+            )) emitMove = true;
+
+
+        if (newAttribs.hasOwnProperty("disabled"))
+        {
+            this.setEnabled(!newAttribs.disabled);
+        }
+
+        let changed = false;
+        for (const p in newAttribs)
+        {
+            if (this.uiAttribs[p] != newAttribs[p]) changed = true;
+            this.uiAttribs[p] = newAttribs[p];
+        }
+
+        if (this.uiAttribs.hasOwnProperty("selected") && this.uiAttribs.selected == false) delete this.uiAttribs.selected;
+        if (newAttribs.title && newAttribs.title != this.name) this.setTitle(newAttribs.title);
+
+        if (changed)
+        {
+            this.emitEvent("onUiAttribsChange", newAttribs);
+            this.patch.emitEvent("onUiAttribsChange", this, newAttribs);
+        }
+
+
+        if (emitMove) this.emitEvent("move");
+    };
+    /**
+     * setUiAttrib
+     * possible values:
+     * <pre>
+     * warning - warning message - showing up in op parameter panel
+     * error - error message - showing up in op parameter panel
+     * extendTitle - op title extension, e.g. [ + ]
+     * </pre>
+     * @function setUiAttrib
+     * @param {Object} newAttribs, e.g. {"attrib":value}
+     * @memberof Op
+     * @instance
+     * @example
+     * op.setUiAttrib({"extendTitle":str});
+     */
+    Op.prototype.setUiAttribs = Op.prototype.setUiAttrib = Op.prototype.uiAttr = _setUiAttrib;
+
+    Op.prototype.getName = function ()
+    {
+        if (this.uiAttribs.name) return this.uiAttribs.name;
+        return this.name;
+    };
+
+    Op.prototype.addOutPort = function (p)
+    {
+        p.direction = CONSTANTS.PORT.PORT_DIR_OUT;
+        p._op = this;
+        this.portsOut.push(p);
+        this.emitEvent("onPortAdd", p);
+        return p;
+    };
+
+    Op.prototype.hasDynamicPort = function ()
+    {
+        let i = 0;
+        for (i = 0; i < this.portsIn.length; i++)
+        {
+            if (this.portsIn[i].type == CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC) return true;
+            if (this.portsIn[i].getName() == "dyn") return true;
+        }
+        for (i = 0; i < this.portsOut.length; i++)
+        {
+            if (this.portsOut[i].type == CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC) return true;
+            if (this.portsOut[i].getName() == "dyn") return true;
+        }
+
+        return false;
+    };
+
+    Op.prototype.addInPort = function (p)
+    {
+        if (!(p instanceof Port)) throw new Error("parameter is not a port!");
+
+        p.direction = CONSTANTS.PORT.PORT_DIR_IN;
+        p._op = this;
+
+        this.portsIn.push(p);
+        this.emitEvent("onPortAdd", p);
+
+        return p;
+    };
+
+    /**
+     * create a trigger input port
+     * @function inTrigger
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     *
+     */
+    Op.prototype.inFunction = Op.prototype.inTrigger = function (name, v)
+    {
+        const p = this.addInPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_FUNCTION));
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+    /**
+     * create multiple UI trigger buttons
+     * @function inTriggerButton
+     * @memberof Op
+     * @instance
+     * @param {String} name
+     * @param {Array} names
+     * @return {Port} created port
+     */
+    Op.prototype.inFunctionButton = Op.prototype.inTriggerButton = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_FUNCTION, {
+                "display": "button"
+            })
+        );
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+    Op.prototype.inFunctionButton = Op.prototype.inUiTriggerButtons = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_FUNCTION, {
+                "display": "buttons"
+            })
+        );
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+
+
+    /**
+     * create a number value input port
+     * @function inFloat
+     * @memberof Op
+     * @instance
+     * @param {String} name
+     * @param {Number} value
+     * @return {Port} created port
+     */
+    Op.prototype.inValueFloat = Op.prototype.inValue = Op.prototype.inFloat = function (name, v)
+    {
+        const p = this.addInPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE));
+
+        p.setInitialValue(v);
+
+        return p;
+    };
+
+    /**
+     * create a boolean input port, displayed as a checkbox
+     * @function inBool
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {Boolean} value
+     * @return {Port} created port
+     */
+    Op.prototype.inValueBool = Op.prototype.inBool = function (name, v)
+    {
+        // old
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_NUMBER, {
+                "display": "bool"
+            })
+        );
+        // if (v !== undefined)
+        // {
+        p.setInitialValue(v);
+        // p.set(v);
+        // p.defaultValue = p.get();
+        // }
+
+        return p;
+    };
+
+
+    Op.prototype.inMultiPort = function (name, type)
+    {
+        const p = new MultiPort(
+            this,
+            name,
+            type,
+            CONSTANTS.PORT_DIR_IN,
+            {
+                "display": "multiport",
+                "hidePort": true
+            }
+        );
+        p.ignoreValueSerialize = true;
+
+        this.addInPort(p);
+        p.initPorts();
+
+        return p;
+    };
+
+    Op.prototype.outMultiPort = function (name, type)
+    {
+        const p = new MultiPort(
+            this,
+            name,
+            type,
+            CONSTANTS.PORT.PORT_DIR_OUT,
+            {
+                "display": "multiport",
+                "hidePort": true
+            }
+        );
+        p.ignoreValueSerialize = true;
+
+        this.addOutPort(p);
+        p.initPorts();
+
+        return p;
+    };
+
+
+
+    Op.prototype.inValueString = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "type": "string"
+            })
+        );
+        p.value = "";
+
+        p.setInitialValue(v);
+        return p;
+    };
+
+    /**
+     * create a String value input port
+     * @function inString
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {String} value default value
+     * @return {Port} created port
+     */
+    Op.prototype.inString = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_STRING, {
+                "type": "string"
+            })
+        );
+        v = v || "";
+        // p.value = v;
+
+        p.setInitialValue(v);
+        return p;
+    };
+
+    /**
+     * create a String value input port displayed as TextArea
+     * @function inValueText
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {String} value default value
+     * @return {Port} created port
+     */
+    Op.prototype.inValueText = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "type": "string",
+                "display": "text"
+            })
+        );
+        p.value = "";
+
+        p.setInitialValue(v);
+        // if (v !== undefined)
+        // {
+        //     p.set(v);
+        //     p.defaultValue = v;
+        // }
+        return p;
+    };
+
+    Op.prototype.inTextarea = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_STRING, {
+                "type": "string",
+                "display": "text"
+            })
+        );
+        p.value = "";
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    /**
+     * create a String value input port displayed as editor
+     * @function inStringEditor
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {String} value default value
+     * @return {Port} created port
+     */
+    // new string
+    Op.prototype.inStringEditor = function (name, v, syntax, hideFormatButton = true)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_STRING, {
+                "type": "string",
+                "display": "editor",
+                "editShortcut": true,
+                "editorSyntax": syntax,
+                "hideFormatButton": hideFormatButton
+            }));
+
+        p.value = "";
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    // old
+    Op.prototype.inValueEditor = function (name, v, syntax, hideFormatButton = true)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_NUMBER, {
+                "type": "string",
+                "display": "editor",
+                "editorSyntax": syntax,
+                "hideFormatButton": hideFormatButton
+            })
+        );
+        p.value = "";
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    /**
+     * create a string select box
+     * @function inDropDown
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {Array} values
+     * @param {String} value default value
+     * @return {Port} created port
+     */
+    Op.prototype.inValueSelect = Op.prototype.inDropDown = function (name, values, v, noindex)
+    {
+        let p = null;
+        if (!noindex)
+        {
+            const indexPort = new Port(this, name + " index", CONSTANTS.OP.OP_PORT_TYPE_NUMBER, {
+                "increment": "integer",
+                "hideParam": true
+            });
+            const n = this.addInPort(indexPort);
+
+            if (values) for (let i = 0; i < values.length; i++) values[i] = String(values[i]);
+
+            const valuePort = new ValueSelectPort(
+                this,
+                name,
+                CONSTANTS.OP.OP_PORT_TYPE_NUMBER,
+                {
+                    "display": "dropdown",
+                    "hidePort": true,
+                    "type": "string",
+                    "values": values
+                },
+                n
+            );
+
+            valuePort.indexPort = indexPort;
+
+            valuePort.on("change", (val, thePort) =>
+            {
+                if (!thePort.indexPort.isLinked() && thePort.uiAttribs.values)
+                {
+                    const idx = thePort.uiAttribs.values.indexOf(val);
+                    if (idx > -1) thePort.indexPort.set(idx);
+                }
+            });
+
+            indexPort.onLinkChanged = function ()
+            {
+                valuePort.setUiAttribs({ "greyout": indexPort.isLinked() });
+            };
+
+            p = this.addInPort(valuePort);
+
+            if (v !== undefined)
+            {
+                p.set(v);
+                const index = values.findIndex((item) => { return item == v; });
+                n.setValue(index);
+                p.defaultValue = v;
+                n.defaultValue = index;
+            }
+        }
+        else
+        {
+            const valuePort = new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "display": "dropdown",
+                "hidePort": true,
+                "type": "string",
+                values
+            });
+
+            p = this.addInPort(valuePort);
+        }
+
+        return p;
+    };
+
+    /**
+     * create a string switch box
+     * @function inSwitch
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {Array} values
+     * @param {String} value default value
+     * @return {Port} created port
+     */
+    Op.prototype.inSwitch = function (name, values, v, noindex)
+    {
+        let p = null;
+        if (!noindex)
+        {
+            if (!v)v = values[0];
+            const indexPort = new Port(this, name + " index", CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "increment": "integer",
+                "values": values,
+                "hideParam": true
+            });
+            const n = this.addInPort(indexPort);
+
+            if (values) for (let i = 0; i < values.length; i++) values[i] = String(values[i]);
+
+            const switchPort = new SwitchPort(
+                this,
+                name,
+                CONSTANTS.OP.OP_PORT_TYPE_STRING,
+                {
+                    "display": "switch",
+                    "hidePort": true,
+                    "type": "string",
+                    "values": values
+                },
+                n
+            );
+
+            switchPort.indexPort = indexPort;
+
+            switchPort.on("change", (val, thePort) =>
+            {
+                if (!thePort.indexPort.isLinked() && thePort.uiAttribs.values)
+                {
+                    const idx = thePort.uiAttribs.values.indexOf(val);
+                    if (idx > -1) thePort.indexPort.set(idx);
+                }
+            });
+
+            indexPort.onLinkChanged = function ()
+            {
+                switchPort.setUiAttribs({ "greyout": indexPort.isLinked() });
+            };
+            p = this.addInPort(switchPort);
+
+            if (v !== undefined)
+            {
+                p.set(v);
+                const index = values.findIndex((item) => { return item == v; });
+                n.setValue(index);
+                p.defaultValue = v;
+                n.defaultValue = index;
+            }
+        }
+        else
+        {
+            const switchPort = new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_STRING, {
+                "display": "switch",
+                "hidePort": true,
+                "type": "string",
+                "values": values
+            });
+            p = this.addInPort(switchPort);
+        }
+
+        return p;
+    };
+
+    /**
+     * create a integer input port
+     * @function inInt
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {number} value default value
+     * @return {Port} created port
+     */
+    Op.prototype.inValueInt = Op.prototype.inInt = function (name, v)
+    {
+        // old
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "increment": "integer"
+            })
+        );
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    /**
+     * create a file/URL input port
+     * @function inURL
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.inFile = function (name, filter, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "display": "file",
+                "type": "string",
+                "filter": filter
+            })
+        );
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    Op.prototype.inUrl = function (name, filter, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_STRING, {
+                "display": "file",
+                "type": "string",
+                "filter": filter
+            })
+        );
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    /**
+     * create a texture input port
+     * @function inTexture
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.inTexture = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_OBJECT, {
+                "display": "texture",
+                "objType": "texture",
+                "preview": true
+            })
+        );
+        p.ignoreValueSerialize = true;
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+
+    /**
+     * create a object input port
+     * @function inObject
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.inObject = function (name, v, objType)
+    {
+        const p = this.addInPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_OBJECT, { "objType": objType }));
+        p.ignoreValueSerialize = true;
+
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+    Op.prototype.inGradient = function (name, v)
+    {
+        const p = this.addInPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "display": "gradient"
+                // "hidePort": true
+            })
+        );
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+
+    Op.prototype.getPortVisibleIndex = function (p)
+    {
+        let ports = this.portsIn;
+        if (p.direction == CONSTANTS.PORT_DIR_OUT)ports = this.portsOut;
+
+        let index = 0;
+        for (let i = 0; i < ports.length; i++)
+        {
+            if (ports[i].uiAttribs.hidePort) continue;
+            index++;
+            if (ports[i] == p) return index;
+        }
+    };
+
+    /**
+     * create a array input port
+     * @function inArray
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.inArray = function (name, v, stride)
+    {
+        if (!stride && CABLES.UTILS.isNumeric(v))stride = v;
+
+        const p = this.addInPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_ARRAY, { "stride": stride }));
+
+        if (v !== undefined && (Array.isArray(v) || v == null)) p.set(v);
+
+        // if (v !== undefined) p.set(v);
+        return p;
+    };
+
+    /**
+     * create a value slider input port
+     * @function inFloatSlider
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {number} defaultvalue
+     * @param {number} min
+     * @param {number} max
+     * @return {Port} created port
+     */
+    Op.prototype.inValueSlider = Op.prototype.inFloatSlider = function (name, v, min, max)
+    {
+        const uiattribs = { "display": "range" };
+
+        if (min != undefined && max != undefined)
+        {
+            uiattribs.min = min;
+            uiattribs.max = max;
+        }
+
+        const p = this.addInPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, uiattribs));
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    /**
+     * create output trigger port
+     * @function outTrigger
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outFunction = Op.prototype.outTrigger = function (name, v)
+    {
+        // old
+        const p = this.addOutPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_FUNCTION));
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+    /**
+     * create output value port
+     * @function outNumber
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {number} default value
+     * @return {Port} created port
+     */
+    Op.prototype.outValue = Op.prototype.outNumber = function (name, v)
+    {
+        // old
+        const p = this.addOutPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE));
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+
+    /**
+     * create output boolean port
+     * @function outBool
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outValueBool = Op.prototype.outBool = function (name, v)
+    {
+        // old
+        const p = this.addOutPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "display": "bool"
+            })
+        );
+        if (v !== undefined) p.set(v);
+        else p.set(0);
+        return p;
+    };
+
+    /**
+     * create output boolean port,value will be converted to 0 or 1
+     * @function outBool
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outBoolNum = function (name, v)
+    {
+        const p = this.addOutPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "display": "boolnum"
+            })
+        );
+
+        p.set = function (b)
+        {
+            this.setValue(b ? 1 : 0);
+            // console.log("bool set", b, this.get());
+        }.bind(p);
+
+        if (v !== undefined) p.set(v);
+        else p.set(0);
+        return p;
+    };
+
+    /**
+     * create output string port
+     * @function outString
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outValueString = function (name, v)
+    {
+        const p = this.addOutPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_VALUE, {
+                "type": "string"
+            })
+        );
+        if (v !== undefined) p.set(v);
+        return p;
+    };
+    Op.prototype.outString = function (name, v)
+    {
+        const p = this.addOutPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_STRING, {
+                "type": "string"
+            })
+        );
+        if (v !== undefined) p.set(v);
+        else p.set("");
+        return p;
+    };
+
+    /**
+     * create output object port
+     * @function outObject
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outObject = function (name, v, objType)
+    {
+        const p = this.addOutPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_OBJECT, { "objType": objType || null }));
+        p.set(v || null);
+        p.ignoreValueSerialize = true;
+        return p;
+    };
+
+    /**
+     * create output array port
+     * @function outArray
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outArray = function (name, v, stride)
+    {
+        if (!stride && CABLES.UTILS.isNumeric(v))stride = v;
+        const p = this.addOutPort(new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_ARRAY, { "stride": stride }));
+        if (v !== undefined && (Array.isArray(v) || v == null)) p.set(v);
+
+        p.ignoreValueSerialize = true;
+        return p;
+    };
+
+    /**
+     * create output texture port
+     * @function outTexture
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @return {Port} created port
+     */
+    Op.prototype.outTexture = function (name, v)
+    {
+        const p = this.addOutPort(
+            new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_OBJECT, {
+                "preview": true,
+                "objType": "texture",
+                "display": "texture"
+            })
+        );
+        if (v !== undefined) p.set(v || CGL.Texture.getEmptyTexture(this.patch.cgl));
+
+        p.ignoreValueSerialize = true;
+        return p;
+    };
+
+    Op.prototype.inDynamic = function (name, filter, options, v)
+    {
+        const p = new Port(this, name, CONSTANTS.OP.OP_PORT_TYPE_DYNAMIC, options);
+
+        p.shouldLink = function (p1, p2)
+        {
+            if (filter && UTILS.isArray(filter))
+            {
+                for (let i = 0; i < filter.length; i++)
+                {
+                    if (p1 == this && p2.type === filter[i]) return true;
+                    if (p2 == this && p1.type === filter[i]) return true;
+                }
+                return false; // types do not match
+            }
+            return true; // no filter set
+        };
+
+        this.addInPort(p);
+        if (v !== undefined)
+        {
+            p.set(v);
+            p.defaultValue = v;
+        }
+        return p;
+    };
+
+    Op.prototype.removeLinks = function ()
+    {
+        for (let i = 0; i < this.portsIn.length; i++) this.portsIn[i].removeLinks();
+        for (let ipo = 0; ipo < this.portsOut.length; ipo++) this.portsOut[ipo].removeLinks();
+    };
+
+    Op.prototype.getSerialized = function ()
+    {
+        const opObj = {};
+
+        if (this.opId) opObj.opId = this.opId;
+        if (this.patch.storeObjNames) opObj.objName = this.objName;
+
+
+        opObj.id = this.id;
+        opObj.uiAttribs = JSON.parse(JSON.stringify(this.uiAttribs)) || {};
+
+        if (this.storage && Object.keys(this.storage).length > 0) opObj.storage = JSON.parse(JSON.stringify(this.storage));
+        if (this.uiAttribs.hasOwnProperty("working") && this.uiAttribs.working == true) delete this.uiAttribs.working;
+        if (opObj.uiAttribs.hasOwnProperty("uierrors")) delete opObj.uiAttribs.uierrors;
+
+        if (opObj.uiAttribs.title == this._shortOpName) delete opObj.uiAttribs.title;
+
+        opObj.portsIn = [];
+        opObj.portsOut = [];
+
+        // console.log("this.portsIn", this.portsIn);
+
+        for (let i = 0; i < this.portsIn.length; i++)
+        {
+            const s = this.portsIn[i].getSerialized();
+            if (s)opObj.portsIn.push(s);
+        }
+        for (const ipo in this.portsOut)
+        {
+            const s = this.portsOut[ipo].getSerialized();
+            if (s)opObj.portsOut.push(s);
+        }
+
+        if (opObj.portsIn.length == 0) delete opObj.portsIn;
+        if (opObj.portsOut.length == 0) delete opObj.portsOut;
+        cleanJson(opObj);
+
+        return opObj;
+    };
+
+    Op.prototype.getFirstOutPortByType = function (type)
+    {
+        for (const ipo in this.portsOut) if (this.portsOut[ipo].type == type) return this.portsOut[ipo];
+    };
+
+    Op.prototype.getFirstInPortByType = function (type)
+    {
+        for (const ipo in this.portsIn) if (this.portsIn[ipo].type == type) return this.portsIn[ipo];
+    };
+
+    /**
+     * return port by the name portName
+     * @function getPort
+     * @instance
+     * @memberof Op
+     * @param {String} portName
+     * @return {Port}
+     */
+    Op.prototype.getPort = Op.prototype.getPortByName = function (name, lowerCase)
+    {
+        if (lowerCase)
+        {
+            for (let ipi = 0; ipi < this.portsIn.length; ipi++)
+                if (this.portsIn[ipi].getName().toLowerCase() == name || this.portsIn[ipi].id.toLowerCase() == name)
+                    return this.portsIn[ipi];
+
+            for (let ipo = 0; ipo < this.portsOut.length; ipo++)
+                if (this.portsOut[ipo].getName().toLowerCase() == name || this.portsOut[ipo].id.toLowerCase() == name)
+                    return this.portsOut[ipo];
+        }
+        else
+        {
+            for (let ipi = 0; ipi < this.portsIn.length; ipi++)
+                if (this.portsIn[ipi].getName() == name || this.portsIn[ipi].id == name)
+                    return this.portsIn[ipi];
+
+            for (let ipo = 0; ipo < this.portsOut.length; ipo++)
+                if (this.portsOut[ipo].getName() == name || this.portsOut[ipo].id == name)
+                    return this.portsOut[ipo];
+        }
+    };
+
+
+    /**
+     * return port by the name id
+     * @function getPortById
+     * @instance
+     * @memberof Op
+     * @param {String} id
+     * @return {Port}
+     */
+    Op.prototype.getPortById = function (id)
+    {
+        for (let ipi = 0; ipi < this.portsIn.length; ipi++) if (this.portsIn[ipi].id == id) return this.portsIn[ipi];
+        for (let ipo = 0; ipo < this.portsOut.length; ipo++) if (this.portsOut[ipo].id == id) return this.portsOut[ipo];
+    };
+
+    Op.prototype.updateAnims = function ()
+    {
+        if (this._hasAnimPort)
+            for (let i = 0; i < this.portsIn.length; i++) this.portsIn[i].updateAnim();
+    };
+
+    Op.prototype.log = function ()
+    {
+        const initiator = "op " + this.objName;
+        if (CABLES.UI && !CABLES.UI.logFilter.shouldPrint(initiator, ...arguments)) return;
+        if (!CABLES.UI && this.patch.silent) return;
+
+        const args = ["[op " + CABLES.getShortOpName(this.objName) + "]"];
+        args.push.apply(args, arguments);
+        Function.prototype.apply.apply(console.log, [console, args]);// eslint-disable-line
+    };
+
+    Op.prototype.error = Op.prototype.logError = function ()
+    {
+        if (!this)
+        {
+            console.log("no this...!!!");
+            debugger;
+            return;
+        }
+
+        // if (this.patch.silent) return;
+        const args = ["[op " + CABLES.getShortOpName(this.objName) + "]"];
+        args.push.apply(args, arguments);
+        Function.prototype.apply.apply(console.error, [console, args]);// eslint-disable-line
+        if (window.gui) window.gui.emitEvent("opLogEvent", this.objName, "error", arguments);
+    };
+
+    Op.prototype.warn = Op.prototype.logWarn = function ()
+    {
+        // if (this.patch.silent) return;
+        const args = ["[op " + CABLES.getShortOpName(this.objName) + "]"];
+        args.push.apply(args, arguments);
+        Function.prototype.apply.apply(console.warn, [console, args]);// eslint-disable-line
+    };
+
+    Op.prototype.verbose = Op.prototype.logVerbose = function ()
+    {
+        const initiator = "op " + CABLES.getShortOpName(this.objName);
+        if (CABLES.UI && !CABLES.UI.logFilter.shouldPrint(initiator, ...arguments)) return;
+
+        if (!CABLES.UI && this.patch.silent) return;
+
+        const args = ["[" + initiator + "]"];
+        args.push.apply(args, arguments);
+        Function.prototype.apply.apply(console.info, [console, args]);// eslint-disable-line
+    };
+
+
+    Op.prototype.profile = function (enable)
+    {
+        for (let ipi = 0; ipi < this.portsIn.length; ipi++)
+        {
+            this.portsIn[ipi]._onTriggered = this.portsIn[ipi]._onTriggeredProfiling;
+            this.portsIn[ipi].set = this.portsIn[ipi]._onSetProfiling;
+        }
+    };
+
+    Op.prototype.findParent = function (objName)
+    {
+        for (let ipi = 0; ipi < this.portsIn.length; ipi++)
+        {
+            if (this.portsIn[ipi].isLinked())
+            {
+                if (this.portsIn[ipi].links[0].portOut.parent.objName == objName)
+                    return this.portsIn[ipi].links[0].portOut.parent;
+
+                let found = null;
+                found = this.portsIn[ipi].links[0].portOut.parent.findParent(objName);
+                if (found) return found;
+            }
+        }
+        return null;
+    };
+
+
+    // todo: check instancing stuff?
+    Op.prototype.cleanUp = function ()
+    {
+        if (this._instances)
+        {
+            for (let i = 0; i < this._instances.length; i++)
+            {
+                if (this._instances[i].onDelete) this._instances[i].onDelete();
+            }
+
+
+            this._instances.length = 0;
+        }
+        for (let i = 0; i < this.portsIn.length; i++)
+        {
+            this.portsIn[i].setAnimated(false);
+        }
+
+        if (this.onAnimFrame) this.patch.removeOnAnimFrame(this);
+    };
+
+    // todo: check instancing stuff?
+    Op.prototype.instanced = function (triggerPort)
+    {
+        console.log("instanced", this.patch.instancing.numCycles());
+        if (this.patch.instancing.numCycles() === 0) return false;
+
+
+        let i = 0;
+        let ipi = 0;
+        if (!this._instances || this._instances.length != this.patch.instancing.numCycles())
+        {
+            if (!this._instances) this._instances = [];
+            this._.log("creating instances of ", this.objName, this.patch.instancing.numCycles(), this._instances.length);
+            this._instances.length = this.patch.instancing.numCycles();
+
+            for (i = 0; i < this._instances.length; i++)
+            {
+                this._instances[i] = this.patch.createOp(this.objName, true);
+                this._instances[i].instanced = function ()
+                {
+                    return false;
+                };
+                this._instances[i].uiAttr(this.uiAttribs);
+
+                for (let ipo = 0; ipo < this.portsOut.length; ipo++)
+                {
+                    if (this.portsOut[ipo].type == CONSTANTS.OP.OP_PORT_TYPE_FUNCTION)
+                    {
+                        this._instances[i].getPortByName(this.portsOut[ipo].name).trigger = this.portsOut[ipo].trigger.bind(this.portsOut[ipo]);
+                    }
+                }
+            }
+
+            for (ipi = 0; ipi < this.portsIn.length; ipi++)
+            {
+                this.portsIn[ipi].onChange = null;
+                this.portsIn[ipi].onValueChanged = null;
+            }
+        }
+
+        const theTriggerPort = null;
+        for (ipi = 0; ipi < this.portsIn.length; ipi++)
+        {
+            if (
+                this.portsIn[ipi].type == CONSTANTS.OP.OP_PORT_TYPE_VALUE ||
+                this.portsIn[ipi].type == CONSTANTS.OP.OP_PORT_TYPE_ARRAY
+            )
+            {
+                this._instances[this.patch.instancing.index()].portsIn[ipi].set(this.portsIn[ipi].get());
+            }
+            if (this.portsIn[ipi].type == CONSTANTS.OP.OP_PORT_TYPE_FUNCTION)
+            {
+                // if(this._instances[ this.patch.instancing.index() ].portsIn[ipi].name==triggerPort.name)
+                // theTriggerPort=this._instances[ this.patch.instancing.index() ].portsIn[ipi];
+            }
+        }
+
+        if (theTriggerPort) theTriggerPort.onTriggered();
+
+        for (ipi = 0; ipi < this.portsOut.length; ipi++)
+        {
+            if (this.portsOut[ipi].type == CONSTANTS.OP.OP_PORT_TYPE_VALUE)
+            {
+                this.portsOut[ipi].set(this._instances[this.patch.instancing.index()].portsOut[ipi].get());
+            }
+        }
+
+        return true;
+    };
+
+    // todo: check instancing stuff?
+    Op.prototype.initInstancable = function ()
+    {
+        //         if(this.isInstanced)
+        //         {
+        //             console.log('cancel instancing');
+        //             return;
+        //         }
+        //         this._instances=[];
+        //         for(var ipi=0;ipi<this.portsIn.length;ipi++)
+        //         {
+        //             if(this.portsIn[ipi].type==CONSTANTS.OP.OP_PORT_TYPE_VALUE)
+        //             {
+        //
+        //             }
+        //             if(this.portsIn[ipi].type==CONSTANTS.OP.OP_PORT_TYPE_FUNCTION)
+        //             {
+        //                 // var piIndex=ipi;
+        //                 this.portsIn[ipi].onTriggered=function(piIndex)
+        //                 {
+        //
+        //                     var i=0;
+        // // console.log('trigger',this._instances.length);
+        //
+        //                 }.bind(this,ipi );
+        //
+        //             }
+        // };
+        // this._instances=null;
+    };
+
+    Op.prototype.setValues = function (obj)
+    {
+        for (const i in obj)
+        {
+            const port = this.getPortByName(i);
+            if (port) port.set(obj[i]);
+            else this._log.warn("op.setValues: port not found:", i);
+        }
+    };
+
+    /**
+     * return true if op has this error message id
+     * @function hasUiError
+     * @instance
+     * @memberof Op
+     * @param {id} error id
+     * @returns {Boolean} - has id
+     */
+    Op.prototype.hasUiError = function (id)
+    {
+        return this._uiErrors.hasOwnProperty(id) && this._uiErrors[id];
+    };
+
+    /**
+     * show op error message - set message to null to remove error message
+     * @function setUiError
+     * @instance
+     * @memberof Op
+     * @param {id} error id
+     * @param {txt} text message
+     * @param {level} level
+     */
+    Op.prototype.setUiError = function (id, txt, level)
+    {
+        // overwritten in ui: core_extend_op
+    };
+
+    // todo: remove
+    Op.prototype.setError = function (id, txt)
+    {
+        this._log.warn("old error message op.error() - use op.setUiError()");
+    };
+
+
+    /**
+     * enable/disable op
+     * @function
+     * @instance
+     * @memberof Op
+     * @param {boolean}
+     */
+    Op.prototype.setEnabled = function (b)
+    {
+        this.enabled = b;
+        this.emitEvent("onEnabledChange", b);
+        if (!this.enabled) this.setUiError("_disabled", "Op is disabled", 0);
+        else this.setUiError("_disabled", null);
+    };
+
+    /**
+     * organize ports into a group
+     * @function
+     * @instance
+     * @memberof Op
+     * @param {String} name
+     * @param {Array} ports
+     */
+    Op.prototype.setPortGroup = function (name, ports)
+    {
+        for (let i = 0; i < ports.length; i++)
+        {
+            if (ports[i])
+                if (ports[i].setUiAttribs) ports[i].setUiAttribs({ "group": name });
+                else
+                {
+                    this._log.error("setPortGroup: invalid port!");
+                }
+        }
+    };
+
+    /**
+     * visually indicate ports that they are coordinate inputs
+     * @function
+     * @instance
+     * @memberof Op
+     * @param {Port} portX
+     * @param {Port} portY
+     * @param {Port} portZ
+     */
+    Op.prototype.setUiAxisPorts = function (px, py, pz)
+    {
+        if (px) px.setUiAttribs({ "axis": "X" });
+        if (py) py.setUiAttribs({ "axis": "Y" });
+        if (pz) pz.setUiAttribs({ "axis": "Z" });
+    };
+
+    /**
+     * remove port from op
+     * @function removePort
+     * @instance
+     * @memberof Op
+     * @param {Port} port to remove
+     */
+    Op.prototype.removePort = function (port)
+    {
+        for (let ipi = 0; ipi < this.portsIn.length; ipi++)
+        {
+            if (this.portsIn[ipi] == port)
+            {
+                this.portsIn.splice(ipi, 1);
+                this.emitEvent("onUiAttribsChange", {});
+                this.emitEvent("onPortRemoved", {});
+                return;
+            }
+        }
+    };
+
+    Op.prototype._checkLinksNeededToWork = function () {};
+
+    /**
+     * show a warning of this op is not a child of parentOpName
+     * @function
+     * @instance
+     * @memberof Op
+     * @param {String} parentOpName
+     */
+    Op.prototype.toWorkNeedsParent = function (parentOpName)
+    {
+        if (!this.patch.isEditorMode()) return;
+
+        this._linkTimeRules.needsParentOp = parentOpName;
+    };
+
+    // /**
+    //  * show a warning of this op is a child of parentOpName
+    //  * @function
+    //  * @instance
+    //  * @memberof Op
+    //  * @param {String} parentOpName
+    //  */
+    Op.prototype.toWorkShouldNotBeChild = function (parentOpName, type)
+    {
+        if (!this.patch.isEditorMode()) return;
+        this._linkTimeRules.forbiddenParent = parentOpName;
+        if (type != undefined) this._linkTimeRules.forbiddenParentType = type;
+    };
+
+
+    /**
+     * show a small X to indicate op is not working when given ports are not linked
+     * @function
+     * @instance
+     * @memberof Op
+     * @param {Port} port1
+     * @param {Port} port2
+     * @param {Port} port3
+     */
+    Op.prototype.toWorkPortsNeedToBeLinked = function ()
+    {
+        if (!this.patch.isEditorMode()) return;
+        for (let i = 0; i < arguments.length; i++)
+            if (this._linkTimeRules.needsLinkedToWork.indexOf(arguments[i]) == -1) this._linkTimeRules.needsLinkedToWork.push(arguments[i]);
+    };
+    Op.prototype.toWorkPortsNeedToBeLinkedReset = function ()
+    {
+        if (!this.patch.isEditorMode()) return;
+        this._linkTimeRules.needsLinkedToWork.length = 0;
+        if (this.checkLinkTimeWarnings) this.checkLinkTimeWarnings();
+    };
+
+    Op.prototype.initVarPorts = function ()
+    {
+        for (let i = 0; i < this.portsIn.length; i++)
+        {
+            if (this.portsIn[i].getVariableName()) this.portsIn[i].setVariable(this.portsIn[i].getVariableName());
+        }
+    };
+
+    /**
+     * refresh op parameters, if current op is selected
+     * @function
+     * @instance
+     * @memberof Op
+     */
+    Op.prototype.refreshParams = function ()
+    {
+        if (this.patch && this.patch.isEditorMode() && this.isCurrentUiOp())
+        {
+            gui.opParams.show(this);
+        }
+    };
+
+    /**
+     * Returns true if op is selected and parameter are shown in the editor, can only return true if in editor/ui
+     * @function isCurrentUiOp
+     * @instance
+     * @memberof Op
+     * @returns {Boolean} - is current ui op
+     */
+    Op.prototype.isCurrentUiOp = function ()
+    {
+        if (this.patch.isEditorMode()) return gui.patchView.isCurrentOp(this);
+    };
+
+    /**
+     * Implement to render 2d canvas based graphics from in an op
+     * @function renderVizLayer
+     * @instance
+     * @memberof Op
+     * @param {ctx} context of canvas 2d
+     * @param {Object} layer info
+     * @param {number} layer.x x position on canvas
+     * @param {number} layer.y y position on canvas
+     * @param {number} layer.width width of canvas
+     * @param {number} layer.height height of canvas
+     * @param {number} layer.scale current scaling of patchfield view
+     */
+    Op.prototype.renderVizLayer = null; // optionaly defined in op instance
+}
+
+
+
+;// CONCATENATED MODULE: ./src/core/loadingstatus.js
+
+
+
+
+/**
+ * LoadingStatus class, manages asynchronous loading jobs
+ *
+ * @external CABLES
+ * @namespace LoadingStatus
+ * @hideconstructor
+ * @class
+ */
+const LoadingStatus = function (patch)
+{
+    EventTarget.apply(this);
+
+    this._log = new Logger("LoadingStatus");
+    this._loadingAssets = {};
+    this._cbFinished = [];
+    this._assetTasks = [];
+    this._percent = 0;
+    this._count = 0;
+    this._countFinished = 0;
+    this._order = 0;
+    this._startTime = 0;
+    this._patch = patch;
+    this._wasFinishedPrinted = false;
+    this._loadingAssetTaskCb = false;
+};
+
+LoadingStatus.prototype.setOnFinishedLoading = function (cb)
+{
+    this._cbFinished.push(cb);
+};
+
+LoadingStatus.prototype.getNumAssets = function ()
+{
+    return this._countFinished;
+};
+
+LoadingStatus.prototype.getProgress = function ()
+{
+    return this._percent;
+};
+
+LoadingStatus.prototype.checkStatus = function ()
+{
+    this._countFinished = 0;
+    this._count = 0;
+
+    for (const i in this._loadingAssets)
+    {
+        this._count++;
+        if (!this._loadingAssets[i].finished)
+        {
+            this._countFinished++;
+        }
+    }
+
+    this._percent = (this._count - this._countFinished) / this._count;
+
+    if (this._countFinished === 0)
+    {
+        for (let j = 0; j < this._cbFinished.length; j++)
+        {
+            if (this._cbFinished[j])
+            {
+                const cb = this._cbFinished[j];
+                setTimeout(() => { cb(this._patch); this.emitEvent("finishedAll"); }, 100);
+            }
+        }
+
+        if (!this._wasFinishedPrinted)
+        {
+            this._wasFinishedPrinted = true;
+            this.print();
+        }
+        this.emitEvent("finishedAll");
+    }
+};
+
+LoadingStatus.prototype.getList = function ()
+{
+    let arr = [];
+    for (const i in this._loadingAssets)
+    {
+        arr.push(this._loadingAssets[i]);
+    }
+
+    return arr;
+};
+
+
+LoadingStatus.prototype.getListJobs = function ()
+{
+    let arr = [];
+    for (const i in this._loadingAssets)
+    {
+        if (!this._loadingAssets[i].finished)arr.push(this._loadingAssets[i].name);
+    }
+
+    return arr;
+};
+
+LoadingStatus.prototype.print = function ()
+{
+    if (this._patch.config.silent) return;
+
+    const rows = [];
+
+    for (const i in this._loadingAssets)
+    {
+        rows.push([
+            this._loadingAssets[i].order,
+            this._loadingAssets[i].type,
+            this._loadingAssets[i].name,
+            (this._loadingAssets[i].timeEnd - this._loadingAssets[i].timeStart) / 1000 + "s",
+        ]);
+    }
+
+    this._log.groupCollapsed(
+        "finished loading " + this._order + " assets in " + (Date.now() - this._startTime) / 1000 + "s",
+    );
+    this._log.table(rows);
+    this._log.groupEnd();
+};
+
+LoadingStatus.prototype.finished = function (id)
+{
+    const l = this._loadingAssets[id];
+    if (l)
+    {
+        if (l.finished) this._log.warn("loading job was already finished", l);
+
+        if (l.op) l.op.setUiAttribs({ "loading": false });
+        l.finished = true;
+        l.timeEnd = Date.now();
+    }
+
+    this.checkStatus();
+    this.emitEvent("finishedTask");
+};
+
+LoadingStatus.prototype._startAssetTasks = function ()
+{
+    for (let i = 0; i < this._assetTasks.length; i++) this._assetTasks[i]();
+    this._assetTasks.length = 0;
+};
+
+/**
+ * delay an asset loading task, mainly to wait for ui to be finished loading and showing, and only then start loading assets
+ * @function addAssetLoadingTask
+ * @instance
+ * @memberof Op
+ * @param {function} callback
+ */
+LoadingStatus.prototype.addAssetLoadingTask = function (cb)
+{
+    if (this._patch.isEditorMode() && !CABLES.UI.loaded)
+    {
+        this._assetTasks.push(cb);
+
+        if (!this._loadingAssetTaskCb)window.gui.addEventListener("uiloaded", this._startAssetTasks.bind(this));
+        this._loadingAssetTaskCb = true;
+    }
+    else
+    {
+        cb();
+    }
+    this.emitEvent("addAssetTask");
+};
+
+LoadingStatus.prototype.existByName = function (name)
+{
+    for (let i in this._loadingAssets)
+    {
+        if (this._loadingAssets[i].name == name && !this._loadingAssets[i].finished)
+        {
+            return true;
+        }
+    }
+};
+
+LoadingStatus.prototype.start = function (type, name, op)
+{
+    if (this._startTime == 0) this._startTime = Date.now();
+    const id = generateUUID();
+
+    if (op)op.setUiAttribs({ "loading": true });
+
+    this._loadingAssets[id] = {
+        "id": id,
+        "op": op,
+        "type": type,
+        "name": name,
+        "finished": false,
+        "timeStart": Date.now(),
+        "order": this._order,
+    };
+    this._order++;
+
+    this.emitEvent("startTask");
+
+    return id;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/instancing.js
+// todo: needs to be removed...
+
+const Instancing = function ()
+{
+    this._loops = [];
+    this._indizes = [];
+    this._index = 0;
+};
+
+Instancing.prototype.pushLoop = function (maxNum)
+{
+    this._loops.push(Math.abs(Math.floor(maxNum)));
+    this._indizes.push(this._index);
+};
+
+Instancing.prototype.popLoop = function ()
+{
+    this._loops.pop();
+    // this._index--;
+    this._index = this._indizes.pop();
+    if (this._loops.length === 0) this._index = 0;
+};
+
+Instancing.prototype.numLoops = function ()
+{
+    return this._loops.length;
+};
+
+Instancing.prototype.numCycles = function ()
+{
+    if (this._loops.length === 0) return 0;
+    let num = this._loops[0];
+    for (let i = 1; i < this._loops.length; i++) num *= this._loops[i];
+
+    return num;
+};
+
+Instancing.prototype.inLoop = function ()
+{
+    return this._loops.length > 0;
+};
+
+Instancing.prototype.increment = function ()
+{
+    this._index++;
+};
+
+Instancing.prototype.index = function ()
+{
+    return this._index;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/timer.js
+
+
+/** @namespace CABLES */
+
+const internalNow = function ()
+{
+    return window.performance.now();
+};
+
+/**
+ * current time in milliseconds
+ * @memberof CABLES
+ * @function now
+ * @static
+ */
+const now = function ()
+{
+    return internalNow();
+};
+
+// ----------------------------
+
+/**
+ * Measuring time
+ * @external CABLES
+ * @namespace Timer
+ * @hideconstructor
+ * @class
+ */
+const Timer = function ()
+{
+    EventTarget.apply(this);
+
+    this._timeStart = internalNow();
+    this._timeOffset = 0;
+
+    this._currentTime = 0;
+    this._lastTime = 0;
+    this._paused = true;
+    this._delay = 0;
+    this.overwriteTime = -1;
+};
+
+
+Timer.prototype._internalNow = function ()
+{
+    if (this._ts) return this._ts;
+    return internalNow();
+};
+
+Timer.prototype._getTime = function ()
+{
+    this._lastTime = (this._internalNow() - this._timeStart) / 1000;
+    return this._lastTime + this._timeOffset;
+};
+
+Timer.prototype.setDelay = function (d)
+{
+    this._delay = d;
+    this.emitEvent("timeChange");
+};
+
+/**
+ * @function
+ * @memberof Timer
+ * @instance
+ * @description returns true if timer is playing
+ * @return {Boolean} value
+ */
+Timer.prototype.isPlaying = function ()
+{
+    return !this._paused;
+};
+
+/**
+ * @function
+ * @memberof Timer
+ * @instance
+ * @description update timer
+ * @return {Number} time
+ */
+Timer.prototype.update = function (ts)
+{
+    if (ts) this._ts = ts;
+    if (this._paused) return;
+    this._currentTime = this._getTime();
+
+    return this._currentTime;
+};
+
+/**
+ * @function
+ * @memberof Timer
+ * @instance
+ * @return {Number} time in milliseconds
+ */
+Timer.prototype.getMillis = function ()
+{
+    return this.get() * 1000;
+};
+
+/**
+ * @function
+ * @memberof Timer
+ * @instance
+ * @return {Number} value time in seconds
+ */
+Timer.prototype.get = Timer.prototype.getTime = function ()
+{
+    if (this.overwriteTime >= 0) return this.overwriteTime - this._delay;
+    return this._currentTime - this._delay;
+};
+
+/**
+ * toggle between play/pause state
+ * @function
+ * @memberof Timer
+ * @instance
+ */
+Timer.prototype.togglePlay = function ()
+{
+    if (this._paused) this.play();
+    else this.pause();
+};
+
+/**
+ * set current time
+ * @function
+ * @memberof Timer
+ * @instance
+ * @param {Number} t
+ */
+Timer.prototype.setTime = function (t)
+{
+    if (isNaN(t) || t < 0) t = 0;
+    this._timeStart = this._internalNow();
+    this._timeOffset = t;
+    this._currentTime = t;
+    this.emitEvent("timeChange");
+};
+
+Timer.prototype.setOffset = function (val)
+{
+    if (this._currentTime + val < 0)
+    {
+        this._timeStart = this._internalNow();
+        this._timeOffset = 0;
+        this._currentTime = 0;
+    }
+    else
+    {
+        this._timeOffset += val;
+        this._currentTime = this._lastTime + this._timeOffset;
+    }
+    this.emitEvent("timeChange");
+};
+
+/**
+ * (re)starts the timer
+ * @function
+ * @memberof Timer
+ * @instance
+ */
+Timer.prototype.play = function ()
+{
+    this._timeStart = this._internalNow();
+    this._paused = false;
+    this.emitEvent("playPause");
+};
+
+/**
+ * pauses the timer
+ * @function
+ * @memberof Timer
+ * @instance
+ */
+Timer.prototype.pause = function ()
+{
+    this._timeOffset = this._currentTime;
+    this._paused = true;
+    this.emitEvent("playPause");
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_profiler.js
+
+
+class Profiler
+{
+    constructor(patch)
+    {
+        this.startFrame = patch.getFrameNum();
+        this.items = {};
+        this.currentId = null;
+        this.currentStart = 0;
+        this._patch = patch;
+    }
+
+    getItems()
+    {
+        return this.items;
+    }
+
+    clear()
+    {
+        if (this.paused) return;
+        this.items = {};
+    }
+
+    togglePause()
+    {
+        this.paused = !this.paused;
+        if (!this.paused)
+        {
+            this.items = {};
+            this.currentStart = performance.now();
+        }
+    }
+
+    add(type, object)
+    {
+        if (this.paused) return;
+
+        if (this.currentId !== null)
+        {
+            if (!object || object.id != this.currentId)
+            {
+                if (this.items[this.currentId])
+                {
+                    this.items[this.currentId].timeUsed += performance.now() - this.currentStart;
+
+                    if (!this.items[this.currentId].peakTime || now() - this.items[this.currentId].peakTime > 5000)
+                    {
+                        this.items[this.currentId].peak = 0;
+                        this.items[this.currentId].peakTime = now();
+                    }
+                    this.items[this.currentId].peak = Math.max(this.items[this.currentId].peak, performance.now() - this.currentStart);
+                }
+            }
+        }
+
+        if (object !== null)
+        {
+            if (!this.items[object.id])
+            {
+                this.items[object.id] = {
+                    "numTriggers": 0,
+                    "timeUsed": 0,
+                };
+            }
+
+            if (this.items[object.id].lastFrame != this._patch.getFrameNum()) this.items[object.id].numTriggers = 0;
+
+            this.items[object.id].lastFrame = this._patch.getFrameNum();
+            this.items[object.id].numTriggers++;
+            this.items[object.id].opid = object.op.id;
+            this.items[object.id].title = object.op.name + "." + object.name;
+            this.items[object.id].subPatch = object.op.uiAttribs.subPatch;
+
+            this.currentId = object.id;
+            this.currentStart = performance.now();
+        }
+        else
+        {
+            this.currentId = null;
+        }
+    }
+
+    print()
+    {
+        console.log("--------");
+        for (const i in this.items)
+        {
+            console.log(this.items[i].title + ": " + this.items[i].numTriggers + " / " + this.items[i].timeUsed);
+        }
+    }
+}
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/constants.js
+const SHADER = {
+    // default attributes
+    "SHADERVAR_VERTEX_POSITION": "vPosition",
+    "SHADERVAR_VERTEX_NUMBER": "attrVertIndex",
+    "SHADERVAR_VERTEX_NORMAL": "attrVertNormal",
+    "SHADERVAR_VERTEX_TEXCOORD": "attrTexCoord",
+    "SHADERVAR_INSTANCE_MMATRIX": "instMat",
+    "SHADERVAR_VERTEX_COLOR": "attrVertColor",
+
+    "SHADERVAR_INSTANCE_INDEX": "instanceIndex",
+
+    // default uniforms
+    "SHADERVAR_UNI_PROJMAT": "projMatrix",
+    "SHADERVAR_UNI_VIEWMAT": "viewMatrix",
+    "SHADERVAR_UNI_MODELMAT": "modelMatrix",
+    "SHADERVAR_UNI_NORMALMAT": "normalMatrix",
+    "SHADERVAR_UNI_INVVIEWMAT": "inverseViewMatrix",
+    "SHADERVAR_UNI_INVPROJMAT": "invProjMatrix",
+    "SHADERVAR_UNI_MATERIALID": "materialId",
+    "SHADERVAR_UNI_OBJECTID": "objectId",
+
+    "SHADERVAR_UNI_VIEWPOS": "camPos",
+};
+
+
+const BLEND_MODES = {
+    "BLEND_NONE": 0,
+    "BLEND_NORMAL": 1,
+    "BLEND_ADD": 2,
+    "BLEND_SUB": 3,
+    "BLEND_MUL": 4,
+};
+
+
+
+
+
+const RAD2DEG = 180.0 / Math.PI;
+const DEG2RAD = Math.PI / 180.0;
+
+const constants_CONSTANTS = {
+    "MATH": {
+        "DEG2RAD": DEG2RAD,
+        "RAD2DEG": RAD2DEG,
+    },
+    "SHADER": SHADER,
+    "BLEND_MODES": BLEND_MODES,
+};
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_uniform.js
+
+
+
+class CgUniform
+{
+    constructor(__shader, __type, __name, _value, _port2, _port3, _port4, _structUniformName, _structName, _propertyName)
+    {
+        this._log = new Logger("cg_uniform");
+        this._type = __type;
+        this._name = __name;
+        this._shader = __shader;
+        this._value = 0.00001;
+        this._oldValue = null;
+        this._port = null;
+        this._structName = _structName;
+        this._structUniformName = _structUniformName;
+        this._propertyName = _propertyName;
+
+        this._shader._addUniform(this);
+        this.needsUpdate = true;
+        this.shaderType = null;
+        this.comment = null;
+
+        if (__type == "f")
+        {
+            this.set = this.setValue = this.setValueF.bind(this);
+            this.updateValue = this.updateValueF.bind(this);
+        }
+        else if (__type == "f[]")
+        {
+            this.set = this.setValue = this.setValueArrayF.bind(this);
+            this.updateValue = this.updateValueArrayF.bind(this);
+        }
+        else if (__type == "2f[]")
+        {
+            this.set = this.setValue = this.setValueArray2F.bind(this);
+            this.updateValue = this.updateValueArray2F.bind(this);
+        }
+        else if (__type == "3f[]")
+        {
+            this.set = this.setValue = this.setValueArray3F.bind(this);
+            this.updateValue = this.updateValueArray3F.bind(this);
+        }
+        else if (__type == "4f[]")
+        {
+            this.set = this.setValue = this.setValueArray4F.bind(this);
+            this.updateValue = this.updateValueArray4F.bind(this);
+        }
+        else if (__type == "i")
+        {
+            this.set = this.setValue = this.setValueI.bind(this);
+            this.updateValue = this.updateValueI.bind(this);
+        }
+        else if (__type == "2i")
+        {
+            this.set = this.setValue = this.setValue2I.bind(this);
+            this.updateValue = this.updateValue2I.bind(this);
+        }
+        else if (__type == "3i")
+        {
+            this.set = this.setValue = this.setValue3I.bind(this);
+            this.updateValue = this.updateValue3I.bind(this);
+        }
+        else if (__type == "4i")
+        {
+            this.set = this.setValue = this.setValue4I.bind(this);
+            this.updateValue = this.updateValue4I.bind(this);
+        }
+        else if (__type == "b")
+        {
+            this.set = this.setValue = this.setValueBool.bind(this);
+            this.updateValue = this.updateValueBool.bind(this);
+        }
+        else if (__type == "4f")
+        {
+            this.set = this.setValue = this.setValue4F.bind(this);
+            this.updateValue = this.updateValue4F.bind(this);
+        }
+        else if (__type == "3f")
+        {
+            this.set = this.setValue = this.setValue3F.bind(this);
+            this.updateValue = this.updateValue3F.bind(this);
+        }
+        else if (__type == "2f")
+        {
+            this.set = this.setValue = this.setValue2F.bind(this);
+            this.updateValue = this.updateValue2F.bind(this);
+        }
+        else if (__type == "t")
+        {
+            this.set = this.setValue = this.setValueT.bind(this);
+            this.updateValue = this.updateValueT.bind(this);
+        }
+        else if (__type == "tc")
+        {
+            this.set = this.setValue = this.setValueT.bind(this);
+            this.updateValue = this.updateValueT.bind(this);
+        }
+        else if (__type == "t[]")
+        {
+            this.set = this.setValue = this.setValueArrayT.bind(this);
+            this.updateValue = this.updateValueArrayT.bind(this);
+        }
+        else if (__type == "m4" || __type == "m4[]")
+        {
+            this.set = this.setValue = this.setValueM4.bind(this);
+            this.updateValue = this.updateValueM4.bind(this);
+        }
+        else throw new Error("Unknown uniform type");
+
+        if (typeof _value == "object" && _value instanceof Port)
+        {
+            this._port = _value;
+            this._value = this._port.get();
+
+
+            if (_port2 && _port3 && _port4)
+            {
+                if (!(_port2 instanceof Port) || !(_port3 instanceof Port) || !(_port4 instanceof Port))
+                {
+                    this._log.error("[cgl_uniform] mixed port/value parameter for vec4 ", this._name);
+                }
+
+                this._value = [0, 0, 0, 0];
+                this._port2 = _port2;
+                this._port3 = _port3;
+                this._port4 = _port4;
+
+                this._port.on("change", this.updateFromPort4f.bind(this));
+                this._port2.on("change", this.updateFromPort4f.bind(this));
+                this._port3.on("change", this.updateFromPort4f.bind(this));
+                this._port4.on("change", this.updateFromPort4f.bind(this));
+
+                // this._port.onChange = this._port2.onChange = this._port3.onChange = this._port4.onChange = this.updateFromPort4f.bind(this);
+                this.updateFromPort4f();
+            }
+            else if (_port2 && _port3)
+            {
+                if (!(_port2 instanceof Port) || !(_port3 instanceof Port))
+                {
+                    this._log.error("[cgl_uniform] mixed port/value parameter for vec4 ", this._name);
+                }
+
+                this._value = [0, 0, 0];
+                this._port2 = _port2;
+                this._port3 = _port3;
+                // this._port.onChange = this._port2.onChange = this._port3.onChange = this.updateFromPort3f.bind(this);
+                this._port.on("change", this.updateFromPort3f.bind(this));
+                this._port2.on("change", this.updateFromPort3f.bind(this));
+                this._port3.on("change", this.updateFromPort3f.bind(this));
+
+                this.updateFromPort3f();
+            }
+            else if (_port2)
+            {
+                if (!(_port2 instanceof Port))
+                {
+                    this._log.error("[cgl_uniform] mixed port/value parameter for vec4 ", this._name);
+                }
+
+                this._value = [0, 0];
+                this._port2 = _port2;
+                // this._port.onChange = this._port2.onChange = this.updateFromPort2f.bind(this);
+                this._port.on("change", this.updateFromPort2f.bind(this));
+                this._port2.on("change", this.updateFromPort2f.bind(this));
+
+                this.updateFromPort2f();
+            }
+            else
+            {
+                // this._port.on = this.updateFromPort.bind(this);
+                this._port.on("change", this.updateFromPort.bind(this));
+            }
+        }
+        else this._value = _value;
+
+        this.setValue(this._value);
+        this.needsUpdate = true;
+    }
+
+
+    getType()
+    {
+        return this._type;
+    }
+
+    getName()
+    {
+        return this._name;
+    }
+
+    getValue()
+    {
+        return this._value;
+    }
+
+    getShaderType()
+    {
+        return this.shaderType;
+    }
+
+    isStructMember()
+    {
+        return !!this._structName;
+    }
+
+
+    updateFromPort4f()
+    {
+        this._value[0] = this._port.get();
+        this._value[1] = this._port2.get();
+        this._value[2] = this._port3.get();
+        this._value[3] = this._port4.get();
+        this.setValue(this._value);
+    }
+
+    updateFromPort3f()
+    {
+        this._value[0] = this._port.get();
+        this._value[1] = this._port2.get();
+        this._value[2] = this._port3.get();
+        this.setValue(this._value);
+    }
+
+    updateFromPort2f()
+    {
+        this._value[0] = this._port.get();
+        this._value[1] = this._port2.get();
+        this.setValue(this._value);
+    }
+
+    updateFromPort()
+    {
+        this.setValue(this._port.get());
+    }
+}
+
+/* harmony default export */ const cg_uniform = (CgUniform);
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_shader_uniform.js
+
+
+
+
+/**
+ * Shader uniforms
+ *
+ * types:
+ * <pre>
+ * f    - float
+ * 2f   - vec2
+ * 3f   - vec3
+ * 4f   - vec4
+ * i    - integer
+ * t    - texture
+ * m4   - mat4, 4x4 float matrix
+ * f[]  - array of floats
+ * 2f[] - array of float vec2
+ * 3f[] - array of float vec3
+ * 4f[] - array of float vec4
+ * </pre>
+ *
+ * @external CGL
+ * @namespace Uniform
+ * @class
+ * @param {Shader} shader
+ * @param {String} [type=f]
+ * @param {String} name
+ * @param {Number|Port} value  can be a Number,Matrix or Port
+ * @example
+ * // bind float uniform called myfloat and initialize with value 1.0
+ * const unir=new CGL.Uniform(shader,'f','myfloat',1.0);
+ * unir.setValue(1.0);
+ *
+ * // bind float uniform called myfloat and automatically set it to input port value
+ * const myPort=op.inFloat("input");
+ * const pv=new CGL.Uniform(shader,'f','myfloat',myPort);
+ *
+ */
+
+
+// export const Uniform(__shader, __type, __name, _value, _port2, _port3, _port4, _structUniformName, _structName, _propertyName)
+
+class Uniform extends cg_uniform
+{
+    constructor(__shader, __type, __name, _value, _port2, _port3, _port4, _structUniformName, _structName, _propertyName)
+    {
+        super(__shader, __type, __name, _value, _port2, _port3, _port4, _structUniformName, _structName, _propertyName);
+        this._loc = -1;
+        this._cgl = __shader._cgl;
+    }
+
+    get name()
+    {
+        return this._name;
+    }
+
+    copy(newShader)
+    {
+        const uni = new Uniform(newShader, this._type, this._name, this._value, this._port2, this._port3, this._port4, this._structUniformName, this._structName, this._propertyName);
+        uni.shaderType = this.shaderType;
+        return uni;
+    }
+
+    /**
+     * returns type as glsl type string. e.g. 'f' returns 'float'
+     * @function getGlslTypeString
+     * @memberof Uniform
+     * @instance
+     * @return {string} type as string
+     */
+    getGlslTypeString()
+    {
+        return Uniform.glslTypeString(this._type);
+    }
+
+    _isValidLoc()
+    {
+        return this._loc != -1;// && this._loc != null;
+    }
+
+    resetLoc()
+    {
+        this._loc = -1;
+        this.needsUpdate = true;
+    }
+
+    bindTextures() {}
+
+    getLoc()
+    {
+        return this._loc;
+    }
+
+    updateFromPort4f()
+    {
+        this._value[0] = this._port.get();
+        this._value[1] = this._port2.get();
+        this._value[2] = this._port3.get();
+        this._value[3] = this._port4.get();
+        this.setValue(this._value);
+    }
+
+    updateFromPort3f()
+    {
+        this._value[0] = this._port.get();
+        this._value[1] = this._port2.get();
+        this._value[2] = this._port3.get();
+        this.setValue(this._value);
+    }
+
+    updateFromPort2f()
+    {
+        this._value[0] = this._port.get();
+        this._value[1] = this._port2.get();
+        this.setValue(this._value);
+    }
+
+    updateFromPort()
+    {
+        this.setValue(this._port.get());
+    }
+
+    updateValueF()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        this._shader.getCgl().gl.uniform1f(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueF(v)
+    {
+        if (v != this._value)
+        {
+            this.needsUpdate = true;
+            this._value = v;
+        }
+    }
+
+    updateValueI()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        this._shader.getCgl().gl.uniform1i(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    updateValue2I()
+    {
+        if (!this._value) return;
+
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+
+        this._shader.getCgl().gl.uniform2i(this._loc, this._value[0], this._value[1]);
+
+        this.needsUpdate = false;
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    updateValue3I()
+    {
+        if (!this._value) return;
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+
+        this._shader.getCgl().gl.uniform3i(this._loc, this._value[0], this._value[1], this._value[2]);
+        this.needsUpdate = false;
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    updateValue4I()
+    {
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+        this._shader.getCgl().gl.uniform4i(this._loc, this._value[0], this._value[1], this._value[2], this._value[3]);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueI(v)
+    {
+        if (v != this._value)
+        {
+            this.needsUpdate = true;
+            this._value = v;
+        }
+    }
+
+    setValue2I(v)
+    {
+        if (!v) return;
+        if (!this._oldValue)
+        {
+            this._oldValue = [v[0] - 1, 1];
+            this.needsUpdate = true;
+        }
+        else if (v[0] != this._oldValue[0] || v[1] != this._oldValue[1])
+        {
+            this._oldValue[0] = v[0];
+            this._oldValue[1] = v[1];
+            this.needsUpdate = true;
+        }
+
+        this._value = v;
+    }
+
+    setValue3I(v)
+    {
+        if (!v) return;
+        if (!this._oldValue)
+        {
+            this._oldValue = [v[0] - 1, 1, 2];
+            this.needsUpdate = true;
+        }
+        else if (v[0] != this._oldValue[0] || v[1] != this._oldValue[1] || v[2] != this._oldValue[2])
+        {
+            this._oldValue[0] = v[0];
+            this._oldValue[1] = v[1];
+            this._oldValue[2] = v[2];
+            this.needsUpdate = true;
+        }
+
+        this._value = v;
+    }
+
+    setValue4I(v)
+    {
+        this.needsUpdate = true;
+        this._value = v || vec4.create();
+    }
+
+    updateValueBool()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+        this._shader.getCgl().gl.uniform1i(this._loc, this._value ? 1 : 0);
+
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueBool(v)
+    {
+        if (v != this._value)
+        {
+            this.needsUpdate = true;
+            this._value = v;
+        }
+    }
+
+    setValueArray4F(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValueArray4F()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        if (!this._value) return;
+        this._shader.getCgl().gl.uniform4fv(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueArray3F(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValueArray3F()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        if (!this._value) return;
+        this._shader.getCgl().gl.uniform3fv(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueArray2F(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValueArray2F()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        if (!this._value) return;
+        this._shader.getCgl().gl.uniform2fv(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueArrayF(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValueArrayF()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        if (!this._value) return;
+        this._shader.getCgl().gl.uniform1fv(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueArrayT(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+
+    updateValue3F()
+    {
+        if (!this._value) return;
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+
+        this._shader.getCgl().gl.uniform3f(this._loc, this._value[0], this._value[1], this._value[2]);
+        this.needsUpdate = false;
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValue3F(v)
+    {
+        if (!v) return;
+        if (!this._oldValue)
+        {
+            this._oldValue = [v[0] - 1, 1, 2];
+            this.needsUpdate = true;
+        }
+        else if (v[0] != this._oldValue[0] || v[1] != this._oldValue[1] || v[2] != this._oldValue[2])
+        {
+            this._oldValue[0] = v[0];
+            this._oldValue[1] = v[1];
+            this._oldValue[2] = v[2];
+            this.needsUpdate = true;
+        }
+
+        this._value = v;
+    }
+
+    updateValue2F()
+    {
+        if (!this._value) return;
+
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+
+        this._shader.getCgl().gl.uniform2f(this._loc, this._value[0], this._value[1]);
+        this.needsUpdate = false;
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValue2F(v)
+    {
+        if (!v) return;
+        if (!this._oldValue)
+        {
+            this._oldValue = [v[0] - 1, 1];
+            this.needsUpdate = true;
+        }
+        else if (v[0] != this._oldValue[0] || v[1] != this._oldValue[1])
+        {
+            this._oldValue[0] = v[0];
+            this._oldValue[1] = v[1];
+            this.needsUpdate = true;
+        }
+        this._value = v;
+    }
+
+    updateValue4F()
+    {
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+
+        if (!this._value)
+        {
+            this._log.warn("no value for uniform", this._name, this);
+            this._value = [0, 0, 0, 0];
+        }
+
+        this.needsUpdate = false;
+        this._shader.getCgl().gl.uniform4f(this._loc, this._value[0], this._value[1], this._value[2], this._value[3]);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValue4F(v)
+    {
+        if (typeof this.value == "number") this.value = vec4.create(); // this should not be needed, but somehow it crashes with some shadermods
+
+        if (!v) return;
+        if (!this._oldValue)
+        {
+            this._oldValue = [v[0] - 1, 1, 2, 3];
+            this.needsUpdate = true;
+        }
+        else if (v[0] != this._oldValue[0] || v[1] != this._oldValue[1] || v[2] != this._oldValue[2] || v[3] != this._oldValue[3])
+        {
+            this._oldValue[0] = v[0];
+            this._oldValue[1] = v[1];
+            this._oldValue[2] = v[2];
+            this.needsUpdate = true;
+        }
+
+        this._value = v;
+    }
+
+    updateValueM4()
+    {
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+        if (!this._value || this._value.length % 16 != 0) return console.log("this.name", this._name, this._value);
+
+        this._shader.getCgl().gl.uniformMatrix4fv(this._loc, false, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    setValueM4(v)
+    {
+        this.needsUpdate = true;
+        this._value = v || mat4.create();
+    }
+
+    updateValueArrayT()
+    {
+        if (!this._isValidLoc()) this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+        else this.needsUpdate = false;
+
+        if (!this._value) return;
+        this._shader.getCgl().gl.uniform1iv(this._loc, this._value);
+        this._cgl.profileData.profileUniformCount++;
+    }
+
+    updateValueT()
+    {
+        if (!this._isValidLoc())
+        {
+            this._loc = this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(), this._name);
+            this._cgl.profileData.profileShaderGetUniform++;
+            this._cgl.profileData.profileShaderGetUniformName = this._name;
+        }
+
+        this._cgl.profileData.profileUniformCount++;
+        this._shader.getCgl().gl.uniform1i(this._loc, this._value);
+        this.needsUpdate = false;
+    }
+
+    setValueT(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+}
+
+
+Uniform.glslTypeString = (t) =>
+{
+    if (t == "f") return "float";
+    if (t == "b") return "bool";
+    if (t == "i") return "int";
+    if (t == "2i") return "ivec2";
+    if (t == "2f") return "vec2";
+    if (t == "3f") return "vec3";
+    if (t == "4f") return "vec4";
+    if (t == "m4") return "mat4";
+
+    if (t == "t") return "sampler2D";
+    if (t == "tc") return "samplerCube";
+
+    if (t == "3f[]") return null; // ignore this for now...
+    if (t == "m4[]") return null; // ignore this for now...
+    if (t == "f[]") return null; // ignore this for now...
+
+    console.warn("[CGL UNIFORM] unknown glsl type string ", t);
+};
+
+
+/**
+ * @function setValue
+ * @memberof Uniform
+ * @instance
+ * @param {Number|Array|Matrix|Texture} value
+ */
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_texture.js
+
+
+
+
+
+const DEFAULT_TEXTURE_SIZE = 8;
+
+/**
+ * A Texture
+ * @external CGL
+ * @namespace Texture
+ * @constructor
+ * @param {Context} cgl
+ * @param {Object} [options]
+ * @hideconstructor
+ * @class
+ * @example
+ * // generate a 256x256 pixel texture of random colors
+ * const size=256;
+ * const data = new Uint8Array(size*size*4);
+ *
+ * for(var x=0;x<size*size*4;x++) data[ x*4+3]=255;
+ *
+ * const tex=new CGL.Texture(cgl);
+ * tex.initFromData(data,size,size,CGL.Texture.FILTER_NEAREST,CGL.Texture.WRAP_REPEAT);
+ */
+const Texture = function (__cgl, options = {})
+{
+    if (!__cgl) throw new Error("no cgl");
+    this._log = new Logger("cgl_texture");
+    this._cgl = __cgl;
+    this.pixelFormat = options.pixelFormat || Texture.PFORMATSTR_RGBA8UB;
+    this.tex = this._cgl.gl.createTexture();
+    this.id = CABLES.uuid();
+    this.width = 0;
+    this.height = 0;
+    this.loading = false;
+    this.flip = true;
+    this.flipped = false;
+    this.shadowMap = false;
+    this.deleted = false;
+    this.image = null;
+    this.anisotropic = 0;
+    this.filter = Texture.FILTER_NEAREST;
+    this.wrap = Texture.WRAP_CLAMP_TO_EDGE;
+    this.texTarget = this._cgl.gl.TEXTURE_2D;
+    if (options && options.type) this.texTarget = options.type;
+    this.textureType = Texture.TYPE_DEFAULT;
+    this.unpackAlpha = true;
+    this._fromData = true;
+    this.name = "unknown";
+
+    this._glDataType = -1;
+    this._glInternalFormat = -1;
+    this._glDataFormat = -1;
+
+
+    if (options)
+    {
+        this.name = options.name || this.name;
+        if (options.isDepthTexture)
+        {
+            this.textureType = Texture.TYPE_DEPTH;
+        }
+        if (options.isFloatingPointTexture === true) this.textureType = Texture.TYPE_FLOAT;
+
+        if ("textureType" in options) this.textureType = options.textureType;
+        if ("filter" in options) this.filter = options.filter;
+        if ("wrap" in options) this.wrap = options.wrap;
+        if ("unpackAlpha" in options) this.unpackAlpha = options.unpackAlpha;
+        if ("flip" in options) this.flip = options.flip;
+        if ("shadowMap" in options) this.shadowMap = options.shadowMap;
+        if ("anisotropic" in options) this.anisotropic = options.anisotropic;
+    }
+    else
+    {
+        options = {};
+    }
+
+    if (!options.pixelFormat && options.isFloatingPointTexture) this.pixelFormat = Texture.PFORMATSTR_RGBA32F;
+
+    if (this.textureType == Texture.TYPE_DEPTH) this.pixelFormat = Texture.PFORMATSTR_DEPTH;
+
+
+
+    if (!options.width) options.width = DEFAULT_TEXTURE_SIZE;
+    if (!options.height) options.height = DEFAULT_TEXTURE_SIZE;
+
+    this._cgl.profileData.profileTextureNew++;
+
+
+    this.setFormat(Texture.setUpGlPixelFormat(this._cgl, this.pixelFormat));
+    this._cgl.profileData.addHeavyEvent("texture created", this.name, options.width + "x" + options.height);
+
+    this.setSize(options.width, options.height);
+    this.getInfoOneLine();
+};
+
+Texture.prototype.isFloatingPoint = function ()
+{
+    return Texture.isPixelFormatFloat(this.pixelFormat);
+};
+
+/**
+ * returns true if otherTexture has same options (width/height/filter/wrap etc)
+ * @function compareSettings
+ * @memberof Texture
+ * @instance
+ * @param {Texture} otherTexture
+ * @returns {Boolean}
+ */
+Texture.prototype.compareSettings = function (tex)
+{
+    // if (!tex) { this._log.warn("compare: no tex"); return false; }
+    // if (tex.width != this.width) this._log.warn("tex.width not equal", tex.width, this.width);
+    // if (tex.height != this.height) this._log.warn("tex.height not equal", tex.height, this.height);
+    // if (tex.filter != this.filter) this._log.warn("tex.filter not equal");
+    // if (tex.wrap != this.wrap) this._log.warn("tex.wrap not equal");
+    // if (tex.textureType != this.textureType) this._log.warn("tex.textureType not equal");
+    // if (tex.unpackAlpha != this.unpackAlpha) this._log.warn("tex.unpackAlpha not equal");
+    // if (tex.anisotropic != this.anisotropic) this._log.warn("tex.anisotropic not equal");
+    // if (tex.shadowMap != this.shadowMap) this._log.warn("tex.shadowMap not equal");
+    // if (tex.texTarget != this.texTarget) this._log.warn("tex.texTarget not equal");
+    // if (tex.flip != this.flip) this._log.warn("tex.flip not equal");
+
+    if (!tex) return false;
+    return (
+        tex.width == this.width &&
+        tex.height == this.height &&
+        tex.filter == this.filter &&
+        tex.wrap == this.wrap &&
+        tex.textureType == this.textureType &&
+        tex.unpackAlpha == this.unpackAlpha &&
+        tex.anisotropic == this.anisotropic &&
+        tex.shadowMap == this.shadowMap &&
+        tex.texTarget == this.texTarget &&
+        tex.flip == this.flip
+    );
+};
+
+/**
+ * returns a new texture with the same settings (does not copy texture itself)
+ * @function clone
+ * @memberof Texture
+ * @instance
+ * @returns {Texture}
+ */
+Texture.prototype.clone = function ()
+{
+    const newTex = new Texture(this._cgl, {
+        "name": this.name,
+        "filter": this.filter,
+        "anisotropic": this.anisotropic,
+        "wrap": this.wrap,
+        "textureType": this.textureType,
+        "pixelFormat": this.pixelFormat,
+        "unpackAlpha": this.unpackAlpha,
+        "flip": this.flip,
+        "width": this.width,
+        "height": this.height,
+    });
+
+    this._cgl.profileData.addHeavyEvent("texture created", this.name, this.width + "x" + this.height);
+
+    if (!this.compareSettings(newTex))
+    {
+        this._log.error("Cloned texture settings do not compare!");
+        this._log.error(this);
+        this._log.error(newTex);
+    }
+
+    return newTex;
+};
+
+
+Texture.prototype.setFormat = function (o)
+{
+    this.pixelFormat = o.pixelFormat;
+    this._glDataFormat = o.glDataFormat;
+    this._glInternalFormat = o.glInternalFormat;
+    this._glDataType = o.glDataType;
+};
+
+
+Texture.setUpGlPixelFormat = function (cgl, pixelFormatStr)
+{
+    const o = {};
+
+    if (!pixelFormatStr)
+    {
+        console.log("no pixelformatstr!");
+        console.log((new Error()).stack);
+        pixelFormatStr = Texture.PFORMATSTR_RGBA8UB;
+    }
+
+    o.pixelFormatBase = pixelFormatStr;
+
+
+    o.pixelFormat = pixelFormatStr;
+    o.glDataType = cgl.gl.UNSIGNED_BYTE;
+    o.glInternalFormat = cgl.gl.RGBA8;
+    o.glDataFormat = cgl.gl.RGBA;
+
+    let floatDatatype = cgl.gl.FLOAT;
+
+    if (cgl.glUseHalfFloatTex)
+    {
+        if (pixelFormatStr == Texture.PFORMATSTR_RGBA32F) pixelFormatStr = Texture.PFORMATSTR_RGBA16F;
+        if (pixelFormatStr == Texture.PFORMATSTR_RG32F) pixelFormatStr = Texture.PFORMATSTR_RG16F;
+        if (pixelFormatStr == Texture.PFORMATSTR_R32F) pixelFormatStr = Texture.PFORMATSTR_R16F;
+    }
+
+    if (pixelFormatStr.contains("16bit"))
+    {
+        if (cgl.glVersion == 2)
+        {
+            // cgl.enableExtension("OES_texture_half_float");
+            const hasExt = cgl.enableExtension("EXT_color_buffer_half_float");
+
+            if (!hasExt)
+            {
+                console.warn("no 16bit extension, fallback to 32bit", pixelFormatStr);
+                // fallback to 32 bit?
+                if (pixelFormatStr == Texture.PFORMATSTR_RGBA16F) pixelFormatStr = Texture.PFORMATSTR_RGBA32F;
+                if (pixelFormatStr == Texture.PFORMATSTR_RGB16F) pixelFormatStr = Texture.PFORMATSTR_RGB32F;
+                if (pixelFormatStr == Texture.PFORMATSTR_RG16F) pixelFormatStr = Texture.PFORMATSTR_RG32F;
+                if (pixelFormatStr == Texture.PFORMATSTR_R16F) pixelFormatStr = Texture.PFORMATSTR_R32F;
+            }
+            else
+            {
+                floatDatatype = cgl.gl.HALF_FLOAT;
+            }
+        }
+    }
+
+    if (cgl.glVersion == 1)
+    {
+        o.glInternalFormat = cgl.gl.RGBA;
+
+        if (pixelFormatStr == Texture.PFORMATSTR_RGBA16F || pixelFormatStr == Texture.PFORMATSTR_RG16F || pixelFormatStr == Texture.PFORMATSTR_R16F)
+        {
+            const ext = cgl.enableExtension("OES_texture_half_float");
+            if (!ext) throw new Error("no half float texture extension");
+
+            floatDatatype = ext.HALF_FLOAT_OES;
+        }
+    }
+
+
+    if (pixelFormatStr == Texture.PFORMATSTR_RGBA8UB)
+    {
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_RGB565)
+    {
+        o.glInternalFormat = cgl.gl.RGB565;
+        o.glDataFormat = cgl.gl.RGB;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_R8UB)
+    {
+        o.glInternalFormat = cgl.gl.R8;
+        o.glDataFormat = cgl.gl.RED;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_RG8UB)
+    {
+        o.glInternalFormat = cgl.gl.RG8;
+        o.glDataFormat = cgl.gl.RG;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_RGB8UB)
+    {
+        o.glInternalFormat = cgl.gl.RGB8;
+        o.glDataFormat = cgl.gl.RGB;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_SRGBA8)
+    {
+        o.glInternalFormat = cgl.gl.SRGB8_ALPHA8;
+    }
+
+    else if (pixelFormatStr == Texture.PFORMATSTR_R32F)
+    {
+        o.glInternalFormat = cgl.gl.R32F;
+        o.glDataFormat = cgl.gl.RED;
+        o.glDataType = floatDatatype;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_R16F)
+    {
+        o.glInternalFormat = cgl.gl.R16F;
+        o.glDataType = floatDatatype;
+        o.glDataFormat = cgl.gl.RED;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_RG16F)
+    {
+        o.glInternalFormat = cgl.gl.RG16F;
+        o.glDataType = floatDatatype;
+        o.glDataFormat = cgl.gl.RG;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_RGBA16F)
+    {
+        if (cgl.glVersion == 1) o.glInternalFormat = cgl.gl.RGBA;
+        else o.glInternalFormat = cgl.gl.RGBA16F;
+        o.glDataType = floatDatatype;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_R11FG11FB10F)
+    {
+        o.glInternalFormat = cgl.gl.R11F_G11F_B10F;
+        o.glDataType = floatDatatype;
+        o.glDataFormat = cgl.gl.RGB;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_RGBA32F)
+    {
+        if (cgl.glVersion == 1) o.glInternalFormat = cgl.gl.RGBA;
+        else o.glInternalFormat = cgl.gl.RGBA32F;
+        o.glDataType = floatDatatype;
+    }
+    else if (pixelFormatStr == Texture.PFORMATSTR_DEPTH)
+    {
+        if (cgl.glVersion == 1)
+        {
+            o.glInternalFormat = cgl.gl.DEPTH_COMPONENT;
+            o.glDataType = cgl.gl.UNSIGNED_SHORT;
+            o.glDataFormat = cgl.gl.DEPTH_COMPONENT;
+        }
+        else
+        {
+            o.glInternalFormat = cgl.gl.DEPTH_COMPONENT32F;
+            o.glDataType = cgl.gl.FLOAT;
+            o.glDataFormat = cgl.gl.DEPTH_COMPONENT;
+        }
+    }
+    else
+    {
+        console.log("unknown pixelformat ", pixelFormatStr);
+    }
+
+    /// //////
+
+    if (pixelFormatStr.contains("32bit") || pixelFormatStr == Texture.PFORMATSTR_R11FG11FB10F)
+    {
+        if (cgl.glVersion == 2) cgl.enableExtension("EXT_color_buffer_float");
+        if (cgl.glVersion == 2) cgl.enableExtension("EXT_float_blend");
+
+        cgl.enableExtension("OES_texture_float_linear"); // yes, i am sure, this is a webgl 1 and 2 ext
+    }
+
+
+    o.numColorChannels = 1;
+    if (pixelFormatStr.startsWith("R"))o.numColorChannels = 1;
+    if (pixelFormatStr.startsWith("RG"))o.numColorChannels = 2;
+    if (pixelFormatStr.startsWith("RGB"))o.numColorChannels = 3;
+    if (pixelFormatStr.startsWith("RGBA"))o.numColorChannels = 4;
+
+
+    // console.log(pixelFormatStr, this.name);
+
+    if (!o.glDataType || !o.glInternalFormat || !o.glDataFormat) console.log("pixelformat wrong ?!", pixelFormatStr, o.glDataType, o.glInternalFormat, o.glDataFormat, this);
+
+    return o;
+};
+
+/**
+ * set pixel size of texture
+ * @function setSize
+ * @memberof Texture
+ * @instance
+ * @param {Number} width
+ * @param {Number} height
+ */
+Texture.prototype.setSize = function (w, h)
+{
+    if (this._cgl.aborted) return;
+    if (w != w || w <= 0 || !w) w = DEFAULT_TEXTURE_SIZE;
+    if (h != h || h <= 0 || !h) h = DEFAULT_TEXTURE_SIZE;
+
+    if (w > this._cgl.maxTexSize || h > this._cgl.maxTexSize) this._log.error("texture size too big! " + w + "x" + h + " / max: " + this._cgl.maxTexSize);
+
+    w = Math.min(w, this._cgl.maxTexSize);
+    h = Math.min(h, this._cgl.maxTexSize);
+
+    w = Math.floor(w);
+    h = Math.floor(h);
+    if (this.width == w && this.height == h) return;
+
+    w = this._cgl.checkTextureSize(w);
+    h = this._cgl.checkTextureSize(h);
+
+    this.width = w;
+    this.height = h;
+    this.deleted = false;
+
+    this.setFormat(Texture.setUpGlPixelFormat(this._cgl, this.pixelFormat));
+
+    this.shortInfoString = this.getInfoOneLine();// w + "x" + h + "";
+
+    this._cgl.gl.bindTexture(this.texTarget, this.tex);
+    this._cgl.profileData.profileTextureResize++;
+
+    const uarr = null;
+
+    this._cgl.gl.texImage2D(this.texTarget, 0, this._glInternalFormat, w, h, 0, this._glDataFormat, this._glDataType, uarr);
+
+    this._setFilter();
+
+    this.updateMipMap();
+
+    this._cgl.gl.bindTexture(this.texTarget, null);
+};
+
+
+/**
+ * @function initFromData
+ * @memberof Texture
+ * @instance
+ * @description create texturem from rgb data
+ * @param {Array<Number>} data rgb color array [r,g,b,a,r,g,b,a,...]
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Number} filter
+ * @param {Number} wrap
+ */
+Texture.prototype.initFromData = function (data, w, h, filter, wrap)
+{
+    this.filter = filter;
+    this.wrap = wrap;
+    if (filter == undefined) this.filter = Texture.FILTER_LINEAR;
+    if (wrap == undefined) this.wrap = Texture.WRAP_CLAMP_TO_EDGE;
+    this.width = w;
+    this.height = h;
+    this._fromData = true;
+    this.deleted = false;
+
+    if (this.height > this._cgl.maxTexSize || this.width > this._cgl.maxTexSize)
+    {
+        const t = CGL.Texture.getTempTexture(this._cgl);
+        this.width = t.width;
+        this.height = t.height;
+        this.tex = t.tex;
+        this._log.error("[cgl_texture] texture size to big!!!", this.width, this.height, this._cgl.maxTexSize);
+        return;
+    }
+
+    if (this.flip) this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_FLIP_Y_WEBGL, this.flip);
+
+    this._cgl.gl.bindTexture(this.texTarget, this.tex);
+
+    this.setFormat(Texture.setUpGlPixelFormat(this._cgl, this.pixelFormat));
+
+    this._cgl.gl.texImage2D(this.texTarget, 0, this._glInternalFormat, w, h, 0, this._glDataFormat, this._glDataType, data);
+
+    this._setFilter();
+    this.updateMipMap();
+
+    if (this.flip) this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_FLIP_Y_WEBGL, false);
+    this._cgl.gl.bindTexture(this.texTarget, null);
+};
+
+Texture.prototype.updateMipMap = function ()
+{
+    if ((this._cgl.glVersion == 2 || this.isPowerOfTwo()) && this.filter == Texture.FILTER_MIPMAP)
+    {
+        this._cgl.gl.generateMipmap(this.texTarget);
+        this._cgl.profileData.profileGenMipMap++;
+    }
+};
+
+/**
+ * set texture data from an image/canvas object
+ * @function initTexture
+ * @memberof Texture
+ * @instance
+ * @param {Object} image
+ * @param {Number} filter
+ */
+Texture.prototype.initTexture = function (img, filter)
+{
+    this._cgl.printError("before initTexture");
+    this._cgl.checkFrameStarted("texture inittexture");
+    this._fromData = false;
+
+    this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this.unpackAlpha);
+    if (img.width || img.videoWidth) this.width = img.videoWidth || img.width;
+    if (img.height || img.videoHeight) this.height = img.videoHeight || img.height;
+
+    if (filter !== undefined) this.filter = filter; // todo: can we remove this filter param?
+
+    if (img.height > this._cgl.maxTexSize || img.width > this._cgl.maxTexSize)
+    {
+        const t = CGL.Texture.getTempTexture(this._cgl);
+        this.width = t.width;
+        this.height = t.height;
+        this.tex = t.tex;
+        this._log.error("[cgl_texture] texture size to big!!!", img.width, img.height, this._cgl.maxTexSize);
+        return;
+    }
+
+
+    // console.log("loaded texture", img.width, img.height);
+
+    this._cgl.gl.bindTexture(this.texTarget, this.tex);
+
+    this.deleted = false;
+    this.flipped = !this.flip;
+    if (this.flipped) this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_FLIP_Y_WEBGL, this.flipped);
+
+
+    this.setFormat(Texture.setUpGlPixelFormat(this._cgl, this.pixelFormat));
+
+    this._cgl.gl.texImage2D(this.texTarget, 0, this._glInternalFormat, this._glDataFormat, this._glDataType, img);
+    // this._cgl.gl.texImage2D(this.texTarget, 0, this._cgl.gl.RGBA, this._cgl.gl.RGBA, this._cgl.gl.UNSIGNED_BYTE, img);
+
+    // if (this._cgl.printError("[cgl_texture] init " + this.name));
+
+    this._setFilter();
+    this.updateMipMap();
+
+    // if (this._cgl.printError("[cgl_texture] init2"));
+
+    this._cgl.gl.bindTexture(this.texTarget, null);
+    this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false);
+    if (this.flipped) this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_FLIP_Y_WEBGL, false);
+
+    this.getInfoOneLine();
+    this._cgl.printError("initTexture");
+};
+
+/**
+ * delete texture. use this when texture is no longer needed
+ * @function delete
+ * @memberof Texture
+ * @instance
+ */
+Texture.prototype.dispose =
+Texture.prototype.delete = function ()
+{
+    if (this.loading)
+    {
+        // cant delete texture when still loading
+        // setTimeout(this.delete.bind(this), 50);
+        return;
+    }
+
+    this.deleted = true;
+    this.width = 0;
+    this.height = 0;
+    this._cgl.profileData.profileTextureDelete++;
+    this._cgl.gl.deleteTexture(this.tex);
+    this.image = null;
+
+    this.tex = null;
+};
+
+/**
+ * @function isPowerOfTwo
+ * @memberof Texture
+ * @instance
+ * @description return true if texture width and height are both power of two
+ * @return {Boolean}
+ */
+Texture.prototype.isPowerOfTwo = function ()
+{
+    return Texture.isPowerOfTwo(this.width) && Texture.isPowerOfTwo(this.height);
+};
+
+Texture.prototype.printInfo = function ()
+{
+    console.log(this.getInfo());
+};
+
+Texture.prototype.getInfoReadable = function ()
+{
+    const info = this.getInfo();
+    let html = "";
+
+    info.name = info.name.substr(0, info.name.indexOf("?rnd="));
+
+    for (const i in info)
+    {
+        html += "* " + i + ":  **" + info[i] + "**\n";
+    }
+
+    return html;
+};
+
+Texture.prototype.getInfoOneLine = function ()
+{
+    let txt = "" + this.width + "x" + this.height;
+    txt += " ";
+    // if (this.textureType === CGL.Texture.TYPE_FLOAT) txt += " 32bit"; else txt += " 8bit";
+    // if (this.textureType === CGL.Texture.TYPE_FLOAT) txt += " 32bit"; else txt += " 8bit";
+    txt += this.pixelFormat;
+
+    if (this.filter === CGL.Texture.FILTER_NEAREST) txt += " nearest";
+    if (this.filter === CGL.Texture.FILTER_LINEAR) txt += " linear";
+    if (this.filter === CGL.Texture.FILTER_MIPMAP) txt += " mipmap";
+
+    if (this.wrap === CGL.Texture.WRAP_CLAMP_TO_EDGE) txt += " clamp";
+    if (this.wrap === CGL.Texture.WRAP_REPEAT) txt += " repeat";
+    if (this.wrap === CGL.Texture.WRAP_MIRRORED_REPEAT) txt += " repeatmir";
+
+    this.shortInfoString = txt;
+
+    return txt;
+};
+
+Texture.prototype.getInfoOneLineShort = function ()
+{
+    let txt = "" + this.width + "x" + this.height;
+    // if (this.textureType === CGL.Texture.TYPE_FLOAT) txt += " 32bit"; else txt += " 8bit";
+    txt += " ";
+    txt += this.pixelFormat;
+
+    this.shortInfoString = txt;
+
+    return txt;
+};
+
+
+Texture.prototype.getInfo = function ()
+{
+    return Texture.getTexInfo(this);
+};
+
+
+Texture.prototype._setFilter = function ()
+{
+    this._cgl.printError("before _setFilter");
+
+    if (!this._fromData)
+    {
+        this._cgl.gl.pixelStorei(this._cgl.gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, this.unpackAlpha);
+    }
+
+    if (this.shadowMap)
+    {
+        this._cgl.gl.texParameteri(this._cgl.gl.TEXTURE_2D, this._cgl.gl.TEXTURE_COMPARE_MODE, this._cgl.gl.COMPARE_REF_TO_TEXTURE);
+        this._cgl.gl.texParameteri(this._cgl.gl.TEXTURE_2D, this._cgl.gl.TEXTURE_COMPARE_FUNC, this._cgl.gl.LEQUAL);
+    }
+
+    if (this.textureType == Texture.TYPE_FLOAT && this.filter == Texture.FILTER_MIPMAP)
+    {
+        this.filter = Texture.FILTER_LINEAR;
+        this._log.stack("texture: HDR and mipmap filtering at the same time is not possible");
+    }
+
+    if (this._cgl.glVersion == 1 && !this.isPowerOfTwo())
+    {
+        this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MAG_FILTER, this._cgl.gl.NEAREST);
+        this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MIN_FILTER, this._cgl.gl.NEAREST);
+
+        this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_S, this._cgl.gl.CLAMP_TO_EDGE);
+        this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_T, this._cgl.gl.CLAMP_TO_EDGE);
+
+        this.filter = Texture.FILTER_NEAREST;
+        this.wrap = Texture.WRAP_CLAMP_TO_EDGE;
+    }
+    else
+    {
+        if (this.wrap == Texture.WRAP_CLAMP_TO_EDGE)
+        {
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_S, this._cgl.gl.CLAMP_TO_EDGE);
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_T, this._cgl.gl.CLAMP_TO_EDGE);
+        }
+        else if (this.wrap == Texture.WRAP_REPEAT)
+        {
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_S, this._cgl.gl.REPEAT);
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_T, this._cgl.gl.REPEAT);
+        }
+        else if (this.wrap == Texture.WRAP_MIRRORED_REPEAT)
+        {
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_S, this._cgl.gl.MIRRORED_REPEAT);
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_WRAP_T, this._cgl.gl.MIRRORED_REPEAT);
+        }
+
+        if (this.filter == Texture.FILTER_NEAREST)
+        {
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MAG_FILTER, this._cgl.gl.NEAREST);
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MIN_FILTER, this._cgl.gl.NEAREST);
+        }
+        else if (this.filter == Texture.FILTER_LINEAR)
+        {
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MIN_FILTER, this._cgl.gl.LINEAR);
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MAG_FILTER, this._cgl.gl.LINEAR);
+        }
+        else if (this.filter == Texture.FILTER_MIPMAP)
+        {
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MAG_FILTER, this._cgl.gl.LINEAR);
+            this._cgl.gl.texParameteri(this.texTarget, this._cgl.gl.TEXTURE_MIN_FILTER, this._cgl.gl.LINEAR_MIPMAP_LINEAR);
+        }
+        else
+        {
+            this._log.log("unknown texture filter!", this.filter);
+            throw new Error("unknown texture filter!" + this.filter);
+        }
+
+        if (this.anisotropic)
+        {
+            const ext = this._cgl.enableExtension("EXT_texture_filter_anisotropic");
+
+
+
+            if (this._cgl.maxAnisotropic)
+            {
+                const aniso = Math.min(this._cgl.maxAnisotropic, this.anisotropic);
+                this._cgl.gl.texParameterf(this._cgl.gl.TEXTURE_2D, ext.TEXTURE_MAX_ANISOTROPY_EXT, aniso);
+            }
+        }
+    }
+    this.getInfoOneLine();
+    this._cgl.printError("_setFilter");
+};
+
+
+/**
+ * @function load
+ * @static
+ * @memberof Texture
+ * @description load an image from an url
+ * @param {Context} cgl
+ * @param {String} url
+ * @param {Function} onFinished
+ * @param {Object} options
+ * @return {Texture}
+ */
+Texture.load = function (cgl, url, finishedCallback, settings)
+{
+    if (!url) return finishedCallback({ "error": true });
+    let loadingId = null;
+    if (!cgl.patch.loading.existByName(url)) loadingId = cgl.patch.loading.start("texture", url);
+
+    const texture = new Texture(cgl);
+    texture.name = url;
+
+    // texture.pixelFormat = Texture.PFORMATSTR_;
+
+    if (cgl.patch.isEditorMode()) gui.jobs().start({ "id": "loadtexture" + loadingId, "title": "loading texture " + CABLES.basename(url) });
+
+    texture.image = new Image();
+    texture.image.crossOrigin = "anonymous";
+    texture.loading = true;
+
+    if (settings && settings.hasOwnProperty("filter")) texture.filter = settings.filter;
+    if (settings && settings.hasOwnProperty("flip")) texture.flip = settings.flip;
+    if (settings && settings.hasOwnProperty("wrap")) texture.wrap = settings.wrap;
+    if (settings && settings.hasOwnProperty("anisotropic")) texture.anisotropic = settings.anisotropic;
+    if (settings && settings.hasOwnProperty("unpackAlpha")) texture.unpackAlpha = settings.unpackAlpha;
+    if (settings && settings.hasOwnProperty("pixelFormat")) texture.pixelFormat = settings.pixelFormat;
+
+    texture.image.onabort = texture.image.onerror = (e) =>
+    {
+        console.warn("[cgl.texture.load] error loading texture", url, e);
+        texture.loading = false;
+        if (loadingId) cgl.patch.loading.finished(loadingId);
+        const error = { "error": true };
+        if (finishedCallback) finishedCallback(error, texture);
+        if (cgl.patch.isEditorMode()) gui.jobs().finish("loadtexture" + loadingId);
+    };
+
+    texture.image.onload = function (e)
+    {
+        cgl.addNextFrameOnceCallback(() =>
+        {
+            texture.initTexture(texture.image);
+            if (loadingId) cgl.patch.loading.finished(loadingId);
+            texture.loading = false;
+            if (cgl.patch.isEditorMode()) gui.jobs().finish("loadtexture" + loadingId);
+
+            if (finishedCallback) finishedCallback(null, texture);
+        });
+    };
+    texture.image.src = url;
+
+    return texture;
+};
+
+/**
+ * @static
+ * @function getTempTexture
+ * @memberof Texture
+ * @description returns the default temporary texture (grey diagonal stipes)
+ * @param {Context} cgl
+ * @return {Texture}
+ */
+Texture.getTempTexture = function (cgl)
+{
+    if (!cgl) console.error("[getTempTexture] no cgl!");
+    if (!cgl.tempTexture) cgl.tempTexture = Texture.getTemporaryTexture(cgl, 256, Texture.FILTER_LINEAR, Texture.REPEAT);
+    return cgl.tempTexture;
+};
+
+/**
+ * @static
+ * @function getErrorTexture
+ * @memberof Texture
+ * @description returns the default temporary texture (grey diagonal stipes)
+ * @param {Context} cgl
+ * @return {Texture}
+ */
+Texture.getErrorTexture = function (cgl)
+{
+    if (!cgl) console.error("[getTempTexture] no cgl!");
+    if (!cgl.errorTexture) cgl.errorTexture = Texture.getTemporaryTexture(cgl, 256, Texture.FILTER_LINEAR, Texture.REPEAT, 1, 0.2, 0.2);
+    return cgl.errorTexture;
+};
+
+
+/**
+ * @function getEmptyTexture
+ * @memberof Texture
+ * @instance
+ * @description returns a reference to a small empty (transparent) texture
+ * @return {Texture}
+ */
+Texture.getEmptyTexture = function (cgl, fp)
+{
+    if (fp) return Texture.getEmptyTextureFloat(cgl);
+    if (!cgl) console.error("[getEmptyTexture] no cgl!");
+    if (cgl.tempTextureEmpty) return cgl.tempTextureEmpty;
+
+    cgl.tempTextureEmpty = new Texture(cgl, { "name": "emptyTexture" });
+    const data = new Uint8Array(8 * 8 * 4).fill(0);
+    for (let i = 0; i < 8 * 8 * 4; i += 4) data[i + 3] = 0;
+
+    cgl.tempTextureEmpty.initFromData(data, 8, 8, Texture.FILTER_NEAREST, Texture.WRAP_REPEAT);
+
+    return cgl.tempTextureEmpty;
+};
+
+/**
+ * @function getEmptyTextureFloat
+ * @memberof Texture
+ * @instance
+ * @description returns a reference to a small empty (transparent) 32bit texture
+ * @return {Texture}
+ */
+Texture.getEmptyTextureFloat = function (cgl)
+{
+    if (!cgl) console.error("[getEmptyTextureFloat] no cgl!");
+    if (cgl.tempTextureEmptyFloat) return cgl.tempTextureEmptyFloat;
+
+    cgl.tempTextureEmptyFloat = new Texture(cgl, { "name": "emptyTexture", "isFloatingPointTexture": true });
+    const data = new Float32Array(8 * 8 * 4).fill(1);
+    for (let i = 0; i < 8 * 8 * 4; i += 4) data[i + 3] = 0;
+
+    cgl.tempTextureEmptyFloat.initFromData(data, 8, 8, Texture.FILTER_NEAREST, Texture.WRAP_REPEAT);
+
+    return cgl.tempTextureEmptyFloat;
+};
+
+
+/**
+ * @function getRandomTexture
+ * @memberof Texture
+ * @static
+ * @description returns a reference to a random texture
+ * @return {Texture}
+ */
+Texture.getRandomTexture = function (cgl)
+{
+    if (!cgl) console.error("[getRandomTexture] no cgl!");
+    if (cgl.randomTexture) return cgl.randomTexture;
+
+    const size = 256;
+    const data = new Uint8Array(size * size * 4);
+
+    for (let x = 0; x < size * size; x++)
+    {
+        data[x * 4 + 0] = Math.random() * 255;
+        data[x * 4 + 1] = Math.random() * 255;
+        data[x * 4 + 2] = Math.random() * 255;
+        data[x * 4 + 3] = 255;
+    }
+
+    cgl.randomTexture = new Texture(cgl);
+    cgl.randomTexture.initFromData(data, size, size, Texture.FILTER_NEAREST, Texture.WRAP_REPEAT);
+
+    return cgl.randomTexture;
+};
+
+/**
+ * @function getRandomFloatTexture
+ * @memberof Texture
+ * @static
+ * @description returns a reference to a texture containing random numbers between -1 and 1
+ * @return {Texture}
+ */
+Texture.getRandomFloatTexture = function (cgl)
+{
+    if (!cgl) console.error("[getRandomTexture] no cgl!");
+    if (cgl.getRandomFloatTexture) return cgl.getRandomFloatTexture;
+
+    const size = 256;
+    const data = new Float32Array(size * size * 4);
+
+    for (let x = 0; x < size * size; x++)
+    {
+        data[x * 4 + 0] = (Math.random() - 0.5) * 2.0;
+        data[x * 4 + 1] = (Math.random() - 0.5) * 2.0;
+        data[x * 4 + 2] = (Math.random() - 0.5) * 2.0;
+        data[x * 4 + 3] = 1;
+    }
+
+    cgl.getRandomFloatTexture = new Texture(cgl, { "isFloatingPointTexture": true });
+    cgl.getRandomFloatTexture.initFromData(data, size, size, Texture.FILTER_NEAREST, Texture.WRAP_REPEAT);
+
+    return cgl.getRandomFloatTexture;
+};
+
+/**
+ * @function getBlackTexture
+ * @memberof Texture
+ * @static
+ * @description returns a reference to a black texture
+ * @return {Texture}
+ */
+Texture.getBlackTexture = function (cgl)
+{
+    if (!cgl) this._log.error("[getBlackTexture] no cgl!");
+    if (cgl.blackTexture) return cgl.blackTexture;
+
+    const size = 8;
+    const data = new Uint8Array(size * size * 4);
+
+    for (let x = 0; x < size * size; x++)
+    {
+        data[x * 4 + 0] = data[x * 4 + 1] = data[x * 4 + 2] = 0;
+        data[x * 4 + 3] = 255;
+    }
+
+    cgl.blackTexture = new Texture(cgl);
+    cgl.blackTexture.initFromData(data, size, size, Texture.FILTER_NEAREST, Texture.WRAP_REPEAT);
+
+    return cgl.blackTexture;
+};
+
+
+/**
+ * @function getEmptyCubemapTexture
+ * @memberof Texture
+ * @static
+ * @description returns an empty cubemap texture with rgba = [0, 0, 0, 0]
+ * @return {Texture}
+ */
+Texture.getEmptyCubemapTexture = function (cgl)
+{
+    const faces = [
+        cgl.gl.TEXTURE_CUBE_MAP_POSITIVE_X,
+        cgl.gl.TEXTURE_CUBE_MAP_NEGATIVE_X,
+        cgl.gl.TEXTURE_CUBE_MAP_POSITIVE_Y,
+        cgl.gl.TEXTURE_CUBE_MAP_NEGATIVE_Y,
+        cgl.gl.TEXTURE_CUBE_MAP_POSITIVE_Z,
+        cgl.gl.TEXTURE_CUBE_MAP_NEGATIVE_Z
+    ];
+
+    const tex = cgl.gl.createTexture();
+    const target = cgl.gl.TEXTURE_CUBE_MAP;
+    const filter = Texture.FILTER_NEAREST;
+    const wrap = Texture.WRAP_CLAMP_TO_EDGE;
+    const width = 8;
+    const height = 8;
+
+    cgl.profileData.profileTextureNew++;
+
+
+    cgl.gl.bindTexture(target, tex);
+    cgl.profileData.profileTextureResize++;
+
+    for (let i = 0; i < 6; i += 1)
+    {
+        const data = new Uint8Array(8 * 8 * 4);
+
+        cgl.gl.texImage2D(faces[i], 0, cgl.gl.RGBA, 8, 8, 0, cgl.gl.RGBA, cgl.gl.UNSIGNED_BYTE, data);
+        cgl.gl.texParameteri(target, cgl.gl.TEXTURE_MAG_FILTER, cgl.gl.NEAREST);
+        cgl.gl.texParameteri(target, cgl.gl.TEXTURE_MIN_FILTER, cgl.gl.NEAREST);
+
+        cgl.gl.texParameteri(target, cgl.gl.TEXTURE_WRAP_S, cgl.gl.CLAMP_TO_EDGE);
+        cgl.gl.texParameteri(target, cgl.gl.TEXTURE_WRAP_T, cgl.gl.CLAMP_TO_EDGE);
+    }
+
+
+    cgl.gl.bindTexture(target, null);
+
+    return {
+        "id": CABLES.uuid(),
+        "tex": tex,
+        "cubemap": tex,
+        "width": width,
+        "height": height,
+        "filter": filter,
+        "wrap": wrap,
+        "unpackAlpha": true,
+        "flip": true,
+        "_fromData": true,
+        "name": "emptyCubemapTexture",
+        "anisotropic": 0,
+    };
+};
+
+/**
+ * @static
+ * @function getTempGradientTexture
+ * @memberof Texture
+ * @description returns a gradient texture from black to white
+ * @param {Context} cgl
+ * @return {Texture}
+ */
+Texture.getTempGradientTexture = function (cgl)
+{
+    if (!cgl) console.error("[getTempGradientTexture] no cgl!");
+
+    if (cgl.tempTextureGradient) return cgl.tempTextureGradient;
+    const temptex = new Texture(cgl);
+    const size = 256;
+    const data = new Uint8Array(size * size * 4); // .fill(0);
+
+    for (let y = 0; y < size; y++)
+    {
+        for (let x = 0; x < size; x++)
+        {
+            data[(x + y * size) * 4 + 0] = data[(x + y * size) * 4 + 1] = data[(x + y * size) * 4 + 2] = 255 - y;
+            data[(x + y * size) * 4 + 3] = 255;
+        }
+    }
+
+    temptex.initFromData(data, size, size, Texture.FILTER_NEAREST, Texture.WRAP_REPEAT);
+    cgl.tempTextureGradient = temptex;
+    return temptex;
+};
+
+Texture.getTemporaryTexture = function (cgl, size, filter, wrap, r, g, b)
+{
+    if (r === undefined)r = 1;
+    if (g === undefined)g = 1;
+    if (b === undefined)b = 1;
+    const temptex = new Texture(cgl);
+    const arr = [];
+    for (let y = 0; y < size; y++)
+    {
+        for (let x = 0; x < size; x++)
+        {
+            if ((x + y) % 64 < 32)
+            {
+                arr.push((200 + (y / size) * 25 + (x / size) * 25) * r);
+                arr.push((200 + (y / size) * 25 + (x / size) * 25) * g);
+                arr.push((200 + (y / size) * 25 + (x / size) * 25) * b);
+            }
+            else
+            {
+                arr.push((40 + (y / size) * 25 + (x / size) * 25) * r);
+                arr.push((40 + (y / size) * 25 + (x / size) * 25) * g);
+                arr.push((40 + (y / size) * 25 + (x / size) * 25) * b);
+            }
+            arr.push(255);
+        }
+    }
+
+    const data = new Uint8Array(arr);
+    temptex.initFromData(data, size, size, filter, wrap);
+
+    return temptex;
+};
+
+/**
+ * @static
+ * @function createFromImage
+ * @memberof Texture
+ * @description create texturem from image data (e.g. image or canvas)
+ * @param {Context} cgl
+ * @param {Object} image
+ * @param {Object} options
+ */
+Texture.createFromImage = function (cgl, img, options)
+{
+    options = options || {};
+    const texture = new Texture(cgl, options);
+    texture.flip = false;
+    texture.image = img;
+    texture.width = img.videoWidth || img.width || 8;
+    texture.height = img.videoHeight || img.height || 8;
+    if (options.hasOwnProperty("wrap"))texture.wrap = options.wrap;
+
+    console.log("createFromImage", options);
+    texture.initTexture(img, options.filter);
+
+    return texture;
+};
+
+// deprecated!
+Texture.fromImage = function (cgl, img, filter, wrap)
+{
+    console.error("deprecated texture from image...");
+
+    const texture = new Texture(cgl);
+    texture.flip = false;
+    if (filter) texture.filter = filter;
+    if (wrap) texture.wrap = wrap;
+    texture.image = img;
+    texture.initTexture(img);
+    return texture;
+};
+
+/**
+ * @static
+ * @function isPowerOfTwo
+ * @memberof Texture
+ * @description returns true if x is power of two
+ * @param {Number} x
+ * @return {Boolean}
+ */
+Texture.isPowerOfTwo = function (x)
+{
+    return x == 1 || x == 2 || x == 4 || x == 8 || x == 16 || x == 32 || x == 64 || x == 128 || x == 256 || x == 512 || x == 1024 || x == 2048 || x == 4096 || x == 8192 || x == 16384;
+};
+
+Texture.getTexInfo = function (tex)
+{
+    const obj = {};
+
+    obj.name = tex.name;
+    obj["power of two"] = tex.isPowerOfTwo();
+    obj.size = tex.width + " x " + tex.height;
+
+    let targetString = tex.texTarget;
+    if (tex.texTarget == tex._cgl.gl.TEXTURE_2D) targetString = "TEXTURE_2D";
+    obj.target = targetString;
+
+    obj.unpackAlpha = tex.unpackAlpha;
+
+    if (tex.cubemap)obj.cubemap = true;
+
+    if (tex.textureType == Texture.TYPE_FLOAT) obj.textureType = "TYPE_FLOAT";
+    if (tex.textureType == Texture.TYPE_HALF_FLOAT) obj.textureType = "TYPE_HALF_FLOAT";
+    else if (tex.textureType == Texture.TYPE_DEPTH) obj.textureType = "TYPE_DEPTH";
+    else if (tex.textureType == Texture.TYPE_DEFAULT) obj.textureType = "TYPE_DEFAULT";
+    else obj.textureType = "UNKNOWN " + this.textureType;
+
+    if (tex.wrap == Texture.WRAP_CLAMP_TO_EDGE) obj.wrap = "CLAMP_TO_EDGE";
+    else if (tex.wrap == Texture.WRAP_REPEAT) obj.wrap = "WRAP_REPEAT";
+    else if (tex.wrap == Texture.WRAP_MIRRORED_REPEAT) obj.wrap = "WRAP_MIRRORED_REPEAT";
+    else obj.wrap = "UNKNOWN";
+
+    if (tex.filter == Texture.FILTER_NEAREST) obj.filter = "FILTER_NEAREST";
+    else if (tex.filter == Texture.FILTER_LINEAR) obj.filter = "FILTER_LINEAR";
+    else if (tex.filter == Texture.FILTER_MIPMAP) obj.filter = "FILTER_MIPMAP";
+    else obj.filter = "UNKNOWN";
+
+    obj.pixelFormat = tex.pixelFormat || "unknown";
+
+    return obj;
+};
+
+
+Texture.FILTER_NEAREST = 0;
+Texture.FILTER_LINEAR = 1;
+Texture.FILTER_MIPMAP = 2;
+
+Texture.WRAP_REPEAT = 0;
+Texture.WRAP_MIRRORED_REPEAT = 1;
+Texture.WRAP_CLAMP_TO_EDGE = 2;
+
+Texture.TYPE_DEFAULT = 0;
+Texture.TYPE_DEPTH = 1;
+Texture.TYPE_FLOAT = 2;
+
+
+Texture.PFORMATSTR_RGB565 = "RGB 5/6/5bit ubyte";
+
+Texture.PFORMATSTR_R8UB = "R 8bit ubyte";
+Texture.PFORMATSTR_RG8UB = "RG 8bit ubyte";
+Texture.PFORMATSTR_RGB8UB = "RGB 8bit ubyte";
+Texture.PFORMATSTR_RGBA8UB = "RGBA 8bit ubyte";
+
+Texture.PFORMATSTR_SRGBA8 = "SRGBA 8bit ubyte";
+
+Texture.PFORMATSTR_R11FG11FB10F = "RGB 11/11/10bit float";
+
+Texture.PFORMATSTR_R16F = "R 16bit float";
+Texture.PFORMATSTR_RG16F = "RG 16bit float";
+Texture.PFORMATSTR_RGB16F = "RGB 16bit float";
+Texture.PFORMATSTR_RGBA16F = "RGBA 16bit float";
+
+
+Texture.PFORMATSTR_R32F = "R 32bit float";
+Texture.PFORMATSTR_RG32F = "RG 32bit float";
+Texture.PFORMATSTR_RGB32F = "RGB 32bit float";
+Texture.PFORMATSTR_RGBA32F = "RGBA 32bit float";
+
+Texture.PFORMATSTR_DEPTH = "DEPTH";
+
+
+Texture.PIXELFORMATS = [
+
+    Texture.PFORMATSTR_RGB565,
+
+    Texture.PFORMATSTR_R8UB,
+    Texture.PFORMATSTR_RG8UB,
+    Texture.PFORMATSTR_RGB8UB,
+    Texture.PFORMATSTR_RGBA8UB,
+
+    Texture.PFORMATSTR_SRGBA8,
+
+    Texture.PFORMATSTR_R11FG11FB10F,
+    Texture.PFORMATSTR_R16F,
+    Texture.PFORMATSTR_RG16F,
+    Texture.PFORMATSTR_RGBA16F,
+
+    Texture.PFORMATSTR_R32F,
+    Texture.PFORMATSTR_RGBA32F
+
+];
+
+Texture.isPixelFormatFloat =
+    (pxlfrmt) =>
+    {
+        return (pxlfrmt || "").contains("float");
+    };
+
+Texture.isPixelFormatHalfFloat =
+    (pxlfrmt) =>
+    {
+        return (pxlfrmt || "").contains("float") && (pxlfrmt || "").contains("16bit");
+    };
+
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_boundingbox.js
+
+
+/**
+ * bounding box
+ * @class
+ * @external CGL
+ * @namespace BoundingBox
+ * @param {Geometry} geometry or bounding box
+ */
+class BoundingBox
+{
+    constructor(geom)
+    {
+        this._init();
+        this._first = true;
+        this._wireMesh = null;
+
+        if (geom) this.apply(geom);
+    }
+
+    _init()
+    {
+        this._max = [-Number.MAX_VALUE, -Number.MAX_VALUE, -Number.MAX_VALUE];
+        this._min = [Number.MAX_VALUE, Number.MAX_VALUE, Number.MAX_VALUE];
+        this._center = [0, 0, 0];
+        this._size = [0, 0, 0];
+        this._maxAxis = 0.0;
+        this._first = true;
+    }
+
+    /**
+     * get biggest number of maxX,maxY,maxZ
+     * @type {Number}
+     */
+    get maxAxis() { return this._maxAxis || 1; }
+
+    /**
+     * size of bounding box
+     * @type {vec3}
+     */
+    get size() { return this._size; }
+
+    /**
+     * center of bounding box
+     * @type {vec3}
+     */
+    get center() { return this._center; }
+
+    /**
+     * center x
+     * @type {Number}
+     */
+    get x() { return this._center[0]; }
+
+    /**
+     * center y
+     * @type {Number}
+     */
+    get y() { return this._center[1]; }
+
+    /**
+     * center z
+     * @type {Number}
+     */
+    get z() { return this._center[2]; }
+
+
+    /**
+     * minimum x
+     * @type {Number}
+     */
+    get minX() { return this._min[0]; }
+
+    /**
+     * minimum y
+     * @type {Number}
+     */
+    get minY() { return this._min[1]; }
+
+    /**
+     * minimum z
+     * @type {Number}
+     */
+    get minZ() { return this._min[2]; }
+
+    /**
+     * maximum x
+     * @type {Number}
+     */
+    get maxX() { return this._max[0]; }
+
+    /**
+     * maximum y
+     * @type {Number}
+     */
+    get maxY() { return this._max[1]; }
+
+    /**
+     * maximum z
+     * @type {Number}
+     */
+    get maxZ() { return this._max[2]; }
+
+
+    apply(geom, mat)
+    {
+        if (!geom)
+        {
+            // console.warn("[boundingbox] no geom/vertices", geom);
+            return;
+        }
+
+        if (geom instanceof BoundingBox)
+        {
+            const bb = geom;
+
+            this.applyPos(bb.maxX, bb.maxY, bb.maxZ);
+            this.applyPos(bb.minX, bb.minY, bb.minZ);
+        }
+        else
+        {
+            for (let i = 0; i < geom.vertices.length; i += 3)
+                // if (geom.vertices[i] == geom.vertices[i] || geom.vertices[i] != null)
+                // {
+            // if(mat)
+            // {
+                this.applyPos(geom.vertices[i], geom.vertices[i + 1], geom.vertices[i + 2]);
+            // }
+            // else
+            // {
+            //     this.applyPos(geom.vertices[i + 0],geom.vertices[i + 1],geom.vertices[i + 2]);
+            // }
+                // }
+        }
+        this.calcCenterSize();
+    }
+
+    /**
+     * returns a copy of the bounding box
+     * @function copy
+     * @memberof BoundingBox
+     * @instance
+     */
+    copy()
+    {
+        return new BoundingBox(this);
+    }
+
+    get changed()
+    {
+        return !(this._max[0] == -Number.MAX_VALUE && this._max[1] == -Number.MAX_VALUE && this._max[2] == -Number.MAX_VALUE);
+    }
+
+    applyPos(x, y, z)
+    {
+        if (x == Number.MAX_VALUE || x == -Number.MAX_VALUE ||
+            y == Number.MAX_VALUE || y == -Number.MAX_VALUE ||
+            z == Number.MAX_VALUE || z == -Number.MAX_VALUE) return;
+
+        if (!CABLES.UTILS.isNumeric(x) || !CABLES.UTILS.isNumeric(y) || !CABLES.UTILS.isNumeric(z)) return;
+
+        if (this._first)
+        {
+            this._max[0] = x;
+            this._max[1] = y;
+            this._max[2] = z;
+
+            this._min[0] = x;
+            this._min[1] = y;
+            this._min[2] = z;
+            this._first = false;
+            return;
+        }
+
+        this._max[0] = Math.max(this._max[0], x);
+        this._max[1] = Math.max(this._max[1], y);
+        this._max[2] = Math.max(this._max[2], z);
+
+        this._min[0] = Math.min(this._min[0], x);
+        this._min[1] = Math.min(this._min[1], y);
+        this._min[2] = Math.min(this._min[2], z);
+    }
+
+    calcCenterSize()
+    {
+        if (this._first) return;
+        // this._size[0]=Math.abs(this._min[0])+Math.abs(this._max[0]);
+        // this._size[1]=Math.abs(this._min[1])+Math.abs(this._max[1]);
+        // this._size[2]=Math.abs(this._min[2])+Math.abs(this._max[2]);
+        this._size[0] = this._max[0] - this._min[0];
+        this._size[1] = this._max[1] - this._min[1];
+        this._size[2] = this._max[2] - this._min[2];
+
+        this._center[0] = (this._min[0] + this._max[0]) / 2;
+        this._center[1] = (this._min[1] + this._max[1]) / 2;
+        this._center[2] = (this._min[2] + this._max[2]) / 2;
+
+        this._maxAxis = Math.max(this._size[2], Math.max(this._size[0], this._size[1]));
+    }
+
+    mulMat4(m)
+    {
+        if (this._first)
+        {
+            this._max[0] = 0;
+            this._max[1] = 0;
+            this._max[2] = 0;
+
+            this._min[0] = 0;
+            this._min[1] = 0;
+            this._min[2] = 0;
+            this._first = false;
+        }
+        vec3.transformMat4(this._max, this._max, m);
+        vec3.transformMat4(this._min, this._min, m);
+        this.calcCenterSize();
+    }
+
+    render(cgl, shader, op)
+    {
+        if (!this._wireMesh) this._wireMesh = new CGL.WireCube(cgl);
+
+        // console.log("bounding box render!");
+        cgl.pushModelMatrix();
+        mat4.translate(cgl.mMatrix, cgl.mMatrix, this._center);
+        // this._wireMesh.render(cgl, this._size[0] / 2, this._size[1] / 2, this._size[2] / 2);
+
+        if (CABLES.UI && op)
+        {
+            CABLES.UI.OverlayMeshes.drawCube(op, this._size[0] / 2, this._size[1] / 2, this._size[2] / 2);
+        }
+
+        cgl.popModelMatrix();
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_geom.js
+// import { vec2, vec3 } from "gl-matrix";
+
+
+
+
+
+/**
+ * a geometry contains all information about a mesh, vertices, texturecoordinates etc. etc.
+ * @external CGL
+ * @namespace Geometry
+ * @param {String} name
+ * @class
+ * @example
+ * // create a triangle with all attributes
+ * const geom=new Geometry("triangle"),
+ *
+ * geom.vertices = [
+ *      0.0,           sizeH.get(),  0.0,
+ *     -sizeW.get(),  -sizeH.get(),  0.0,
+ *      sizeW.get(),  -sizeH.get(),  0.0 ];
+ *
+ * geom.vertexNormals = [
+ *      0.0,  0.0,  1.0,
+ *      0.0,  0.0,  1.0,
+ *      0.0,  0.0,  1.0 ];
+ *
+ * geom.tangents = [
+ *     1,0,0,
+ *     1,0,0,
+ *     1,0,0 ];
+ *
+ * geom.biTangents = [
+ *     0,1,0,
+ *     0,1,0,
+ *     0,1,0 ];
+ *
+ * geom.texCoords = [
+ *      0.5,  0.0,
+ *      1.0,  1.0,
+ *      0.0,  1.0, ];
+ *
+ * geom.verticesIndices = [
+ *     0, 1, 2 ];
+ *
+ */
+const Geometry = function (name)
+{
+    this.name = name || "unknown";
+    this._log = new Logger("cgl_geometry");
+
+    this.faceVertCount = 3;
+    this.glPrimitive = null;
+    this._attributes = {};
+
+    this._vertices = [];
+    this.verticesIndices = [];
+
+    this.isGeometry = true;
+
+    this.morphTargets = [];
+
+    Object.defineProperty(this, "vertices", {
+        get()
+        {
+            return this._vertices;
+        },
+        set(v)
+        {
+            this.setVertices(v);
+        },
+    });
+
+    Object.defineProperty(this, "texCoords", {
+        get()
+        {
+            const att = this.getAttribute("texCoords");
+            if (!att) return [];
+            return att.data;
+        },
+        set(v)
+        {
+            this.setAttribute("texCoords", v, 2);
+        },
+    });
+
+    Object.defineProperty(this, "vertexNormals", {
+        get()
+        {
+            const att = this.getAttribute("vertexNormals");
+            if (!att) return [];
+            return att.data;
+        },
+        set(v)
+        {
+            this.setAttribute("vertexNormals", v, 3);
+        },
+    });
+
+    Object.defineProperty(this, "tangents", {
+        get()
+        {
+            const att = this.getAttribute("tangents");
+            if (!att) return [];
+            return att.data;
+        },
+        set(v)
+        {
+            this.setAttribute("tangents", v, 3);
+        },
+    });
+
+    Object.defineProperty(this, "biTangents", {
+        get()
+        {
+            const att = this.getAttribute("biTangents");
+            if (!att) return [];
+            return att.data;
+        },
+        set(v)
+        {
+            this.setAttribute("biTangents", v, 3);
+        },
+    });
+
+    Object.defineProperty(this, "vertexColors", {
+        get()
+        {
+            const att = this.getAttribute("vertexColors");
+            if (!att) return [];
+            return att.data;
+        },
+        set(v)
+        {
+            this.setAttribute("vertexColors", v, 4);
+        },
+    });
+};
+
+/**
+ * @function clear
+ * @memberof Geometry
+ * @instance
+ * @description clear all buffers/set them to length 0
+ */
+Geometry.prototype.clear = function ()
+{
+    this._vertices = new Float32Array([]);
+    this.verticesIndices = [];
+    this.texCoords = new Float32Array([]);
+    this.vertexNormals = new Float32Array([]);
+    this.tangents = [];
+    this.biTangents = [];
+    this._attributes = {};
+};
+
+
+
+/**
+ * @function getAttributes
+   @memberof Geometry
+ * @instance
+ * @return {Array<Object>} returns array of attribute objects
+ */
+Geometry.prototype.getAttributes = function ()
+{
+    return this._attributes;
+};
+
+/**
+ * @function getAttribute
+ * @memberof Geometry
+ * @instance
+ * @param {String} name
+ * @return {Object}
+ */
+Geometry.prototype.getAttribute = function (name)
+{
+    for (const i in this._attributes)
+    {
+        if (this._attributes[i].name == name) return this._attributes[i];
+    }
+    return null;
+};
+
+/**
+ * @function setAttribute
+ * @description create an attribute
+ * @memberof Geometry
+ * @instance
+ * @param {String} name
+ * @param {Array} data
+ * @param {Number} itemsize
+ */
+Geometry.prototype.setAttribute = function (name, arr, itemSize)
+{
+    let attrType = "";
+    if (!itemSize || itemSize > 4)
+    {
+        console.log("itemsize wrong?", itemSize, name);
+        this._log.stack("itemsize");
+
+        itemSize = 3;
+    }
+
+    if (itemSize == 1) attrType = "float";
+    else if (itemSize == 2) attrType = "vec2";
+    else if (itemSize == 3) attrType = "vec3";
+    else if (itemSize == 4) attrType = "vec4";
+
+
+    const attr = {
+        "name": name,
+        "data": arr,
+        "itemSize": itemSize,
+        "type": attrType,
+    };
+
+    this._attributes[name] = attr;
+};
+
+Geometry.prototype.copyAttribute = function (name, newgeom)
+{
+    const attr = this.getAttribute(name);
+    newgeom.setAttribute(name, new Float32Array(attr.data), attr.itemSize);
+};
+
+
+/**
+ * @function setVertices
+ * @memberof Geometry
+ * @instance
+ * @description set vertices
+ * @param {Array|Float32Array} data [x,y,z,x,y,z,...]
+ */
+Geometry.prototype.setVertices = function (arr)
+{
+    if (arr instanceof Float32Array) this._vertices = arr;
+    else this._vertices = new Float32Array(arr);
+};
+
+/**
+ * @function setTexCoords
+ * @memberof Geometry
+ * @instance
+ * @description set texcoords
+ * @param {Array|Float32Array} data [u,v,u,v,...]
+ */
+Geometry.prototype.setTexCoords = function (arr)
+{
+    if (arr instanceof Float32Array) this.texCoords = arr;
+    else this.texCoords = new Float32Array(arr);
+};
+
+// Geometry.prototype.testIndices = function ()
+// {
+//     var foundError = false;
+//     for (var i = 0; i < this.verticesIndices.length; i++)
+//     {
+//         if (this.verticesIndices[i * 3 + 0] >= this._vertices.length / 3 || this.verticesIndices[i * 3 + 1] >= this._vertices.length / 3 || this.verticesIndices[i * 3 + 2] >= this._vertices.length / 3)
+//         {
+//             foundError = true;
+//             console.log("index error!");
+//         }
+//     }
+// };
+
+// deprecated
+Geometry.prototype.calcNormals = function (smooth)
+{
+    const options = { "smooth": smooth };
+
+
+    this.calculateNormals(options);
+};
+
+/**
+ * @function flipNormals
+ * @memberof Geometry
+ * @description flip normals
+ */
+Geometry.prototype.flipNormals = function (x, y, z)
+{
+    let vec = vec3.create();
+
+    if (x == undefined)x = 1;
+    if (y == undefined)y = 1;
+    if (z == undefined)z = 1;
+
+
+    for (let i = 0; i < this.vertexNormals.length; i += 3)
+    {
+        vec3.set(vec,
+            this.vertexNormals[i + 0],
+            this.vertexNormals[i + 1],
+            this.vertexNormals[i + 2]);
+
+        vec[0] *= -x;
+        vec[1] *= -y;
+        vec[2] *= -z;
+
+        vec3.normalize(vec, vec);
+
+        this.vertexNormals[i + 0] = vec[0];
+        this.vertexNormals[i + 1] = vec[1];
+        this.vertexNormals[i + 2] = vec[2];
+    }
+};
+
+Geometry.prototype.getNumTriangles = function ()
+{
+    if (this.verticesIndices && this.verticesIndices.length) return this.verticesIndices.length / 3;
+    return this.vertices.length / 3;
+};
+
+
+/**
+ * @function flipVertDir
+ * @memberof Geometry
+ * @description flip order of vertices in geom faces
+ */
+Geometry.prototype.flipVertDir = function ()
+{
+    const newInd = [];
+    newInd.length = this.verticesIndices.length;
+    for (let i = 0; i < this.verticesIndices.length; i += 3)
+    {
+        newInd[i] = this.verticesIndices[i + 2];
+        newInd[i + 1] = this.verticesIndices[i + 1];
+        newInd[i + 2] = this.verticesIndices[i];
+    }
+    this.verticesIndices = newInd;
+};
+
+
+Geometry.prototype.setPointVertices = function (verts)
+{
+    if (verts.length % 3 !== 0)
+    {
+        this._log.error("SetPointVertices: Array must be multiple of three.");
+        return;
+    }
+
+    if (!(verts instanceof Float32Array)) this.vertices = new Float32Array(verts);
+    else this.vertices = verts;
+
+    if (!(this.texCoords instanceof Float32Array)) this.texCoords = new Float32Array((verts.length / 3) * 2);
+
+    // this.texCoords.length=verts.length/3*2;
+    this.verticesIndices.length = verts.length / 3;
+    // this.verticesIndices=[];
+
+    for (let i = 0; i < verts.length / 3; i++)
+    {
+        this.verticesIndices[i] = i;
+        this.texCoords[i * 2] = 0;
+        this.texCoords[i * 2 + 1] = 0;
+    }
+};
+
+/**
+ * merge a different geometry into the this geometry
+ * @function merge
+ * @param {Geometry} geom
+ * @memberof Geometry
+ * @instance
+ */
+Geometry.prototype.merge = function (geom)
+{
+    if (!geom) return;
+
+    if (this.isIndexed() != geom.isIndexed())
+    {
+        if (this.isIndexed())
+        {
+            this.unIndex(false, true);
+        }
+        if (geom.isIndexed())
+        {
+            const g = geom.copy();
+            g.unIndex(false, true);
+            geom = g;
+        }
+    }
+
+    const oldIndizesLength = this.verticesIndices.length;
+    const vertLength = this._vertices.length / 3;
+
+    this.verticesIndices.length += geom.verticesIndices.length;
+    for (let i = 0; i < geom.verticesIndices.length; i++)
+        this.verticesIndices[oldIndizesLength + i] = geom.verticesIndices[i] + vertLength;
+
+    this.vertices = UTILS.float32Concat(this._vertices, geom.vertices);
+    this.texCoords = UTILS.float32Concat(this.texCoords, geom.texCoords);
+    this.vertexNormals = UTILS.float32Concat(this.vertexNormals, geom.vertexNormals);
+    this.tangents = UTILS.float32Concat(this.tangents, geom.tangents);
+    this.biTangents = UTILS.float32Concat(this.biTangents, geom.biTangents);
+};
+
+/**
+ * create a copy of the geometry
+ * @function copy
+ * @memberof Geometry
+ * @instance
+ */
+Geometry.prototype.copy = function ()
+{
+    const geom = new Geometry(this.name + " copy");
+    geom.faceVertCount = this.faceVertCount;
+    geom.glPrimitive = this.glPrimitive;
+
+    geom.setVertices(this._vertices.slice(0));
+
+    if (this.verticesIndices)
+    {
+        geom.verticesIndices.length = this.verticesIndices.length;
+        for (let i = 0; i < this.verticesIndices.length; i++) geom.verticesIndices[i] = this.verticesIndices[i];
+    }
+
+    for (let i in this._attributes) this.copyAttribute(i, geom);
+
+    geom.morphTargets.length = this.morphTargets.length;
+    for (let i = 0; i < this.morphTargets.length; i++) geom.morphTargets[i] = this.morphTargets[i];
+
+    return geom;
+};
+
+/**
+ * Calculaten normals
+ * @function calculateNormals
+ * @memberof Geometry
+ * @instance
+ */
+Geometry.prototype.calculateNormals = function (options)
+{
+    // todo: should check angle of normals to get edges    https://community.khronos.org/t/calculating-accurate-vertex-normals/28152
+    options = options || {};
+    if (options.smooth === false) this.unIndex();
+
+    const u = vec3.create();
+    const v = vec3.create();
+    const n = vec3.create();
+
+    function calcNormal(triangle)
+    {
+        vec3.subtract(u, triangle[0], triangle[1]);
+        vec3.subtract(v, triangle[0], triangle[2]);
+        vec3.cross(n, u, v);
+        vec3.normalize(n, n);
+
+        if (options && options.forceZUp)
+        {
+            if (n[2] < 0)
+            {
+                n[0] *= -1;
+                n[1] *= -1;
+                n[2] *= -1;
+            }
+        }
+        return n;
+    }
+
+    this.getVertexVec = function (which)
+    {
+        const vec = [0, 0, 0];
+        vec[0] = this.vertices[which * 3 + 0];
+        vec[1] = this.vertices[which * 3 + 1];
+        vec[2] = this.vertices[which * 3 + 2];
+        return vec;
+    };
+
+    if (!(this.vertexNormals instanceof Float32Array) || this.vertexNormals.length != this.vertices.length) this.vertexNormals = new Float32Array(this.vertices.length);
+
+    for (let i = 0; i < this.vertices.length; i++)
+    {
+        this.vertexNormals[i] = 0;
+    }
+
+    if (!this.isIndexed())
+    {
+        const norms = [];
+        for (let i = 0; i < this.vertices.length; i += 9)
+        {
+            const triangle = [[this.vertices[i + 0], this.vertices[i + 1], this.vertices[i + 2]], [this.vertices[i + 3], this.vertices[i + 4], this.vertices[i + 5]], [this.vertices[i + 6], this.vertices[i + 7], this.vertices[i + 8]]];
+            const nn = calcNormal(triangle);
+            norms.push(nn[0], nn[1], nn[2], nn[0], nn[1], nn[2], nn[0], nn[1], nn[2]);
+        }
+        this.vertexNormals = norms;
+    }
+    else
+    {
+        const faceNormals = [];
+
+        faceNormals.length = Math.floor(this.verticesIndices.length / 3);
+
+        for (let i = 0; i < this.verticesIndices.length; i += 3)
+        {
+            const triangle = [this.getVertexVec(this.verticesIndices[i + 0]), this.getVertexVec(this.verticesIndices[i + 1]), this.getVertexVec(this.verticesIndices[i + 2])];
+
+            faceNormals[i / 3] = calcNormal(triangle);
+
+            this.vertexNormals[this.verticesIndices[i + 0] * 3 + 0] += faceNormals[i / 3][0];
+            this.vertexNormals[this.verticesIndices[i + 0] * 3 + 1] += faceNormals[i / 3][1];
+            this.vertexNormals[this.verticesIndices[i + 0] * 3 + 2] += faceNormals[i / 3][2];
+
+            this.vertexNormals[this.verticesIndices[i + 1] * 3 + 0] += faceNormals[i / 3][0];
+            this.vertexNormals[this.verticesIndices[i + 1] * 3 + 1] += faceNormals[i / 3][1];
+            this.vertexNormals[this.verticesIndices[i + 1] * 3 + 2] += faceNormals[i / 3][2];
+
+            this.vertexNormals[this.verticesIndices[i + 2] * 3 + 0] += faceNormals[i / 3][0];
+            this.vertexNormals[this.verticesIndices[i + 2] * 3 + 1] += faceNormals[i / 3][1];
+            this.vertexNormals[this.verticesIndices[i + 2] * 3 + 2] += faceNormals[i / 3][2];
+        }
+
+
+        for (let i = 0; i < this.verticesIndices.length; i += 3) // faces
+        {
+            for (let k = 0; k < 3; k++) // triangles
+            {
+                const vv = [this.vertexNormals[this.verticesIndices[i + k] * 3 + 0], this.vertexNormals[this.verticesIndices[i + k] * 3 + 1], this.vertexNormals[this.verticesIndices[i + k] * 3 + 2]];
+                vec3.normalize(vv, vv);
+                this.vertexNormals[this.verticesIndices[i + k] * 3 + 0] = vv[0];
+                this.vertexNormals[this.verticesIndices[i + k] * 3 + 1] = vv[1];
+                this.vertexNormals[this.verticesIndices[i + k] * 3 + 2] = vv[2];
+            }
+        }
+    }
+};
+
+/**
+ * Calculates tangents & bitangents with the help of uv-coordinates. Adapted from
+ * Lengyel, Eric. “Computing Tangent Space Basis Vectors for an Arbitrary Mesh”.
+ * Terathon Software 3D Graphics Library.
+ * https://fenix.tecnico.ulisboa.pt/downloadFile/845043405449073/Tangent%20Space%20Calculation.pdf
+ *
+ * @function calcTangentsBitangents
+ * @memberof Geometry
+ * @instance
+ */
+Geometry.prototype.calcTangentsBitangents = function ()
+{
+    if (!this.vertices.length)
+    {
+        // this._log.error("Cannot calculate tangents/bitangents without vertices.");
+        return;
+    }
+    if (!this.vertexNormals.length)
+    {
+        // this._log.error("Cannot calculate tangents/bitangents without normals.");
+        return;
+    }
+    if (!this.texCoords.length)
+    {
+        // console.warn("No texcoords. Replacing with default values [0, 0].");
+        const texCoordLength = (this.vertices.length / 3) * 2;
+        this.texCoords = new Float32Array(texCoordLength);
+        for (let i = 0; i < texCoordLength; i += 1) this.texCoords[i] = 0;
+    }
+    if (!this.verticesIndices || !this.verticesIndices.length)
+    {
+        // this._log.error("Cannot calculate tangents/bitangents without vertex indices.");
+        return;
+    }
+    // this code assumes that we have three indices per triangle
+    if (this.verticesIndices.length % 3 !== 0)
+    {
+        this._log.error("Vertex indices mismatch!");
+        return;
+    }
+
+    const triangleCount = this.verticesIndices.length / 3;
+    const vertexCount = this.vertices.length / 3;
+
+    this.tangents = new Float32Array(this.vertexNormals.length);
+    this.biTangents = new Float32Array(this.vertexNormals.length);
+
+    // temporary buffers
+    const tempVertices = [];
+    tempVertices.length = vertexCount * 2;
+    const v1 = vec3.create();
+    const v2 = vec3.create();
+    const v3 = vec3.create();
+
+    const w1 = vec2.create();
+    const w2 = vec2.create();
+    const w3 = vec2.create();
+
+    const sdir = vec3.create();
+    const tdir = vec3.create();
+
+    // for details on calculation, see article referenced above
+    for (let tri = 0; tri < triangleCount; tri += 1)
+    {
+        // indices of the three vertices for a triangle
+        const i1 = this.verticesIndices[tri * 3];
+        const i2 = this.verticesIndices[tri * 3 + 1];
+        const i3 = this.verticesIndices[tri * 3 + 2];
+
+        // vertex position as vec3
+        vec3.set(v1, this.vertices[i1 * 3], this.vertices[i1 * 3 + 1], this.vertices[i1 * 3 + 2]);
+        vec3.set(v2, this.vertices[i2 * 3], this.vertices[i2 * 3 + 1], this.vertices[i2 * 3 + 2]);
+        vec3.set(v3, this.vertices[i3 * 3], this.vertices[i3 * 3 + 1], this.vertices[i3 * 3 + 2]);
+
+        // texture coordinate as vec2
+        vec2.set(w1, this.texCoords[i1 * 2], this.texCoords[i1 * 2 + 1]);
+        vec2.set(w2, this.texCoords[i2 * 2], this.texCoords[i2 * 2 + 1]);
+        vec2.set(w3, this.texCoords[i3 * 2], this.texCoords[i3 * 2 + 1]);
+
+        const x1 = v2[0] - v1[0];
+        const x2 = v3[0] - v1[0];
+        const y1 = v2[1] - v1[1];
+        const y2 = v3[1] - v1[1];
+        const z1 = v2[2] - v1[2];
+        const z2 = v3[2] - v1[2];
+
+        const s1 = w2[0] - w1[0];
+        const s2 = w3[0] - w1[0];
+        const t1 = w2[1] - w1[1];
+        const t2 = w3[1] - w1[1];
+
+        const r = 1.0 / (s1 * t2 - s2 * t1);
+
+        vec3.set(sdir, (t2 * x1 - t1 * x2) * r, (t2 * y1 - t1 * y2) * r, (t2 * z1 - t1 * z2) * r);
+        vec3.set(tdir, (s1 * x2 - s2 * x1) * r, (s1 * y2 - s2 * y1) * r, (s1 * z2 - s2 * z1) * r);
+
+        tempVertices[i1] = sdir;
+        tempVertices[i2] = sdir;
+        tempVertices[i3] = sdir;
+
+        tempVertices[i1 + vertexCount] = tdir;
+        tempVertices[i2 + vertexCount] = tdir;
+        tempVertices[i3 + vertexCount] = tdir;
+    }
+
+    const normal = vec3.create();
+    const tempVert = vec3.create();
+    const tan = vec3.create();
+    const bitan = vec3.create();
+    const temp1 = vec3.create();
+    const temp2 = vec3.create();
+    const crossPd = vec3.create();
+    const normalized = vec3.create();
+
+    for (let vert = 0; vert < vertexCount; vert += 1)
+    {
+        // NOTE: some meshes don't have index 0 - n in their indexbuffer, if this is the case, skip calculation of this vertex
+        if (!tempVertices[vert]) continue;
+
+        vec3.set(normal, this.vertexNormals[vert * 3], this.vertexNormals[vert * 3 + 1], this.vertexNormals[vert * 3 + 2]);
+        vec3.set(tempVert, tempVertices[vert][0], tempVertices[vert][1], tempVertices[vert][2]);
+
+        // Gram-Schmidt orthagonalize
+        const _dp = vec3.dot(normal, tempVert);
+        vec3.scale(temp1, normal, _dp);
+        vec3.subtract(temp2, tempVert, temp1);
+
+        vec3.normalize(normalized, temp2);
+        vec3.cross(crossPd, normal, tempVert);
+
+        // const intermDot = vec3.dot(crossPd, tempVertices[vert + vertexCount]);
+        const w = 1.0;// intermDot < 0.0 ? -1.0 : 1.0;
+
+        vec3.scale(tan, normalized, 1 / w);
+        vec3.cross(bitan, normal, tan);
+
+        this.tangents[vert * 3 + 0] = tan[0];
+        this.tangents[vert * 3 + 1] = tan[1];
+        this.tangents[vert * 3 + 2] = tan[2];
+        this.biTangents[vert * 3 + 0] = bitan[0];
+        this.biTangents[vert * 3 + 1] = bitan[1];
+        this.biTangents[vert * 3 + 2] = bitan[2];
+    }
+};
+
+Geometry.prototype.isIndexed = function ()
+{
+    if (this._vertices.length == 0) return true;
+    return this.verticesIndices.length != 0;
+};
+
+/**
+ * @function unIndex
+ * @memberof Geometry
+ * @instance
+ * @param {Boolean}
+ * @description remove all vertex indizes, vertices array will contain 3*XYZ for every triangle
+ */
+Geometry.prototype.unIndex = function (reIndex, dontCalcNormals)
+{
+    const newVerts = [];
+    const newIndizes = [];
+    let count = 0;
+
+    for (let j in this._attributes)
+    {
+        const attr = this._attributes[j];
+        let na = [];
+
+        for (let i = 0; i < this.verticesIndices.length; i += 3)
+        {
+            for (let s = 0; s < 3; s++)
+            {
+                if (attr.itemSize == 3)
+                    na.push(
+                        attr.data[this.verticesIndices[i + s] * 3 + 0],
+                        attr.data[this.verticesIndices[i + s] * 3 + 1],
+                        attr.data[this.verticesIndices[i + s] * 3 + 2]);
+                else if (attr.itemSize == 4)
+                    na.push(
+                        attr.data[this.verticesIndices[i + s] * 4 + 0],
+                        attr.data[this.verticesIndices[i + s] * 4 + 1],
+                        attr.data[this.verticesIndices[i + s] * 4 + 2],
+                        attr.data[this.verticesIndices[i + s] * 4 + 3]);
+                else if (attr.itemSize == 2)
+                    na.push(
+                        attr.data[this.verticesIndices[i + s] * 2 + 0],
+                        attr.data[this.verticesIndices[i + s] * 2 + 1]);
+                else if (attr.itemSize == 1)
+                    na.push(
+                        attr.data[this.verticesIndices[i + s]]);
+                else console.log("unknown attr", attr);
+            }
+        }
+        this.setAttribute(attr.name, na, attr.itemSize);
+    }
+
+    for (let i = 0; i < this.verticesIndices.length; i += 3)
+    {
+        newVerts.push(
+            this.vertices[this.verticesIndices[i + 0] * 3 + 0],
+            this.vertices[this.verticesIndices[i + 0] * 3 + 1],
+            this.vertices[this.verticesIndices[i + 0] * 3 + 2]);
+
+        newIndizes.push(count);
+        count++;
+
+        newVerts.push(
+            this.vertices[this.verticesIndices[i + 1] * 3 + 0],
+            this.vertices[this.verticesIndices[i + 1] * 3 + 1],
+            this.vertices[this.verticesIndices[i + 1] * 3 + 2]);
+
+        newIndizes.push(count);
+        count++;
+
+        newVerts.push(
+            this.vertices[this.verticesIndices[i + 2] * 3 + 0],
+            this.vertices[this.verticesIndices[i + 2] * 3 + 1],
+            this.vertices[this.verticesIndices[i + 2] * 3 + 2]);
+
+        newIndizes.push(count);
+        count++;
+    }
+
+    this.vertices = newVerts;
+
+    this.verticesIndices = [];
+    if (reIndex) this.verticesIndices = newIndizes;
+
+    if (!dontCalcNormals) this.calculateNormals();
+};
+
+Geometry.prototype.calcBarycentric = function ()
+{
+    let barycentrics = [];
+    barycentrics.length = this.vertices.length;
+    for (let i = 0; i < this.vertices.length; i++) barycentrics[i] = 0;
+
+    let count = 0;
+    for (let i = 0; i < this.vertices.length; i += 3)
+    {
+        barycentrics[i + count] = 1;
+        count++;
+        if (count == 3) count = 0;
+    }
+
+    this.setAttribute("attrBarycentric", barycentrics, 3);
+};
+
+Geometry.prototype.getBounds = function ()
+{
+    return new BoundingBox(this);
+};
+
+Geometry.prototype.center = function (x, y, z)
+{
+    if (x === undefined)
+    {
+        x = true;
+        y = true;
+        z = true;
+    }
+
+    let i = 0;
+    const bounds = this.getBounds();
+    const offset = [bounds.minX + (bounds.maxX - bounds.minX) / 2, bounds.minY + (bounds.maxY - bounds.minY) / 2, bounds.minZ + (bounds.maxZ - bounds.minZ) / 2];
+
+    for (i = 0; i < this.vertices.length; i += 3)
+    {
+        if (this.vertices[i + 0] == this.vertices[i + 0])
+        {
+            if (x) this.vertices[i + 0] -= offset[0];
+            if (y) this.vertices[i + 1] -= offset[1];
+            if (z) this.vertices[i + 2] -= offset[2];
+        }
+    }
+
+    return offset;
+};
+
+Geometry.prototype.mapTexCoords2d = function ()
+{
+    const bounds = this.getBounds();
+    const num = this.vertices.length / 3;
+
+    this.texCoords = new Float32Array(num * 2);
+
+    for (let i = 0; i < num; i++)
+    {
+        const vertX = this.vertices[i * 3 + 0];
+        const vertY = this.vertices[i * 3 + 1];
+        this.texCoords[i * 2 + 0] = vertX / (bounds.maxX - bounds.minX) + 0.5;
+        this.texCoords[i * 2 + 1] = 1.0 - vertY / (bounds.maxY - bounds.minY) + 0.5;
+    }
+};
+
+
+Geometry.prototype.getInfoOneLine = function ()
+{
+    let txt = "";
+    if (this.faceVertCount == 3 && this.verticesIndices)txt += this.verticesIndices.length / 3;
+    else txt += 0;
+
+    txt += " tris ";
+
+    if (this.vertices)txt += this.vertices.length / 3;
+    else txt += 0;
+
+    txt += " verts";
+
+    return txt;
+};
+
+Geometry.prototype.getInfo = function ()
+{
+    const info = {};
+
+    if (this.faceVertCount == 3 && this.verticesIndices)info.numFaces = this.verticesIndices.length / 3;
+    else info.numFaces = 0;
+
+    if (this.verticesIndices && this.verticesIndices.length)info.indices = this.verticesIndices.length;
+
+    if (this.vertices)info.numVerts = this.vertices.length / 3;
+    else info.numVerts = 0;
+
+    if (this.vertexNormals) info.numNormals = this.vertexNormals.length / 3;
+    else info.numNormals = 0;
+
+    if (this.texCoords) info.numTexCoords = this.texCoords.length / 2;
+    else info.numTexCoords = 0;
+
+    if (this.tangents) info.numTangents = this.tangents.length / 3;
+    else info.numTangents = 0;
+
+    if (this.biTangents) info.numBiTangents = this.biTangents.length / 3;
+    else info.numBiTangents = 0;
+
+    if (this.biTangents) info.numBiTangents = this.biTangents.length / 3;
+    else info.numBiTangents = 0;
+
+    if (this.vertexColors) info.numVertexColors = this.vertexColors.length / 4;
+    else info.numVertexColors = 0;
+
+    if (this.getAttributes()) info.numAttribs = Object.keys(this.getAttributes()).length;
+    else info.numAttribs = 0;
+
+    info.isIndexed = this.isIndexed();
+
+    return info;
+};
+
+// -----------------
+
+// TODO : move this into "old" circle op
+Geometry.buildFromFaces = function (arr, name, optimize)
+{
+    const vertices = [];
+    const verticesIndices = [];
+
+    for (let i = 0; i < arr.length; i += 3)
+    {
+        const a = arr[i + 0];
+        const b = arr[i + 1];
+        const c = arr[i + 2];
+        const face = [-1, -1, -1];
+
+        if (optimize)
+            for (let iv = 0; iv < vertices.length; iv += 3)
+            {
+                if (vertices[iv + 0] == a[0] && vertices[iv + 1] == a[1] && vertices[iv + 2] == a[2]) face[0] = iv / 3;
+                if (vertices[iv + 0] == b[0] && vertices[iv + 1] == b[1] && vertices[iv + 2] == b[2]) face[1] = iv / 3;
+                if (vertices[iv + 0] == c[0] && vertices[iv + 1] == c[1] && vertices[iv + 2] == c[2]) face[2] = iv / 3;
+            }
+
+        if (face[0] == -1)
+        {
+            vertices.push(a[0], a[1], a[2]);
+            face[0] = (vertices.length - 1) / 3;
+        }
+
+        if (face[1] == -1)
+        {
+            vertices.push(b[0], b[1], b[2]);
+            face[1] = (vertices.length - 1) / 3;
+        }
+
+        if (face[2] == -1)
+        {
+            vertices.push(c[0], c[1], c[2]);
+            face[2] = (vertices.length - 1) / 3;
+        }
+
+        verticesIndices.push(parseInt(face[0], 10));
+        verticesIndices.push(parseInt(face[1], 10));
+        verticesIndices.push(parseInt(face[2], 10));
+    }
+
+    const geom = new Geometry(name);
+    geom.name = name;
+    geom.vertices = vertices;
+    geom.verticesIndices = verticesIndices;
+
+    return geom;
+};
+
+// TODO: not needed anymore ?! move to deprecated ops?
+Geometry.json2geom = function (jsonMesh)
+{
+    const geom = new Geometry("jsonMeshGeom");
+    geom.verticesIndices = [];
+
+    geom.vertices = jsonMesh.vertices || [];
+    geom.vertexNormals = jsonMesh.normals || [];
+    geom.vertexColors = jsonMesh.colors || [];
+    geom.tangents = jsonMesh.tangents || [];
+    geom.biTangents = jsonMesh.bitangents || [];
+    if (jsonMesh.texturecoords) geom.setTexCoords(jsonMesh.texturecoords[0]);
+
+    if (jsonMesh.vertices_b64)geom.vertices = new Float32Array(b64decTypedArray(jsonMesh.vertices_b64));
+    if (jsonMesh.normals_b64) geom.vertexNormals = new Float32Array(b64decTypedArray(jsonMesh.normals_b64));
+    if (jsonMesh.tangents_b64) geom.tangents = new Float32Array(b64decTypedArray(jsonMesh.tangents_b64));
+    if (jsonMesh.bitangents_b64) geom.biTangents = new Float32Array(b64decTypedArray(jsonMesh.bitangents_b64));
+    if (jsonMesh.texturecoords_b64) geom.setTexCoords(new Float32Array(b64decTypedArray(jsonMesh.texturecoords_b64[0])));
+
+    if (jsonMesh.faces_b64)
+    {
+        geom.verticesIndices = new Uint32Array(b64decTypedArray(jsonMesh.faces_b64));
+    }
+    else
+    {
+        geom.verticesIndices.length = jsonMesh.faces.length * 3;
+        for (let i = 0; i < jsonMesh.faces.length; i++)
+        {
+            geom.verticesIndices[i * 3] = jsonMesh.faces[i][0];
+            geom.verticesIndices[i * 3 + 1] = jsonMesh.faces[i][1];
+            geom.verticesIndices[i * 3 + 2] = jsonMesh.faces[i][2];
+        }
+    }
+
+    return geom;
+};
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_mesh_feedback.js
+// view-source:http://toji.github.io/webgl2-particles-2/
+
+function extendMeshWithFeedback(Mesh)
+{
+    Mesh.prototype.hasFeedbacks = function ()
+    {
+        return this._feedBacks.length > 0;
+    };
+
+    Mesh.prototype.removeFeedbacks = function (shader)
+    {
+        if (!this._feedbacks) return;
+        this._feedbacks.length = 0;
+        this._feedBacksChanged = true;
+    };
+
+    Mesh.prototype.setAttributeFeedback = function () {};
+
+    Mesh.prototype.setFeedback = function (attrib, nameOut, initialArr)
+    {
+        let fb = { nameOut, };
+        let found = false;
+        this.unBindFeedbacks();
+
+        for (let i = 0; i < this._feedBacks.length; i++)
+        {
+            if (this._feedBacks[i].nameOut == nameOut)
+            {
+                fb = this._feedBacks[i];
+
+                found = true;
+            }
+        }
+
+        if (!found) this._feedBacksChanged = true;
+
+        fb.initialArr = initialArr;
+        fb.attrib = attrib;
+
+        // console.log("setfeedback");
+
+        if (fb.outBuffer) this._cgl.gl.deleteBuffer(fb.outBuffer);
+        // if(fb.attrib.buffer)this._cgl.gl.deleteBuffer(fb.attrib.buffer);
+        fb.outBuffer = this._cgl.gl.createBuffer();
+        this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, fb.outBuffer);
+        this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER, fb.initialArr, this._cgl.gl.STATIC_DRAW);
+
+        this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, fb.attrib.buffer);
+        this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER, fb.initialArr, this._cgl.gl.STATIC_DRAW);
+
+        if (!found) this._feedBacks.push(fb);
+
+        // console.log('initialArr',initialArr.length/3);
+        // console.log('vertices',fb.attrib.numItems);
+        // console.log('vertices',this._bufVertexAttrib.numItems);
+
+        return fb;
+    };
+
+    Mesh.prototype.bindFeedback = function (attrib)
+    {
+        if (!this._feedBacks || this._feedBacks.length === 0) return;
+        if (this._transformFeedBackLoc == -1) this._transformFeedBackLoc = this._cgl.gl.createTransformFeedback();
+
+        this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK, this._transformFeedBackLoc);
+
+        let found = false;
+
+        for (let i = 0; i < this._feedBacks.length; i++)
+        {
+            const fb = this._feedBacks[i];
+
+            if (fb.attrib == attrib)
+            {
+                found = true;
+                // this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, fb.attrib.buffer);
+                //
+                // this._cgl.gl.vertexAttribPointer(
+                //     fb.attrib.loc,
+                //     fb.attrib.itemSize,
+                //     fb.attrib.type,
+                //     false,
+                //     fb.attrib.itemSize*4, 0);
+
+                this._cgl.gl.bindBufferBase(this._cgl.gl.TRANSFORM_FEEDBACK_BUFFER, i, fb.outBuffer);
+            }
+        }
+
+        if (!found)
+        {
+            // console.log("ARTTRIB NOT FOUND",attrib.name);
+        }
+    };
+
+    Mesh.prototype.drawFeedbacks = function (shader, prim)
+    {
+        let i = 0;
+
+        if (this._feedBacksChanged)
+        {
+            const names = [];
+            this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK, this._transformFeedBackLoc);
+
+            for (i = 0; i < this._feedBacks.length; i++) names.push(this._feedBacks[i].nameOut);
+            shader.setFeedbackNames(names);
+
+            console.log("feedbacknames", names);
+
+            shader.compile();
+            this._feedBacksChanged = false;
+            this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK, null);
+            console.log("changed finished");
+            return;
+        }
+
+        //
+        // for( i=0;i<this._feedBacks.length;i++)
+        // {
+        //     var fb=this._feedBacks[i];
+        //
+        //     this._cgl.gl.bindBufferBase(this._cgl.gl.TRANSFORM_FEEDBACK_BUFFER, i, fb.outBuffer);
+        // }
+
+        // draw
+        this._cgl.gl.beginTransformFeedback(this.glPrimitive);
+        this._cgl.gl.drawArrays(prim, 0, this._feedBacks[0].attrib.numItems);
+
+        // unbind
+        this._cgl.gl.endTransformFeedback();
+
+        this.unBindFeedbacks();
+
+        this.feedBacksSwapBuffers();
+    };
+
+    Mesh.prototype.unBindFeedbacks = function ()
+    {
+        for (let i = 0; i < this._feedBacks.length; i++)
+        {
+            // this._cgl.gl.disableVertexAttribArray(this._feedBacks[i].attrib.loc);
+            this._cgl.gl.bindBufferBase(this._cgl.gl.TRANSFORM_FEEDBACK_BUFFER, i, null);
+        }
+
+        this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK, null);
+    };
+
+    Mesh.prototype.feedBacksSwapBuffers = function ()
+    {
+        for (let i = 0; i < this._feedBacks.length; i++)
+        {
+            const t = this._feedBacks[i].attrib.buffer;
+            this._feedBacks[i].attrib.buffer = this._feedBacks[i].outBuffer;
+            this._feedBacks[i].outBuffer = t;
+        }
+    };
+}
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_mesh.js
+
+
+
+
+
+const MESH = {};
+MESH.lastMesh = null;
+
+/**
+ * webgl renderable 3d object
+ * @external CGL
+ * @namespace Mesh
+ * @hideconstructor
+ * @param {Context} cgl
+ * @param {Geometry} geometry
+ * @param {Number} [glPrimitive]
+ * @class
+ * @example
+ * const cgl=this._cgl
+ * const mesh=new CGL.Mesh(cgl, geometry);
+ *
+ * function render()
+ * {
+ *   mesh.render(cgl.getShader());
+ * }
+ */
+const Mesh = function (_cgl, __geom, _options)
+{
+    this._cgl = _cgl;
+
+    let options = _options || {};
+    if (CABLES.UTILS.isNumeric(options))options = { "glPrimitive": _options }; // old constructor fallback...
+    this._log = new Logger("cgl_mesh");
+    this._bufVertexAttrib = null;
+    this._bufVerticesIndizes = this._cgl.gl.createBuffer();
+    this._indexType = this._cgl.gl.UNSIGNED_SHORT;
+    this._attributes = [];
+    this._attribLocs = {};
+    this._geom = null;
+    this._lastShader = null;
+    this._numInstances = 0;
+    this._glPrimitive = options.glPrimitive;
+
+    this.opId = options.opId || "";
+    this._preWireframeGeom = null;
+    this.addVertexNumbers = false;
+    this._name = "unknown";
+
+    this.feedBackAttributes = [];
+    this.setGeom(__geom);
+
+    this._feedBacks = [];
+    this._feedBacksChanged = false;
+    this._transformFeedBackLoc = -1;
+    this._lastAttrUpdate = 0;
+
+    this.memFreed = false;
+
+    this._cgl.profileData.addHeavyEvent("mesh constructed", this._name);
+
+    this._queryExt = null;
+
+    Object.defineProperty(this, "numInstances", {
+        get()
+        {
+            return this._numInstances;
+        },
+        set(v)
+        {
+            this.setNumInstances(v);
+        },
+    });
+};
+
+Mesh.prototype.freeMem = function ()
+{
+    this.memFreed = true;
+
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        this._attributes[i].floatArray = null;
+    }
+};
+
+/**
+ * @function updateVertices
+ * @memberof Mesh
+ * @instance
+ * @description update vertices only from a geometry
+ * @param {Geometry} geometry
+ */
+Mesh.prototype.updateVertices = function (geom)
+{
+    this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_POSITION, geom.vertices, 3);
+    this._numVerts = geom.vertices.length / 3;
+};
+
+Mesh.prototype.setAttributePointer = function (attrName, name, stride, offset)
+{
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        if (this._attributes[i].name == attrName)
+        {
+            if (!this._attributes[i].pointer) this._attributes[i].pointer = [];
+
+            this._attributes[i].pointer.push(
+                {
+                    "loc": -1,
+                    "name": name,
+                    "stride": stride,
+                    "offset": offset,
+                    "instanced": attrName == constants_CONSTANTS.SHADER.SHADERVAR_INSTANCE_MMATRIX,
+                }
+            );
+        }
+    }
+};
+
+Mesh.prototype.getAttribute = function (name)
+{
+    for (let i = 0; i < this._attributes.length; i++) if (this._attributes[i].name == name) return this._attributes[i];
+};
+
+Mesh.prototype.setAttributeRange = function (attr, array, start, end)
+{
+    if (!attr) return;
+    if (!start && !end) return;
+
+    if (!attr.name)
+    {
+        this._log.stack("no attrname?!");
+    }
+
+    this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, attr.buffer);
+    this._cgl.profileData.profileMeshAttributes += (end - start) || 0;
+
+    this._cgl.profileData.profileSingleMeshAttribute[this._name] = this._cgl.profileData.profileSingleMeshAttribute[this._name] || 0;
+    this._cgl.profileData.profileSingleMeshAttribute[this._name] += (end - start) || 0;
+
+    if (attr.numItems < array.length / attr.itemSize)
+    {
+        this._resizeAttr(array, attr);
+    }
+
+    if (end >= array.length - 1)
+    {
+        this._log.log(this._cgl.canvas.id + " " + attr.name + " buffersubdata out of bounds ?", array.length, end, start, attr);
+    }
+
+    if (this._cgl.glVersion == 1) this._cgl.gl.bufferSubData(this._cgl.gl.ARRAY_BUFFER, 0, array); // probably slow/ maybe create and array with only changed size ??
+    else this._cgl.gl.bufferSubData(this._cgl.gl.ARRAY_BUFFER, start * 4, array, start, (end - start));
+};
+
+Mesh.prototype._resizeAttr = function (array, attr)
+{
+    if (attr.buffer)
+        this._cgl.gl.deleteBuffer(attr.buffer);
+
+    attr.buffer = this._cgl.gl.createBuffer();
+    this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, attr.buffer);
+    this._bufferArray(array, attr);
+    attr.numItems = array.length / attr.itemSize;// numItems;
+};
+
+
+Mesh.prototype._bufferArray = function (array, attr)
+{
+    let floatArray = attr.floatArray || null;
+    if (!array) return;
+
+
+    if (this._cgl.debugOneFrame)
+    {
+        console.log("_bufferArray", array.length, attr.name); // eslint-disable-line
+    }
+
+    if (!(array instanceof Float32Array))
+    {
+        if (attr && floatArray && floatArray.length == array.length)
+        {
+            floatArray.set(array);
+            // floatArray = floatArray;
+        }
+        else
+        {
+            floatArray = new Float32Array(array);
+
+            if (this._cgl.debugOneFrame)
+            {
+                console.log("_bufferArray create new float32array", array.length, attr.name); // eslint-disable-line
+            }
+
+            if (array.length > 10000)
+            {
+                this._cgl.profileData.profileNonTypedAttrib++;
+                this._cgl.profileData.profileNonTypedAttribNames = "(" + this._name + ":" + attr.name + ")";
+            }
+        }
+    }
+    else floatArray = array;
+
+    attr.arrayLength = floatArray.length;
+    attr.floatArray = null;// floatArray;
+
+    this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER, floatArray, this._cgl.gl.DYNAMIC_DRAW);
+};
+
+/**
+ * @function setAttribute
+ * @description update attribute
+ * @memberof Mesh
+ * @instance
+ * @param {String} attribute name
+ * @param {Array} data
+ * @param {Number} itemSize
+ * @param {Object} options
+ */
+Mesh.prototype.addAttribute = Mesh.prototype.updateAttribute = Mesh.prototype.setAttribute = function (name, array, itemSize, options)
+{
+    if (!array)
+    {
+        this._log.error("mesh addAttribute - no array given! " + name);
+        throw new Error();
+    }
+    let cb = null;
+    let instanced = false;
+    let i = 0;
+    const numItems = array.length / itemSize;
+
+    this._cgl.profileData.profileMeshAttributes += numItems || 0;
+
+    if (typeof options == "function")
+    {
+        cb = options;
+    }
+
+    if (typeof options == "object")
+    {
+        if (options.cb) cb = options.cb;
+        if (options.instanced) instanced = options.instanced;
+    }
+
+    if (name == constants_CONSTANTS.SHADER.SHADERVAR_INSTANCE_MMATRIX) instanced = true;
+
+
+    for (i = 0; i < this._attributes.length; i++)
+    {
+        const attr = this._attributes[i];
+        if (attr.name == name)
+        {
+            if (attr.numItems === numItems)
+            {
+            }
+            else
+            {
+                // this._log.log("wrong buffer size", this._geom.name, attr.name, attr.numItems, numItems);
+                this._resizeAttr(array, attr);
+            }
+
+            this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, attr.buffer);
+            this._bufferArray(array, attr);
+
+            return attr;
+        }
+    }
+
+    // create new buffer...
+
+    const buffer = this._cgl.gl.createBuffer();
+
+    this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, buffer);
+    // this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER, floatArray, this._cgl.gl.DYNAMIC_DRAW);
+
+    let type = this._cgl.gl.FLOAT;
+    if (options && options.type) type = options.type;
+    const attr = {
+        "buffer": buffer,
+        "name": name,
+        "cb": cb,
+        "itemSize": itemSize,
+        "numItems": numItems,
+        "startItem": 0,
+        "instanced": instanced,
+        "type": type
+    };
+
+    this._bufferArray(array, attr);
+
+    if (name == constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_POSITION) this._bufVertexAttrib = attr;
+    this._attributes.push(attr);
+    this._attribLocs = {};
+
+    return attr;
+};
+
+Mesh.prototype.getAttributes = function ()
+{
+    return this._attributes;
+};
+
+/**
+ * @function updateTexCoords
+ * @description update texture coordinates only from a geometry
+ * @memberof Mesh
+ * @instance
+ * @param {Geometry} geometry
+ */
+Mesh.prototype.updateTexCoords = function (geom)
+{
+    if (geom.texCoords && geom.texCoords.length > 0)
+    {
+        this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_TEXCOORD, geom.texCoords, 2);
+    }
+    else
+    {
+        const tcBuff = new Float32Array(Math.round((geom.vertices.length / 3) * 2));
+        this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_TEXCOORD, tcBuff, 2);
+    }
+};
+
+
+/**
+ * @function updateNormals
+ * @description update normals only from a geometry
+ * @memberof Mesh
+ * @instance
+ * @param {Geometry} geometry
+ */
+Mesh.prototype.updateNormals = function (geom)
+{
+    if (geom.vertexNormals && geom.vertexNormals.length > 0)
+    {
+        this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_NORMAL, geom.vertexNormals, 3);
+    }
+    else
+    {
+        const tcBuff = new Float32Array(Math.round((geom.vertices.length)));
+        this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_NORMAL, tcBuff, 3);
+    }
+};
+
+
+Mesh.prototype._setVertexNumbers = function (arr)
+{
+    if (!this._verticesNumbers || this._verticesNumbers.length != this._numVerts || arr)
+    {
+        if (arr) this._verticesNumbers = arr;
+        else
+        {
+            this._verticesNumbers = new Float32Array(this._numVerts);
+            for (let i = 0; i < this._numVerts; i++) this._verticesNumbers[i] = i;
+        }
+
+        this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_NUMBER, this._verticesNumbers, 1, (attr, geom, shader) =>
+        {
+            if (!shader.uniformNumVertices) shader.uniformNumVertices = new Uniform(shader, "f", "numVertices", this._numVerts);
+            shader.uniformNumVertices.setValue(this._numVerts);
+
+            // console.log("this._numVerts", this._numVerts, attr, shader.uniformNumVertices);
+        });
+    }
+};
+
+/**
+ * @function setVertexIndices
+ * @description update vertex indices / faces
+ * @memberof Mesh
+ * @instance
+ * @param {array} vertIndices
+ */
+Mesh.prototype.setVertexIndices = function (vertIndices)
+{
+    if (!this._bufVerticesIndizes)
+    {
+        this._log.warn("no bufVerticesIndizes: " + this._name);
+        return;
+    }
+    if (vertIndices.length > 0)
+    {
+        if (vertIndices instanceof Float32Array) this._log.warn("vertIndices float32Array: " + this._name);
+
+        for (let i = 0; i < vertIndices.length; i++)
+        {
+            if (vertIndices[i] >= this._numVerts)
+            {
+                this._log.warn("invalid index in " + this._name, i, vertIndices[i]);
+                return;
+            }
+        }
+
+        this._cgl.gl.bindBuffer(this._cgl.gl.ELEMENT_ARRAY_BUFFER, this._bufVerticesIndizes);
+
+        // todo cache this ?
+        // if(!this.vertIndicesTyped || this.vertIndicesTyped.length!=this._geom.verticesIndices.length)
+
+        if (vertIndices.length > 65535)
+        {
+            this.vertIndicesTyped = new Uint32Array(vertIndices);
+            this._indexType = this._cgl.gl.UNSIGNED_INT;
+        }
+        else
+        if (vertIndices instanceof Uint32Array)
+        {
+            this.vertIndicesTyped = vertIndices;
+            this._indexType = this._cgl.gl.UNSIGNED_INT;
+        }
+        else
+        if (!(vertIndices instanceof Uint16Array))
+        {
+            this.vertIndicesTyped = new Uint16Array(vertIndices);
+            this._indexType = this._cgl.gl.UNSIGNED_SHORT;
+        }
+        else this.vertIndicesTyped = vertIndices;
+
+        this._cgl.gl.bufferData(this._cgl.gl.ELEMENT_ARRAY_BUFFER, this.vertIndicesTyped, this._cgl.gl.DYNAMIC_DRAW);
+        this._bufVerticesIndizes.itemSize = 1;
+        this._bufVerticesIndizes.numItems = vertIndices.length;
+    }
+    else this._bufVerticesIndizes.numItems = 0;
+};
+
+/**
+ * @function setGeom
+ * @memberof Mesh
+ * @instance
+ * @description set geometry for mesh
+ * @param {Geometry} geometry
+ */
+Mesh.prototype.setGeom = function (geom, removeRef)
+{
+    this._geom = geom;
+    if (geom.glPrimitive != null) this._glPrimitive = geom.glPrimitive;
+    if (this._geom && this._geom.name) this._name = "mesh " + this._geom.name;
+
+    MESH.lastMesh = null;
+    this._cgl.profileData.profileMeshSetGeom++;
+
+    this._disposeAttributes();
+
+    this.updateVertices(this._geom);
+    this.setVertexIndices(this._geom.verticesIndices);
+
+    if (this.addVertexNumbers) this._setVertexNumbers();
+
+    const geomAttribs = this._geom.getAttributes();
+
+    const attribAssoc = {
+        "texCoords": constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_TEXCOORD,
+        "vertexNormals": constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_NORMAL,
+        "vertexColors": constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_COLOR,
+        "tangents": "attrTangent",
+        "biTangents": "attrBiTangent",
+    };
+
+    for (const index in geomAttribs)
+        if (geomAttribs[index].data && geomAttribs[index].data.length)
+            this.setAttribute(attribAssoc[index] || index, geomAttribs[index].data, geomAttribs[index].itemSize);
+
+
+    if (removeRef)
+    {
+        this._geom = null;
+    }
+};
+
+Mesh.prototype._preBind = function (shader)
+{
+    for (let i = 0; i < this._attributes.length; i++)
+        if (this._attributes[i].cb)
+            this._attributes[i].cb(this._attributes[i], this._geom, shader);
+};
+
+Mesh.prototype._checkAttrLengths = function ()
+{
+    if (this.memFreed) return;
+    // check length
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        if (this._attributes[i].arrayLength / this._attributes[i].itemSize < this._attributes[0].arrayLength / this._attributes[0].itemSize)
+        {
+            let name = "unknown";
+            if (this._geom)name = this._geom.name;
+            // this._log.warn(
+            //     name + ": " + this._attributes[i].name +
+            //     " wrong attr length. is:", this._attributes[i].arrayLength / this._attributes[i].itemSize,
+            //     " should be:", this._attributes[0].arrayLength / this._attributes[0].itemSize,
+            // );
+        }
+    }
+};
+
+Mesh.prototype._bind = function (shader)
+{
+    if (!shader.isValid()) return;
+
+    let attrLocs = [];
+    if (this._attribLocs[shader.id]) attrLocs = this._attribLocs[shader.id];
+    else this._attribLocs[shader.id] = attrLocs;
+
+    this._lastShader = shader;
+    if (shader.lastCompile > this._lastAttrUpdate || attrLocs.length != this._attributes.length)
+    {
+        this._lastAttrUpdate = shader.lastCompile;
+        for (let i = 0; i < this._attributes.length; i++) attrLocs[i] = -1;
+    }
+
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        const attribute = this._attributes[i];
+        if (attrLocs[i] == -1)
+        {
+            if (attribute._attrLocationLastShaderTime != shader.lastCompile)
+            {
+                attribute._attrLocationLastShaderTime = shader.lastCompile;
+                attrLocs[i] = this._cgl.glGetAttribLocation(shader.getProgram(), attribute.name);
+                // this._log.log('attribloc',attribute.name,attrLocs[i]);
+                this._cgl.profileData.profileAttrLoc++;
+            }
+        }
+
+        if (attrLocs[i] != -1)
+        {
+            this._cgl.gl.enableVertexAttribArray(attrLocs[i]);
+            this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, attribute.buffer);
+
+            if (attribute.instanced)
+            {
+                // todo: easier way to fill mat4 attribs...
+                if (attribute.itemSize <= 4)
+                {
+                    if (!attribute.itemSize || attribute.itemSize == 0) this._log.warn("instanced attrib itemsize error", this._geom.name, attribute);
+
+                    this._cgl.gl.vertexAttribPointer(attrLocs[i], attribute.itemSize, attribute.type, false, attribute.itemSize * 4, 0);
+                    this._cgl.gl.vertexAttribDivisor(attrLocs[i], 1);
+                }
+                else if (attribute.itemSize == 16)
+                {
+                    const stride = 16 * 4;
+
+                    this._cgl.gl.vertexAttribPointer(attrLocs[i], 4, attribute.type, false, stride, 0);
+                    this._cgl.gl.enableVertexAttribArray(attrLocs[i] + 1);
+                    this._cgl.gl.vertexAttribPointer(attrLocs[i] + 1, 4, attribute.type, false, stride, 4 * 4 * 1);
+                    this._cgl.gl.enableVertexAttribArray(attrLocs[i] + 2);
+                    this._cgl.gl.vertexAttribPointer(attrLocs[i] + 2, 4, attribute.type, false, stride, 4 * 4 * 2);
+                    this._cgl.gl.enableVertexAttribArray(attrLocs[i] + 3);
+                    this._cgl.gl.vertexAttribPointer(attrLocs[i] + 3, 4, attribute.type, false, stride, 4 * 4 * 3);
+
+                    this._cgl.gl.vertexAttribDivisor(attrLocs[i], 1);
+                    this._cgl.gl.vertexAttribDivisor(attrLocs[i] + 1, 1);
+                    this._cgl.gl.vertexAttribDivisor(attrLocs[i] + 2, 1);
+                    this._cgl.gl.vertexAttribDivisor(attrLocs[i] + 3, 1);
+                }
+                else
+                {
+                    this._log.warn("unknown instance attrib size", attribute.name);
+                }
+            }
+            else
+            {
+                if (!attribute.itemSize || attribute.itemSize == 0) this._log.warn("attrib itemsize error", this._name, attribute);
+                this._cgl.gl.vertexAttribPointer(attrLocs[i], attribute.itemSize, attribute.type, false, attribute.itemSize * 4, 0);
+
+                if (attribute.pointer)
+                {
+                    for (let ip = 0; ip < attribute.pointer.length; ip++)
+                    {
+                        const pointer = attribute.pointer[ip];
+
+                        if (pointer.loc == -1)
+                            pointer.loc = this._cgl.glGetAttribLocation(shader.getProgram(), pointer.name);
+
+                        this._cgl.profileData.profileAttrLoc++;
+
+                        this._cgl.gl.enableVertexAttribArray(pointer.loc);
+                        this._cgl.gl.vertexAttribPointer(pointer.loc, attribute.itemSize, attribute.type, false, pointer.stride, pointer.offset);
+                    }
+                }
+                this.bindFeedback(attribute);
+            }
+        }
+    }
+
+    if (this._bufVerticesIndizes && this._bufVerticesIndizes.numItems !== 0) this._cgl.gl.bindBuffer(this._cgl.gl.ELEMENT_ARRAY_BUFFER, this._bufVerticesIndizes);
+};
+
+Mesh.prototype.unBind = function ()
+{
+    const shader = this._lastShader;
+    this._lastShader = null;
+    if (!shader) return;
+
+    let attrLocs = [];
+    if (this._attribLocs[shader.id]) attrLocs = this._attribLocs[shader.id];
+    else this._attribLocs[shader.id] = attrLocs;
+
+    MESH.lastMesh = null;
+
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        if (this._attributes[i].instanced)
+        {
+            // todo: easier way to fill mat4 attribs...
+            if (this._attributes[i].itemSize <= 4)
+            {
+                if (attrLocs[i] != -1) this._cgl.gl.vertexAttribDivisor(attrLocs[i], 0);
+                if (attrLocs[i] >= 0) this._cgl.gl.disableVertexAttribArray(attrLocs[i]);
+            }
+            else
+            {
+                this._cgl.gl.vertexAttribDivisor(attrLocs[i], 0);
+                this._cgl.gl.vertexAttribDivisor(attrLocs[i] + 1, 0);
+                this._cgl.gl.vertexAttribDivisor(attrLocs[i] + 2, 0);
+                this._cgl.gl.vertexAttribDivisor(attrLocs[i] + 3, 0);
+                this._cgl.gl.disableVertexAttribArray(attrLocs[i] + 1);
+                this._cgl.gl.disableVertexAttribArray(attrLocs[i] + 2);
+                this._cgl.gl.disableVertexAttribArray(attrLocs[i] + 3);
+            }
+        }
+
+        if (attrLocs[i] != -1) this._cgl.gl.disableVertexAttribArray(attrLocs[i]);
+    }
+};
+
+Mesh.prototype.meshChanged = function ()
+{
+    return this._cgl.lastMesh && this._cgl.lastMesh != this;
+};
+
+Mesh.prototype.printDebug = function (shader)
+{
+    console.log("--attributes");
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        console.log("attribute " + i + " " + this._attributes[i].name);
+    }
+};
+
+Mesh.prototype.setNumVertices = function (num)
+{
+    this._bufVertexAttrib.numItems = num;
+};
+
+Mesh.prototype.getNumVertices = function ()
+{
+    return this._bufVertexAttrib.numItems;
+};
+
+
+/**
+ * @function render
+ * @memberof Mesh
+ * @instance
+ * @description draw mesh to screen
+ * @param {Shader} shader
+ */
+Mesh.prototype.render = function (shader)
+{
+    // TODO: enable/disablevertex only if the mesh has changed... think drawing 10000x the same mesh
+
+    if (!shader || !shader.isValid() || this._cgl.aborted) return;
+
+    this._checkAttrLengths();
+
+    if (this._geom)
+    {
+        if (this._preWireframeGeom && !shader.wireframe && !this._geom.isIndexed())
+        {
+            this.setGeom(this._preWireframeGeom);
+            this._preWireframeGeom = null;
+            // console.log("remove prewireframe geom");
+        }
+
+        if (shader.wireframe)
+        {
+            let changed = false;
+
+            if (this._geom.isIndexed())
+            {
+                if (!this._preWireframeGeom)
+                {
+                    this._preWireframeGeom = this._geom;
+                    this._geom = this._geom.copy();
+                }
+
+                this._geom.unIndex();
+                changed = true;
+            }
+
+            if (!this._geom.getAttribute("attrBarycentric"))
+            {
+                if (!this._preWireframeGeom)
+                {
+                    this._preWireframeGeom = this._geom;
+                    this._geom = this._geom.copy();
+                }
+                changed = true;
+
+                this._geom.calcBarycentric();
+            }
+            if (changed) this.setGeom(this._geom);
+        }
+        // if (shader.wireframe)
+        // console.log(shader.wireframe, this._geom.isIndexed());
+    }
+
+    let needsBind = false;
+    if (MESH.lastMesh != this)
+    {
+        if (MESH.lastMesh) MESH.lastMesh.unBind();
+        needsBind = true;
+    }
+
+
+    // var needsBind=false;
+    // {
+    //     needsBind=true;
+    // }
+    if (needsBind) this._preBind(shader);
+
+    if (!shader.bind()) return;
+
+    // if(needsBind)
+    this._bind(shader);
+    if (this.addVertexNumbers) this._setVertexNumbers();
+
+    MESH.lastMesh = this;
+
+    let prim = this._cgl.gl.TRIANGLES;
+    if (this._glPrimitive !== undefined) prim = this._glPrimitive;
+    if (shader.glPrimitive !== null) prim = shader.glPrimitive;
+
+    let elementDiv = 1;
+    let doQuery = this._cgl.profileData.doProfileGlQuery;
+    let queryStarted = false;
+    if (doQuery)
+    {
+        let id = this._name + " - " + shader.getName() + " #" + shader.id;
+        if (this._numInstances) id += " instanced " + this._numInstances + "x";
+
+        let queryProfilerData = this._cgl.profileData.glQueryData[id];
+
+        if (!queryProfilerData) queryProfilerData = { "id": id, "num": 0 };
+
+        if (shader.opId)queryProfilerData.shaderOp = shader.opId;
+        if (this.opId)queryProfilerData.meshOp = this.opId;
+
+        this._cgl.profileData.glQueryData[id] = queryProfilerData;
+
+        if (!this._queryExt && this._queryExt !== false) this._queryExt = this._cgl.enableExtension("EXT_disjoint_timer_query_webgl2") || false;
+        if (this._queryExt)
+        {
+            if (queryProfilerData._drawQuery)
+            {
+                const available = this._cgl.gl.getQueryParameter(queryProfilerData._drawQuery, this._cgl.gl.QUERY_RESULT_AVAILABLE);
+                if (available)
+                {
+                    const elapsedNanos = this._cgl.gl.getQueryParameter(queryProfilerData._drawQuery, this._cgl.gl.QUERY_RESULT);
+                    const currentTimeGPU = elapsedNanos / 1000000;
+
+                    queryProfilerData._times = queryProfilerData._times || 0;
+                    queryProfilerData._times += currentTimeGPU;
+                    queryProfilerData._numcount++;
+                    queryProfilerData.when = performance.now();
+                    queryProfilerData._drawQuery = null;
+                    queryProfilerData.queryStarted = false;
+                }
+            }
+
+            if (!queryProfilerData.queryStarted)
+            {
+                queryProfilerData._drawQuery = this._cgl.gl.createQuery();
+                this._cgl.gl.beginQuery(this._queryExt.TIME_ELAPSED_EXT, queryProfilerData._drawQuery);
+                queryStarted = queryProfilerData.queryStarted = true;
+            }
+        }
+    }
+
+
+    if (this.hasFeedbacks())
+    {
+        this.drawFeedbacks(shader, prim);
+    }
+    else if (!this._bufVerticesIndizes || this._bufVerticesIndizes.numItems === 0)
+    {
+        // for (let i = 0; i < this._attributes.length; i++)
+        // {
+        //     if (this._attributes[i].arrayLength / this._attributes[i].itemSize != this._bufVertexAttrib.floatArray.length / 3)
+        //     {
+        //         this._log.warn("attrib buffer length wrong! ", this._attributes[i].name, this._attributes[i].arrayLength / this._attributes[i].itemSize, this._bufVertexAttrib.floatArray.length / 3, this._attributes[i].itemSize);
+        //         // this._log.log(this);
+        //         // debugger;
+        //         return;
+        //     }
+        // }
+
+
+        if (prim == this._cgl.gl.TRIANGLES)elementDiv = 3;
+        if (this._numInstances === 0) this._cgl.gl.drawArrays(prim, this._bufVertexAttrib.startItem, this._bufVertexAttrib.numItems - this._bufVertexAttrib.startItem);
+        else this._cgl.gl.drawArraysInstanced(prim, this._bufVertexAttrib.startItem, this._bufVertexAttrib.numItems, this._numInstances);
+    }
+    else
+    {
+        if (prim == this._cgl.gl.TRIANGLES)elementDiv = 3;
+        if (this._numInstances === 0)
+        {
+            // console.log("la", this._bufVerticesIndizes.numItems);
+
+            this._cgl.gl.drawElements(prim, this._bufVerticesIndizes.numItems, this._indexType, 0);
+        }
+        else
+        {
+            this._cgl.gl.drawElementsInstanced(prim, this._bufVerticesIndizes.numItems, this._indexType, 0, this._numInstances);
+        }
+    }
+
+    if (this._cgl.debugOneFrame && this._cgl.gl.getError() != this._cgl.gl.NO_ERROR)
+    {
+        this._log.error("mesh draw gl error");
+        this._log.error("mesh", this);
+        this._log.error("shader", shader);
+
+        const attribNames = [];
+        for (let i = 0; i < this._cgl.gl.getProgramParameter(shader.getProgram(), this._cgl.gl.ACTIVE_ATTRIBUTES); i++)
+        {
+            const name = this._cgl.gl.getActiveAttrib(shader.getProgram(), i).name;
+            this._log.error("attrib ", name);
+        }
+    }
+
+    this._cgl.profileData.profileMeshNumElements += (this._bufVertexAttrib.numItems / elementDiv) * (this._numInstances || 1);
+    this._cgl.profileData.profileMeshDraw++;
+
+    if (doQuery && queryStarted)
+    {
+        this._cgl.gl.endQuery(this._queryExt.TIME_ELAPSED_EXT);
+    }
+
+    this._cgl.printError("mesh render " + this._name);
+
+    this.unBind();
+};
+
+Mesh.prototype.setNumInstances = function (n)
+{
+    n = Math.max(0, n);
+    if (this._numInstances != n)
+    {
+        this._numInstances = n;
+        const indexArr = new Float32Array(n);
+        for (let i = 0; i < n; i++) indexArr[i] = i;
+        this.setAttribute(constants_CONSTANTS.SHADER.SHADERVAR_INSTANCE_INDEX, indexArr, 1, { "instanced": true });
+    }
+};
+
+Mesh.prototype._disposeAttributes = function ()
+{
+    if (!this._attributes) return;
+
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        if (this._attributes[i].buffer)
+        {
+            this._cgl.gl.deleteBuffer(this._attributes[i].buffer);
+            this._attributes[i].buffer = null;
+        }
+    }
+    this._attributes.length = 0;
+};
+
+Mesh.prototype.dispose = function ()
+{
+    if (this._bufVertexAttrib && this._bufVertexAttrib.buffer) this._cgl.gl.deleteBuffer(this._bufVertexAttrib.buffer);
+    if (this._bufVerticesIndizes) this._cgl.gl.deleteBuffer(this._bufVerticesIndizes);
+    this._bufVerticesIndizes = null;
+
+    this._disposeAttributes();
+};
+
+extendMeshWithFeedback(Mesh);
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_simplerect.js
+
+
+
+
+const MESHES = {};
+
+MESHES.getSimpleRect = function (cgl, name)
+{
+    const geom = new Geometry(name);
+
+    geom.vertices = [1.0, 1.0, 0.0, -1.0, 1.0, 0.0, 1.0, -1.0, 0.0, -1.0, -1.0, 0.0];
+    geom.texCoords = [1.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0];
+    geom.verticesIndices = [0, 1, 2, 2, 1, 3];
+    geom.vertexNormals = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0];
+
+    return new Mesh(cgl, geom);
+};
+
+
+MESHES.getSimpleCube = function (cgl, name)
+{
+    const geom = new Geometry(name);
+    geom.vertices = [-1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, -1, 1, -1, 1, 1, -1, 1, 1, 1, -1, 1, 1, -1, -1, -1, 1, -1, -1, 1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1, 1, 1, 1, 1, 1, 1, -1, -1, -1, -1, -1, -1, 1, -1, 1, 1, -1, 1, -1];
+    geom.setTexCoords([0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0,]);
+    geom.verticesIndices = [0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9, 10, 8, 10, 11, 12, 13, 14, 12, 14, 15, 16, 17, 18, 16, 18, 19, 20, 21, 22, 20, 22, 23];
+    geom.vertexNormals = new Float32Array([0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0, -1.0, 0.0, 0.0]);
+    geom.tangents = new Float32Array([0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);
+    geom.biTangents = new Float32Array([-1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]);
+
+    return new Mesh(cgl, geom);
+};
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_textureeffect.js
+
+
+
+
+const TextureEffect = function (cgl, options)
+{
+    this._cgl = cgl;
+    this._log = new Logger("cgl_TextureEffect");
+
+    if (!cgl.TextureEffectMesh) this.createMesh();
+
+    this._textureSource = null;
+    this._options = options;
+    this.name = options.name || "unknown";
+
+    // TODO: do we still need the options ?
+    // var opts=options ||
+    //     {
+    //         isFloatingPointTexture:false,
+    //         filter:CGL.Texture.FILTER_LINEAR
+    //     };
+    // if(options && options.fp)opts.isFloatingPointTexture=true;
+
+    this.imgCompVer = 0;
+    this.aspectRatio = 1;
+    this._textureTarget = null; // new CGL.Texture(this._cgl,opts);
+    this._frameBuf = this._cgl.gl.createFramebuffer();
+    this._frameBuf2 = this._cgl.gl.createFramebuffer();
+    this._renderbuffer = this._cgl.gl.createRenderbuffer();
+    this._renderbuffer2 = this._cgl.gl.createRenderbuffer();
+    this.switched = false;
+    this.depth = false;
+};
+
+TextureEffect.prototype.dispose = function ()
+{
+    if (this._renderbuffer) this._cgl.gl.deleteRenderbuffer(this._renderbuffer);
+    if (this._frameBuf) this._cgl.gl.deleteFramebuffer(this._frameBuf);
+    if (this._renderbuffer2) this._cgl.gl.deleteRenderbuffer(this._renderbuffer2);
+    if (this._frameBuf2) this._cgl.gl.deleteFramebuffer(this._frameBuf2);
+};
+
+TextureEffect.prototype.getWidth = function ()
+{
+    return this._textureSource.width;
+};
+
+TextureEffect.prototype.getHeight = function ()
+{
+    return this._textureSource.height;
+};
+
+TextureEffect.prototype.setSourceTexture = function (tex)
+{
+    if (tex === null)
+    {
+        this._textureSource = new Texture(this._cgl);
+        this._textureSource.setSize(16, 16);
+    }
+    else
+    {
+        this._textureSource = tex;
+    }
+
+    if (!this._textureSource.compareSettings(this._textureTarget))
+    {
+        if (this._textureTarget) this._textureTarget.delete();
+
+        this._textureTarget = this._textureSource.clone();
+
+        this._cgl.profileData.profileEffectBuffercreate++;
+
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuf);
+
+        this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, this._renderbuffer);
+
+        // if(tex.textureType==CGL.Texture.TYPE_FLOAT) this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER,this._cgl.gl.RGBA32F, this._textureSource.width,this._textureSource.height);
+        // else this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER,this._cgl.gl.RGBA8, this._textureSource.width,this._textureSource.height);
+
+        if (this.depth) this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER, this._cgl.gl.DEPTH_COMPONENT16, this._textureSource.width, this._textureSource.height);
+        this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.TEXTURE_2D, this._textureTarget.tex, 0);
+        if (this.depth) this._cgl.gl.framebufferRenderbuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.DEPTH_ATTACHMENT, this._cgl.gl.RENDERBUFFER, this._renderbuffer);
+
+        // this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.TEXTURE_2D, this._textureTarget.tex, 0);
+
+        this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, null);
+        this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, null);
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuf2);
+
+        this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, this._renderbuffer2);
+
+        // if(tex.textureType==CGL.Texture.TYPE_FLOAT) this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER,this._cgl.gl.RGBA32F, this._textureSource.width,this._textureSource.height);
+        // else this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER,this._cgl.gl.RGBA8, this._textureSource.width,this._textureSource.height);
+
+        if (this.depth) this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER, this._cgl.gl.DEPTH_COMPONENT16, this._textureSource.width, this._textureSource.height);
+        this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.TEXTURE_2D, this._textureSource.tex, 0);
+
+        if (this.depth) this._cgl.gl.framebufferRenderbuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.DEPTH_ATTACHMENT, this._cgl.gl.RENDERBUFFER, this._renderbuffer2);
+
+        // this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.TEXTURE_2D, this._textureSource.tex, 0);
+
+        this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, null);
+        this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, null);
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+    }
+
+    this.aspectRatio = this._textureSource.width / this._textureSource.height;
+};
+TextureEffect.prototype.continueEffect = function ()
+{
+    this._cgl.pushDepthTest(false);
+    this._cgl.pushModelMatrix();
+    this._cgl.pushPMatrix();
+    // todo why two pushs?
+
+
+
+    this._cgl.pushViewPort(0, 0, this.getCurrentTargetTexture().width, this.getCurrentTargetTexture().height);
+
+
+
+    mat4.perspective(this._cgl.pMatrix, 45, this.getCurrentTargetTexture().width / this.getCurrentTargetTexture().height, 0.1, 1100.0); // todo: why?
+
+    this._cgl.pushPMatrix();
+    mat4.identity(this._cgl.pMatrix);
+
+    this._cgl.pushViewMatrix();
+    mat4.identity(this._cgl.vMatrix);
+
+    this._cgl.pushModelMatrix();
+    mat4.identity(this._cgl.mMatrix);
+};
+
+
+TextureEffect.prototype.startEffect = function (bgTex)
+{
+    if (!this._textureTarget)
+    {
+        this._log.warn("effect has no target");
+        return;
+    }
+
+    this.switched = false;
+
+    this.continueEffect();
+
+    if (bgTex)
+    {
+        this._bgTex = bgTex;
+    }
+    this._countEffects = 0;
+};
+
+TextureEffect.prototype.endEffect = function ()
+{
+    this._cgl.popDepthTest();
+    this._cgl.popModelMatrix();
+
+    this._cgl.popPMatrix();
+    this._cgl.popModelMatrix();
+    this._cgl.popViewMatrix();
+
+    this._cgl.popPMatrix();
+    this._cgl.popViewPort();
+};
+
+TextureEffect.prototype.bind = function ()
+{
+    if (this._textureSource === null)
+    {
+        this._log.warn("no base texture set!");
+        return;
+    }
+
+    if (!this.switched)
+    {
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuf);
+        this._cgl.pushGlFrameBuffer(this._frameBuf);
+    }
+    else
+    {
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuf2);
+        this._cgl.pushGlFrameBuffer(this._frameBuf2);
+    }
+};
+
+TextureEffect.prototype.finish = function ()
+{
+    if (this._textureSource === null)
+    {
+        this._log.warn("no base texture set!");
+        return;
+    }
+
+    this._cgl.TextureEffectMesh.render(this._cgl.getShader());
+
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.popGlFrameBuffer());
+
+    this._cgl.profileData.profileTextureEffect++;
+
+    if (this._textureTarget.filter == Texture.FILTER_MIPMAP)
+    {
+        if (!this.switched)
+        {
+            this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, this._textureTarget.tex);
+            this._textureTarget.updateMipMap();
+        }
+        else
+        {
+            this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, this._textureSource.tex);
+            this._textureSource.updateMipMap();
+        }
+
+        this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, null);
+    }
+
+    this.switched = !this.switched;
+    this._countEffects++;
+};
+
+TextureEffect.prototype.getCurrentTargetTexture = function ()
+{
+    if (this.switched) return this._textureSource;
+    return this._textureTarget;
+};
+
+TextureEffect.prototype.getCurrentSourceTexture = function ()
+{
+    if (this._countEffects == 0 && this._bgTex) return this._bgTex;
+
+    if (this.switched) return this._textureTarget;
+    return this._textureSource;
+};
+
+TextureEffect.prototype.delete = function ()
+{
+    if (this._textureTarget) this._textureTarget.delete();
+    if (this._textureSource) this._textureSource.delete();
+    this._cgl.gl.deleteRenderbuffer(this._renderbuffer);
+    this._cgl.gl.deleteFramebuffer(this._frameBuf);
+};
+
+TextureEffect.prototype.createMesh = function ()
+{
+    this._cgl.TextureEffectMesh = MESHES.getSimpleRect(this._cgl, "texEffectRect");
+};
+
+// ---------------------------------------------------------------------------------
+
+TextureEffect.checkOpNotInTextureEffect = function (op)
+{
+    if (!op.patch.cgl) return true;
+    if (op.uiAttribs.error && !op.patch.cgl.currentTextureEffect)
+    {
+        op.setUiError("textureeffect", null);
+        return true;
+    }
+    if (!op.patch.cgl.currentTextureEffect) return true;
+
+    if (op.patch.cgl.currentTextureEffect && !op.uiAttribs.error)
+    {
+        op.setUiError("textureeffect", "This op can not be a child of a ImageCompose/texture effect! imagecompose should only have textureeffect childs.", 0);
+        return false;
+    }
+
+    if (op.patch.cgl.currentTextureEffect) return false;
+    return true;
+};
+
+TextureEffect.checkOpInEffect = function (op, minver)
+{
+    minver = minver || 0;
+
+    if (op.patch.cgl.currentTextureEffect)
+    {
+        if (op.uiAttribs.uierrors && op.patch.cgl.currentTextureEffect.imgCompVer >= minver)
+        {
+            op.setUiError("texeffect", null);
+            return true;
+        }
+
+        if (minver && op.patch.cgl.currentTextureEffect.imgCompVer < minver)
+        {
+            op.setUiError("texeffect", "This op must be a child of an ImageCompose op with version >=" + minver + " <span class=\"button-small\" onclick=\"gui.patchView.downGradeOp('" + op.id + "','" + op.name + "')\">Downgrade</span> to previous version", 1);
+        }
+    }
+
+    if (op.patch.cgl.currentTextureEffect) return true;
+
+    if (!op.patch.cgl.currentTextureEffect && (!op.uiAttribs.uierrors || op.uiAttribs.uierrors.length == 0))
+    {
+        op.setUiError("texeffect", "This op must be a child of an ImageCompose op! More infos <a href=\"https://docs.cables.gl/image_composition/image_composition.html\" target=\"_blank\">here</a>. ", 1);
+        return false;
+    }
+
+    if (!op.patch.cgl.currentTextureEffect) return false;
+    return true;
+};
+
+TextureEffect.getBlendCode = function (ver)
+{
+    let src = "".endl()
+        + "vec3 _blend(vec3 base,vec3 blend)".endl()
+        + "{".endl()
+        + "   vec3 colNew=blend;".endl()
+        + "   #ifdef BM_MULTIPLY".endl()
+        + "       colNew=base*blend;".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_MULTIPLY_INV".endl()
+        + "       colNew=base* vec3(1.0)-blend;".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_AVERAGE".endl()
+        + "       colNew=((base + blend) / 2.0);".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_ADD".endl()
+        + "       colNew=min(base + blend, vec3(1.0));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_SUBTRACT_ONE".endl()
+        + "       colNew=max(base + blend - vec3(1.0), vec3(0.0));".endl()
+        + "   #endif".endl()
+
+        + "   #ifdef BM_SUBTRACT".endl()
+        + "       colNew=base - blend;".endl()
+        + "   #endif".endl()
+
+        + "   #ifdef BM_DIFFERENCE".endl()
+        + "       colNew=abs(base - blend);".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_NEGATION".endl()
+        + "       colNew=(vec3(1.0) - abs(vec3(1.0) - base - blend));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_EXCLUSION".endl()
+        + "       colNew=(base + blend - 2.0 * base * blend);".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_LIGHTEN".endl()
+        + "       colNew=max(blend, base);".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_DARKEN".endl()
+        + "       colNew=min(blend, base);".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_OVERLAY".endl()
+        + "      #define BlendOverlayf(base, blend)  (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)))"
+            // .endl()+'       #define BlendOverlay(base, blend)       Blend(base, blend, BlendOverlayf)'
+            //    .endl()+'      colNew=Blend(base, blend, BlendOverlayf);'
+            .endl()
+        + "      colNew=vec3(BlendOverlayf(base.r, blend.r),BlendOverlayf(base.g, blend.g),BlendOverlayf(base.b, blend.b));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_SCREEN".endl()
+        + "      #define BlendScreenf(base, blend)       (1.0 - ((1.0 - base) * (1.0 - blend)))"
+            // .endl()+'       #define BlendScreen(base, blend)        Blend(base, blend, BlendScreenf)'
+            // .endl()+'      colNew=Blend(base, blend, BlendScreenf);'
+            .endl()
+        + "      colNew=vec3(BlendScreenf(base.r, blend.r),BlendScreenf(base.g, blend.g),BlendScreenf(base.b, blend.b));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_SOFTLIGHT".endl()
+        + "      #define BlendSoftLightf(base, blend)    ((blend < 0.5) ? (2.0 * base * blend + base * base * (1.0 - 2.0 * blend)) : (sqrt(base) * (2.0 * blend - 1.0) + 2.0 * base * (1.0 - blend)))"
+            // .endl()+'       #define BlendSoftLight(base, blend)     Blend(base, blend, BlendSoftLightf)'
+            //    .endl()+'      colNew=Blend(base, blend, BlendSoftLightf);'
+            .endl()
+        + "      colNew=vec3(BlendSoftLightf(base.r, blend.r),BlendSoftLightf(base.g, blend.g),BlendSoftLightf(base.b, blend.b));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_HARDLIGHT".endl()
+        + "      #define BlendOverlayf(base, blend)  (base < 0.5 ? (2.0 * base * blend) : (1.0 - 2.0 * (1.0 - base) * (1.0 - blend)))"
+            // .endl()+'       #define BlendOverlay(base, blend)       Blend(base, blend, BlendOverlayf)'
+            // .endl()+'      colNew=Blend(blend, base, BlendOverlayf);'
+            .endl()
+        + "      colNew=vec3(BlendOverlayf(base.r, blend.r),BlendOverlayf(base.g, blend.g),BlendOverlayf(base.b, blend.b));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_COLORDODGE".endl()
+        + "      #define BlendColorDodgef(base, blend)   ((blend == 1.0) ? blend : min(base / (1.0 - blend), 1.0))"
+            // .endl()+'      colNew=Blend(base, blend, BlendColorDodgef);'
+            .endl()
+        + "      colNew=vec3(BlendColorDodgef(base.r, blend.r),BlendColorDodgef(base.g, blend.g),BlendColorDodgef(base.b, blend.b));".endl()
+        + "   #endif".endl()
+        + "   #ifdef BM_COLORBURN".endl()
+        + "      #define BlendColorBurnf(base, blend)    ((blend == 0.0) ? blend : max((1.0 - ((1.0 - base) / blend)), 0.0))"
+            // .endl()+'      colNew=Blend(base, blend, BlendColorBurnf);'
+            .endl()
+        + "      colNew=vec3(BlendColorBurnf(base.r, blend.r),BlendColorBurnf(base.g, blend.g),BlendColorBurnf(base.b, blend.b));".endl()
+        + "   #endif".endl()
+
+
+
+
+
+
+
+
+
+
+        + "   return colNew;".endl()
+        + "}".endl();
+
+    if (!ver)
+        src += "vec4 cgl_blend(vec4 oldColor,vec4 newColor,float amount)".endl()
+                + "{".endl()
+                    + "vec4 col=vec4( _blend(oldColor.rgb,newColor.rgb) ,1.0);".endl()
+                    + "col=vec4( mix( col.rgb, oldColor.rgb ,1.0-oldColor.a*amount),1.0);".endl()
+                    + "return col;".endl()
+                + "}".endl();
+
+    if (ver >= 3)
+        src += "vec4 cgl_blendPixel(vec4 base,vec4 col,float amount)".endl() +
+                "{".endl() +
+
+                "#ifdef BM_MATH_ADD".endl() +
+                "   return vec4(base.rgb+col.rgb*amount,1.0);".endl() +
+                "#endif".endl() +
+
+                "#ifdef BM_MATH_SUB".endl() +
+                "   return vec4(base.rgb-col.rgb*amount,1.0);".endl() +
+                "#endif".endl() +
+
+                "#ifdef BM_MATH_MUL".endl() +
+                "   return vec4(base.rgb*col.rgb*amount,1.0);".endl() +
+                "#endif".endl() +
+
+                "#ifdef BM_MATH_DIV".endl() +
+                "   return vec4(base.rgb/col.rgb*amount,1.0);".endl() +
+                "#endif".endl() +
+
+
+                    "#ifndef BM_MATH".endl() +
+                        "vec3 colNew=_blend(base.rgb,col.rgb);".endl() +
+
+                        "float newA=clamp(base.a+(col.a*amount),0.,1.);".endl() +
+
+                        "#ifdef BM_ALPHAMASKED".endl() +
+                            "newA=base.a;".endl() +
+                        "#endif".endl() +
+
+                        "return vec4(".endl() +
+                            "mix(colNew,base.rgb,1.0-(amount*col.a)),".endl() +
+                            "newA);".endl() +
+
+                    "#endif".endl() +
+    "}".endl();
+
+    return src;
+};
+
+TextureEffect.onChangeBlendSelect = function (shader, blendName, maskAlpha = false)
+{
+    blendName = String(blendName);
+    shader.toggleDefine("BM_NORMAL", blendName == "normal");
+    shader.toggleDefine("BM_MULTIPLY", blendName == "multiply");
+    shader.toggleDefine("BM_MULTIPLY_INV", blendName == "multiply invert");
+    shader.toggleDefine("BM_AVERAGE", blendName == "average");
+    shader.toggleDefine("BM_ADD", blendName == "add");
+    shader.toggleDefine("BM_SUBTRACT_ONE", blendName == "subtract one");
+    shader.toggleDefine("BM_SUBTRACT", blendName == "subtract");
+    shader.toggleDefine("BM_DIFFERENCE", blendName == "difference");
+    shader.toggleDefine("BM_NEGATION", blendName == "negation");
+    shader.toggleDefine("BM_EXCLUSION", blendName == "exclusion");
+    shader.toggleDefine("BM_LIGHTEN", blendName == "lighten");
+    shader.toggleDefine("BM_DARKEN", blendName == "darken");
+    shader.toggleDefine("BM_OVERLAY", blendName == "overlay");
+    shader.toggleDefine("BM_SCREEN", blendName == "screen");
+    shader.toggleDefine("BM_SOFTLIGHT", blendName == "softlight");
+    shader.toggleDefine("BM_HARDLIGHT", blendName == "hardlight");
+    shader.toggleDefine("BM_COLORDODGE", blendName == "color dodge");
+    shader.toggleDefine("BM_COLORBURN", blendName == "color burn");
+
+    shader.toggleDefine("BM_MATH_ADD", blendName == "Math Add");
+    shader.toggleDefine("BM_MATH_SUB", blendName == "Math Subtract");
+    shader.toggleDefine("BM_MATH_MUL", blendName == "Math Multiply");
+    shader.toggleDefine("BM_MATH_DIV", blendName == "Math Divide");
+
+    shader.toggleDefine("BM_MATH", blendName.indexOf("Math ") == 0);
+
+
+    shader.toggleDefine("BM_ALPHAMASKED", maskAlpha);
+};
+
+TextureEffect.AddBlendSelect = function (op, name, defaultMode)
+{
+    const p = op.inValueSelect(name || "Blend Mode", [
+        "normal", "lighten", "darken", "multiply", "multiply invert", "average", "add", "subtract", "difference", "negation", "exclusion", "overlay", "screen", "color dodge", "color burn", "softlight", "hardlight", "subtract one",
+        "Math Add",
+        "Math Subtract",
+        "Math Multiply",
+        "Math Divide",
+
+    ], defaultMode || "normal");
+    return p;
+};
+
+TextureEffect.AddBlendAlphaMask = function (op, name, defaultMode)
+{
+    const p = op.inSwitch(name || "Alpha Mask", ["Off", "On"], defaultMode || "Off");
+    return p;
+};
+
+TextureEffect.setupBlending = function (op, shader, blendPort, amountPort, alphaMaskPort)
+{
+    const onChange = () =>
+    {
+        let maskAlpha = false;
+        if (alphaMaskPort) maskAlpha = alphaMaskPort.get() == "On";
+        TextureEffect.onChangeBlendSelect(shader, blendPort.get(), maskAlpha);
+
+        let str = blendPort.get();
+        if (str == "normal") str = null;
+        else if (str == "multiply") str = "mul";
+        else if (str == "multiply invert") str = "mulinv";
+        else if (str == "lighten") str = "light";
+        else if (str == "darken") str = "darken";
+        else if (str == "average") str = "avg";
+        else if (str == "subtract one") str = "sub one";
+        else if (str == "subtract") str = "sub";
+        else if (str == "difference") str = "diff";
+        else if (str == "negation") str = "neg";
+        else if (str == "exclusion") str = "exc";
+        else if (str == "overlay") str = "ovl";
+        else if (str == "color dodge") str = "dodge";
+        else if (str == "color burn") str = "burn";
+        else if (str == "softlight") str = "soft";
+        else if (str == "hardlight") str = "hard";
+        else if (str == "Math Add") str = "+";
+        else if (str == "Math Subtract") str = "-";
+        else if (str == "Math Multiply") str = "*";
+        else if (str == "Math Divide") str = "/";
+
+        op.setUiAttrib({ "extendTitle": str });
+    };
+    op.setPortGroup("Blending", [blendPort, amountPort, alphaMaskPort]);
+
+    let maskAlpha = false;
+
+    blendPort.onChange = onChange;
+    if (alphaMaskPort)
+    {
+        alphaMaskPort.onChange = onChange;
+        maskAlpha = alphaMaskPort.get() == "On";
+    }
+
+    TextureEffect.onChangeBlendSelect(shader, blendPort.get(), maskAlpha);
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_shader_lib.js
+
+
+
+
+const ShaderLibMods = {
+    "CGL.BLENDMODES": function ()
+    {
+        this.name = "blendmodes";
+        this.srcHeadFrag = TextureEffect.getBlendCode();
+    },
+    "CGL.BLENDMODES3": function ()
+    {
+        this.name = "blendmodes3";
+        this.srcHeadFrag = TextureEffect.getBlendCode(3);
+    },
+
+    "CGL.LUMINANCE": function ()
+    {
+        this.name = "luminance";
+        this.srcHeadFrag = "".endl()
+            + "float cgl_luminance(vec3 c)".endl()
+            + "{".endl()
+            + "    return dot(vec3(0.2126,0.7152,0.0722),c);".endl()
+            + "}".endl();
+    },
+
+
+    // quite good random numbers, but somehow don't work in ANGLE
+    "CGL.RANDOM_OLD": function ()
+    {
+        this.name = "randomNumber";
+        this.srcHeadFrag = "".endl()
+            + "float cgl_random(vec2 co)".endl()
+            + "{".endl()
+            + "    return fract(sin(dot(co.xy ,vec2(12.9898,4.1414))) * 432758.5453);".endl()
+            + "}".endl()
+            + "vec3 cgl_random3(vec2 co)".endl()
+            + "{".endl()
+            + "    return vec3( cgl_random(co),cgl_random(co+0.5711),cgl_random(co+1.5711));".endl()
+            + "}";
+    },
+
+
+    // low quality generative ranodm numbers
+    "CGL.RANDOM_LOW": function ()
+    {
+        this.name = "randomNumber";
+        this.srcHeadFrag = "".endl()
+            + "float cgl_random(vec2 co)".endl()
+            + "{".endl()
+            + "    return fract(sin(dot(co.xy ,vec2(12.9898,4.1414))) * 358.5453);".endl()
+            + "}".endl()
+            + "vec3 cgl_random3(vec2 co)".endl()
+            + "{".endl()
+            + "    return vec3( cgl_random(co),cgl_random(co+0.5711),cgl_random(co+1.5711));".endl()
+            + "}";
+    },
+
+    // texture based random numbers
+    "CGL.RANDOM_TEX": function ()
+    {
+        this.name = "randomNumbertex";
+        this.srcHeadFrag = "".endl()
+            + "UNI sampler2D CGLRNDTEX;".endl()
+            + "float cgl_random(vec2 co)".endl()
+            + "{".endl()
+            + "    return texture(CGLRNDTEX,co*5711.0).r;".endl()
+            + "}".endl()
+            + "vec3 cgl_random3(vec2 co)".endl()
+            + "{".endl()
+            + "    return texture(CGLRNDTEX,co*5711.0).rgb;".endl()
+            + "}";
+
+        this.initUniforms = function (shader)
+        {
+            return [new Uniform(shader, "t", "CGLRNDTEX", 7)];
+        };
+
+        this.onBind = function (cgl, shader)
+        {
+            Texture.getRandomTexture(cgl);
+            cgl.setTexture(7, Texture.getRandomTexture(cgl).tex);
+        };
+    },
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_utils.js
+/** @namespace CGL */
+
+/**
+ * multiply to get radians from degree, e.g. `360 * CGL.DEG2RAD`
+ * @const {Number}
+ * @memberof CGL
+ * @static
+ */
+const cgl_utils_DEG2RAD = Math.PI / 180.0;
+
+/**
+ * to get degrees from radians, e.g. `3.14 * CGL.RAD2DEG`
+ * @const {number}
+ * @memberof CGL
+ */
+const cgl_utils_RAD2DEG = 180.0 / Math.PI;
+
+const onLoadingAssetsFinished = null; // deprecated / remove later
+
+/**
+ * get normalized mouse wheel delta (including browser specific adjustment)
+ * @function getWheelDelta
+ * @static
+ * @memberof CGL
+ * @param {MouseEvent} event
+ * @return {Number} normalized delta
+ */
+const isWindows = window.navigator.userAgent.contains("Windows");
+const getWheelDelta_ = function (event)
+{
+    let normalized;
+    if (event.wheelDelta)
+    {
+        // chrome
+        normalized = (event.wheelDelta % 120) - 0 == -0 ? event.wheelDelta / 120 : event.wheelDelta / 30;
+        normalized *= -1.5;
+        if (isWindows) normalized *= 2;
+    }
+    else
+    {
+        // firefox
+        let d = event.deltaY;
+        if (event.shiftKey) d = event.deltaX;
+        const rawAmmount = d || event.detail;
+        normalized = -(rawAmmount % 3 ? rawAmmount * 10 : rawAmmount / 3);
+        normalized *= -3;
+    }
+
+    if (normalized > 20) normalized = 20;
+    if (normalized < -20) normalized = -20;
+
+    return normalized;
+};
+
+const getWheelSpeed = getWheelDelta_;
+const getWheelDelta = getWheelDelta_;
+
+// from https://github.com/lodash/lodash/blob/master/escape.js
+
+const htmlEscapes = {
+    "&": "&amp;",
+    "<": "&lt;",
+    ">": "&gt;",
+    "\"": "&quot;",
+    "'": "&#39;",
+};
+
+/** Used to match HTML entities and HTML characters. */
+const reUnescapedHtml = /[&<>"']/g;
+const reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
+
+/*  eslint-disable */
+const escapeHTML = function(string)
+{
+    return string && reHasUnescapedHtml.test(string) ?
+        string.replace(reUnescapedHtml, function(chr) { return htmlEscapes[chr]; })
+        : string || "";
+}
+/* eslint-enable */
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_shader_default_glsl.vert
+/* harmony default export */ const cgl_shader_default_glsl = ("{{MODULES_HEAD}}\nIN vec3 vPosition; //!@\nIN vec2 attrTexCoord;\nIN vec3 attrVertNormal;\nIN vec3 attrTangent,attrBiTangent;\n\nIN float attrVertIndex;\n\nOUT vec2 texCoord;\nOUT vec3 norm;\nUNI mat4 projMatrix;\nUNI mat4 viewMatrix;\nUNI mat4 modelMatrix;\n\nvoid main()\n{\n    texCoord=attrTexCoord;\n    norm=attrVertNormal;\n    vec4 pos=vec4(vPosition,  1.0);\n    vec3 tangent=attrTangent;\n    vec3 bitangent=attrBiTangent;\n    mat4 mMatrix=modelMatrix;\n    gl_PointSize=10.0;\n\n    {{MODULE_VERTEX_POSITION}}\n\n    mat4 modelViewMatrix=viewMatrix*mMatrix;\n    {{MODULE_VERTEX_MOVELVIEW}}\n\n    gl_Position = projMatrix * modelViewMatrix * pos;\n}\n");
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_shader.js
+
+
+
+
+
+// import { CGL } from "./index.js";
+
+
+
+// ---------------------------------------------------------------------------
+
+
+/*
+
+proposal default shader variable names:
+
+attrVertex - currently: vPosition
+attrVertexIndex - currently: attrVertIndex
+attrTexCoord
+attrInstMat - currently: instMat
+attrVertColor
+attrTangent
+attrBiTangent
+
+uProjMatrix - currently: projMatrix
+uModelMatrix - currently: modelMatrix
+uNormalMatrix - currently: normalMatrix
+uCamPosition - currently: camPos
+
+*/
+
+
+// ---------------------------------------------------------------------------
+
+let materialIdCounter = 0;
+
+/**
+ * @class
+ * @external CGL
+ * @namespace Shader
+ * @hideconstructor
+ * @example
+ * var shader=new CGL.Shader(cgl,'MinimalMaterial');
+ * shader.setSource(attachments.shader_vert,attachments.shader_frag);
+ */
+const Shader = function (_cgl, _name, _op)
+{
+    if (!_cgl) throw new Error("shader constructed without cgl " + _name);
+
+    this._log = new Logger("cgl_shader");
+    this._cgl = _cgl;
+
+    if (!_name) this._log.stack("no shader name given");
+    this._name = _name || "unknown";
+
+    if (_op) this.opId = _op.id;
+    this.glslVersion = 0;
+    if (_cgl.glVersion > 1) this.glslVersion = 300;
+
+    this._materialId = ++materialIdCounter;
+
+    this.id = simpleId();
+    this._isValid = true;
+    this._program = null;
+    this._uniforms = [];
+    this._drawBuffers = [true];
+    this._defines = [];
+    this._needsRecompile = true;
+    this._compileReason = "initial";
+
+    this.ignoreMissingUniforms = false;
+    this._projMatrixUniform = null;
+    this._mvMatrixUniform = null;
+    this._mMatrixUniform = null;
+    this._vMatrixUniform = null;
+    this._camPosUniform = null;
+    this._normalMatrixUniform = null;
+    this._inverseViewMatrixUniform = null;
+
+    this._attrVertexPos = -1;
+    this.precision = _cgl.patch.config.glslPrecision || "highp";
+
+    this._pMatrixState = -1;
+    this._vMatrixState = -1;
+
+    this._countMissingUniforms = 0;
+    this._modGroupCount = 0; // not needed anymore...
+    this._feedBackNames = [];
+    this._attributes = [];
+
+    this.glPrimitive = null;
+    this.offScreenPass = false;
+    this._extensions = [];
+    this.srcVert = this.getDefaultVertexShader();
+    this.srcFrag = this.getDefaultFragmentShader();
+    this.lastCompile = 0;
+
+    this._moduleNames = [];
+    this._modules = [];
+    this._moduleNumId = 0;
+
+    this._libs = [];
+    this._structNames = [];
+    this._structUniformNames = [];
+    this._textureStackUni = [];
+    this._textureStackTex = [];
+    this._textureStackType = [];
+    this._textureStackTexCgl = [];
+
+    this._tempNormalMatrix = mat4.create();
+    this._tempCamPosMatrix = mat4.create();
+    this._tempInverseViewMatrix = mat4.create();
+    this._tempInverseProjMatrix = mat4.create();
+
+    this.setModules(["MODULE_VERTEX_POSITION", "MODULE_COLOR", "MODULE_BEGIN_FRAG", "MODULE_VERTEX_MOVELVIEW"]);
+};
+
+Shader.prototype.isValid = function ()
+{
+    return this._isValid;
+};
+
+Shader.prototype.getCgl = function ()
+{
+    return this._cgl;
+};
+
+Shader.prototype.getName = function ()
+{
+    return this._name;
+};
+
+/**
+ * enable an extension for the shader
+ * @function enableExtension
+ * @memberof Shader
+ * @instance
+ * @param name extension name
+ */
+Shader.prototype.enableExtension = function (name)
+{
+    this.setWhyCompile("enable extension " + name);
+    this._needsRecompile = true;
+    this._extensions.push(name);
+};
+
+Shader.prototype.getAttrVertexPos = function ()
+{
+    return this._attrVertexPos;
+};
+
+Shader.prototype.hasTextureUniforms = function ()
+{
+    for (let i = 0; i < this._uniforms.length; i++)
+        if (this._uniforms[i].getType() == "t") return true;
+    return false;
+};
+
+Shader.prototype.setWhyCompile = function (why)
+{
+    this._compileReason = why;
+};
+
+/**
+ * copy all uniform values from another shader
+ * @function copyUniforms
+ * @memberof Shader
+ * @instance
+ * @param shader uniform values will be copied from this shader
+ */
+Shader.prototype.copyUniformValues = function (origShader)
+{
+    // console.log(origShader._uniforms);
+    for (let i = 0; i < origShader._uniforms.length; i++)
+    {
+        if (!this._uniforms[i])
+        {
+            this._log.log("unknown uniform?!");
+            continue;
+        }
+
+        // this._log.log(origShader._uniforms[i].getName());
+        // this.getUniform(origShader._uniforms[i].)
+        // this._uniforms[i].set(origShader._uniforms[i].getValue());
+
+
+        // if (origShader._uniforms[i].getName().contains("pathPoints"))
+        //     console.log("copyUniformValues", origShader._uniforms[i].getName(), origShader._uniforms[i].getValue());
+
+        this.getUniform(origShader._uniforms[i].getName()).set(origShader._uniforms[i].getValue());
+    }
+
+    this.popTextures();
+    for (let i = 0; i < origShader._textureStackUni.length; i++)
+    {
+        this._textureStackUni[i] = origShader._textureStackUni[i];
+        this._textureStackTex[i] = origShader._textureStackTex[i];
+        this._textureStackType[i] = origShader._textureStackType[i];
+        this._textureStackTexCgl[i] = origShader._textureStackTexCgl[i];
+    }
+
+    // this._textureStackUni = [];
+    // this._textureStackTex = [];
+    // this._textureStackType = [];
+    // this._textureStackTexCgl = [];
+};
+
+/**
+ * copy current shader
+ * @function copy
+ * @memberof Shader
+ * @instance
+ * @returns newShader
+ */
+Shader.prototype.copy = function ()
+{
+    const shader = new Shader(this._cgl, this._name + " copy");
+    shader.setSource(this.srcVert, this.srcFrag);
+
+    shader._modules = JSON.parse(JSON.stringify(this._modules));
+    shader._defines = JSON.parse(JSON.stringify(this._defines));
+
+    shader._modGroupCount = this._modGroupCount;
+    shader._moduleNames = this._moduleNames;
+    shader.glPrimitive = this.glPrimitive;
+    shader.offScreenPass = this.offScreenPass;
+    shader._extensions = this._extensions;
+    shader.wireframe = this.wireframe;
+    shader._attributes = this._attributes;
+
+    for (let i = 0; i < this._uniforms.length; i++)
+    {
+        const u = this._uniforms[i].copy(shader);
+        u.resetLoc();
+    }
+
+    this.setWhyCompile("copy");
+    shader._needsRecompile = true;
+    return shader;
+};
+
+
+/**
+ * set shader source code
+ * @function setSource
+ * @memberof Shader
+ * @instance
+ * @param {String} srcVert
+ * @param {String} srcFrag
+ */
+Shader.prototype.setSource = function (srcVert, srcFrag)
+{
+    this.srcVert = srcVert;
+    this.srcFrag = srcFrag;
+    this.setWhyCompile("Source changed");
+    this._needsRecompile = true;
+    this._isValid = true;
+};
+
+Shader.prototype._addLibs = function (src)
+{
+    for (const id in ShaderLibMods)
+    {
+        if (src.contains(id))
+        {
+            const lib = new ShaderLibMods[id]();
+            src = src.replace("{{" + id + "}}", lib.srcHeadFrag);
+            this._libs.push(lib);
+            if (lib.initUniforms)lib.initUniforms(this);
+        }
+    }
+
+    return src;
+};
+
+Shader.prototype.createStructUniforms = function ()
+{
+    // * create structs
+    let structStrFrag = "";
+    let structStrVert = ""; // TODO: not used yet
+
+    this._structNames = [];
+    // * reset the arrays holding the value each recompile so we don't skip structs
+    // * key value mapping so the same struct can be added twice (two times the same modifier)
+    this._injectedStringsFrag = {};
+    this._injectedStringsVert = {};
+
+    this._structUniformNamesIndicesFrag = [];
+    this._structUniformNamesIndicesVert = [];
+
+    for (let i = 0; i < this._uniforms.length; i++)
+    {
+        // * only add uniforms to struct that are a member of a struct
+        if (this._uniforms[i].isStructMember())
+        {
+            const injectionString = "{{INJECTION_POINT_STRUCT_" + this._uniforms[i]._structName + "}}";
+
+            // * check if struct is not already part of shader
+            if (!this._structNames.includes(this._uniforms[i]._structName))
+            {
+                // * create struct definition with placeholder string to inject
+                const structDefinition = "struct "
+                    + this._uniforms[i]._structName + " {".endl()
+                    + injectionString
+                    + "};".endl().endl();
+
+                if (this._uniforms[i].getShaderType() === "both" || this._uniforms[i].getShaderType() === "frag")
+                    structStrFrag = structStrFrag.concat(structDefinition);
+
+                if (this._uniforms[i].getShaderType() === "both" || this._uniforms[i].getShaderType() === "vert")
+                    structStrVert = structStrVert.concat(structDefinition);
+
+                this._structNames.push(this._uniforms[i]._structName);
+                this._injectedStringsFrag[this._uniforms[i]._structName] = [];
+                this._injectedStringsVert[this._uniforms[i]._structName] = [];
+            }
+
+            // * create member & comment
+            let comment = "";
+            if (this._uniforms[i].comment) comment = " // " + this._uniforms[i].comment;
+
+            let stringToInsert = "";
+            if (this._uniforms[i].getGlslTypeString() == undefined)stringToInsert += "//";
+            stringToInsert += "  " + this._uniforms[i].getGlslTypeString()
+                    + " " + this._uniforms[i]._propertyName + ";"
+                    + comment;
+
+            if (this._uniforms[i].getShaderType() === "both")
+            {
+                // * inject member before {injectionString}
+                if (
+                    !this._injectedStringsFrag[this._uniforms[i]._structName].contains(stringToInsert)
+                && !this._injectedStringsVert[this._uniforms[i]._structName].contains(stringToInsert))
+                {
+                    const insertionIndexFrag = structStrFrag.lastIndexOf(injectionString);
+                    const insertionIndexVert = structStrVert.lastIndexOf(injectionString);
+
+                    structStrFrag =
+                        structStrFrag.slice(0, insertionIndexFrag)
+                        + stringToInsert + structStrFrag.slice(insertionIndexFrag - 1);
+
+                    structStrVert =
+                        structStrVert.slice(0, insertionIndexVert)
+                        + stringToInsert + structStrVert.slice(insertionIndexVert - 1);
+
+                    this._injectedStringsFrag[this._uniforms[i]._structName].push(stringToInsert);
+                    this._injectedStringsVert[this._uniforms[i]._structName].push(stringToInsert);
+                }
+
+                if (!this._structUniformNamesIndicesFrag.includes(i)) this._structUniformNamesIndicesFrag.push(i);
+                if (!this._structUniformNamesIndicesVert.includes(i)) this._structUniformNamesIndicesVert.push(i);
+            }
+            else if (this._uniforms[i].getShaderType() === "frag")
+            {
+                // * inject member before {injectionString}
+                if (!this._injectedStringsFrag[this._uniforms[i]._structName].includes(stringToInsert)) //
+                {
+                    const insertionIndexFrag = structStrFrag.lastIndexOf(injectionString);
+
+                    structStrFrag =
+                        structStrFrag.slice(0, insertionIndexFrag)
+                        + stringToInsert + structStrFrag.slice(insertionIndexFrag - 1);
+
+                    this._injectedStringsFrag[this._uniforms[i]._structName].push(stringToInsert);
+                }
+
+                if (!this._structUniformNamesIndicesFrag.includes(i)) this._structUniformNamesIndicesFrag.push(i);
+            }
+            else if (this._uniforms[i].getShaderType() === "vert")
+            {
+                // * inject member before {injectionString}
+                if (!this._injectedStringsVert[this._uniforms[i]._structName].includes(stringToInsert))
+                {
+                    const insertionIndexVert = structStrVert.lastIndexOf(injectionString);
+
+                    structStrVert =
+                        structStrVert.slice(0, insertionIndexVert)
+                        + stringToInsert + structStrVert.slice(insertionIndexVert - 1);
+
+                    this._injectedStringsVert[this._uniforms[i]._structName].push(stringToInsert);
+                }
+
+                if (!this._structUniformNamesIndicesVert.includes(i)) this._structUniformNamesIndicesVert.push(i);
+            }
+        }
+    }
+
+    // * dedupe injected uni declarations
+    this._uniDeclarationsFrag = [];
+    this._uniDeclarationsVert = [];
+
+    // * remove struct injection points and add uniform in fragment
+    for (let i = 0; i < this._structUniformNamesIndicesFrag.length; i += 1)
+    {
+        const index = this._structUniformNamesIndicesFrag[i];
+        const uniDeclarationString = "UNI " + this._uniforms[index]._structName + " " + this._uniforms[index]._structUniformName + ";".endl();
+
+        if (!this._uniDeclarationsFrag.includes(uniDeclarationString))
+        {
+            const injectionString = "{{INJECTION_POINT_STRUCT_" + this._uniforms[index]._structName + "}}";
+
+            structStrFrag = structStrFrag.replace(injectionString, "");
+            structStrFrag += uniDeclarationString;
+
+            this._uniDeclarationsFrag.push(uniDeclarationString);
+        }
+    }
+
+    // * remove struct injection points and add uniform in vertex
+    for (let i = 0; i < this._structUniformNamesIndicesVert.length; i += 1)
+    {
+        const index = this._structUniformNamesIndicesVert[i];
+        const uniDeclarationString = "UNI " + this._uniforms[index]._structName + " " + this._uniforms[index]._structUniformName + ";".endl();
+
+        if (!this._uniDeclarationsVert.includes(uniDeclarationString))
+        {
+            const injectionString = "{{INJECTION_POINT_STRUCT_" + this._uniforms[index]._structName + "}}";
+
+            structStrVert = structStrVert.replace(injectionString, "");
+            structStrVert += uniDeclarationString;
+            this._uniDeclarationsVert.push(uniDeclarationString);
+        }
+    }
+
+    return [structStrVert, structStrFrag];
+};
+
+Shader.prototype._getAttrSrc = function (attr, firstLevel)
+{
+    const r = {};
+    if (attr.name && attr.type)
+    {
+        r.srcHeadVert = "";
+        if (!firstLevel) r.srcHeadVert += "#ifndef ATTRIB_" + attr.name.endl();
+        r.srcHeadVert += "#define ATTRIB_" + attr.name.endl();
+        r.srcHeadVert += "IN " + attr.type + " " + attr.name + ";".endl();
+        if (!firstLevel) r.srcHeadVert += "#endif".endl();
+
+        if (attr.nameFrag)
+        {
+            r.srcHeadVert += "";
+            if (!firstLevel) r.srcHeadVert += "#ifndef ATTRIB_" + attr.nameFrag.endl();
+            r.srcHeadVert += "#define ATTRIB_" + attr.nameFrag.endl();
+            r.srcHeadVert += "OUT " + attr.type + " " + attr.nameFrag + ";".endl();
+            if (!firstLevel) r.srcHeadVert += "#endif".endl();
+
+            r.srcVert = "".endl() + attr.nameFrag + "=" + attr.name + ";";
+
+            r.srcHeadFrag = "";
+            if (!firstLevel) r.srcHeadFrag += "#ifndef ATTRIB_" + attr.nameFrag.endl();
+            r.srcHeadFrag += "#define ATTRIB_" + attr.nameFrag.endl();
+            r.srcHeadFrag += "IN " + attr.type + " " + attr.nameFrag + ";".endl();
+            if (!firstLevel) r.srcHeadFrag += "#endif".endl();
+        }
+    }
+    return r;
+};
+
+Shader.prototype.compile = function ()
+{
+    if (this._cgl.aborted) return;
+    const startTime = performance.now();
+
+
+
+    this._cgl.profileData.profileShaderCompiles++;
+    this._cgl.profileData.profileShaderCompileName = this._name + " [" + this._compileReason + "]";
+
+    let extensionString = "";
+    if (this._extensions)
+        for (let i = 0; i < this._extensions.length; i++)
+            extensionString += "#extension " + this._extensions[i] + " : enable".endl();
+
+    let definesStr = "";
+    if (this._defines.length) definesStr = "\n// cgl generated".endl();
+    for (let i = 0; i < this._defines.length; i++)
+        definesStr += "#define " + this._defines[i][0] + " " + this._defines[i][1] + "".endl();
+
+    const structStrings = this.createStructUniforms();
+    this._cgl.profileData.addHeavyEvent("shader compile", this._name + " [" + this._compileReason + "]");
+    this._compileReason = "";
+
+
+
+    if (this._uniforms)
+    {
+        // * we create an array of the uniform names to check our indices & an array to save them
+        const uniNames = this._uniforms.map((uni) => { return uni._name; });
+        const indicesToRemove = [];
+
+        // * we go through our uniforms and check if the same name is contained somewhere further in the array
+        // * if so, we add the current index to be removed later
+        for (let i = 0; i < this._uniforms.length; i++)
+        {
+            const uni = this._uniforms[i];
+            const nextIndex = uniNames.indexOf(uni._name, i + 1);
+            if (nextIndex > -1) indicesToRemove.push(i);
+        }
+
+        // * after that, we go through the uniforms backwards (so we keep the order) and remove the indices
+        // * also, we reset the locations of all the other valid uniforms
+        for (let j = this._uniforms.length - 1; j >= 0; j -= 1)
+        {
+            if (indicesToRemove.includes(j)) this._uniforms.splice(j, 1);
+            else this._uniforms[j].resetLoc();
+        }
+    }
+
+    this._cgl.printError("uniform resets");
+
+    if (this.hasTextureUniforms()) definesStr += "#define HAS_TEXTURES".endl();
+
+    let vs = "";
+    let fs = "";
+
+    if (!this.srcFrag)
+    {
+        this._log.error("[cgl shader] has no fragment source!", this);
+        this.srcVert = this.getDefaultVertexShader();
+        this.srcFrag = this.getDefaultFragmentShader();
+        // return;
+    }
+
+    if (this.glslVersion == 300)
+    {
+        vs = "#version 300 es"
+            .endl() + "// "
+            .endl() + "// vertex shader " + this._name
+            .endl() + "// "
+            .endl() + "precision " + this.precision + " float;"
+            .endl() + "precision " + this.precision + " sampler2D;"
+            .endl() + ""
+            .endl() + "#define WEBGL2"
+            .endl() + "#define texture2D texture"
+            .endl() + "#define UNI uniform"
+            .endl() + "#define IN in"
+            .endl() + "#define OUT out"
+            .endl();
+
+        fs = "#version 300 es"
+            .endl() + "// "
+            .endl() + "// fragment shader " + this._name
+            .endl() + "// "
+            .endl() + "precision " + this.precision + " float;"
+            .endl() + "precision " + this.precision + " sampler2D;"
+            .endl() + ""
+            .endl() + "#define WEBGL2"
+            .endl() + "#define texture2D texture"
+            .endl() + "#define IN in"
+            .endl() + "#define OUT out"
+            .endl() + "#define UNI uniform"
+            .endl() + "{{DRAWBUFFER}}"
+
+            .endl();
+    }
+    else
+    {
+        fs = ""
+            .endl() + "// "
+            .endl() + "// fragment shader " + this._name
+            .endl() + "// "
+            .endl() + "#define WEBGL1"
+            .endl() + "#define texture texture2D"
+            .endl() + "#define outColor gl_FragColor"
+            .endl() + "#define IN varying"
+            .endl() + "#define UNI uniform"
+            .endl();
+
+        vs = ""
+            .endl() + "// "
+            .endl() + "// vertex shader " + this._name
+            .endl() + "// "
+            .endl() + "#define WEBGL1"
+            .endl() + "#define texture texture2D"
+            .endl() + "#define OUT varying"
+            .endl() + "#define IN attribute"
+            .endl() + "#define UNI uniform"
+            .endl();
+    }
+
+    let uniformsStrVert = "\n// cgl generated".endl();
+    let uniformsStrFrag = "\n// cgl generated".endl();
+
+
+    fs += "\n// active mods: --------------- ";
+    vs += "\n// active mods: --------------- ";
+
+    let foundModsFrag = false;
+    let foundModsVert = false;
+    for (let i = 0; i < this._moduleNames.length; i++)
+    {
+        for (let j = 0; j < this._modules.length; j++)
+        {
+            if (this._modules[j].name == this._moduleNames[i])
+            {
+                if (this._modules[j].srcBodyFrag || this._modules[j].srcHeadFrag)
+                {
+                    foundModsFrag = true;
+                    fs += "\n// " + i + "." + j + ". " + this._modules[j].title + " (" + this._modules[j].name + ")";
+                }
+                if (this._modules[j].srcBodyVert || this._modules[j].srcHeadVert)
+                {
+                    vs += "\n// " + i + "." + j + ". " + this._modules[j].title + " (" + this._modules[j].name + ")";
+                    foundModsVert = true;
+                }
+            }
+        }
+    }
+    if (!foundModsVert)fs += "\n// no mods used...";
+    if (!foundModsFrag)fs += "\n// no mods used...";
+    fs += "\n";
+    vs += "\n";
+
+    for (let i = 0; i < this._uniforms.length; i++)
+    {
+        if (this._uniforms[i].shaderType && !this._uniforms[i].isStructMember())
+        {
+            let uniStr = "";
+            if (!this._uniforms[i].getGlslTypeString())uniStr += "// ";
+            uniStr += "UNI " + this._uniforms[i].getGlslTypeString() + " " + this._uniforms[i].getName();
+            let comment = "";
+            if (this._uniforms[i].comment) comment = " // " + this._uniforms[i].comment;
+
+            if (this._uniforms[i].shaderType == "vert" || this._uniforms[i].shaderType == "both")
+                if (!this.srcVert.contains(uniStr) && !this.srcVert.contains("uniform " + this._uniforms[i].getGlslTypeString() + " " + this._uniforms[i].getName()))
+                    uniformsStrVert += uniStr + ";" + comment.endl();
+
+            if (this._uniforms[i].shaderType == "frag" || this._uniforms[i].shaderType == "both")
+                if (!this.srcFrag.contains(uniStr) && !this.srcFrag.contains("uniform " + this._uniforms[i].getGlslTypeString() + " " + this._uniforms[i].getName()))
+                    uniformsStrFrag += uniStr + ";" + comment.endl();
+        }
+    }
+
+
+    let countUniFrag = 0;
+    let countUniVert = 0;
+    for (let i = 0; i < this._uniforms.length; i++)
+    {
+        if (this._uniforms[i].shaderType && !this._uniforms[i].isStructMember())
+        {
+            if (this._uniforms[i].shaderType == "vert" || this._uniforms[i].shaderType == "both") countUniVert++;
+            if (this._uniforms[i].shaderType == "frag" || this._uniforms[i].shaderType == "both") countUniFrag++;
+        }
+    }
+    if (countUniFrag >= this._cgl.maxUniformsFrag) this._log.warn("[cgl_shader] num uniforms frag: " + countUniFrag + " / " + this._cgl.maxUniformsFrag);
+    if (countUniVert >= this._cgl.maxUniformsVert) this._log.warn("[cgl_shader] num uniforms vert: " + countUniVert + " / " + this._cgl.maxUniformsVert);
+
+
+    if (!fs.contains("precision")) fs = "precision " + this.precision + " float;".endl() + fs;
+    if (!vs.contains("precision")) vs = "precision " + this.precision + " float;".endl() + vs;
+    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent))
+    {
+        fs += "#define MOBILE".endl();
+        vs += "#define MOBILE".endl();
+    }
+    vs = extensionString + vs + definesStr + structStrings[0] + uniformsStrVert + "\n// -- \n" + this.srcVert;
+    fs = extensionString + fs + definesStr + structStrings[1] + uniformsStrFrag + "\n// -- \n" + this.srcFrag;
+
+
+    let srcHeadVert = "";
+    let srcHeadFrag = "";
+
+    this._modules.sort(function (a, b)
+    {
+        return a.group - b.group;
+    });
+
+    this._modules.sort(function (a, b)
+    {
+        return a.priority || 0 - b.priority || 0;
+    });
+
+
+    let addedAttribs = false;
+
+    for (let i = 0; i < this._moduleNames.length; i++)
+    {
+        let srcVert = "";
+        let srcFrag = "";
+
+        if (!addedAttribs)
+        {
+            addedAttribs = true;
+
+            for (let k = 0; k < this._attributes.length; k++)
+            {
+                const r = this._getAttrSrc(this._attributes[k], true);
+                if (r.srcHeadVert)srcHeadVert += r.srcHeadVert;
+                if (r.srcVert)srcVert += r.srcVert;
+                if (r.srcHeadFrag)srcHeadFrag += r.srcHeadFrag;
+            }
+        }
+
+        for (let j = 0; j < this._modules.length; j++)
+        {
+            const mod = this._modules[j];
+            if (mod.name == this._moduleNames[i])
+            {
+                srcHeadVert += "\n//---- MOD: group:" + mod.group + ": idx:" + j + " - prfx:" + mod.prefix + " - " + mod.title + " ------\n";
+                srcHeadFrag += "\n//---- MOD: group:" + mod.group + ": idx:" + j + " - prfx:" + mod.prefix + " - " + mod.title + " ------\n";
+
+                srcVert += "\n\n//---- MOD: " + mod.title + " / " + mod.priority + " ------\n";
+                srcFrag += "\n\n//---- MOD: " + mod.title + " / " + mod.priority + " ------\n";
+
+                if (mod.attributes)
+                    for (let k = 0; k < mod.attributes.length; k++)
+                    {
+                        const r = this._getAttrSrc(mod.attributes[k], false);
+                        if (r.srcHeadVert)srcHeadVert += r.srcHeadVert;
+                        if (r.srcVert)srcVert += r.srcVert;
+                        if (r.srcHeadFrag)srcHeadFrag += r.srcHeadFrag;
+                    }
+
+                srcHeadVert += mod.srcHeadVert || "";
+                srcHeadFrag += mod.srcHeadFrag || "";
+                srcVert += mod.srcBodyVert || "";
+                srcFrag += mod.srcBodyFrag || "";
+
+                srcHeadVert += "\n//---- end mod ------\n";
+                srcHeadFrag += "\n//---- end mod ------\n";
+
+                srcVert += "\n//---- end mod ------\n";
+                srcFrag += "\n//---- end mod ------\n";
+
+                srcVert = srcVert.replace(/{{mod}}/g, mod.prefix);
+                srcFrag = srcFrag.replace(/{{mod}}/g, mod.prefix);
+                srcHeadVert = srcHeadVert.replace(/{{mod}}/g, mod.prefix);
+                srcHeadFrag = srcHeadFrag.replace(/{{mod}}/g, mod.prefix);
+
+                srcVert = srcVert.replace(/MOD_/g, mod.prefix);
+                srcFrag = srcFrag.replace(/MOD_/g, mod.prefix);
+                srcHeadVert = srcHeadVert.replace(/MOD_/g, mod.prefix);
+                srcHeadFrag = srcHeadFrag.replace(/MOD_/g, mod.prefix);
+            }
+        }
+
+
+        vs = vs.replace("{{" + this._moduleNames[i] + "}}", srcVert);
+        fs = fs.replace("{{" + this._moduleNames[i] + "}}", srcFrag);
+    }
+    vs = vs.replace("{{MODULES_HEAD}}", srcHeadVert);
+    fs = fs.replace("{{MODULES_HEAD}}", srcHeadFrag);
+
+
+    vs = this._addLibs(vs);
+    fs = this._addLibs(fs);
+
+
+    // SETUP draw buffers / multi texture render targets
+
+    let drawBufferStr = "";
+    for (let i = 0; i < 16; i++)
+        if (fs.contains("outColor" + i)) this._drawBuffers[i] = true;
+
+    if (this._drawBuffers.length == 1)
+    {
+        drawBufferStr = "out vec4 outColor;".endl();
+        drawBufferStr += "#define gl_FragColor outColor".endl();
+    }
+    else
+    {
+        drawBufferStr += "#define MULTI_COLORTARGETS".endl();
+        drawBufferStr += "vec4 outColor;".endl();
+
+        let count = 0;
+        for (let i = 0; i < this._drawBuffers.length; i++)
+        {
+            if (count == 0) drawBufferStr += "#define gl_FragColor outColor" + i + "".endl();
+            drawBufferStr += "layout(location = " + i + ") out vec4 outColor" + i + ";".endl();
+            count++;
+        }
+    }
+
+    fs = fs.replace("{{DRAWBUFFER}}", drawBufferStr);
+    // //////
+
+
+    if (!this._program)
+    {
+        this._program = this._createProgram(vs, fs);
+    }
+    else
+    {
+        // this.vshader=createShader(vs, gl.VERTEX_SHADER, this.vshader );
+        // this.fshader=createShader(fs, gl.FRAGMENT_SHADER, this.fshader );
+        // linkProgram(program);
+        this._program = this._createProgram(vs, fs);
+
+        this._projMatrixUniform = null;
+
+        for (let i = 0; i < this._uniforms.length; i++) this._uniforms[i].resetLoc();
+    }
+
+    this.finalShaderFrag = fs;
+    this.finalShaderVert = vs;
+
+
+    MESH.lastMesh = null;
+    MESH.lastShader = null;
+
+    this._countMissingUniforms = 0;
+    this._needsRecompile = false;
+    this.lastCompile = now();
+
+    // this._cgl.printError("shader compile");
+
+    this._cgl.profileData.shaderCompileTime += performance.now() - startTime;
+};
+
+Shader.hasChanged = function ()
+{
+    return this._needsRecompile;
+};
+
+
+Shader.prototype.bind = function ()
+{
+    if (!this._isValid || this._cgl.aborted) return;
+
+    MESH.lastShader = this;
+
+    if (!this._program || this._needsRecompile) this.compile();
+    if (!this._isValid) return;
+
+    if (!this._projMatrixUniform && !this.ignoreMissingUniforms)
+    {
+        this._countMissingUniforms++;
+        // if (this._countMissingUniforms == 10)console.log("stopping getlocation of missing uniforms...", this._name);
+        if (this._countMissingUniforms < 10)
+        {
+            this._projMatrixUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_PROJMAT);
+            this._attrVertexPos = this._cgl.glGetAttribLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_VERTEX_POSITION);
+            this._mvMatrixUniform = this._cgl.gl.getUniformLocation(this._program, "mvMatrix");
+            this._vMatrixUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_VIEWMAT);
+            this._mMatrixUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_MODELMAT);
+            this._camPosUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_VIEWPOS);
+            this._normalMatrixUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_NORMALMAT);
+            this._inverseViewMatrixUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_INVVIEWMAT);
+            this._inverseProjMatrixUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_INVPROJMAT);
+            this._materialIdUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_MATERIALID);
+            this._objectIdUniform = this._cgl.gl.getUniformLocation(this._program, constants_CONSTANTS.SHADER.SHADERVAR_UNI_OBJECTID);
+
+            for (let i = 0; i < this._uniforms.length; i++) this._uniforms[i].needsUpdate = true;
+        }
+    }
+
+
+    if (this._cgl.currentProgram != this._program)
+    {
+        this._cgl.profileData.profileShaderBinds++;
+        this._cgl.gl.useProgram(this._program);
+        this._cgl.currentProgram = this._program;
+    }
+
+    for (let i = 0; i < this._uniforms.length; i++)
+        if (this._uniforms[i].needsUpdate) this._uniforms[i].updateValue();
+
+    if (this._pMatrixState != this._cgl.getProjectionMatrixStateCount())
+    {
+        this._pMatrixState = this._cgl.getProjectionMatrixStateCount();
+        this._cgl.gl.uniformMatrix4fv(this._projMatrixUniform, false, this._cgl.pMatrix);
+        this._cgl.profileData.profileMVPMatrixCount++;
+    }
+
+    if (this._objectIdUniform)
+        this._cgl.gl.uniform1f(this._objectIdUniform, ++this._cgl.frameStore.objectIdCounter);
+
+    if (this._materialIdUniform)
+        this._cgl.gl.uniform1f(this._materialIdUniform, this._materialId);
+
+    if (this._vMatrixUniform)
+    {
+        if (this._vMatrixState != this._cgl.getViewMatrixStateCount())
+        {
+            this._cgl.gl.uniformMatrix4fv(this._vMatrixUniform, false, this._cgl.vMatrix);
+            this._cgl.profileData.profileMVPMatrixCount++;
+            this._vMatrixState = this._cgl.getViewMatrixStateCount();
+
+            if (this._inverseViewMatrixUniform)
+            {
+                mat4.invert(this._tempInverseViewMatrix, this._cgl.vMatrix);
+                this._cgl.gl.uniformMatrix4fv(this._inverseViewMatrixUniform, false, this._tempInverseViewMatrix);
+                this._cgl.profileData.profileMVPMatrixCount++;
+            }
+            if (this._inverseProjMatrixUniform)
+            {
+                mat4.invert(this._tempInverseProjMatrix, this._cgl.pMatrix);
+                this._cgl.gl.uniformMatrix4fv(this._inverseProjMatrixUniform, false, this._tempInverseProjMatrix);
+                this._cgl.profileData.profileMVPMatrixCount++;
+            }
+        }
+        this._cgl.gl.uniformMatrix4fv(this._mMatrixUniform, false, this._cgl.mMatrix);
+        this._cgl.profileData.profileMVPMatrixCount++;
+
+        if (this._camPosUniform)
+        {
+            mat4.invert(this._tempCamPosMatrix, this._cgl.vMatrix);
+            this._cgl.gl.uniform3f(this._camPosUniform, this._tempCamPosMatrix[12], this._tempCamPosMatrix[13], this._tempCamPosMatrix[14]);
+            this._cgl.profileData.profileMVPMatrixCount++;
+        }
+    }
+    else
+    {
+        // mvmatrix deprecated....
+        const tempmv = mat4.create();
+
+        mat4.mul(tempmv, this._cgl.vMatrix, this._cgl.mMatrix);
+        this._cgl.gl.uniformMatrix4fv(this._mvMatrixUniform, false, tempmv);
+        this._cgl.profileData.profileMVPMatrixCount++;
+    }
+
+    if (this._normalMatrixUniform)
+    {
+        // mat4.mul(this._tempNormalMatrix, this._cgl.vMatrix, this._cgl.mMatrix);
+        mat4.invert(this._tempNormalMatrix, this._cgl.mMatrix);
+        mat4.transpose(this._tempNormalMatrix, this._tempNormalMatrix);
+
+        this._cgl.gl.uniformMatrix4fv(this._normalMatrixUniform, false, this._tempNormalMatrix);
+        this._cgl.profileData.profileMVPMatrixCount++;
+    }
+
+    for (let i = 0; i < this._libs.length; i++)
+    {
+        if (this._libs[i].onBind) this._libs[i].onBind.bind(this._libs[i])(this._cgl, this);
+    }
+
+    this._bindTextures();
+
+    return this._isValid;
+};
+
+Shader.prototype.unBind = function ()
+{
+};
+
+/**
+ * easily enable/disable a define without a value
+ * @function toggleDefine
+ * @memberof Shader
+ * @instance
+ * @param {name} name
+ * @param {any} value or port
+ */
+Shader.prototype.toggleDefine = function (name, enabled)
+{
+    if (enabled && typeof (enabled) == "object" && enabled.addEventListener) // port
+    {
+        if (enabled.changeListener)enabled.removeEventListener(enabled.changeListener);
+
+        enabled.onToggleDefine = (v) =>
+        {
+            this.toggleDefine(name, v);
+        };
+
+        enabled.changeListener = enabled.on("change", enabled.onToggleDefine);
+        enabled = enabled.get();
+    }
+
+    if (enabled) this.define(name);
+    else this.removeDefine(name);
+};
+
+/**
+ * add a define to a shader, e.g.  #define DO_THIS_THAT 1
+ * @function define
+ * @memberof Shader
+ * @instance
+ * @param {String} name
+ * @param {Any} value (can be empty)
+ */
+Shader.prototype.define = function (name, value)
+{
+    if (value === null || value === undefined) value = "";
+
+    if (typeof (value) == "object") // port
+    {
+        value.removeEventListener("change", value.onDefineChange);
+        value.onDefineChange = (v) =>
+        {
+            this.define(name, v);
+        };
+        value.on("change", value.onDefineChange);
+
+        value = value.get();
+    }
+
+
+    for (let i = 0; i < this._defines.length; i++)
+    {
+        if (this._defines[i][0] == name && this._defines[i][1] == value) return;
+        if (this._defines[i][0] == name)
+        {
+            this._defines[i][1] = value;
+            this.setWhyCompile("define " + name + " " + value);
+
+            this._needsRecompile = true;
+            return;
+        }
+    }
+    this.setWhyCompile("define " + name + " " + value);
+    this._needsRecompile = true;
+    this._defines.push([name, value]);
+};
+
+Shader.prototype.getDefines = function ()
+{
+    return this._defines;
+};
+
+Shader.prototype.getDefine = function (name)
+{
+    for (let i = 0; i < this._defines.length; i++)
+        if (this._defines[i][0] == name) return this._defines[i][1];
+    return null;
+};
+
+/**
+ * return true if shader has define
+ * @function hasDefine
+ * @memberof Shader
+ * @instance
+ * @param {String} name
+ * @return {Boolean}
+ */
+Shader.prototype.hasDefine = function (name)
+{
+    for (let i = 0; i < this._defines.length; i++)
+        if (this._defines[i][0] == name) return true;
+};
+
+/**
+ * remove a define from a shader
+ * @param {name} name
+ * @function removeDefine
+ * @memberof Shader
+ * @instance
+ */
+Shader.prototype.removeDefine = function (name)
+{
+    for (let i = 0; i < this._defines.length; i++)
+    {
+        if (this._defines[i][0] == name)
+        {
+            this._defines.splice(i, 1);
+            this._needsRecompile = true;
+
+            this.setWhyCompile("define removed:" + name);
+
+            return;
+        }
+    }
+};
+
+/**
+ * remove a module from shader
+ * @function removeModule
+ * @memberof Shader
+ * @instance
+ * @param {shaderModule} module the module to be removed
+ */
+Shader.prototype.removeModule = function (mod)
+{
+    for (let i = 0; i < this._modules.length; i++)
+    {
+        if (mod && mod.id)
+        {
+            if (this._modules[i].id == mod.id || !this._modules[i])
+            {
+                let found = true;
+                while (found)
+                {
+                    found = false;
+                    for (let j = 0; j < this._uniforms.length; j++)
+                    {
+                        if (this._uniforms[j].getName().startsWith(mod.prefix))
+                        {
+                            this._uniforms.splice(j, 1);
+                            found = true;
+                            continue;
+                        }
+                    }
+                }
+
+                this._needsRecompile = true;
+                this.setWhyCompile("remove module " + mod.title);
+                this._modules.splice(i, 1);
+                break;
+            }
+        }
+    }
+};
+
+
+Shader.prototype.getNumModules = function ()
+{
+    return this._modules.length;
+};
+
+
+Shader.prototype.getCurrentModules = function () { return this._modules; };
+
+
+/**
+ * add a module
+ * @function addModule
+ * @memberof Shader
+ * @instance
+ * @param {shaderModule} module the module to be added
+ * @param {shaderModule} [sibling] sibling module, new module will share the same group
+ */
+Shader.prototype.addModule = function (mod, sibling)
+{
+    if (this.hasModule(mod.id)) return;
+    if (!mod.id) mod.id = CABLES.simpleId();
+    if (!mod.numId) mod.numId = this._moduleNumId;
+    if (!mod.num)mod.num = this._modules.length;
+    if (sibling && !sibling.group) sibling.group = simpleId();
+
+    if (!mod.group)
+        if (sibling) mod.group = sibling.group;
+        else mod.group = simpleId();
+
+    mod.prefix = "mod" + mod.group + "_";
+    this._modules.push(mod);
+
+    this._needsRecompile = true;
+    this.setWhyCompile("add module " + mod.title);
+    this._moduleNumId++;
+
+    return mod;
+};
+
+Shader.prototype.hasModule = function (modId)
+{
+    for (let i = 0; i < this._modules.length; i++)
+    {
+        if (this._modules[i].id == modId) return true;
+    }
+    return false;
+};
+
+Shader.prototype.setModules = function (names)
+{
+    this._moduleNames = names;
+};
+
+Shader.prototype.dispose = function ()
+{
+    this._cgl.gl.deleteProgram(this._program);
+};
+
+Shader.prototype.needsRecompile = function ()
+{
+    return this._needsRecompile;
+};
+
+Shader.prototype.setDrawBuffers = function (arr)
+{
+    console.log("useless drawbuffers...?!");
+    // if (this._drawBuffers.length !== arr.length)
+    // {
+    //     this._drawBuffers = arr;
+    //     this._needsRecompile = true;
+    //     this.setWhyCompile("setDrawBuffers");
+    //     return;
+    // }
+    // for (let i = 0; i < arr.length; i++)
+    // {
+    //     if (arr[i] !== this._drawBuffers[i])
+    //     {
+    //         this._drawBuffers = arr;
+    //         this._needsRecompile = true;
+    //         this.setWhyCompile("setDrawBuffers");
+    //         return;
+    //     }
+    // }
+};
+
+Shader.prototype.getUniforms = function ()
+{
+    return this._uniforms;
+};
+
+Shader.prototype.getUniform = function (name)
+{
+    for (let i = 0; i < this._uniforms.length; i++)
+        if (this._uniforms[i].getName() == name)
+            return this._uniforms[i];
+    return null;
+};
+
+Shader.prototype.removeAllUniforms = function ()
+{
+    this._uniforms = [];
+    // for (let i = 0; i < this._uniforms.length; i++)
+    //     this.removeUniform(this._uniforms[i].name);
+};
+
+Shader.prototype.removeUniform = function (name)
+{
+    for (let i = 0; i < this._uniforms.length; i++)
+    {
+        if (this._uniforms[i].getName() == name)
+        {
+            this._uniforms.splice(i, 1);
+        }
+    }
+    this._needsRecompile = true;
+    this.setWhyCompile("remove uniform " + name);
+};
+
+
+Shader.prototype._addUniform = function (uni)
+{
+    this._uniforms.push(uni);
+    this.setWhyCompile("add uniform " + name);
+    this._needsRecompile = true;
+};
+
+/**
+ * add a uniform to the fragment shader
+ * @param {String} type ['f','t', etc]
+ * @param {String} name
+ * @param {any} value or port
+ * @memberof Shader
+ * @instance
+ * @function addUniformFrag
+ * @returns {CGL.Uniform}
+ */
+Shader.prototype.addUniformFrag = function (type, name, valueOrPort, p2, p3, p4)
+{
+    const uni = new CGL.Uniform(this, type, name, valueOrPort, p2, p3, p4);
+    uni.shaderType = "frag";
+    return uni;
+};
+
+/**
+ * add a uniform to the vertex shader
+ * @param {String} type ['f','t', etc]
+ * @param {String} name
+ * @param {any} value or port
+ * @memberof Shader
+ * @instance
+ * @function addUniformVert
+ * @returns {CGL.Uniform}
+ */
+Shader.prototype.addUniformVert = function (type, name, valueOrPort, p2, p3, p4)
+{
+    const uni = new CGL.Uniform(this, type, name, valueOrPort, p2, p3, p4);
+    uni.shaderType = "vert";
+    return uni;
+};
+/**
+ * add a uniform to both shaders
+ * @param {String} type ['f','t', etc]
+ * @param {String} name
+ * @param {any} value or port
+ * @memberof Shader
+ * @instance
+ * @function addUniformBoth
+ * @returns {CGL.Uniform}
+ */
+Shader.prototype.addUniformBoth = function (type, name, valueOrPort, p2, p3, p4)
+{
+    const uni = new CGL.Uniform(this, type, name, valueOrPort, p2, p3, p4);
+    uni.shaderType = "both";
+    return uni;
+};
+
+/**
+ * add a struct & its uniforms to the fragment shader
+ * @param {String} structName name of the struct, i.e.: LightStruct
+ * @param {String} uniformName name of the struct uniform in the shader, i.e.: lightUni
+ * @param {Array} members array of objects containing the struct members. see example for structure
+
+ * @memberof Shader
+ * @instance
+ * @function addUniformStructFrag
+ * @returns {Object}
+ * @example
+ * const shader = new CGL.Shader(cgl, 'MinimalMaterial');
+ * shader.setSource(attachments.shader_vert, attachments.shader_frag);
+ * shader.addUniformStructFrag("Light", "uniformLight", [
+ * { "type": "3f", "name": "position", "v1": null },
+ * { "type": "4f", "name": "color", "v1": inR, v2: inG, v3: inB, v4: inAlpha }
+ * ]);
+ */
+Shader.prototype.addUniformStructFrag = function (structName, uniformName, members)
+{
+    const uniforms = {};
+
+    if (!members) return uniforms;
+
+    for (let i = 0; i < members.length; i += 1)
+    {
+        const member = members[i];
+        if (!this.hasUniform(uniformName + "." + member.name))
+        {
+            const uni = new CGL.Uniform(this, member.type, uniformName + "." + member.name, member.v1, member.v2, member.v3, member.v4, uniformName, structName, member.name);
+            uni.shaderType = "frag";
+            uniforms[uniformName + "." + member.name] = uni;
+        }
+    }
+
+    return uniforms;
+};
+
+/**
+ * add a struct & its uniforms to the vertex shader
+ * @param {String} structName name of the struct, i.e.: LightStruct
+ * @param {String} uniformName name of the struct uniform in the shader, i.e.: lightUni
+ * @param {Array} members array of objects containing the struct members. see example for structure
+
+ * @memberof Shader
+ * @instance
+ * @function addUniformStructVert
+ * @returns {CGL.Uniform}
+ * @example
+ * const shader = new CGL.Shader(cgl, 'MinimalMaterial');
+ * shader.setSource(attachments.shader_vert, attachments.shader_frag);
+ * shader.addUniformStructVert("Light", "uniformLight", [
+ * { "type": "3f", "name": "position", "v1": null },
+ * { "type": "4f", "name": "color", "v1": inR, v2: inG, v3: inB, v4: inAlpha }
+ * ]);
+ */
+Shader.prototype.addUniformStructVert = function (structName, uniformName, members)
+{
+    const uniforms = {};
+
+    if (!members) return uniforms;
+
+    for (let i = 0; i < members.length; i += 1)
+    {
+        const member = members[i];
+        if (!this.hasUniform(uniformName + "." + member.name))
+        {
+            const uni = new CGL.Uniform(this, member.type, uniformName + "." + member.name, member.v1, member.v2, member.v3, member.v4, uniformName, structName, member.name);
+            uni.shaderType = "vert";
+            uniforms[uniformName + "." + member.name] = uni;
+        }
+    }
+
+    return uniforms;
+};
+
+/**
+ * add a struct & its uniforms to the both shaders. PLEASE NOTE: it is not possible to add the same struct to both shaders when it contains ANY integer members.
+ * @param {String} structName name of the struct, i.e.: LightStruct
+ * @param {String} uniformName name of the struct uniform in the shader, i.e.: lightUni
+ * @param {Array} members array of objects containing the struct members. see example for structure
+
+ * @memberof Shader
+ * @instance
+ * @function addUniformStructBoth
+ * @returns {Object}
+ * @example
+ * const shader = new CGL.Shader(cgl, 'MinimalMaterial');
+ * shader.setSource(attachments.shader_vert, attachments.shader_frag);
+ * shader.addUniformStructBoth("Light", "uniformLight", [
+ * { "type": "3f", "name": "position", "v1": null },
+ * { "type": "4f", "name": "color", "v1": inR, v2: inG, v3: inB, v4: inAlpha }
+ * ]);
+ */
+Shader.prototype.addUniformStructBoth = function (structName, uniformName, members)
+{
+    const uniforms = {};
+
+    if (!members) return uniforms;
+
+    for (let i = 0; i < members.length; i += 1)
+    {
+        const member = members[i];
+        if ((member.type === "2i" || member.type === "i" || member.type === "3i"))
+            this._log.error("Adding an integer struct member to both shaders can potentially error. Please use different structs for each shader. Error occured in struct:", structName, " with member:", member.name, " of type:", member.type, ".");
+        if (!this.hasUniform(uniformName + "." + member.name))
+        {
+            const uni = new CGL.Uniform(this, member.type, uniformName + "." + member.name, member.v1, member.v2, member.v3, member.v4, uniformName, structName, member.name);
+            uni.shaderType = "both";
+            uniforms[uniformName + "." + member.name] = uni;
+        }
+    }
+
+    return uniforms;
+};
+
+Shader.prototype.hasUniform = function (name)
+{
+    for (let i = 0; i < this._uniforms.length; i++)
+    {
+        if (this._uniforms[i].getName() == name) return true;
+    }
+    return false;
+};
+
+Shader.prototype._createProgram = function (vstr, fstr)
+{
+    this._cgl.printError("before _createprogram");
+
+    const program = this._cgl.gl.createProgram();
+
+    this.vshader = Shader.createShader(this._cgl, vstr, this._cgl.gl.VERTEX_SHADER, this);
+    this.fshader = Shader.createShader(this._cgl, fstr, this._cgl.gl.FRAGMENT_SHADER, this);
+
+
+    if (this.vshader && this.fshader)
+    {
+        this._cgl.gl.attachShader(program, this.vshader);
+        this._cgl.gl.attachShader(program, this.fshader);
+
+        this._linkProgram(program, vstr, fstr);
+    }
+    else
+    {
+        this._isValid = false;
+        this._cgl.printError("shader _createProgram");
+        console.log("could not link shaderprogram");
+        return null;
+    }
+
+    this._cgl.printError("shader _createProgram");
+    return program;
+};
+
+Shader.prototype.hasErrors = function ()
+{
+    return this._hasErrors;
+};
+
+Shader.prototype._linkProgram = function (program, vstr, fstr)
+{
+    this._cgl.printError("before _linkprogram");
+
+    if (this._feedBackNames.length > 0)
+    {
+        this._cgl.gl.transformFeedbackVaryings(program, this._feedBackNames, this._cgl.gl.SEPARATE_ATTRIBS);
+        // INTERLEAVED_ATTRIBS
+        // SEPARATE_ATTRIBS
+    }
+
+    this._cgl.gl.linkProgram(program);
+    this._cgl.printError("gl.linkprogram");
+    this._isValid = true;
+
+    this._hasErrors = false;
+
+    if (this._cgl.patch.config.glValidateShader !== false)
+    {
+        this._cgl.gl.validateProgram(program);
+
+        if (!this._cgl.gl.getProgramParameter(program, this._cgl.gl.VALIDATE_STATUS))
+        {
+            // validation failed
+            console.log("shaderprogram validation failed...");
+            console.log(this._name + " programinfo: ", this._cgl.gl.getProgramInfoLog(program));
+        }
+
+        if (!this._cgl.gl.getProgramParameter(program, this._cgl.gl.LINK_STATUS))
+        {
+            this._hasErrors = true;
+            this._log.warn(this._cgl.gl.getShaderInfoLog(this.fshader) || "empty shader infolog");
+            this._log.warn(this._cgl.gl.getShaderInfoLog(this.vshader) || "empty shader infolog");
+            this._log.error(this._name + " shader linking fail...");
+
+            console.log(this._name + " programinfo: ", this._cgl.gl.getProgramInfoLog(program));
+
+            console.log("--------------------------------------");
+            console.log(this);
+            console.log("--------------------------------------");
+            this._isValid = false;
+
+            this._name = "errorshader";
+            this.setSource(Shader.getDefaultVertexShader(), Shader.getErrorFragmentShader());
+            this._cgl.printError("shader link err");
+        }
+    }
+};
+
+Shader.prototype.getProgram = function ()
+{
+    return this._program;
+};
+
+Shader.prototype.setFeedbackNames = function (names)
+{
+    this.setWhyCompile("setFeedbackNames");
+    this._needsRecompile = true;
+    this._feedBackNames = names;
+};
+
+Shader.prototype.getDefaultVertexShader = Shader.getDefaultVertexShader = function ()
+{
+    return cgl_shader_default_glsl;
+};
+
+Shader.prototype.getDefaultFragmentShader = Shader.getDefaultFragmentShader = function (r, g, b)
+{
+    if (r == undefined)
+    {
+        r = 0.5;
+        g = 0.5;
+        b = 0.5;
+    }
+    return ""
+        .endl() + "IN vec2 texCoord;"
+        .endl() + "{{MODULES_HEAD}}"
+        .endl() + "void main()"
+        .endl() + "{"
+        .endl() + "    vec4 col=vec4(" + r + "," + g + "," + b + ",1.0);"
+        .endl() + "    {{MODULE_COLOR}}"
+        .endl() + "    outColor = col;"
+        .endl() + "}";
+};
+
+/**
+  * adds attribute definition to shader header without colliding with other shader modules...
+ * when attrFrag is defined, vertex shader will output this attribute to the fragment shader
+ * @function
+ * @memberof Shader
+ * @instance
+ * @param {Object} attribObject {type:x,name:x,[nameFrag:x]}
+ * @return {Object}
+ */
+Shader.prototype.addAttribute = function (attr)
+{
+    for (let i = 0; i < this._attributes.length; i++)
+    {
+        if (this._attributes[i].name == attr.name && this._attributes[i].nameFrag == attr.nameFrag) return;
+    }
+    this._attributes.push(attr);
+    this._needsRecompile = true;
+    this.setWhyCompile("addAttribute");
+};
+
+Shader.prototype.bindTextures =
+Shader.prototype._bindTextures = function ()
+{
+    if (this._textureStackTex.length > this._cgl.maxTextureUnits)
+    {
+        this._log.warn("[shader._bindTextures] too many textures bound", this._textureStackTex.length + "/" + this._cgl.maxTextureUnits);
+    }
+
+    // for (let i = this._textureStackTex.length + 1; i < this._cgl.maxTextureUnits; i++) this._cgl.setTexture(i, null);
+
+    for (let i = 0; i < this._textureStackTex.length; i++)
+    {
+        // console.log(this._textureStackTex.length, i);
+        if (!this._textureStackTex[i] && !this._textureStackTexCgl[i])
+        {
+            this._log.warn("no texture for pushtexture", this._name);
+        }
+        else
+        {
+            let t = this._textureStackTex[i];
+            if (this._textureStackTexCgl[i])
+            {
+                t = this._textureStackTexCgl[i].tex || CGL.Texture.getEmptyTexture(this._cgl).tex;
+            }
+
+            let bindOk = true;
+
+            if (!this._textureStackUni[i])
+            {
+                // throw(new Error('no uniform given to texturestack'));
+                this._log.warn("no uniform for pushtexture", this._name);
+                bindOk = this._cgl.setTexture(i, t, this._textureStackType[i]);
+            }
+            else
+            {
+                this._textureStackUni[i].setValue(i);
+                bindOk = this._cgl.setTexture(i, t, this._textureStackType[i]);
+
+                // console.log(bindOk, i, t, this._textureStackType[i]);
+            }
+            if (!bindOk) console.warn("tex bind failed", this.getName(), this._textureStackUni[i]);
+        }
+    }
+};
+
+Shader.prototype.setUniformTexture = function (uni, tex)
+{
+    tex = tex || CGL.Texture.getTempTexture(this._cgl);
+    for (let i = 0; i < this._textureStackUni.length; i++)
+        if (this._textureStackUni[i] == uni)
+        {
+            const old = this._textureStackTex[i] || this._textureStackTexCgl[i];
+            if (tex.hasOwnProperty("tex"))
+            {
+                this._textureStackTexCgl[i] = tex;
+                this._textureStackTex[i] = null;
+            }
+            else
+            {
+                this._textureStackTexCgl[i] = null;
+                this._textureStackTex[i] = tex;
+            }
+
+            // this._textureStackTex[i] = tex;
+            // this._cgl.setTexture(i, tex, this._textureStackType[i]);
+            return old;
+        }
+    return null;
+};
+
+/**
+ * push a texture on the stack. those textures will be bound when binding the shader. texture slots are automatically set
+ * @param {uniform} texture uniform
+ * @param {texture} texture
+ * @param {type} texture type, can be ignored when TEXTURE_2D
+ * @function pushTexture
+ * @memberof Shader
+ * @instance
+ */
+Shader.prototype.pushTexture = function (uniform, t, type)
+{
+    if (!uniform)
+    {
+        console.log("no uniform given to texturestack", uniform);
+        return;
+    }
+    if (!t)
+    {
+        return;
+    }
+    if (!t.hasOwnProperty("tex") && !(t instanceof WebGLTexture))
+    {
+        this._log.warn(new Error("invalid texture").stack);
+
+        this._log.warn("[cgl_shader] invalid texture...", t);
+        return;
+    }
+
+    this._textureStackUni.push(uniform);
+
+    if (t.hasOwnProperty("tex"))
+    {
+        this._textureStackTexCgl.push(t);
+        this._textureStackTex.push(null);
+    }
+    else
+    {
+        this._textureStackTexCgl.push(null);
+        this._textureStackTex.push(t);
+    }
+
+    this._textureStackType.push(type);
+};
+
+/**
+ * pop last texture
+ * @function popTexture
+ * @memberof Shader
+ * @instance
+ */
+Shader.prototype.popTexture = function ()
+{
+    this._textureStackUni.pop();
+    this._textureStackTex.pop();
+    this._textureStackTexCgl.pop();
+    this._textureStackType.pop();
+};
+
+/**
+ * pop all textures
+ * @function popTextures
+ * @memberof Shader
+ * @instance
+ */
+Shader.prototype.popTextures = function ()
+{
+    this._textureStackTex.length =
+    this._textureStackTexCgl.length =
+    this._textureStackType.length =
+    this._textureStackUni.length = 0;
+};
+
+Shader.prototype.getMaterialId = function ()
+{
+    return this._materialId;
+};
+
+Shader.prototype.getInfo = function ()
+{
+    const info = {};
+    info.name = this._name;
+    // info.modules = JSON.parse(JSON.stringify(this._modules));
+    // info.defines = JSON.parse(JSON.stringify(this._defines));
+    info.defines = this.getDefines();
+    info.hasErrors = this.hasErrors();
+
+    return info;
+};
+
+// --------------------------
+
+Shader.getErrorFragmentShader = function ()
+{
+    return ""
+        .endl() + "void main()"
+        .endl() + "{"
+        .endl() + "   float g=mod((gl_FragCoord.y+gl_FragCoord.x),50.0)/50.0;"
+        .endl() + "   g= step(0.1,g);"
+        .endl() + "   outColor = vec4( g+0.5, 0.0, 0.0, 1.0);"
+        .endl() + "}";
+};
+
+Shader.createShader = function (cgl, str, type, cglShader)
+{
+    if (cgl.aborted) return;
+
+    // cgl.printError("[Shader.createShader] ", cglShader._name);
+
+    function getBadLines(infoLog)
+    {
+        const basLines = [];
+        const lines = infoLog.split("\n");
+        for (const i in lines)
+        {
+            const divide = lines[i].split(":");
+            if (parseInt(divide[2], 10)) basLines.push(parseInt(divide[2], 10));
+        }
+        return basLines;
+    }
+
+
+    const shader = cgl.gl.createShader(type);
+    cgl.gl.shaderSource(shader, str);
+    cgl.gl.compileShader(shader);
+
+    if (!cgl.gl.getShaderParameter(shader, cgl.gl.COMPILE_STATUS))
+    {
+        let infoLog = cgl.gl.getShaderInfoLog(shader);
+        if (!infoLog)
+        {
+            console.warn("empty shader info log", this._name);
+            return;
+        }
+
+        console.log("compile status: ");
+
+        const badLines = getBadLines(infoLog);
+        let htmlWarning = "<pre style=\"margin-bottom:0px;\"><code class=\"shaderErrorCode language-glsl\" style=\"padding-bottom:0px;max-height: initial;max-width: initial;\">";
+        const lines = str.match(/^.*((\r\n|\n|\r)|$)/gm);
+
+        if (!cgl.aborted && infoLog)
+        {
+            if (type == cgl.gl.VERTEX_SHADER) console.log("VERTEX_SHADER");
+            if (type == cgl.gl.FRAGMENT_SHADER) console.log("FRAGMENT_SHADER");
+
+            for (const i in lines)
+            {
+                const j = parseInt(i, 10) + 1;
+                const line = j + ": " + lines[i];
+                console.log(line);
+
+                let isBadLine = false;
+                for (const bj in badLines)
+                    if (badLines[bj] == j) isBadLine = true;
+
+                if (isBadLine)
+                {
+                    htmlWarning += "</code></pre>";
+                    // htmlWarning += "<span class=\"shaderErrorCode error\">";
+                    htmlWarning += "<pre style=\"margin:0\"><code class=\"language-glsl\" style=\"background-color:#660000;padding-top:0px;padding-bottom:0px\">";
+                }
+                htmlWarning += escapeHTML(line);
+
+                if (isBadLine)
+                {
+                    htmlWarning += "</code></pre>";
+                    htmlWarning += "<pre style=\"margin:0\"><code class=\"language-glsl\" style=\";padding-top:0px;padding-bottom:0px\">";
+                }
+            }
+        }
+
+        console.warn(infoLog);
+
+        infoLog = infoLog.replace(/\n/g, "<br/>");
+        if (cgl.patch.isEditorMode())console.log("Shader error ", cglShader._name, infoLog, this);
+
+        htmlWarning = infoLog + "<br/>" + htmlWarning + "<br/><br/>";
+        htmlWarning += "</code></pre>";
+
+        cgl.patch.emitEvent("criticalError", { "title": "Shader error " + cglShader._name, "text": htmlWarning, "exception": { "message": infoLog } });
+
+        // this._name = "errorshader";
+        cglShader.setSource(Shader.getDefaultVertexShader(), Shader.getErrorFragmentShader());
+    }
+    else
+    {
+        // console.log(name+' shader compiled...');
+    }
+    // cgl.printError("shader create2");
+    return shader;
+};
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_profiledata.js
+class ProfileData
+{
+    constructor(cgl)
+    {
+        this._cgl = cgl;
+        this._lastTime = 0;
+        this.pause = false;
+        this.profileUniformCount = 0;
+        this.profileShaderBinds = 0;
+        this.profileUniformCount = 0;
+        this.profileShaderCompiles = 0;
+        this.profileVideosPlaying = 0;
+        this.profileMVPMatrixCount = 0;
+        this.profileEffectBuffercreate = 0;
+        this.profileShaderGetUniform = 0;
+        this.profileFrameBuffercreate = 0;
+        this.profileMeshSetGeom = 0;
+        this.profileTextureNew = 0;
+        this.profileGenMipMap = 0;
+        this.profileOnAnimFrameOps = 0;
+
+        this.profileFencedPixelRead = 0;
+        this.profileMainloopMs = 0;
+        this.profileMeshDraw = 0;
+        this.profileTextureEffect = 0;
+        this.profileTexPreviews = 0;
+        this.shaderCompileTime = 0;
+        this.profileMeshNumElements = 0;
+        this.profileMeshAttributes = 0;
+        this.profileSingleMeshAttribute = [];
+        this.heavyEvents = [];
+
+        this.doProfileGlQuery = false;
+        this.glQueryData = {};
+    }
+
+    clear()
+    {
+        this.profileSingleMeshAttribute = {};
+        this.profileMeshAttributes = 0;
+        this.profileUniformCount = 0;
+        this.profileShaderGetUniform = 0;
+        this.profileShaderCompiles = 0;
+        this.profileShaderBinds = 0;
+        this.profileTextureResize = 0;
+        this.profileFrameBuffercreate = 0;
+        this.profileEffectBuffercreate = 0;
+        this.profileTextureDelete = 0;
+        this.profileMeshSetGeom = 0;
+        this.profileVideosPlaying = 0;
+        this.profileMVPMatrixCount = 0;
+        this.profileNonTypedAttrib = 0;
+        this.profileNonTypedAttribNames = "";
+        this.profileTextureNew = 0;
+        this.profileGenMipMap = 0;
+        this.profileFramebuffer = 0;
+        this.profileMeshDraw = 0;
+        this.profileTextureEffect = 0;
+        this.profileTexPreviews = 0;
+        this.profileMeshNumElements = 0;
+        this.profileFencedPixelRead = 0;
+    }
+
+    clearGlQuery()
+    {
+        for (let i in this.glQueryData)
+        {
+            if (!this.glQueryData[i].lastClear || performance.now() - this.glQueryData[i].lastClear > 1000)
+            {
+                this.glQueryData[i].time = this.glQueryData[i]._times / this.glQueryData[i]._numcount;
+                this.glQueryData[i].num = this.glQueryData[i]._numcount;
+
+                this.glQueryData[i]._times = 0;
+                this.glQueryData[i]._numcount = 0;
+                this.glQueryData[i].lastClear = performance.now();
+            }
+        }
+    }
+
+    addHeavyEvent(event, name, info)
+    {
+        const e = { "event": event, "name": name, "info": info, "date": performance.now() };
+        this.heavyEvents.push(e);
+        this._cgl.emitEvent("heavyEvent", e);
+    }
+}
+
+
+
+
+;// CONCATENATED MODULE: ../shared/client/src/helper.js
+class Helper
+{
+    constructor()
+    {
+        this._simpleIdCounter = 0;
+    }
+
+    uuid()
+    {
+        let d = new Date().getTime();
+        return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) =>
+        {
+            const r = (d + Math.random() * 16) % 16 | 0;
+            d = Math.floor(d / 16);
+            return (c === "x" ? r : (r & 0x3) | 0x8).toString(16);
+        });
+    }
+
+    isNumeric(n)
+    {
+        return !isNaN(parseFloat(n)) && isFinite(n);
+    }
+
+    /**
+     * generate a simple ID
+     * @function simpleId
+     * @memberof Utils
+     * @return {Number} new id
+     * @static
+     */
+    simpleId()
+    {
+        this._simpleIdCounter++;
+        return this._simpleIdCounter;
+    }
+}
+/* harmony default export */ const helper = (new Helper());
+
+;// CONCATENATED MODULE: ../shared/client/src/eventtarget.js
+
+
+
+class Events
+{
+    constructor()
+    {
+        this._log = new Logger("eventtarget");
+        this._eventCallbacks = {};
+        this._logName = "";
+        this._logEvents = false;
+        this._listeners = {};
+
+        this.on = this.addEventListener;
+        this.off = this.removeEventListener;
+    }
+
+    addEventListener(which, cb, idPrefix)
+    {
+        const event =
+            {
+                "id": (idPrefix || "") + helper.simpleId(),
+                "name": which,
+                "cb": cb,
+            };
+        if (!this._eventCallbacks[which]) this._eventCallbacks[which] = [event];
+        else this._eventCallbacks[which].push(event);
+
+        this._listeners[event.id] = event;
+
+        return event.id;
+    }
+
+    hasEventListener(which, cb)
+    {
+        if (which && !cb)
+        {
+            // check by id
+            return !!this._listeners[which];
+        }
+        else
+        {
+            this._log.warn("old eventtarget function haseventlistener!");
+            if (which && cb)
+            {
+                if (this._eventCallbacks[which])
+                {
+                    const idx = this._eventCallbacks[which].indexOf(cb);
+                    return idx !== -1;
+                }
+            }
+        }
+    }
+
+    hasListenerForEventName(eventName)
+    {
+        return this._eventCallbacks[eventName] && this._eventCallbacks[eventName].length > 0;
+    }
+
+    removeEventListener(which, cb)
+    {
+        if (which === null || which === undefined) return;
+
+        if (!cb) // new style, remove by id, not by name/callback
+        {
+            const event = this._listeners[which];
+            if (!event)
+            {
+                this._log.log("could not find event...");
+                return;
+            }
+
+            let found = true;
+            while (found)
+            {
+                found = false;
+                let index = -1;
+                for (let i = 0; i < this._eventCallbacks[event.name].length; i++)
+                {
+                    if (this._eventCallbacks[event.name][i].id.indexOf(which) === 0) // this._eventCallbacks[event.name][i].id == which ||
+                    {
+                        found = true;
+                        index = i;
+                    }
+                }
+
+                if (index !== -1)
+                {
+                    this._eventCallbacks[event.name].splice(index, 1);
+                    delete this._listeners[which];
+                }
+            }
+
+            return;
+        }
+
+        this._log.info("[eventtaget] ", "old function signature: removeEventListener! use listener id");
+        this._log.log((new Error()).stack);
+
+        let index = null;
+        for (let i = 0; i < this._eventCallbacks[which].length; i++)
+            if (this._eventCallbacks[which][i].cb === cb)
+                index = i;
+
+        if (index !== null)
+        {
+            delete this._eventCallbacks[index];
+        }
+        else this._log.warn("removeEventListener not found " + which);
+    }
+
+    logEvents(enabled, name)
+    {
+        this._logEvents = enabled;
+        this._logName = name;
+    }
+
+    emitEvent(which, param1, param2, param3, param4, param5, param6)
+    {
+        if (this._logEvents) this._log.log("[event] ", this._logName, which, this._eventCallbacks);
+
+        if (this._eventCallbacks[which])
+        {
+            for (let i = 0; i < this._eventCallbacks[which].length; i++)
+            {
+                if (this._eventCallbacks[which][i])
+                {
+                    this._eventCallbacks[which][i].cb(param1, param2, param3, param4, param5, param6);
+                }
+            }
+        }
+        else
+        {
+            if (this._logEvents) this._log.log("[event] has no event callback", which, this._eventCallbacks);
+        }
+    }
+}
+
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_canvas.js
+class CgCanvas
+{
+    constructor(options)
+    {
+        if (!options)
+        {
+            console.error("CgCanvas no options");
+        }
+        else
+        {
+            this._canvasEle = options.canvasEle;
+        }
+
+        if (!options.cg)console.error("CgCanvas options has no cg");
+        if (!options.canvasEle)console.error("CgCanvas options has no canvasEle");
+
+        this._cg = options.cg;
+        this.pixelDensity = 1;
+        this.canvasWidth = this.canvasEle.clientWidth;
+        this.canvasHeight = this.canvasEle.clientHeight;
+
+        this._oldWidthRp = -1;
+        this._oldHeightRp = -1;
+
+        this.setSize(this.canvasWidth, this.canvasHeight);
+    }
+
+    get canvasEle() { return this._canvasEle; }
+
+
+    setSize(w, h, ignorestyle)
+    {
+        if (this._oldWidthRp != w * this.pixelDensity || this._oldHeightRp != h * this.pixelDensity)
+        {
+            this._oldWidthRp = this.canvasEle.width = w * this.pixelDensity;
+            this._oldHeightRp = this.canvasEle.height = h * this.pixelDensity;
+
+            if (!ignorestyle)
+            {
+                this.canvasEle.style.width = w + "px";
+                this.canvasEle.style.height = h + "px";
+            }
+
+            this.updateSize();
+
+            this._cg.emitEvent("resize");
+        }
+    }
+
+    updateSize()
+    {
+        this.canvasEle.width = this.canvasWidth = this.canvasEle.clientWidth * this.pixelDensity;
+        this.canvasEle.height = this.canvasHeight = this.canvasEle.clientHeight * this.pixelDensity;
+    }
+
+    dispose()
+    {
+        this._canvasEle.remove();
+        this._canvasEle = null;
+    }
+}
+
+
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_matrixstack.js
+
+const MatrixStack = function ()
+{
+    this._arr = [mat4.create()];
+    this._index = 0;
+    this.stateCounter = 0;
+};
+
+MatrixStack.prototype.push = function (m)
+{
+    this._index++;
+    this.stateCounter++;
+
+    if (this._index == this._arr.length)
+    {
+        const copy = mat4.create();
+        this._arr.push(copy);
+    }
+
+    mat4.copy(this._arr[this._index], m || this._arr[this._index - 1]);
+
+    return this._arr[this._index];
+};
+
+MatrixStack.prototype.pop = function ()
+{
+    this.stateCounter++;
+
+    this._index--;
+    if (this._index < 0) this._index = 0;
+
+    return this._arr[this._index];
+};
+
+MatrixStack.prototype.length = function ()
+{
+    return this._index;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_state.js
+
+
+
+
+
+// const CGState ()
+class CGState extends Events
+{
+    constructor(_patch)
+    {
+        super();
+        // this.canvas = null;
+
+        this.fpsCounter = new CABLES.CG.FpsCounter();
+        this._identView = vec3.create();
+        this._ident = vec3.create();
+        vec3.set(this._identView, 0, 0, -2);
+        vec3.set(this._ident, 0, 0, 0);
+
+        this.patch = _patch;
+
+
+
+        this.DEPTH_COMPARE_FUNC_NEVER = 0;
+        this.DEPTH_COMPARE_FUNC_LESS = 1;
+        this.DEPTH_COMPARE_FUNC_EQUAL = 2;
+        this.DEPTH_COMPARE_FUNC_LESSEQUAL = 3;
+        this.DEPTH_COMPARE_FUNC_GREATER = 4;
+        this.DEPTH_COMPARE_FUNC_NOTEQUAL = 5;
+        this.DEPTH_COMPARE_FUNC_GREATEREQUAL = 6;
+        this.DEPTH_COMPARE_FUNC_ALWAYS = 7;
+
+
+        /**
+             * Current projection matrix
+             * @memberof Context
+             * @instance
+             * @type {mat4}
+             */
+        this.pMatrix = mat4.create();
+
+        /**
+             * Current model matrix
+             * @memberof Context
+             * @instance
+             * @type {mat4}
+             */
+        this.mMatrix = mat4.create();
+
+        /**
+             * Current view matrix
+             * @memberof Context
+             * @instance
+             * @type {mat4}
+             */
+        this.vMatrix = mat4.create();
+        this._textureslots = [];
+
+        this._pMatrixStack = new MatrixStack();
+        this._mMatrixStack = new MatrixStack();
+        this._vMatrixStack = new MatrixStack();
+
+        this.canvasScale = 1;
+
+        mat4.identity(this.mMatrix);
+        mat4.identity(this.vMatrix);
+
+
+        window.matchMedia("screen and (min-resolution: 2dppx)")
+            .addEventListener("change", (e) =>
+            {
+                this.emitEvent("resize");
+            });
+    }
+
+    get canvasWidth()
+    {
+        return this.cgCanvas.canvasWidth;
+    }
+
+    get canvasHeight()
+    {
+        return this.cgCanvas.canvasHeight;
+    }
+
+    set pixelDensity(p)
+    {
+        if (this.cgCanvas.pixelDensity != p)
+        {
+            this.cgCanvas.pixelDensity = p;
+            this.cgCanvas.updateSize();
+            this.emitEvent("resize");
+        }
+    }
+
+    get pixelDensity()
+    {
+        return this.cgCanvas.pixelDensity;
+    }
+
+
+    getGApiName()
+    {
+        return ["WebGL", "WebGPU"][this.gApi];
+    }
+
+    get canvas()
+    {
+        return this.cgCanvas.canvasEle;
+    }
+
+    setCanvas(canvEle)
+    {
+        if (this.cgCanvas && canvEle == this.cgCanvas.canvasEle) return;
+        if (typeof canvEle === "string") canvEle = document.getElementById(canvEle);
+
+        this.cgCanvas = new CgCanvas({ "canvasEle": canvEle, "cg": this });
+
+        if (this._setCanvas) this._setCanvas(canvEle);
+
+        this.updateSize();
+    }
+
+    updateSize()
+    {
+        this.cgCanvas.updateSize();
+    }
+
+    setSize(w, h, ignorestyle)
+    {
+        this.cgCanvas.setSize(w, h, ignorestyle);
+    }
+
+    _resizeToWindowSize()
+    {
+        this.setSize(window.innerWidth, window.innerHeight);
+        this.updateSize();
+    }
+
+    _resizeToParentSize()
+    {
+        const p = this.canvas.parentElement;
+        if (!p)
+        {
+            this._log.error("cables: can not resize to container element");
+            return;
+        }
+        this.setSize(p.clientWidth, p.clientHeight);
+
+        this.updateSize();
+    }
+
+    setAutoResize(parent)
+    {
+        window.removeEventListener("resize", this._resizeToWindowSize.bind(this));
+        window.removeEventListener("resize", this._resizeToParentSize.bind(this));
+
+        if (parent == "window")
+        {
+            window.addEventListener("resize", this._resizeToWindowSize.bind(this));
+            window.addEventListener("orientationchange", this._resizeToWindowSize.bind(this));
+            this._resizeToWindowSize();
+        }
+        if (parent == "parent")
+        {
+            window.addEventListener("resize", this._resizeToParentSize.bind(this));
+            this._resizeToParentSize();
+        }
+    }
+
+
+    /**
+ * push a matrix to the projection matrix stack
+ * @function pushPMatrix
+ * @memberof Context
+ * @instance
+ * @param {mat4} projectionmatrix
+ */
+    pushPMatrix()
+    {
+        this.pMatrix = this._pMatrixStack.push(this.pMatrix);
+    }
+
+    /**
+  * pop projection matrix stack
+  * @function popPMatrix
+  * @memberof Context
+  * @instance
+  * @returns {mat4} current projectionmatrix
+  */
+    popPMatrix()
+    {
+        this.pMatrix = this._pMatrixStack.pop();
+        return this.pMatrix;
+    }
+
+    getProjectionMatrixStateCount()
+    {
+        return this._pMatrixStack.stateCounter;
+    }
+
+    /**
+  * push a matrix to the model matrix stack
+  * @function pushModelMatrix
+  * @memberof Context
+  * @instance
+  * @param {mat4} modelmatrix
+  * @example
+  * // see source code of translate op:
+  * cgl.pushModelMatrix();
+  * mat4.translate(cgl.mMatrix,cgl.mMatrix, vec);
+  * trigger.trigger();
+  * cgl.popModelMatrix();
+  */
+    pushModelMatrix()
+    {
+        this.mMatrix = this._mMatrixStack.push(this.mMatrix);
+    }
+
+    /**
+  * pop model matrix stack
+  * @function popModelMatrix
+  * @memberof Context
+  * @instance
+  * @returns {mat4} current modelmatrix
+  */
+    popModelMatrix()
+    {
+        // todo: DEPRECATE
+        // if (this._mMatrixStack.length === 0) throw "Invalid modelview popMatrix!";
+        this.mMatrix = this._mMatrixStack.pop();
+        return this.mMatrix;
+    }
+
+    /**
+  * get model matrix
+  * @function modelMatrix
+  * @memberof Context
+  * @instance
+  * @returns {mat4} current modelmatrix
+  */
+    modelMatrix()
+    {
+        return this.mMatrix;
+    }
+
+
+    /**
+ * push a matrix to the view matrix stack
+ * @function pushviewMatrix
+ * @memberof Context
+ * @instance
+ * @param {mat4} viewmatrix
+ */
+    pushViewMatrix()
+    {
+        this.vMatrix = this._vMatrixStack.push(this.vMatrix);
+    }
+
+    /**
+  * pop view matrix stack
+  * @function popViewMatrix
+  * @memberof Context
+  * @instance
+  * @returns {mat4} current viewmatrix
+  * @function
+  */
+    popViewMatrix()
+    {
+        this.vMatrix = this._vMatrixStack.pop();
+    }
+
+    getViewMatrixStateCount()
+    {
+        return this._vMatrixStack.stateCounter;
+    }
+
+    _startMatrixStacks(identTranslate, identTranslateView)
+    {
+        identTranslate = identTranslate || this._ident;
+        identTranslateView = identTranslateView || this._identView;
+
+        mat4.perspective(this.pMatrix, 45, this.canvasWidth / this.canvasHeight, 0.1, 1000.0);
+
+        mat4.identity(this.mMatrix);
+        mat4.identity(this.vMatrix);
+        mat4.translate(this.mMatrix, this.mMatrix, identTranslate);
+        mat4.translate(this.vMatrix, this.vMatrix, identTranslateView);
+
+        this.pushPMatrix();
+        this.pushModelMatrix();
+        this.pushViewMatrix();
+    }
+
+    _endMatrixStacks()
+    {
+        this.popViewMatrix();
+        this.popModelMatrix();
+        this.popPMatrix();
+    }
+
+    dispose()
+    {
+        this.aborted = true;
+        if (this.cgCanvas) this.cgCanvas.dispose();
+        if (this._dispose) this._dispose();
+    }
+}
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cg/sg_fpscounter.js
+
+
+class FpsCounter extends Events
+{
+    constructor()
+    {
+        super();
+        this._timeStartFrame = 0;
+        this._timeStartSecond = 0;
+        this._fpsCounter = 0;
+        this._msCounter = 0;
+        this._frameCount = 0;
+
+        this.stats = { "ms": 0, "fps": 0 };
+    }
+
+    get frameCount()
+    {
+        return this._frameCount;
+    }
+
+    startFrame()
+    {
+        this._timeStartFrame = CABLES.now();
+    }
+
+    endFrame()
+    {
+        this._frameCount++;
+        this._fpsCounter++;
+
+        const timeFrame = CABLES.now() - this._timeStartFrame;
+        this._msCounter += timeFrame;
+
+        if (CABLES.now() - this._timeStartSecond > 1000)
+        {
+            this.endSecond();
+        }
+    }
+
+    endSecond()
+    {
+        this.stats.fps = this._fpsCounter;
+        this.stats.ms = Math.round(this._msCounter / this._fpsCounter * 100) / 100;
+
+        this.emitEvent("performance", this.stats);
+
+        // reset
+        this._fpsCounter = 0;
+        this._msCounter = 0;
+        this._timeStartSecond = CABLES.now();
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cg/cg_constants.js
+
+
+
+
+
+const CG = {
+
+    "GAPI_WEBGL": 0,
+    "GAPI_WEBGPU": 1,
+
+    "DEPTH_COMPARE_NEVER": 0,
+    "DEPTH_COMPARE_LESS": 1,
+    "DEPTH_COMPARE_EQUAL": 2,
+    "DEPTH_COMPARE_LESSEQUAL": 3,
+    "DEPTH_COMPARE_GREATER": 4,
+    "DEPTH_COMPARE_NOTEQUAL": 5,
+    "DEPTH_COMPARE_GREATEREQUAL": 6,
+    "DEPTH_COMPARE_ALWAYS": 7,
+
+    "CULL_NONE": 0,
+    "CULL_BACK": 1,
+    "CULL_FRONT": 2,
+    "CULL_BOTH": 3,
+
+
+    "Geometry": Geometry,
+    "BoundingBox": BoundingBox,
+    "FpsCounter": FpsCounter,
+
+    "CgCanvas": CgCanvas
+};
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_state.js
+
+
+
+
+
+
+
+
+/**
+ * cables gl context/state manager
+ * @external CGL
+ * @namespace Context
+ * @class
+ * @hideconstructor
+ */
+// const Context(_patch)
+class Context extends CGState
+{
+    constructor(_patch)
+    {
+        super(_patch);
+        // EventTarget.apply(this);
+        // CGState.apply(this);
+
+        this.gApi = CG.GAPI_WEBGL;
+        this.aborted = false;
+
+        this.pushMvMatrix = this.pushModelMatrix; // deprecated and wrong... still used??
+        this.popMvMatrix = this.popmMatrix = this.popModelMatrix;// deprecated and wrong... still used??
+
+        this.profileData = new ProfileData(this);
+        this._log = new Logger("cgl_context");
+        this._viewPort = [0, 0, 0, 0];
+        this.glVersion = 0;
+        this.glUseHalfFloatTex = false;
+        this.clearCanvasTransparent = true;
+        this.clearCanvasDepth = true;
+        this.debugOneFrame = false;
+        this.checkGlErrors = false; // true is slow // false should be default...
+        this.maxTextureUnits = 0;
+        this.maxVaryingVectors = 0;
+        this.currentProgram = null;
+        this._hadStackError = false;
+        this.glSlowRenderer = false;
+        this._isSafariCrap = false;
+
+        this.temporaryTexture = null;
+        this.frameStore = {};
+        this._onetimeCallbacks = [];
+        this.gl = null;
+
+        this._cursor = "auto";
+        this._currentCursor = "";
+
+        this._viewPortStack = [];
+        this._glFrameBufferStack = [];
+        this._frameBufferStack = [];
+        this._shaderStack = [];
+        this._stackDepthTest = [];
+        this.mainloopOp = null;
+
+        this._simpleShader = new Shader(this, "simpleshader");
+        this._simpleShader.setModules(["MODULE_VERTEX_POSITION", "MODULE_COLOR", "MODULE_BEGIN_FRAG", "MODULE_VERTEX_MOVELVIEW"]);
+        this._simpleShader.setSource(Shader.getDefaultVertexShader(), Shader.getDefaultFragmentShader());
+
+        this._currentShader = this._simpleShader;
+
+
+        this._oldCanvasWidth = -1;
+        this._oldCanvasHeight = -1;
+        this._enabledExtensions = {};
+    }
+
+    // set pixelDensity(p)
+    // {
+    //     this._pixelDensity = p;
+    // }
+
+    // get pixelDensity()
+    // {
+    //     return this._pixelDensity;
+    // }
+
+
+
+    get viewPort()
+    {
+        if (this._viewPortStack.length > 3)
+        {
+            const l = this._viewPortStack.length;
+
+            return [
+                this._viewPortStack[l - 4],
+                this._viewPortStack[l - 3],
+                this._viewPortStack[l - 2],
+                this._viewPortStack[l - 1]
+            ];
+        }
+        else
+        {
+            // workaround pre viewport stack times / or+and initial value...
+
+            return this._viewPort;
+        }
+    }
+
+
+
+    get mvMatrix() // deprecate
+    {
+        return this.mMatrix;
+    }
+
+    set mvMatrix(m) // deprecate
+    {
+        this.mMatrix = m;
+    }
+
+
+    exitError(msgId, msg)
+    {
+        console.log(msgId, msg);
+        this.patch.exitError(msgId, msg);
+        this.aborted = true;
+    }
+
+
+    _setCanvas(canv)
+    {
+        if (!canv)
+        {
+            this._log.stack("_setCanvas undef");
+        }
+
+        if (!this.patch.config.canvas) this.patch.config.canvas = {};
+        if (!this.patch.config.canvas.hasOwnProperty("preserveDrawingBuffer")) this.patch.config.canvas.preserveDrawingBuffer = false;
+        if (!this.patch.config.canvas.hasOwnProperty("premultipliedAlpha")) this.patch.config.canvas.premultipliedAlpha = false;
+        if (!this.patch.config.canvas.hasOwnProperty("alpha")) this.patch.config.canvas.alpha = false;
+
+        this.patch.config.canvas.stencil = true;
+
+        if (this.patch.config.hasOwnProperty("clearCanvasColor")) this.clearCanvasTransparent = this.patch.config.clearCanvasColor;
+        if (this.patch.config.hasOwnProperty("clearCanvasDepth")) this.clearCanvasDepth = this.patch.config.clearCanvasDepth;
+
+        // safari stuff..........
+        if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent) && (navigator.userAgent.match(/iPhone/i)))
+        {
+            this._isSafariCrap = true;
+            this.glUseHalfFloatTex = true;
+        }
+
+        if (!this.patch.config.canvas.forceWebGl1) this.gl = canv.getContext("webgl2", this.patch.config.canvas);
+
+
+        if (!this.gl || this.gl.isContextLost())
+        {
+            this.aborted = true;
+            this.exitError("NO_WEBGL", "sorry, could not initialize WebGL. Please check if your Browser supports WebGL or try to restart your browser.");
+            return;
+        }
+
+        if (this.gl.getParameter(this.gl.VERSION) != "WebGL 1.0")
+        {
+            this.glVersion = 2;
+        }
+        else
+        {
+            this.gl = canv.getContext("webgl", this.patch.config.canvas) || canv.getContext("experimental-webgl", this.patch.config.canvas);
+            this.glVersion = 1;
+
+            // safari
+            // if (/^((?!chrome|android).)*safari/i.test(navigator.userAgent) && (navigator.userAgent.match(/iPhone/i)))
+            // {
+            //     this.glUseHalfFloatTex = true;
+            // }
+
+            // ios
+            if (/iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream)
+            {
+                if (!this.patch.config.canvas.hasOwnProperty("powerPreference")) this.patch.config.canvas.powerPreference = "high-performance";
+            }
+
+            this.enableExtension("OES_standard_derivatives");
+            // this.enableExtension("GL_OES_standard_derivatives");
+            const instancingExt = this.enableExtension("ANGLE_instanced_arrays") || this.gl;
+            if (instancingExt.vertexAttribDivisorANGLE)
+            {
+                this.gl.vertexAttribDivisor = instancingExt.vertexAttribDivisorANGLE.bind(instancingExt);
+                this.gl.drawElementsInstanced = instancingExt.drawElementsInstancedANGLE.bind(instancingExt);
+            }
+        }
+
+        const dbgRenderInfo = this.enableExtension("WEBGL_debug_renderer_info");
+        if (dbgRenderInfo)
+        {
+            this.glRenderer = this.gl.getParameter(dbgRenderInfo.UNMASKED_RENDERER_WEBGL);
+            if (this.glRenderer === "Google SwiftShader") this.glSlowRenderer = true;
+        }
+
+        this.canvas.addEventListener("webglcontextlost", (event) =>
+        {
+            if (this.aborted) return console.log("[cgl_state] aborted context lost... can be ignored...");
+            this._log.error("canvas lost...", event);
+            this.emitEvent("webglcontextlost");
+            this.aborted = true;
+        });
+
+
+        this.maxAnisotropic = 0;
+        if (this.enableExtension("EXT_texture_filter_anisotropic"))
+            this.maxAnisotropic = this.gl.getParameter(this.enableExtension("EXT_texture_filter_anisotropic").MAX_TEXTURE_MAX_ANISOTROPY_EXT);
+
+
+        this.maxVaryingVectors = this.gl.getParameter(this.gl.MAX_VARYING_VECTORS);
+        this.maxTextureUnits = this.gl.getParameter(this.gl.MAX_TEXTURE_IMAGE_UNITS);
+        this.maxTexSize = this.gl.getParameter(this.gl.MAX_TEXTURE_SIZE);
+        this.maxUniformsFrag = this.gl.getParameter(this.gl.MAX_FRAGMENT_UNIFORM_VECTORS);
+        this.maxUniformsVert = this.gl.getParameter(this.gl.MAX_VERTEX_UNIFORM_VECTORS);
+        this.maxSamples = 0;
+        if (this.gl.MAX_SAMPLES) this.maxSamples = this.gl.getParameter(this.gl.MAX_SAMPLES);
+
+        if (this.glVersion == 1)
+        {
+            this.enableExtension("OES_standard_derivatives");
+            const instancingExt = this.enableExtension("ANGLE_instanced_arrays") || this.gl;
+
+            if (instancingExt.vertexAttribDivisorANGLE)
+            {
+                this.gl.vertexAttribDivisor = instancingExt.vertexAttribDivisorANGLE.bind(instancingExt);
+                this.gl.drawElementsInstanced = instancingExt.drawElementsInstancedANGLE.bind(instancingExt);
+            }
+        }
+
+        this.DEPTH_FUNCS = [
+            this.gl.NEVER,
+            this.gl.ALWAYS,
+            this.gl.LESS,
+            this.gl.LEQUAL,
+            this.gl.GREATER,
+            this.gl.GEQUAL,
+            this.gl.EQUAL,
+            this.gl.NOTEQUAL
+        ];
+        this.CULL_MODES = [
+            null,
+            this.gl.BACK,
+            this.gl.FRONT,
+            this.gl.FRONT_AND_BACK
+        ];
+    }
+
+    getInfo()
+    {
+        return {
+            "glVersion": this.glVersion,
+            "glRenderer": this.glRenderer,
+            "glUseHalfFloatTex": this.glUseHalfFloatTex,
+            "maxVaryingVectors": this.maxVaryingVectors,
+            "maxTextureUnits": this.maxTextureUnits,
+            "maxTexSize": this.maxTexSize,
+            "maxUniformsFrag": this.maxUniformsFrag,
+            "maxUniformsVert": this.maxUniformsVert,
+            "maxSamples": this.maxSamples
+        };
+    }
+
+
+
+
+
+    /**
+     * @function popViewPort
+     * @memberof Context
+     * @instance
+     * @description pop viewPort stack
+     */
+
+
+    popViewPort()
+    {
+        this._viewPortStack.pop();
+        this._viewPortStack.pop();
+        this._viewPortStack.pop();
+        this._viewPortStack.pop();
+
+        if (this._viewPortStack.length == 0)
+        {
+            this.setViewPort(0, 0, this.canvasWidth, this.canvasHeight);
+            // this.gl.viewport(this._viewPort[0], this._viewPort[1], this._viewPort[2], this._viewPort[3]);
+            // this.setViewPort(this._viewPort[0], this._viewPort[1], this._viewPort[2], this._viewPort[3]);
+        }
+        else
+        {
+            // this.viewPort = [this._viewPortStack[this._viewPort.length - 4], this._viewPortStack[this._viewPort.length - 3], this._viewPortStack[this._viewPort.length - 2], this._viewPortStack[this._viewPort.length - 1]];
+            // this.gl.viewport(this._viewPortStack[this._viewPort.length - 4], this._viewPortStack[this._viewPort.length - 3], this._viewPortStack[this._viewPort.length - 2], this._viewPortStack[this._viewPort.length - 1]);
+            this.setViewPort(this._viewPortStack[this._viewPort.length - 4], this._viewPortStack[this._viewPort.length - 3], this._viewPortStack[this._viewPort.length - 2], this._viewPortStack[this._viewPort.length - 1]);
+        }
+    }
+
+    /**
+     * @function pushViewPort
+     * @memberof Context
+     * @instance
+     * @description push a new viewport onto stack
+     * @param {Number} x
+     * @param {Number} y
+     * @param {Number} w
+     * @param {Number} h
+     */
+
+    pushViewPort(x, y, w, h)
+    {
+        this._viewPortStack.push(x, y, w, h);
+        this.setViewPort(x, y, w, h);
+    }
+
+
+    // old
+    getViewPort()
+    {
+        return this._viewPort;
+    }
+
+    // old
+    resetViewPort()
+    {
+        this.gl.viewport(this._viewPort[0], this._viewPort[1], this._viewPort[2], this._viewPort[3]);
+    }
+
+    // old
+    setViewPort(x, y, w, h)
+    {
+        this._viewPort[0] = Math.round(x);
+        this._viewPort[1] = Math.round(y);
+        this._viewPort[2] = Math.round(w);
+        this._viewPort[3] = Math.round(h);
+        this.gl.viewport(this._viewPort[0], this._viewPort[1], this._viewPort[2], this._viewPort[3]);
+    }
+
+
+    screenShot(cb, doScreenshotClearAlpha, mimeType, quality)
+    {
+        if (doScreenshotClearAlpha)
+        {
+            this.gl.clearColor(1, 1, 1, 1);
+            this.gl.colorMask(false, false, false, true);
+            this.gl.clear(this.gl.COLOR_BUFFER_BIT);
+            this.gl.colorMask(true, true, true, true);
+        }
+
+        if (this.canvas && this.canvas.toBlob)
+        {
+            this.canvas.toBlob((blob) =>
+            {
+                if (cb) cb(blob);
+                else this._log.log("no screenshot callback...");
+            }, mimeType, quality);
+        }
+    }
+
+    endFrame()
+    {
+        if (this.patch.isEditorMode()) CABLES.GL_MARKER.drawMarkerLayer(this);
+
+        this.setPreviousShader();
+
+        if (this._vMatrixStack.length() > 0) this.logStackError("view matrix stack length !=0 at end of rendering...");
+        if (this._mMatrixStack.length() > 0) this.logStackError("mvmatrix stack length !=0 at end of rendering...");
+        if (this._pMatrixStack.length() > 0) this.logStackError("pmatrix stack length !=0 at end of rendering...");
+        if (this._glFrameBufferStack.length > 0) this.logStackError("glFrameBuffer stack length !=0 at end of rendering...");
+        if (this._stackDepthTest.length > 0) this.logStackError("depthtest stack length !=0 at end of rendering...");
+        if (this._stackDepthWrite.length > 0) this.logStackError("depthwrite stack length !=0 at end of rendering...");
+        if (this._stackDepthFunc.length > 0) this.logStackError("depthfunc stack length !=0 at end of rendering...");
+        if (this._stackBlend.length > 0) this.logStackError("blend stack length !=0 at end of rendering...");
+        if (this._stackBlendMode.length > 0) this.logStackError("blendMode stack length !=0 at end of rendering...");
+        if (this._shaderStack.length > 0) this.logStackError("this._shaderStack length !=0 at end of rendering...");
+        if (this._stackCullFace.length > 0) this.logStackError("this._stackCullFace length !=0 at end of rendering...");
+        if (this._stackCullFaceFacing.length > 0) this.logStackError("this._stackCullFaceFacing length !=0 at end of rendering...");
+        if (this._viewPortStack.length > 0) this.logStackError("viewport stack length !=0 at end of rendering...");
+
+        this._frameStarted = false;
+
+        if (this._oldCanvasWidth != this.canvasWidth || this._oldCanvasHeight != this.canvasHeight)
+        {
+            this._oldCanvasWidth = this.canvasWidth;
+            this._oldCanvasHeight = this.canvasHeight;
+            this.emitEvent("resize");
+        }
+
+        if (this._cursor != this._currentCursor)
+        {
+            this._currentCursor = this.canvas.style.cursor = this._cursor;
+        }
+
+        this.emitEvent("endframe");
+
+        this.fpsCounter.endFrame();
+    }
+
+    logStackError(str)
+    {
+        if (!this._hadStackError)
+        {
+            this._hadStackError = true;
+            this._log.warn("[" + this.canvas.id + "]: ", str);
+        }
+    }
+
+    // shader stack
+    getShader()
+    {
+        if (this._currentShader) if (!this.frameStore || ((this.frameStore.renderOffscreen === true) == this._currentShader.offScreenPass) === true) return this._currentShader;
+
+        for (let i = this._shaderStack.length - 1; i >= 0; i--) if (this._shaderStack[i]) if (this.frameStore.renderOffscreen == this._shaderStack[i].offScreenPass) return this._shaderStack[i];
+    }
+
+    getDefaultShader()
+    {
+        return this._simpleShader;
+    }
+
+    /**
+     * push a shader to the shader stack
+     * @function pushShader
+     * @memberof Context
+     * @instance
+     * @param {Object} shader
+     * @function
+     */
+
+    pushShader(shader)
+    {
+        if (this.frameStore.forceShaderMods)
+        {
+            for (let i = 0; i < this.frameStore.forceShaderMods.length; i++)
+            {
+                // if (!currentShader.forcedMod && currentShader != this.frameStore.forceShaderMods[i])
+                // {
+                //     currentShader.forcedMod = this.frameStore.forceShaderMods[i];
+                shader = this.frameStore.forceShaderMods[i].bind(shader, false);
+                // }
+                // return currentShader;
+                // if (this.frameStore.forceShaderMods[i].currentShader() && shader != this.frameStore.forceShaderMods[i].currentShader().shader)
+            }
+        }
+
+        this._shaderStack.push(shader);
+        this._currentShader = shader;
+    }
+
+
+    /**
+     * pop current used shader from shader stack
+     * @function popShader
+     * @memberof Context
+     * @instance
+     * @function
+     */
+    setPreviousShader()
+    {
+        if (this.frameStore.forceShaderMods)
+        {
+            for (let i = 0; i < this.frameStore.forceShaderMods.length; i++)
+            {
+                // const a =
+                this.frameStore.forceShaderMods[i].unbind(false);
+                // if (a) return;
+                // this.popShader();
+            }
+        }
+
+        if (this._shaderStack.length === 0) throw new Error("Invalid shader stack pop!");
+        this._shaderStack.pop();
+        this._currentShader = this._shaderStack[this._shaderStack.length - 1];
+    }
+
+    /**
+     * push a framebuffer to the framebuffer stack
+     * @function pushGlFrameBuffer
+     * @memberof Context
+     * @instance
+     * @param {Object} framebuffer
+     * @function
+     */
+    pushGlFrameBuffer(fb)
+    {
+        this._glFrameBufferStack.push(fb);
+    }
+
+    /**
+     * pop framebuffer stack
+     * @function popGlFrameBuffer
+     * @memberof Context
+     * @instance
+     * @returns {Object} current framebuffer or null
+     */
+    popGlFrameBuffer()
+    {
+        if (this._glFrameBufferStack.length == 0) return null;
+        this._glFrameBufferStack.pop();
+        return this._glFrameBufferStack[this._glFrameBufferStack.length - 1];
+    }
+
+    /**
+     * get current framebuffer
+     * @function getCurrentFrameBuffer
+     * @memberof Context
+     * @instance
+     * @returns {Object} current framebuffer or null
+     */
+    getCurrentGlFrameBuffer()
+    {
+        if (this._glFrameBufferStack.length === 0) return null;
+        return this._glFrameBufferStack[this._glFrameBufferStack.length - 1];
+    }
+
+    /**
+     * push a framebuffer to the framebuffer stack
+     * @function pushGlFrameBuffer
+     * @memberof Context
+     * @instance
+     * @param {Framebuffer} framebuffer
+     */
+    pushFrameBuffer(fb)
+    {
+        this._frameBufferStack.push(fb);
+    }
+
+    /**
+     * pop framebuffer stack
+     * @function popFrameBuffer
+     * @memberof Context
+     * @instance
+     * @returns {Framebuffer} current framebuffer or null
+     */
+    popFrameBuffer()
+    {
+        if (this._frameBufferStack.length == 0) return null;
+        this._frameBufferStack.pop();
+        return this._frameBufferStack[this._frameBufferStack.length - 1];
+    }
+
+    /**
+     * get current framebuffer
+     * @function getCurrentFrameBuffer
+     * @memberof Context
+     * @instance
+     * @returns {Framebuffer} current framebuffer or null
+     */
+    getCurrentFrameBuffer()
+    {
+        if (this._frameBufferStack.length === 0) return null;
+        return this._frameBufferStack[this._frameBufferStack.length - 1];
+    }
+
+
+    renderStart(cgl, identTranslate, identTranslateView)
+    {
+        this.fpsCounter.startFrame();
+        this.pushDepthTest(true);
+        this.pushDepthWrite(true);
+        this.pushDepthFunc(cgl.gl.LEQUAL);
+        this.pushCullFaceFacing(cgl.gl.BACK);
+        this.pushCullFace(false);
+
+        // if (this.clearCanvasTransparent)
+        // {
+        //     cgl.gl.clearColor(0, 0, 0, 0);
+        //     cgl.gl.clear(cgl.gl.COLOR_BUFFER_BIT);
+        // }
+        // if (this.clearCanvasDepth) cgl.gl.clear(cgl.gl.DEPTH_BUFFER_BIT);
+
+        cgl.setViewPort(0, 0, cgl.canvasWidth, cgl.canvasHeight);
+
+        this._startMatrixStacks(identTranslate, identTranslateView);
+
+        cgl.pushBlendMode(constants_CONSTANTS.BLEND_MODES.BLEND_NORMAL, false);
+
+        for (let i = 0; i < this._textureslots.length; i++) this._textureslots[i] = null;
+
+        this.pushShader(this._simpleShader);
+
+        this._frameStarted = true;
+
+        if (this._onetimeCallbacks.length > 0)
+        {
+            for (let i = 0; i < this._onetimeCallbacks.length; i++) this._onetimeCallbacks[i]();
+            this._onetimeCallbacks.length = 0;
+        }
+
+        for (let i = 0; i < this._textureslots.length; i++)
+        {
+            this.gl.activeTexture(this.gl.TEXTURE0 + i);
+            this.gl.bindTexture(this.gl.TEXTURE_2D, null);
+            this._textureslots[i] = null;
+        }
+
+        this.emitEvent("beginFrame");
+    }
+
+    renderEnd(cgl)
+    {
+        this._endMatrixStacks();
+
+        this.popDepthTest();
+        this.popDepthWrite();
+        this.popDepthFunc();
+        this.popCullFaceFacing();
+        this.popCullFace();
+        this.popBlend();
+        this.popBlendMode();
+
+        cgl.endFrame();
+
+        this.emitEvent("endFrame");
+    }
+
+    getTexture(slot)
+    {
+        return this._textureslots[slot];
+    }
+
+    hasFrameStarted()
+    {
+        return this._frameStarted;
+    }
+
+    /**
+     * log warning to console if the rendering of one frame has not been started / handy to check for async problems
+     * @function checkFrameStarted
+     * @memberof Context
+     * @instance
+     */
+    checkFrameStarted(string)
+    {
+        if (!this._frameStarted)
+        {
+            this._log.warn("frame not started " + string);
+            this.patch.printTriggerStack();
+        }
+    }
+
+
+    setTexture(slot, t, type)
+    {
+        this.checkFrameStarted("cgl setTexture");
+
+        if (t === null) t = CGL.Texture.getEmptyTexture(this).tex;
+
+        // if (!this.gl.isTexture(t))
+        // {
+        //     console.log("not a texture!!!!"); return false;
+        //     t = CGL.Texture.getEmptyTexture(this).tex;
+        // }
+
+        // if (!this.gl.isTexture(t))
+        // {
+        //     t = CGL.Texture.getErrorTexture(this).tex;
+        //     // this._log.stack("not a texture!!!!");
+        //     // return false;
+        // }
+
+
+        if (this._textureslots[slot] != t)
+        {
+            this.gl.activeTexture(this.gl.TEXTURE0 + slot);
+            this.gl.bindTexture(type || this.gl.TEXTURE_2D, t);
+            this._textureslots[slot] = t;
+        }
+
+
+        return true;
+    }
+
+    fullScreen()
+    {
+        if (this.canvas.requestFullscreen) this.canvas.requestFullscreen();
+        else if (this.canvas.mozRequestFullScreen) this.canvas.mozRequestFullScreen();
+        else if (this.canvas.webkitRequestFullscreen) this.canvas.webkitRequestFullscreen();
+        else if (this.canvas.msRequestFullscreen) this.canvas.msRequestFullscreen();
+    }
+
+
+    printError(str)
+    {
+        if (!this.checkGlErrors) return;
+        let found = false;
+        let error = this.gl.getError();
+
+        if (error != this.gl.NO_ERROR)
+        {
+            let errStr = "";
+            if (error == this.gl.OUT_OF_MEMORY) errStr = "OUT_OF_MEMORY";
+            if (error == this.gl.INVALID_ENUM) errStr = "INVALID_ENUM";
+            if (error == this.gl.INVALID_OPERATION) errStr = "INVALID_OPERATION";
+            if (error == this.gl.INVALID_FRAMEBUFFER_OPERATION) errStr = "INVALID_FRAMEBUFFER_OPERATION";
+            if (error == this.gl.INVALID_VALUE) errStr = "INVALID_VALUE";
+            if (error == this.gl.CONTEXT_LOST_WEBGL)
+            {
+                this.aborted = true;
+                errStr = "CONTEXT_LOST_WEBGL";
+            }
+            if (error == this.gl.NO_ERROR) errStr = "NO_ERROR";
+
+            found = true;
+
+
+            this._log.warn("gl error [" + this.canvas.id + "]: ", str, error, errStr);
+
+            if (this.canvas.id.contains("glGuiCanvas"))
+                if (!this._loggedGlError)
+                {
+                    this.patch.printTriggerStack();
+                    this._log.stack("glerror");
+                    this._loggedGlError = true;
+                }
+        }
+        error = this.gl.getError();
+
+        return found;
+    }
+
+    saveScreenshot(filename, cb, pw, ph, noclearalpha)
+    {
+        this.patch.renderOneFrame();
+
+        let w = this.canvas.clientWidth * this.pixelDensity;
+        let h = this.canvas.clientHeight * this.pixelDensity;
+
+        if (pw)
+        {
+            this.canvas.width = pw;
+            w = pw;
+        }
+        if (ph)
+        {
+            this.canvas.height = ph;
+            h = ph;
+        }
+
+        function padLeft(nr, n, str)
+        {
+            return Array(n - String(nr).length + 1).join(str || "0") + nr;
+        }
+
+        const d = new Date();
+
+        const dateStr = "".concat(String(d.getFullYear()) + String(d.getMonth() + 1) + String(d.getDate()), "_").concat(padLeft(d.getHours(), 2)).concat(padLeft(d.getMinutes(), 2)).concat(padLeft(d.getSeconds(), 2));
+
+        if (!filename) filename = "cables_" + dateStr + ".png";
+        else filename += ".png";
+
+        this.patch.cgl.screenShot(function (blob)
+        {
+            this.canvas.width = w;
+            this.canvas.height = h;
+
+            if (blob)
+            {
+                const anchor = document.createElement("a");
+
+                anchor.download = filename;
+                anchor.href = URL.createObjectURL(blob);
+
+                setTimeout(function ()
+                {
+                    anchor.click();
+                    if (cb) cb(blob);
+                }, 100);
+            }
+            else
+            {
+                this._log.log("screenshot: no blob");
+            }
+        }.bind(this), noclearalpha);
+    }
+
+    _dispose()
+    {
+        this._simpleShader.dispose();
+        this.gl = null;
+    }
+}
+
+
+Context.prototype.popShader = Context.prototype.setPreviousShader;
+Context.prototype.setShader = Context.prototype.pushShader;
+
+/**
+ * execute the callback next frame, once
+ * @function addNextFrameOnceCallback
+ * @memberof Context
+ * @instance
+ * @param {function} callback
+ */
+Context.prototype.addNextFrameOnceCallback = function (cb)
+{
+    if (cb) this._onetimeCallbacks.push(cb);
+};
+
+// state depthtest
+
+/**
+ * push depth testing enabled state
+ * @function pushDepthTest
+ * @param {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype._stackDepthTest = [];
+Context.prototype.pushDepthTest = function (b)
+{
+    this._stackDepthTest.push(b);
+    if (!b) this.gl.disable(this.gl.DEPTH_TEST);
+    else this.gl.enable(this.gl.DEPTH_TEST);
+};
+/**
+ * current state of depth testing
+ * @function stateCullFace
+ * @returns {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.stateDepthTest = function ()
+{
+    return this._stackDepthTest[this._stackDepthTest.length - 1];
+};
+
+/**
+ * pop depth testing state
+ * @function popCullFace
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popDepthTest = function ()
+{
+    this._stackDepthTest.pop();
+
+    if (!this._stackDepthTest[this._stackDepthTest.length - 1]) this.gl.disable(this.gl.DEPTH_TEST);
+    else this.gl.enable(this.gl.DEPTH_TEST);
+};
+
+// --------------------------------------
+// state depthwrite
+
+/**
+ * push depth write enabled state
+ * @function pushDepthTest
+ * @param {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype._stackDepthWrite = [];
+Context.prototype.pushDepthWrite = function (b)
+{
+    b = b || false;
+    this._stackDepthWrite.push(b);
+    this.gl.depthMask(b);
+};
+
+/**
+ * current state of depth writing
+ * @function stateCullFace
+ * @returns {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.stateDepthWrite = function ()
+{
+    return this._stackDepthWrite[this._stackDepthWrite.length - 1];
+};
+
+/**
+ * pop depth writing state
+ * @function popCullFace
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popDepthWrite = function ()
+{
+    this._stackDepthWrite.pop();
+    this.gl.depthMask(this._stackDepthWrite[this._stackDepthWrite.length - 1] || false);
+};
+
+
+// --------------------------------------
+// state CullFace
+
+/**
+ * push face culling face enabled state
+ * @function pushCullFaceFacing
+ * @param {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype._stackCullFace = [];
+Context.prototype.pushCullFace = function (b)
+{
+    this._stackCullFace.push(b);
+
+    if (b) this.gl.enable(this.gl.CULL_FACE);
+    else this.gl.disable(this.gl.CULL_FACE);
+};
+
+/**
+ * current state of face culling
+ * @function stateCullFace
+ * @returns {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.stateCullFace = function ()
+{
+    return this._stackCullFace[this._stackCullFace.length - 1];
+};
+
+/**
+ * pop face culling enabled state
+ * @function popCullFace
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popCullFace = function ()
+{
+    this._stackCullFace.pop();
+
+    if (this._stackCullFace[this._stackCullFace.length - 1]) this.gl.enable(this.gl.CULL_FACE);
+    else this.gl.disable(this.gl.CULL_FACE);
+};
+
+
+// --------------------------------------
+// state CullFace Facing
+
+
+/**
+ * push face culling face side
+ * @function pushCullFaceFacing
+ * @param {Number} cgl.gl.FRONT_AND_BACK, cgl.gl.BACK or cgl.gl.FRONT
+ * @memberof Context
+ * @instance
+ */
+Context.prototype._stackCullFaceFacing = [];
+Context.prototype.pushCullFaceFacing = function (b)
+{
+    this._stackCullFaceFacing.push(b);
+    this.gl.cullFace(this._stackCullFaceFacing[this._stackCullFaceFacing.length - 1]);
+};
+
+/**
+ * current state of face culling side
+ * @function stateCullFaceFacing
+ * @returns {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.stateCullFaceFacing = function ()
+{
+    return this._stackCullFaceFacing[this._stackCullFaceFacing.length - 1];
+};
+
+/**
+ * pop face culling face side
+ * @function popCullFaceFacing
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popCullFaceFacing = function ()
+{
+    this._stackCullFaceFacing.pop();
+    if (this._stackCullFaceFacing.length > 0) this.gl.cullFace(this._stackCullFaceFacing[this._stackCullFaceFacing.length - 1]);
+};
+
+
+// --------------------------------------
+// state depthfunc
+
+Context.prototype._stackDepthFunc = [];
+
+/**
+ * enable / disable depth testing
+ * like `gl.depthFunc(boolean);`
+ * @function pushDepthFunc
+ * @memberof Context
+ * @instance
+ * @param {Boolean} depthtesting
+ */
+Context.prototype.pushDepthFunc = function (f)
+{
+    this._stackDepthFunc.push(f);
+    this.gl.depthFunc(f);
+};
+
+/**
+ * current state of blend
+ * @function stateDepthFunc
+ * @memberof Context
+ * @instance
+ * @returns {Boolean} depth testing enabled/disabled
+ */
+Context.prototype.stateDepthFunc = function ()
+{
+    if (this._stackDepthFunc.length > 0) return this._stackDepthFunc[this._stackDepthFunc.length - 1];
+    return false;
+};
+
+/**
+ * pop depth testing and set the previous state
+ * @function popDepthFunc
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popDepthFunc = function ()
+{
+    this._stackDepthFunc.pop();
+    if (this._stackDepthFunc.length > 0) this.gl.depthFunc(this._stackDepthFunc[this._stackDepthFunc.length - 1]);
+};
+
+// --------------------------------------
+// state blending
+
+Context.prototype._stackBlend = [];
+
+/**
+ * enable / disable blend
+ * like gl.enable(gl.BLEND); / gl.disable(gl.BLEND);
+ * @function pushBlend
+ * @memberof Context
+ * @instance
+ * @param {Boolean} blending
+ */
+Context.prototype.pushBlend = function (b)
+{
+    this._stackBlend.push(b);
+    if (!b) this.gl.disable(this.gl.BLEND);
+    else this.gl.enable(this.gl.BLEND);
+};
+
+/**
+ * pop blend state and set the previous state
+ * @function popBlend
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popBlend = function ()
+{
+    this._stackBlend.pop();
+
+    if (!this._stackBlend[this._stackBlend.length - 1]) this.gl.disable(this.gl.BLEND);
+    else this.gl.enable(this.gl.BLEND);
+};
+
+/**
+ * current state of blend
+ * @function stateBlend
+ * @returns {boolean} blending enabled/disabled
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.stateBlend = function ()
+{
+    return this._stackBlend[this._stackBlend.length - 1];
+};
+
+const BLENDS = {
+    "BLEND_NONE": 0,
+    "BLEND_NORMAL": 1,
+    "BLEND_ADD": 2,
+    "BLEND_SUB": 3,
+    "BLEND_MUL": 4,
+};
+
+Context.prototype._stackBlendMode = [];
+Context.prototype._stackBlendModePremul = [];
+
+/**
+ * push and switch to predefined blendmode (CONSTANTS.BLEND_MODES.BLEND_NONE,CONSTANTS.BLEND_MODES.BLEND_NORMAL,CONSTANTS.BLEND_MODES.BLEND_ADD,CONSTANTS.BLEND_MODES.BLEND_SUB,CONSTANTS.BLEND_MODES.BLEND_MUL)
+ * @function pushBlendMode
+ * @memberof Context
+ * @instance
+ * @param {Number} blendmode
+ * @param {Boolean} premultiplied mode
+ */
+Context.prototype.pushBlendMode = function (blendMode, premul)
+{
+    this._stackBlendMode.push(blendMode);
+    this._stackBlendModePremul.push(premul);
+
+    const n = this._stackBlendMode.length - 1;
+
+    this.pushBlend(this._stackBlendMode[n] !== constants_CONSTANTS.BLEND_MODES.BLEND_NONE);
+    this._setBlendMode(this._stackBlendMode[n], this._stackBlendModePremul[n]);
+};
+
+/**
+ * pop predefined blendmode / switch back to previous blendmode
+ * @function popBlendMode
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popBlendMode = function ()
+{
+    this._stackBlendMode.pop();
+    this._stackBlendModePremul.pop();
+
+    const n = this._stackBlendMode.length - 1;
+
+    this.popBlend(this._stackBlendMode[n] !== constants_CONSTANTS.BLEND_MODES.BLEND_NONE);
+
+    if (n >= 0) this._setBlendMode(this._stackBlendMode[n], this._stackBlendModePremul[n]);
+};
+
+
+// --------------------------------------
+// state stencil
+
+Context.prototype._stackStencil = [];
+
+/**
+ * enable / disable stencil testing
+
+* @function pushStencil
+ * @memberof Context
+ * @instance
+ * @param {Boolean} enable
+ */
+Context.prototype.pushStencil = function (b)
+{
+    this._stackStencil.push(b);
+    if (!b) this.gl.disable(this.gl.STENCIL_TEST);
+    else this.gl.enable(this.gl.STENCIL_TEST);
+};
+
+/**
+ * pop stencil test state and set the previous state
+ * @function popStencil
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.popStencil = function ()
+{
+    this._stackStencil.pop();
+
+    if (!this._stackStencil[this._stackStencil.length - 1]) this.gl.disable(this.gl.STENCIL_TEST);
+    else this.gl.enable(this.gl.STENCIL_TEST);
+};
+
+// --------------------------------------
+
+
+Context.prototype.glGetAttribLocation = function (prog, name)
+{
+    const l = this.gl.getAttribLocation(prog, name);
+    // if (l == -1)
+    // {
+    //     this._log.warn("get attr loc -1 ", name);
+    // }
+    return l;
+};
+
+
+/**
+ * should an op now draw helpermeshes
+ * @function shouldDrawHelpers
+ * @memberof Context
+ * @instance
+ */
+Context.prototype.shouldDrawHelpers = function (op)
+{
+    if (this.frameStore.shadowPass) return false;
+    if (!op.patch.isEditorMode()) return false;
+
+    // const fb = this.getCurrentFrameBuffer();
+    // if (fb && fb.getWidth)
+    // {
+    //     const fbshould = this.canvasWidth / this.canvasHeight == fb.getWidth() / fb.getHeight();
+    //     if (!fbshould) return false;
+    // }
+
+    return gui.shouldDrawOverlay;// || (CABLES.UI.renderHelperCurrent && op.isCurrentUiOp());
+};
+
+Context.prototype._setBlendMode = function (blendMode, premul)
+{
+    const gl = this.gl;
+
+    if (blendMode == constants_CONSTANTS.BLEND_MODES.BLEND_NONE)
+    {
+        // this.gl.disable(this.gl.BLEND);
+    }
+    else if (blendMode == constants_CONSTANTS.BLEND_MODES.BLEND_ADD)
+    {
+        if (premul)
+        {
+            gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
+            gl.blendFuncSeparate(gl.ONE, gl.ONE, gl.ONE, gl.ONE);
+        }
+        else
+        {
+            gl.blendEquation(gl.FUNC_ADD);
+            gl.blendFunc(gl.SRC_ALPHA, gl.ONE);
+        }
+    }
+    else if (blendMode == constants_CONSTANTS.BLEND_MODES.BLEND_SUB)
+    {
+        if (premul)
+        {
+            gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
+            gl.blendFuncSeparate(gl.ZERO, gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ONE_MINUS_SRC_ALPHA);
+        }
+        else
+        {
+            gl.blendEquation(gl.FUNC_ADD);
+            gl.blendFunc(gl.ZERO, gl.ONE_MINUS_SRC_COLOR);
+        }
+    }
+    else if (blendMode == constants_CONSTANTS.BLEND_MODES.BLEND_MUL)
+    {
+        if (premul)
+        {
+            gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
+            gl.blendFuncSeparate(gl.ZERO, gl.SRC_COLOR, gl.ZERO, gl.SRC_ALPHA);
+        }
+        else
+        {
+            gl.blendEquation(gl.FUNC_ADD);
+            gl.blendFunc(gl.ZERO, gl.SRC_COLOR);
+        }
+    }
+    else if (blendMode == constants_CONSTANTS.BLEND_MODES.BLEND_NORMAL)
+    {
+        if (premul)
+        {
+            gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
+            gl.blendFuncSeparate(gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
+        }
+        else
+        {
+            gl.blendEquationSeparate(gl.FUNC_ADD, gl.FUNC_ADD);
+            gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);
+        }
+    }
+    else
+    {
+        this._log.log("setblendmode: unknown blendmode");
+    }
+};
+
+Context.prototype.createMesh = function (geom, options)
+{
+    if (CABLES.UTILS.isNumeric(options))options = { "glPrimitive": options }; // old constructor fallback...
+    return new CGL.Mesh(this, geom, options);
+};
+
+
+/**
+ * set cursor
+ * @function setCursor
+ * @memberof Context
+ * @instance
+ * @param {String} css cursor string
+ */
+Context.prototype.setCursor = function (str)
+{
+    this._cursor = str;
+};
+
+/**
+ * enable a webgl extension
+ * @function enableExtension
+ * @memberof Context
+ * @instance
+ * @param {String} extension name
+ * @returns {Object} extension object or null
+ */
+Context.prototype.enableExtension = function (name)
+{
+    if (!this.gl) return null;
+    // const start = performance.now();
+
+    if (this._enabledExtensions.hasOwnProperty(name))
+    {
+        return this._enabledExtensions[name];
+    }
+
+    const o = this.gl.getExtension(name);
+    this._enabledExtensions[name] = o;
+
+    if (!o)
+        this._log.warn("[cgl_state] extension not available " + name);
+    else
+        this._log.log("enabled extension", name);
+
+    return o;
+};
+
+Context.prototype.checkTextureSize = function (x)
+{
+    x = x || 1;
+    x = Math.floor(x);
+    x = Math.min(x, this.maxTexSize);
+    x = Math.max(x, 1);
+    return x;
+};
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/core_variable.js
+
+
+/**
+ * @type {Object}
+ * @name Variable
+ * @param {String} name
+ * @param {String|Number} value
+ * @memberof Patch
+ * @constructor
+ */
+class PatchVariable extends Events
+{
+    constructor(name, val, type)
+    {
+        super();
+        this._name = name;
+        this.type = type;
+        this.setValue(val);
+    }
+
+    /**
+     * keeping this for backwards compatibility in older
+     * exports before using eventtarget
+     *
+     * @param cb
+     */
+    addListener(cb)
+    {
+        this.on("change", cb, "var");
+    }
+
+    /**
+     * @function Variable.getValue
+     * @memberof Variable
+     * @returns {String|Number|Boolean}
+     */
+
+    getValue()
+    {
+        return this._v;
+    }
+
+    /**
+     * @function getName
+     * @memberof Variable
+     * @instance
+     * @returns {String|Number|Boolean}
+     * @function
+     */
+    getName()
+    {
+        return this._name;
+    }
+
+    /**
+     * @function setValue
+     * @memberof Variable
+     * @instance
+     * @returns {String|Number|Boolean}
+     * @function
+     */
+    setValue(v)
+    {
+        this._v = v;
+        this.emitEvent("change", v, this);
+    }
+}
+
+/* harmony default export */ const core_variable = (PatchVariable);
+
+;// CONCATENATED MODULE: ./src/core/core_patch.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+/**
+ * Patch class, contains all operators,values,links etc. manages loading and running of the whole patch
+ *
+ * see {@link PatchConfig}
+ *
+ * @external CABLES
+ * @namespace Patch
+ * @hideconstructor
+ * @param {PatchConfig} config The configuration object.
+ * @class
+ * @example
+ * CABLES.patch=new CABLES.Patch(
+ * {
+ *     patch:pStr,
+ *     glCanvasId:'glcanvas',
+ *     glCanvasResizeToWindow:true,
+ *     canvas:{powerPreference:"high-performance"},
+ *     prefixAssetPath:'/assets/',
+ *     prefixJsPath:'/js/',
+ *     onError:function(e){console.log(e);}
+ *     glslPrecision:'highp'
+ * });
+ */
+
+const Patch = function (cfg)
+{
+    EventTarget.apply(this);
+
+    this._log = new Logger("core_patch");
+    this.ops = [];
+    this.settings = {};
+    this.config = cfg ||
+        {
+            "glCanvasResizeToWindow": false,
+            "prefixAssetPath": "",
+            "prefixJsPath": "",
+            "silent": true,
+            "onError": null,
+            "onFinishedLoading": null,
+            "onFirstFrameRendered": null,
+            "onPatchLoaded": null,
+            "fpsLimit": 0,
+        };
+    this.timer = new Timer();
+    this.freeTimer = new Timer();
+    this.animFrameOps = [];
+    this.animFrameCallbacks = [];
+    this.gui = false;
+    CABLES.logSilent = this.silent = true;
+    this.profiler = null;
+    this.aborted = false;
+    this._crashedOps = [];
+    this._renderOneFrame = false;
+    this._animReq = null;
+    this._opIdCache = {};
+    this._triggerStack = [];
+    this.storeObjNames = false; // remove after may release
+
+    this.loading = new LoadingStatus(this);
+
+    this._volumeListeners = [];
+    this._paused = false;
+    this._frameNum = 0;
+    this.instancing = new Instancing();
+    this.onOneFrameRendered = null;
+    this.namedTriggers = {};
+
+    this._origData = null;
+    this._frameNext = 0;
+    this._frameInterval = 0;
+    this._lastFrameTime = 0;
+    this._frameWasdelayed = true;
+    this.frameStore = {};
+    this.deSerialized = false;
+    this.reqAnimTimeStamp = 0;
+
+    this.cgCanvas = null;
+
+    if (!(function () { return !this; }())) console.log("not in strict mode: core patch");
+
+    this._isLocal = document.location.href.indexOf("file:") === 0;
+
+    if (this.config.hasOwnProperty("silent")) this.silent = CABLES.logSilent = this.config.silent;
+    if (!this.config.hasOwnProperty("doRequestAnimation")) this.config.doRequestAnimation = true;
+
+    if (!this.config.prefixAssetPath) this.config.prefixAssetPath = "";
+    if (!this.config.prefixJsPath) this.config.prefixJsPath = "";
+    if (!this.config.masterVolume) this.config.masterVolume = 1.0;
+
+    this._variables = {};
+    this._variableListeners = [];
+    this.vars = {};
+    if (cfg && cfg.vars) this.vars = cfg.vars; // vars is old!
+
+    this.cgl = new Context(this);
+    this.cgp = null;
+
+    this._subpatchOpCache = {};
+
+    this.cgl.setCanvas(this.config.glCanvasId || this.config.glCanvas || "glcanvas");
+    if (this.config.glCanvasResizeToWindow === true) this.cgl.setAutoResize("window");
+    if (this.config.glCanvasResizeToParent === true) this.cgl.setAutoResize("parent");
+    this.loading.setOnFinishedLoading(this.config.onFinishedLoading);
+
+    if (this.cgl.aborted) this.aborted = true;
+    if (this.cgl.silent) this.silent = true;
+
+    this.freeTimer.play();
+    this.exec();
+
+    if (!this.aborted)
+    {
+        if (this.config.patch)
+        {
+            this.deSerialize(this.config.patch);
+        }
+        else if (this.config.patchFile)
+        {
+            ajax(
+                this.config.patchFile,
+                (err, _data) =>
+                {
+                    const data = JSON.parse(_data);
+                    if (err)
+                    {
+                        const txt = "";
+                        this._log.error("err", err);
+                        this._log.error("data", data);
+                        this._log.error("data", data.msg);
+                        return;
+                    }
+                    this.deSerialize(data);
+                }
+            );
+        }
+        this.timer.play();
+    }
+
+    console.log("made with https://cables.gl"); // eslint-disable-line
+};
+
+Patch.prototype.isPlaying = function ()
+{
+    return !this._paused;
+};
+
+Patch.prototype.isRenderingOneFrame = function ()
+{
+    return this._renderOneFrame;
+};
+
+
+Patch.prototype.renderOneFrame = function ()
+{
+    this._paused = true;
+    this._renderOneFrame = true;
+    this.exec();
+    this._renderOneFrame = false;
+};
+
+/**
+ * current number of frames per second
+ * @function getFPS
+ * @memberof Patch
+ * @instance
+ * @return {Number} fps
+ */
+Patch.prototype.getFPS = function ()
+{
+    console.log("deprecated getfps");
+    return 0;
+};
+
+/**
+ * returns true if patch is opened in editor/gui mode
+ * @function isEditorMode
+ * @memberof Patch
+ * @instance
+ * @return {Boolean} editor mode
+ */
+Patch.prototype.isEditorMode = function ()
+{
+    return this.config.editorMode === true;
+};
+
+/**
+ * pauses patch execution
+ * @function pause
+ * @memberof Patch
+ * @instance
+ */
+Patch.prototype.pause = function ()
+{
+    cancelAnimationFrame(this._animReq);
+    this.emitEvent("pause");
+    this._animReq = null;
+    this._paused = true;
+    this.freeTimer.pause();
+};
+
+/**
+ * resumes patch execution
+ * @function resume
+ * @memberof Patch
+ * @instance
+ */
+Patch.prototype.resume = function ()
+{
+    if (this._paused)
+    {
+        cancelAnimationFrame(this._animReq);
+        this._paused = false;
+        this.freeTimer.play();
+        this.emitEvent("resume");
+        this.exec();
+    }
+};
+
+/**
+ * set volume [0-1]
+ * @function setVolume
+ * @param {Number} volume
+ * @memberof Patch
+ * @instance
+ */
+Patch.prototype.setVolume = function (v)
+{
+    this.config.masterVolume = v;
+    for (let i = 0; i < this._volumeListeners.length; i++) this._volumeListeners[i].onMasterVolumeChanged(v);
+};
+
+
+/**
+ * get asset path
+ * @function getAssetPath
+ * @memberof Patch
+ * @instance
+ */
+Patch.prototype.getAssetPath = function (patchId = null)
+{
+    if (this.isEditorMode())
+    {
+        let id = patchId || gui.project()._id;
+        return "/assets/" + id + "/";
+    }
+    else if (document.location.href.indexOf("cables.gl") > 0 || document.location.href.indexOf("cables.local") > 0)
+    {
+        const parts = document.location.pathname.split("/");
+        let id = patchId || parts[parts.length - 1];
+        return "/assets/" + id + "/";
+    }
+    else if (this.config.hasOwnProperty("assetPath"))
+    {
+        return this.config.assetPath;
+    }
+    else
+    {
+        return "assets/";
+    }
+};
+
+/**
+ * get js path
+ * @function getJsPath
+ * @memberof Patch
+ * @instance
+ */
+Patch.prototype.getJsPath = function ()
+{
+    if (this.config.hasOwnProperty("jsPath"))
+    {
+        return this.config.jsPath;
+    }
+    else
+    {
+        return "js/";
+    }
+};
+
+/**
+ * get url/filepath for a filename
+ * this uses prefixAssetpath in exported patches
+ * @function getFilePath
+ * @memberof Patch
+ * @instance
+ * @param {String} filename
+ * @return {String} url
+ */
+Patch.prototype.getFilePath = function (filename)
+{
+    if (!filename) return filename;
+    filename = String(filename);
+    if (filename.indexOf("https:") === 0 || filename.indexOf("http:") === 0) return filename;
+    if (filename.indexOf("data:") === 0) return filename;
+    if (filename.indexOf("file:") === 0) return filename;
+
+    filename = filename.replace("//", "/");
+    return this.config.prefixAssetPath + filename + (this.config.suffixAssetPath || "");
+};
+
+Patch.prototype.clear = function ()
+{
+    this.emitEvent("patchClearStart");
+    this.cgl.TextureEffectMesh = null;
+    this.animFrameOps.length = 0;
+    this.timer = new Timer();
+    while (this.ops.length > 0) this.deleteOp(this.ops[0].id);
+
+    this._opIdCache = {};
+    this.emitEvent("patchClearEnd");
+};
+
+Patch.getOpClass = function (objName)
+{
+    const parts = objName.split(".");
+    let opObj = null;
+
+    try
+    {
+        if (parts.length == 2) opObj = window[parts[0]][parts[1]];
+        else if (parts.length == 3) opObj = window[parts[0]][parts[1]][parts[2]];
+        else if (parts.length == 4) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]];
+        else if (parts.length == 5) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]];
+        else if (parts.length == 6) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]];
+        else if (parts.length == 7) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]];
+        else if (parts.length == 8) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]][parts[7]];
+        else if (parts.length == 9) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]][parts[7]][parts[8]];
+        else if (parts.length == 10) opObj = window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]][parts[7]][parts[8]][parts[9]];
+        return opObj;
+    }
+    catch (e)
+    {
+        return null;
+    }
+};
+
+Patch.prototype.createOp = function (identifier, id, opName = null)
+{
+    let op = null;
+    let objName = "";
+
+    try
+    {
+        if (!identifier)
+        {
+            console.error("createop identifier false", identifier);
+            console.log((new Error()).stack);
+            return;
+        }
+        if (identifier.indexOf("Ops.") === -1)
+        {
+            // this should be a uuid, not a namespace
+            // creating ops by id should be the default way from now on!
+            const opId = identifier;
+
+
+
+            if (CABLES.OPS[opId])
+            {
+                objName = CABLES.OPS[opId].objName;
+                op = new CABLES.OPS[opId].f(this, objName, id, opId);
+                op.opId = opId;
+            }
+            else
+            {
+                if (opName)
+                {
+                    identifier = opName;
+                    console.log("could not find op by id: " + opId);
+                }
+                else
+                {
+                    throw new Error("could not find op by id: " + opId, { "cause": "opId:" + opId });
+                }
+            }
+        }
+
+        if (!op)
+        {
+            // fallback: create by objname!
+            objName = identifier;
+            const parts = identifier.split(".");
+            const opObj = Patch.getOpClass(objName);
+
+            if (!opObj)
+            {
+                this.emitEvent("criticalError", { "title": "unknown op" + objName, "text": "unknown op: " + objName });
+
+                this._log.error("unknown op: " + objName);
+                throw new Error("unknown op: " + objName);
+            }
+            else
+            {
+                if (parts.length == 2) op = new window[parts[0]][parts[1]](this, objName, id);
+                else if (parts.length == 3) op = new window[parts[0]][parts[1]][parts[2]](this, objName, id);
+                else if (parts.length == 4) op = new window[parts[0]][parts[1]][parts[2]][parts[3]](this, objName, id);
+                else if (parts.length == 5) op = new window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]](this, objName, id);
+                else if (parts.length == 6) op = new window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]](this, objName, id);
+                else if (parts.length == 7) op = new window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]](this, objName, id);
+                else if (parts.length == 8) op = new window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]][parts[7]](this, objName, id);
+                else if (parts.length == 9) op = new window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]][parts[7]][parts[8]](this, objName, id);
+                else if (parts.length == 10) op = new window[parts[0]][parts[1]][parts[2]][parts[3]][parts[4]][parts[5]][parts[6]][parts[7]][parts[8]][parts[9]](this, objName, id);
+                else console.log("parts.length", parts.length);
+            }
+
+            if (op)
+            {
+                op.opId = null;
+                for (const i in CABLES.OPS)
+                {
+                    if (CABLES.OPS[i].objName == objName) op.opId = i;
+                }
+            }
+        }
+    }
+    catch (e)
+    {
+        this._crashedOps.push(objName);
+
+        this.emitEvent("exceptionOp", e, objName, op);
+
+        if (!this.isEditorMode())
+        {
+            this._log.error(e);
+            this._log.error("[instancing error] " + objName, e);
+
+            if (CABLES.api) CABLES.api.sendErrorReport(e);
+            this.exitError("INSTANCE_ERR", "Instancing Error 1" + objName, e);
+            throw new Error("instancing error 1" + objName);
+        }
+    }
+
+    if (op)
+    {
+        op._objName = objName;
+        op.patch = this;
+    }
+    else
+    {
+        this._log.log("no op was created!?", identifier, id);
+    }
+    return op;
+};
+
+/**
+ * create a new op in patch
+ * @function addOp
+ * @memberof Patch
+ * @instance
+ * @param {String} opIdentifier, uuid or name, e.g. Ops.Math.Sum
+ * @param {Object} uiAttribs Attributes
+ * @param {String} id
+ * @param {boolean} fromDeserialize
+ * @param {String} opName, e.g. Ops.Math.Sum
+ * @example
+ * // add invisible op
+ * patch.addOp('Ops.Math.Sum', { showUiAttribs: false });
+ */
+Patch.prototype.addOp = function (opIdentifier, uiAttribs, id, fromDeserialize, opName)
+{
+    const op = this.createOp(opIdentifier, id, opName);
+
+    if (op)
+    {
+        uiAttribs = uiAttribs || {};
+        if (uiAttribs.hasOwnProperty("errors")) delete uiAttribs.errors;
+        if (uiAttribs.hasOwnProperty("error")) delete uiAttribs.error;
+        uiAttribs.subPatch = uiAttribs.subPatch || 0;
+
+        op.setUiAttribs(uiAttribs);
+        if (op.onCreate) op.onCreate();
+
+        if (op.hasOwnProperty("onAnimFrame")) this.addOnAnimFrame(op);
+        if (op.hasOwnProperty("onMasterVolumeChanged")) this._volumeListeners.push(op);
+
+        if (this._opIdCache[op.id])
+        {
+            console.log("opid with id " + op.id + " already exists in patch!");
+            this.deleteOp(op.id); // strange with subpatch ops: why is this needed, somehow ops get added twice ???.....
+            // return;
+        }
+
+        this.ops.push(op);
+        this._opIdCache[op.id] = op;
+
+        if (this._subPatchCacheAdd) this._subPatchCacheAdd(uiAttribs.subPatch, op);
+        this.emitEvent("onOpAdd", op, fromDeserialize);
+
+        if (op.init) op.init();
+
+        op.emitEvent("init", fromDeserialize);
+    }
+    else
+    {
+        this._log.error("addop: no op.....");
+    }
+
+    return op;
+};
+
+Patch.prototype.addOnAnimFrame = function (op)
+{
+    for (let i = 0; i < this.animFrameOps.length; i++) if (this.animFrameOps[i] == op) { return; }
+
+    this.animFrameOps.push(op);
+};
+
+Patch.prototype.removeOnAnimFrame = function (op)
+{
+    for (let i = 0; i < this.animFrameOps.length; i++)
+    {
+        if (this.animFrameOps[i] == op)
+        {
+            this.animFrameOps.splice(i, 1);
+            return;
+        }
+    }
+};
+
+Patch.prototype.addOnAnimFrameCallback = function (cb)
+{
+    this.animFrameCallbacks.push(cb);
+};
+
+Patch.prototype.removeOnAnimCallback = function (cb)
+{
+    for (let i = 0; i < this.animFrameCallbacks.length; i++)
+    {
+        if (this.animFrameCallbacks[i] == cb)
+        {
+            this.animFrameCallbacks.splice(i, 1);
+            return;
+        }
+    }
+};
+
+Patch.prototype.deleteOp = function (opid, tryRelink, reloadingOp)
+{
+    let found = false;
+    for (const i in this.ops)
+    {
+        if (this.ops[i].id == opid)
+        {
+            const op = this.ops[i];
+            let reLinkP1 = null;
+            let reLinkP2 = null;
+
+            if (op)
+            {
+                found = true;
+                if (tryRelink)
+                {
+                    if (op.portsIn.length > 0 && op.portsIn[0].isLinked() && (op.portsOut.length > 0 && op.portsOut[0].isLinked()))
+                    {
+                        if (op.portsIn[0].getType() == op.portsOut[0].getType() && op.portsIn[0].links[0])
+                        {
+                            reLinkP1 = op.portsIn[0].links[0].getOtherPort(op.portsIn[0]);
+                            reLinkP2 = op.portsOut[0].links[0].getOtherPort(op.portsOut[0]);
+                        }
+                    }
+                }
+
+                const opToDelete = this.ops[i];
+                opToDelete.removeLinks();
+
+                if (this.onDelete)
+                {
+                    // todo: remove
+                    console.log("deprecated this.onDelete", this.onDelete);
+                    this.onDelete(opToDelete);
+                }
+
+                this.ops.splice(i, 1);
+                opToDelete.emitEvent("delete", opToDelete);
+                this.emitEvent("onOpDelete", opToDelete, reloadingOp);
+
+                if (this.clearSubPatchCache) this.clearSubPatchCache(opToDelete.uiAttribs.subPatch);
+
+                if (opToDelete.onDelete) opToDelete.onDelete(reloadingOp);
+                opToDelete.cleanUp();
+
+                if (reLinkP1 !== null && reLinkP2 !== null)
+                {
+                    this.link(reLinkP1.op, reLinkP1.getName(), reLinkP2.op, reLinkP2.getName());
+                }
+
+                delete this._opIdCache[opid];
+                break;
+            }
+        }
+    }
+
+    if (!found) console.log("core patch deleteop: not found...", opid);
+};
+
+Patch.prototype.getFrameNum = function ()
+{
+    return this._frameNum;
+};
+
+Patch.prototype.emitOnAnimFrameEvent = function (time, delta)
+{
+    time = time || this.timer.getTime();
+
+    for (let i = 0; i < this.animFrameCallbacks.length; ++i)
+        if (this.animFrameCallbacks[i])
+            this.animFrameCallbacks[i](time, this._frameNum, delta);
+
+    for (let i = 0; i < this.animFrameOps.length; ++i)
+        if (this.animFrameOps[i].onAnimFrame)
+            this.animFrameOps[i].onAnimFrame(time, this._frameNum, delta);
+};
+
+Patch.prototype.renderFrame = function (timestamp)
+{
+    this.timer.update(this.reqAnimTimeStamp);
+    this.freeTimer.update(this.reqAnimTimeStamp);
+    const time = this.timer.getTime();
+    const startTime = performance.now();
+    this.cgl.frameStartTime = this.timer.getTime();
+
+    const delta = timestamp - this.reqAnimTimeStamp || timestamp;
+
+    this.emitOnAnimFrameEvent(null, delta);
+
+    this.cgl.profileData.profileFrameDelta = delta;
+    this.reqAnimTimeStamp = timestamp;
+    this.cgl.profileData.profileOnAnimFrameOps = performance.now() - startTime;
+
+    this.emitEvent("onRenderFrame", time);
+
+    this._frameNum++;
+    if (this._frameNum == 1)
+    {
+        if (this.config.onFirstFrameRendered) this.config.onFirstFrameRendered();
+    }
+};
+
+Patch.prototype.exec = function (timestamp)
+{
+    if (!this._renderOneFrame && (this._paused || this.aborted)) return;
+    this.emitEvent("reqAnimFrame");
+    cancelAnimationFrame(this._animReq);
+
+    this.config.fpsLimit = this.config.fpsLimit || 0;
+    if (this.config.fpsLimit)
+    {
+        this._frameInterval = 1000 / this.config.fpsLimit;
+    }
+
+    const now = CABLES.now();
+    const frameDelta = now - this._frameNext;
+
+    if (this.isEditorMode())
+    {
+        if (!this._renderOneFrame)
+        {
+            if (now - this._lastFrameTime >= 500 && this._lastFrameTime !== 0 && !this._frameWasdelayed)
+            {
+                this._lastFrameTime = 0;
+                setTimeout(this.exec.bind(this), 500);
+                this.emitEvent("renderDelayStart");
+                this._frameWasdelayed = true;
+                return;
+            }
+        }
+    }
+
+    if (this._renderOneFrame || this.config.fpsLimit === 0 || frameDelta > this._frameInterval || this._frameWasdelayed)
+    {
+        this.renderFrame(timestamp);
+
+        if (this._frameInterval) this._frameNext = now - (frameDelta % this._frameInterval);
+    }
+
+    if (this._frameWasdelayed)
+    {
+        this.emitEvent("renderDelayEnd");
+        this._frameWasdelayed = false;
+    }
+
+    if (this._renderOneFrame)
+    {
+        if (this.onOneFrameRendered) this.onOneFrameRendered(); // todo remove everywhere and use propper event...
+        this.emitEvent("renderedOneFrame");
+        this._renderOneFrame = false;
+    }
+
+
+    if (this.config.doRequestAnimation) this._animReq = this.cgl.canvas.ownerDocument.defaultView.requestAnimationFrame(this.exec.bind(this));
+};
+
+/**
+ * link two ops/ports
+ * @function link
+ * @memberof Patch
+ * @instance
+ * @param {Op} op1
+ * @param {String} portName1
+ * @param {Op} op2
+ * @param {String} portName2
+ */
+Patch.prototype.link = function (op1, port1Name, op2, port2Name, lowerCase, fromDeserialize)
+{
+    if (!op1)
+    {
+        console.warn("link: op1 is null ");
+        return;
+    }
+    if (!op2)
+    {
+        console.warn("link: op2 is null");
+        return;
+    }
+
+    const port1 = op1.getPort(port1Name, lowerCase);
+    const port2 = op2.getPort(port2Name, lowerCase);
+
+    if (!port1)
+    {
+        console.warn("port1 not found! " + port1Name + "(" + op1.objName + ")");
+        return;
+    }
+
+    if (!port2)
+    {
+        console.warn("port2 not found! " + port2Name + " of " + op2.name + "(" + op2.objName + ")", op2);
+        return;
+    }
+
+    if (!port1.shouldLink(port1, port2) || !port2.shouldLink(port1, port2))
+    {
+        return false;
+    }
+
+    if (Link.canLink(port1, port2))
+    {
+        const link = new Link(this);
+        link.link(port1, port2);
+
+        this.emitEvent("onLink", port1, port2, link, fromDeserialize);
+        return link;
+    }
+};
+
+Patch.prototype.serialize = function (options)
+{
+    const obj = {};
+
+    options = options || {};
+    obj.ops = [];
+    obj.settings = this.settings;
+    for (const i in this.ops)
+    {
+        const op = this.ops[i];
+        obj.ops.push(op.getSerialized());
+    }
+
+    cleanJson(obj);
+
+    if (options.asObject) return obj;
+    return JSON.stringify(obj);
+};
+
+Patch.prototype.getOpsByRefId = function (refId)
+{
+    const perf = CABLES.UI.uiProfiler.start("[corepatchetend] getOpsByRefId");
+    const refOps = [];
+    const ops = gui.corePatch().ops;
+    for (let i = 0; i < ops.length; i++)
+        if (ops[i].storage && ops[i].storage.ref == refId) refOps.push(ops[i]);
+    perf.finish();
+    return refOps;
+};
+
+
+Patch.prototype.getOpById = function (opid)
+{
+    return this._opIdCache[opid];
+};
+
+Patch.prototype.getOpsByName = function (name)
+{
+    // TODO: is this still needed ? unclear behaviour....
+    const arr = [];
+    for (const i in this.ops)
+        if (this.ops[i].name == name) arr.push(this.ops[i]);
+    return arr;
+};
+
+Patch.prototype.getOpsByObjName = function (name)
+{
+    const arr = [];
+    for (const i in this.ops)
+        if (this.ops[i].objName == name) arr.push(this.ops[i]);
+    return arr;
+};
+
+Patch.prototype.getOpsByOpId = function (opid)
+{
+    const arr = [];
+    for (const i in this.ops)
+        if (this.ops[i].opId == opid) arr.push(this.ops[i]);
+    return arr;
+};
+
+Patch.prototype.loadLib = function (which)
+{
+    ajaxSync(
+        "/ui/libs/" + which + ".js",
+        (err, res) =>
+        {
+            const se = document.createElement("script");
+            se.type = "text/javascript";
+            se.text = res;
+            document.getElementsByTagName("head")[0].appendChild(se);
+        },
+        "GET",
+    );
+    // open and send a synchronous request
+    // xhrObj.open('GET', '/ui/libs/'+which+'.js', false);
+    // xhrObj.send('');
+    // add the returned content to a newly created script tag
+};
+
+
+Patch.prototype.getSubPatchOp = function (patchId, objName)
+{
+    for (const i in this.ops)
+        if (this.ops[i].uiAttribs && this.ops[i].uiAttribs.subPatch == patchId && this.ops[i].objName == objName)
+            return this.ops[i];
+    return false;
+};
+
+Patch.prototype._addLink = function (opinid, opoutid, inName, outName)
+{
+    return this.link(this.getOpById(opinid), inName, this.getOpById(opoutid), outName, false, true);
+};
+
+Patch.prototype.deSerialize = function (obj, options)
+{
+    options = options || { "genIds": false, "createRef": false };
+    if (this.aborted) return;
+    const newOps = [];
+    const loadingId = this.loading.start("core", "deserialize");
+
+    this.namespace = obj.namespace || "";
+    this.name = obj.name || "";
+
+    if (typeof obj === "string") obj = JSON.parse(obj);
+
+    this.settings = obj.settings;
+
+    this.emitEvent("patchLoadStart");
+
+    if (window.logStartup)logStartup("add " + obj.ops.length + " ops... ");
+
+    const addedOps = [];
+    // add ops...
+    for (let iop = 0; iop < obj.ops.length; iop++)
+    {
+        const start = CABLES.now();
+        const opData = obj.ops[iop];
+        let op = null;
+
+        try
+        {
+            if (opData.opId) op = this.addOp(opData.opId, opData.uiAttribs, opData.id, true, opData.objName);
+            else op = this.addOp(opData.objName, opData.uiAttribs, opData.id, true);
+        }
+        catch (e)
+        {
+            console.log("[instancing error] op data:", opData, e);
+            throw new Error("could not create op by id: <b>" + (opData.objName || opData.opId) + "</b> (" + opData.id + ")");
+        }
+
+        if (op)
+        {
+            addedOps.push(op);
+            if (options.genIds) op.id = shortId();
+            op.portsInData = opData.portsIn;
+            op._origData = JSON.parse(JSON.stringify(opData));
+            op.storage = opData.storage;
+            // if (opData.hasOwnProperty("disabled"))op.setEnabled(!opData.disabled);
+
+            for (const ipi in opData.portsIn)
+            {
+                const objPort = opData.portsIn[ipi];
+                if (objPort && objPort.hasOwnProperty("name"))
+                {
+                    // console.log("load poirt data,objPort", objPort.name, objPort);
+                    const port = op.getPort(objPort.name);
+
+                    if (port && (port.uiAttribs.display == "bool" || port.uiAttribs.type == "bool") && !isNaN(objPort.value)) objPort.value = objPort.value == true ? 1 : 0;
+                    if (port && objPort.value !== undefined && port.type != CONSTANTS.OP.OP_PORT_TYPE_TEXTURE) port.set(objPort.value);
+
+                    if (port)
+                    {
+                        port.deSerializeSettings(objPort);
+                    }
+                    else
+                    {
+                        console.log("preserve", objPort.name, objPort.value);
+                        op.preservedPortValues = op.preservedPortValues || {};
+                        op.preservedPortValues[objPort.name] = objPort.value;
+                    }
+                }
+            }
+
+            for (const ipo in opData.portsOut)
+            {
+                const objPort = opData.portsOut[ipo];
+                if (objPort && objPort.hasOwnProperty("name"))
+                {
+                    const port2 = op.getPort(objPort.name);
+                    if (port2 && port2.type != CONSTANTS.OP.OP_PORT_TYPE_TEXTURE && objPort.hasOwnProperty("value"))
+                        port2.set(obj.ops[iop].portsOut[ipo].value);
+
+                    if (port2 && objPort.expose) port2.setUiAttribs({ "expose": true });
+                }
+            }
+            newOps.push(op);
+        }
+
+        const timeused = Math.round(100 * (CABLES.now() - start)) / 100;
+        if (!this.silent && timeused > 5) console.log("long op init ", obj.ops[iop].objName, timeused);
+    }
+    if (window.logStartup)logStartup("add ops done");
+
+    for (const i in this.ops)
+    {
+        if (this.ops[i].onLoadedValueSet)
+        {
+            this.ops[i].onLoadedValueSet(this.ops[i]._origData);
+            this.ops[i].onLoadedValueSet = null;
+            this.ops[i]._origData = null;
+        }
+        this.ops[i].emitEvent("loadedValueSet");
+    }
+
+    if (window.logStartup)logStartup("creating links");
+
+    if (options.opsCreated)options.opsCreated(addedOps);
+    // create links...
+    if (obj.ops)
+    {
+        for (let iop = 0; iop < obj.ops.length; iop++)
+        {
+            if (obj.ops[iop].portsIn)
+            {
+                for (let ipi2 = 0; ipi2 < obj.ops[iop].portsIn.length; ipi2++)
+                {
+                    if (obj.ops[iop].portsIn[ipi2] && obj.ops[iop].portsIn[ipi2].links)
+                    {
+                        for (let ili = 0; ili < obj.ops[iop].portsIn[ipi2].links.length; ili++)
+                        {
+                            const l = this._addLink(
+                                obj.ops[iop].portsIn[ipi2].links[ili].objIn,
+                                obj.ops[iop].portsIn[ipi2].links[ili].objOut,
+                                obj.ops[iop].portsIn[ipi2].links[ili].portIn,
+                                obj.ops[iop].portsIn[ipi2].links[ili].portOut);
+
+                            console.log("aaaa", l);
+
+
+                            // const took = performance.now - startTime;
+                            // if (took > 100)console.log(obj().ops[iop].portsIn[ipi2].links[ili].objIn, obj.ops[iop].portsIn[ipi2].links[ili].objOut, took);
+                        }
+                    }
+                }
+            }
+            if (obj.ops[iop].portsOut)
+                for (let ipi2 = 0; ipi2 < obj.ops[iop].portsOut.length; ipi2++)
+                    if (obj.ops[iop].portsOut[ipi2] && obj.ops[iop].portsOut[ipi2].links)
+                    {
+                        for (let ili = 0; ili < obj.ops[iop].portsOut[ipi2].links.length; ili++)
+                        {
+                            if (obj.ops[iop].portsOut[ipi2].links[ili])
+                            {
+                                if (obj.ops[iop].portsOut[ipi2].links[ili].subOpRef)
+                                {
+                                    // lost link
+                                    const outOp = this.getOpById(obj.ops[iop].portsOut[ipi2].links[ili].objOut);
+                                    let dstOp = null;
+                                    let theSubPatch = 0;
+
+                                    for (let i = 0; i < this.ops.length; i++)
+                                    {
+                                        if (
+                                            this.ops[i].storage &&
+                                            this.ops[i].storage.ref == obj.ops[iop].portsOut[ipi2].links[ili].subOpRef &&
+                                            outOp.uiAttribs.subPatch == this.ops[i].uiAttribs.subPatch
+                                        )
+                                        {
+                                            theSubPatch = this.ops[i].patchId.get();
+                                            break;
+                                        }
+                                    }
+
+                                    for (let i = 0; i < this.ops.length; i++)
+                                    {
+                                        if (
+                                            this.ops[i].storage &&
+                                            this.ops[i].storage.ref == obj.ops[iop].portsOut[ipi2].links[ili].refOp &&
+                                            this.ops[i].uiAttribs.subPatch == theSubPatch)
+                                        {
+                                            dstOp = this.ops[i];
+                                            break;
+                                        }
+                                    }
+
+                                    if (!dstOp) this._log.warn("could not find op for lost link");
+                                    else
+                                    {
+                                        const l = this._addLink(
+                                            dstOp.id,
+                                            obj.ops[iop].portsOut[ipi2].links[ili].objOut,
+
+                                            obj.ops[iop].portsOut[ipi2].links[ili].portIn,
+                                            obj.ops[iop].portsOut[ipi2].links[ili].portOut);
+                                    }
+                                }
+                                else
+                                {
+                                    const l = this._addLink(obj.ops[iop].portsOut[ipi2].links[ili].objIn, obj.ops[iop].portsOut[ipi2].links[ili].objOut, obj.ops[iop].portsOut[ipi2].links[ili].portIn, obj.ops[iop].portsOut[ipi2].links[ili].portOut);
+
+                                    if (!l)
+                                    {
+                                        const op1 = this.getOpById(obj.ops[iop].portsOut[ipi2].links[ili].objIn);
+                                        const op2 = this.getOpById(obj.ops[iop].portsOut[ipi2].links[ili].objOut);
+
+                                        if (!op1)console.log("could not find link op1");
+                                        if (!op2)console.log("could not find link op2");
+
+                                        const p1Name = obj.ops[iop].portsOut[ipi2].links[ili].portIn;
+
+                                        if (op1 && !op1.getPort(p1Name))
+                                        {
+                                            console.log("PRESERVE port 1 not found", p1Name);
+
+                                            op1.preservedPortLinks[p1Name] = op1.preservedPortLinks[p1Name] || [];
+                                            op1.preservedPortLinks[p1Name].push(obj.ops[iop].portsOut[ipi2].links[ili]);
+                                        }
+
+                                        const p2Name = obj.ops[iop].portsOut[ipi2].links[ili].portOut;
+                                        if (op2 && !op2.getPort(p2Name))
+                                        {
+                                            console.log("PRESERVE port 2 not found", obj.ops[iop].portsOut[ipi2].links[ili].portOut);
+                                            op2.preservedPortLinks[p1Name] = op2.preservedPortLinks[p1Name] || [];
+                                            op2.preservedPortLinks[p1Name].push(obj.ops[iop].portsOut[ipi2].links[ili]);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+        }
+    }
+
+    if (window.logStartup)logStartup("calling ops onloaded");
+
+    for (const i in this.ops)
+    {
+        if (this.ops[i].onLoaded)
+        {
+            // TODO: deprecate!!!
+            this.ops[i].onLoaded();
+            this.ops[i].onLoaded = null;
+        }
+    }
+
+    if (window.logStartup)logStartup("initializing ops...");
+    for (const i in this.ops)
+    {
+        if (this.ops[i].init)
+        {
+            this.ops[i].init();
+            this.ops[i].init = null;
+        }
+    }
+
+    if (window.logStartup)logStartup("initializing vars...");
+
+    if (this.config.variables)
+        for (const varName in this.config.variables)
+            this.setVarValue(varName, this.config.variables[varName]);
+
+    if (window.logStartup)logStartup("initializing var ports");
+
+    for (const i in this.ops)
+    {
+        this.ops[i].initVarPorts();
+        delete this.ops[i].uiAttribs.pasted;
+    }
+
+    setTimeout(() => { this.loading.finished(loadingId); }, 100);
+
+    if (window.logStartup)logStartup("calling onPatchLoaded/patchLoadEnd");
+
+    if (this.config.onPatchLoaded) this.config.onPatchLoaded(this);
+
+    this.deSerialized = true;
+    this.emitEvent("patchLoadEnd", newOps, obj, options.genIds);
+};
+
+Patch.prototype.profile = function (enable)
+{
+    this.profiler = new Profiler(this);
+    for (const i in this.ops)
+    {
+        this.ops[i].profile(enable);
+    }
+};
+
+// ----------------------
+
+/**
+ * set variable value
+ * @function setVariable
+ * @memberof Patch
+ * @instance
+ * @param {String} name of variable
+ * @param {Number|String|Boolean} value
+ */
+Patch.prototype.setVariable = function (name, val)
+{
+    // if (this._variables.hasOwnProperty(name))
+    if (this._variables[name] !== undefined)
+    {
+        this._variables[name].setValue(val);
+    }
+    else
+    {
+        console.log("variable " + name + " not found!");
+    }
+};
+
+Patch.prototype._sortVars = function ()
+{
+    if (!this.isEditorMode()) return;
+    const ordered = {};
+    Object.keys(this._variables).sort(
+        (a, b) =>
+        { return a.localeCompare(b, "en", { "sensitivity": "base" }); }
+    ).forEach((key) =>
+    {
+        ordered[key] = this._variables[key];
+    });
+    this._variables = ordered;
+};
+
+/**
+ * has variable
+ * @function hasVariable
+ * @memberof Patch
+ * @instance
+ * @param {String} name of variable
+ */
+Patch.prototype.hasVar = function (name)
+{
+    return this._variables[name] !== undefined;
+
+    // return this._variables.hasOwnProperty(name);
+};
+
+// used internally
+Patch.prototype.setVarValue = function (name, val, type)
+{
+    if (this.hasVar(name))
+    {
+        this._variables[name].setValue(val);
+    }
+    else
+    {
+        this._variables[name] = new core_variable(name, val, type);
+        this._sortVars();
+        this.emitEvent("variablesChanged");
+    }
+    return this._variables[name];
+};
+// old?
+Patch.prototype.getVarValue = function (name, val)
+{
+    if (this._variables.hasOwnProperty(name)) return this._variables[name].getValue();
+};
+
+/**
+ * @function getVar
+ * @memberof Patch
+ * @instance
+ * @param {String} name
+ * @return {Variable} variable
+ */
+Patch.prototype.getVar = function (name)
+{
+    if (this._variables.hasOwnProperty(name)) return this._variables[name];
+};
+
+
+Patch.prototype.deleteVar = function (name)
+{
+    for (let i = 0; i < this.ops.length; i++)
+        for (let j = 0; j < this.ops[i].portsIn.length; j++)
+            if (this.ops[i].portsIn[j].getVariableName() == name)
+                this.ops[i].portsIn[j].setVariable(null);
+
+    delete this._variables[name];
+    this.emitEvent("variableDeleted", name);
+    this.emitEvent("variablesChanged");
+};
+
+/**
+ * @function getVars
+ * @memberof Patch
+ * @instance
+ * @return {Array<Variable>} variables
+ * @function
+ */
+Patch.prototype.getVars = function (t)
+{
+    if (t === undefined) return this._variables;
+
+    const vars = [];
+    if (t == CABLES.OP_PORT_TYPE_STRING) t = "string";
+    if (t == CABLES.OP_PORT_TYPE_VALUE) t = "number";
+    if (t == CABLES.OP_PORT_TYPE_ARRAY) t = "array";
+    if (t == CABLES.OP_PORT_TYPE_OBJECT) t = "object";
+
+    for (const i in this._variables)
+    {
+        if (!this._variables[i].type || this._variables[i].type == t) vars.push(this._variables[i]);
+    }
+    return vars;
+};
+
+/**
+ * @function exitError
+ * @memberof Patch
+ * @instance
+ * @description cancel patch execution and quit showing an errormessage
+ * @function
+ */
+Patch.prototype.exitError = function (errorId, errorMessage, ex)
+{
+    this.aborted = true;
+
+    if (this && this.config && this.config.onError)
+    {
+        this.config.onError(errorId, errorMessage);
+    }
+    else
+    {
+        if (!this.isEditorMode())
+        {
+            const newDiv = document.createElement("div");
+
+            const rect = this.cgl.canvas.getBoundingClientRect();
+
+            newDiv.setAttribute("style", "position:absolute;border:5px solid red;padding:15px;background-color:black;color:white;font-family:monospace;");
+            newDiv.style.top = rect.top + "px";
+            newDiv.style.left = rect.left + "px";
+            let str = "cables - An error occured:<br/>";
+            str += "[" + errorId + "] - " + errorMessage;
+            if (ex)str += "<br/>Exception: " + ex.message;
+            newDiv.innerHTML = str;
+
+            const pe = this.cgl.canvas.parentElement;
+
+            while (pe.hasChildNodes()) pe.removeChild(pe.lastChild);
+
+            document.body.appendChild(newDiv);
+        }
+    }
+};
+
+/**
+ * @function preRenderOps
+ * @memberof Patch
+ * @instance
+ * @description invoke pre rendering of ops
+ * @function
+ */
+Patch.prototype.preRenderOps = function ()
+{
+    this._log.log("prerendering...");
+
+    for (let i = 0; i < this.ops.length; i++)
+    {
+        if (this.ops[i].preRender)
+        {
+            this.ops[i].preRender();
+            this._log.log("prerender " + this.ops[i].objName);
+        }
+    }
+};
+
+/**
+ * @function dispose
+ * @memberof Patch
+ * @instance
+ * @description stop, dispose and cleanup patch
+ */
+Patch.prototype.dispose = function ()
+{
+    this.pause();
+    this.clear();
+    this.cgl.dispose();
+};
+
+Patch.prototype.pushTriggerStack = function (p)
+{
+    this._triggerStack.push(p);
+};
+
+Patch.prototype.popTriggerStack = function ()
+{
+    this._triggerStack.pop();
+};
+
+Patch.prototype.printTriggerStack = function ()
+{
+    if (this._triggerStack.length == 0)
+    {
+        // console.log("stack length", this._triggerStack.length); // eslint-disable-line
+        return;
+    }
+    console.groupCollapsed( // eslint-disable-line
+        "trigger port stack " + this._triggerStack[this._triggerStack.length - 1].op.name + "." + this._triggerStack[this._triggerStack.length - 1].name,
+    );
+
+    const rows = [];
+    for (let i = 0; i < this._triggerStack.length; i++)
+    {
+        rows.push(i + ". " + this._triggerStack[i].op.name + " " + this._triggerStack[i].name);
+    }
+
+    console.table(rows); // eslint-disable-line
+    console.groupEnd(); // eslint-disable-line
+};
+
+/**
+ * returns document object of the patch could be != global document object when opening canvas ina popout window
+ * @function getDocument
+ * @memberof Patch
+ * @instance
+ * @return {Object} document
+ */
+Patch.prototype.getDocument = function ()
+{
+    return this.cgl.canvas.ownerDocument;
+};
+
+Patch.replaceOpIds = function (json, options)
+{
+    const opids = {};
+    for (const i in json.ops)
+    {
+        opids[json.ops[i].id] = json.ops[i];
+    }
+
+    for (const j in json.ops)
+    {
+        for (const k in json.ops[j].portsOut)
+        {
+            const links = json.ops[j].portsOut[k].links;
+            if (links)
+            {
+                let l = links.length;
+
+                while (l--)
+                {
+                    if (links[l] && (!opids[links[l].objIn] || !opids[links[l].objOut]))
+                    {
+                        if (!options.doNotUnlinkLostLinks)
+                        {
+                            links.splice(l, 1);
+                        }
+                        else
+                        {
+                            if (options.fixLostLinks)
+                            {
+                                // console.log("lost link...?", links[l]);
+                                const op = gui.corePatch().getOpById(links[l].objIn);
+                                if (!op) console.log("op not found!");
+                                else
+                                {
+                                    const outerOp = gui.patchView.getSubPatchOuterOp(op.uiAttribs.subPatch);
+                                    if (outerOp)
+                                    {
+                                        op.storage = op.storage || {};
+                                        op.storage.ref = op.storage.ref || CABLES.shortId();
+                                        links[l].refOp = op.storage.ref;
+                                        links[l].subOpRef = outerOp.storage.ref;
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+
+    for (const i in json.ops)
+    {
+        const op = json.ops[i];
+        const oldId = op.id;
+        let newId = CABLES.shortId();
+
+        if (options.prefixHash) newId = prefixedHash(options.prefixHash + oldId);
+
+        else if (options.prefixId) newId = options.prefixId + oldId;
+        else if (options.refAsId) // when saving json
+        {
+            if (op.storage && op.storage.ref)
+            {
+                newId = op.storage.ref;
+                delete op.storage.ref;
+            }
+            else
+            {
+                op.storage = op.storage || {};
+                op.storage.ref = newId = CABLES.shortId();
+            }
+        }
+
+        const newID = op.id = newId;
+
+        if (options.oldIdAsRef) // when loading json
+        {
+            op.storage = op.storage || {};
+            op.storage.ref = oldId;
+        }
+
+        for (const j in json.ops)
+        {
+            if (json.ops[j].portsIn)
+                for (const k in json.ops[j].portsIn)
+                {
+                    if (json.ops[j].portsIn[k].links)
+                    {
+                        let l = json.ops[j].portsIn[k].links.length;
+
+                        while (l--) if (json.ops[j].portsIn[k].links[l] === null) json.ops[j].portsIn[k].links.splice(l, 1);
+
+                        for (l in json.ops[j].portsIn[k].links)
+                        {
+                            if (json.ops[j].portsIn[k].links[l].objIn === oldId) json.ops[j].portsIn[k].links[l].objIn = newID;
+                            if (json.ops[j].portsIn[k].links[l].objOut === oldId) json.ops[j].portsIn[k].links[l].objOut = newID;
+                        }
+                    }
+                }
+
+            if (json.ops[j].portsOut)
+                for (const k in json.ops[j].portsOut)
+                {
+                    if (json.ops[j].portsOut[k].links)
+                    {
+                        let l = json.ops[j].portsOut[k].links.length;
+
+                        while (l--) if (json.ops[j].portsOut[k].links[l] === null) json.ops[j].portsOut[k].links.splice(l, 1);
+
+                        for (l in json.ops[j].portsOut[k].links)
+                        {
+                            if (json.ops[j].portsOut[k].links[l].objIn === oldId) json.ops[j].portsOut[k].links[l].objIn = newID;
+                            if (json.ops[j].portsOut[k].links[l].objOut === oldId) json.ops[j].portsOut[k].links[l].objOut = newID;
+                        }
+                    }
+                }
+        }
+    }
+
+    // set correct subpatch
+    const subpatchIds = [];
+    const fixedSubPatches = [];
+
+    for (let i = 0; i < json.ops.length; i++)
+    {
+        // if (CABLES.Op.isSubPatchOpName(json.ops[i].objName))
+        if (json.ops[i].storage && json.ops[i].storage.subPatchVer)
+        {
+            for (const k in json.ops[i].portsIn)
+            {
+                if (json.ops[i].portsIn[k].name === "patchId")
+                {
+                    let newId = shortId();
+
+                    if (options.prefixHash) newId = prefixedHash(options.prefixHash + json.ops[i].portsIn[k].value);
+
+                    const oldSubPatchId = json.ops[i].portsIn[k].value;
+                    const newSubPatchId = json.ops[i].portsIn[k].value = newId;
+
+                    subpatchIds.push(newSubPatchId);
+
+                    for (let j = 0; j < json.ops.length; j++)
+                    {
+                        // op has no uiAttribs in export, we don't care about subpatches in export though
+                        if (json.ops[j].uiAttribs)
+                        {
+                            if (json.ops[j].uiAttribs.subPatch === oldSubPatchId)
+                            {
+                                json.ops[j].uiAttribs.subPatch = newSubPatchId;
+                                fixedSubPatches.push(json.ops[j].id);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    for (const kk in json.ops)
+    {
+        let found = false;
+        for (let j = 0; j < fixedSubPatches.length; j++)
+        {
+            if (json.ops[kk].id === fixedSubPatches[j])
+            {
+                found = true;
+                break;
+            }
+        }
+        // op has no uiAttribs in export, we don't care about subpatches in export though
+        if (!found && json.ops[kk].uiAttribs && options.parentSubPatchId != null)
+            json.ops[kk].uiAttribs.subPatch = options.parentSubPatchId;
+    }
+
+    return json;
+};
+
+/**
+ * remove an eventlistener
+ * @instance
+ * @function addEventListener
+ * @param {String} name of event
+ * @param {function} callback
+ */
+
+/**
+ * remove an eventlistener
+ * @instance
+ * @function removeEventListener
+ * @param {String} name of event
+ * @param {function} callback
+ */
+
+/**
+ * op added to patch event
+ * @event onOpAdd
+ *
+ * @memberof Patch
+ * @type {Object}
+ * @property {Op} op new op
+ */
+
+/**
+ * op deleted from patch
+ * @event onOpDelete
+ * @memberof Patch
+ * @type {Object}
+ * @property {Op} op that will be deleted
+ */
+
+/**
+ * link event - two ports will be linked
+ * @event onLink
+ * @memberof Patch
+ * @type {Object}
+ * @property {Port} port1
+ * @property {Port} port2
+ */
+
+/**
+ * unlink event - a link was deleted
+ * @event onUnLink
+ * @memberof Patch
+ * @type {Object}
+ */
+
+/**
+ * variables has been changed / a variable has been added to the patch
+ * @event variablesChanged
+ * @memberof Patch
+ * @type {Object}
+ * @property {Port} port1
+ * @property {Port} port2
+ */
+
+/**
+ * configuration object for loading a patch
+ * @typedef {Object} PatchConfig
+ * @hideconstructor
+ * @property {String} [prefixAssetPath=''] prefix for path to assets
+ * @property {String} [assetPath=''] path to assets
+ * @property {String} [jsPath=''] path to javascript files
+ * @property {String} [glCanvasId='glcanvas'] dom element id of canvas element
+ * @property {Function} [onError=null] called when an error occurs
+ * @property {Function} [onFinishedLoading=null] called when patch finished loading all assets
+ * @property {Function} [onFirstFrameRendered=null] called when patch rendered it's first frame
+ * @property {Boolean} [glCanvasResizeToWindow=false] resize canvas automatically to window size
+ * @property {Boolean} [doRequestAnimation=true] do requestAnimationFrame set to false if you want to trigger exec() from outside (only do if you know what you are doing)
+ * @property {Boolean} [clearCanvasColor=true] clear canvas in transparent color every frame
+ * @property {Boolean} [clearCanvasDepth=true] clear depth every frame
+ * @property {Boolean} [glValidateShader=true] enable/disable validation of shaders *
+ * @property {Boolean} [silent=false]
+ * @property {Number} [fpsLimit=0] 0 for maximum possible frames per second
+ * @property {String} [glslPrecision='mediump'] default precision for glsl shader
+ *
+ */
+
+/* harmony default export */ const core_patch = (Patch);
+
+
+;// CONCATENATED MODULE: ./src/core/embedding.js
+
+
+
+const EMBED = {};
+
+/**
+ * add patch into html element (will create canvas and set size to fill containerElement)
+ * @name CABLES.EMBED#addPatch
+ * @param {object|string} containerElement dom element or id of element
+ * @param {options} patch options
+ * @function
+ */
+EMBED.addPatch = function (_element, options)
+{
+    let el = _element;
+    let id = generateUUID();
+    if (typeof _element == "string")
+    {
+        id = _element;
+        el = document.getElementById(id);
+
+        if (!el)
+        {
+            console.error(id + " Polyshape Container Element not found!");
+            return;
+        }
+    }
+
+    const canvEl = document.createElement("canvas");
+    canvEl.id = "glcanvas_" + id;
+    canvEl.width = el.clientWidth;
+    canvEl.height = el.clientHeight;
+
+    window.addEventListener(
+        "resize",
+        function ()
+        {
+            this.setAttribute("width", el.clientWidth);
+            this.height = el.clientHeight;
+        }.bind(canvEl),
+    );
+
+    el.appendChild(canvEl);
+
+    options = options || {};
+    options.glCanvasId = canvEl.id;
+
+    if (!options.onError)
+    {
+        options.onError = function (err)
+        {
+            console.error(err);
+        };
+    }
+
+    CABLES.patch = new core_patch(options);
+    return canvEl;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/webaudio.js
+/** @namespace WEBAUDIO */
+
+
+
+const WEBAUDIO = {};
+
+WEBAUDIO.toneJsInitialized = false;
+
+/*
+ * External JSDoc definitions
+ */
+
+/**
+ * Part of the Web Audio API, the AudioBuffer interface represents a short audio asset residing in memory.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/AudioBuffer}
+ */
+
+/**
+ * Part of the Web Audio API, the AudioNode interface is a generic interface for representing an audio processing module.
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/AudioNode}
+ */
+
+/**
+ * The AudioContext interface represents an audio-processing graph built from audio modules linked together
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/AudioContext}
+ */
+
+/**
+ * Checks if a global audio context has been created and creates
+ * it if necessary. This audio context can be used for native Web Audio as well as Tone.js ops.
+ * Associates the audio context with Tone.js if it is being used
+ * @param {CABLES.Op} op - The operator which needs the Audio Context
+ */
+WEBAUDIO.createAudioContext = function (op)
+{
+    window.AudioContext = window.AudioContext || window.webkitAudioContext;
+    if (window.AudioContext)
+    {
+        if (!window.audioContext)
+        {
+            window.audioContext = new AudioContext();
+        }
+        // check if tone.js lib is being used
+        if (window.Tone && !WEBAUDIO.toneJsInitialized)
+        {
+            // set current audio context in tone.js
+            Tone.setContext(window.audioContext);
+            WEBAUDIO.toneJsInitialized = true;
+        }
+    }
+    else
+    {
+        op.patch.config.onError("NO_WEBAUDIO", "Web Audio is not supported in this browser.");
+        return;
+    }
+    return window.audioContext;
+};
+
+/**
+ * Returns the audio context.
+ * Before `createAudioContext` must have been called at least once.
+ * It most cases you should use `createAudioContext`, which just returns the audio context
+ * when it has been created already.
+ */
+WEBAUDIO.getAudioContext = function ()
+{
+    return window.audioContext;
+};
+
+/**
+ * Creates an audio in port for the op with name `portName`
+ * When disconnected it will disconnect the previous connected audio node
+ * from the op's audio node.
+ * @param {CABLES.Op} op - The operator to create the audio port in
+ * @param {string} portName - The name of the port
+ * @param {AudioNode} audioNode - The audionode incoming connections should connect to
+ * @param {number} [inputChannelIndex=0] - If the audio node has multiple inputs, this is the index of the input channel to connect to
+ * @returns {CABLES.Port|undefined} - The newly created audio in port or `undefined` if there was an error
+ */
+WEBAUDIO.createAudioInPort = function (op, portName, audioNode, inputChannelIndex)
+{
+    if (!op || !portName || !audioNode)
+    {
+        const msg = "ERROR: createAudioInPort needs three parameters, op, portName and audioNode";
+        op.log(msg);
+        throw new Error(msg);
+        // return;
+    }
+    if (!inputChannelIndex)
+    {
+        inputChannelIndex = 0;
+    }
+    op.webAudio = op.webAudio || {};
+    op.webAudio.audioInPorts = op.webAudio.audioInPorts || [];
+    const port = op.inObject(portName);
+    port.webAudio = {};
+    port.webAudio.previousAudioInNode = null;
+    port.webAudio.audioNode = audioNode;
+
+    op.webAudio.audioInPorts[portName] = port;
+
+    port.onChange = function ()
+    {
+        const audioInNode = port.get();
+        // when port disconnected, disconnect audio nodes
+        if (!audioInNode)
+        {
+            if (port.webAudio.previousAudioInNode)
+            {
+                try
+                {
+                    if (port.webAudio.previousAudioInNode.disconnect) port.webAudio.previousAudioInNode.disconnect(port.webAudio.audioNode, 0, inputChannelIndex);
+                    op.setUiError("audioCtx", null);
+                }
+                catch (e)
+                {
+                    try
+                    {
+                        port.webAudio.previousAudioInNode.disconnect(port.webAudio.audioNode);
+                    }
+                    catch (er)
+                    {
+                        op.log(
+                            "Disconnecting audio node with in/out port index, as well as without in/out-port-index did not work ",
+                            e,
+                        );
+                        if (e.printStackTrace)
+                        {
+                            e.printStackTrace();
+                        }
+                        throw e;
+                    }
+                }
+            }
+        }
+        else
+        {
+            try
+            {
+                if (audioInNode.connect)
+                {
+                    audioInNode.connect(port.webAudio.audioNode, 0, inputChannelIndex);
+                    op.setUiError("audioCtx", null);
+                }
+                else op.setUiError("audioCtx", "The passed input is not an audio context. Please make sure you connect an audio context to the input.", 2);
+            }
+            catch (e)
+            {
+                op.log("Error: Failed to connect web audio node!", e);
+                op.log("port.webAudio.audioNode", port.webAudio.audioNode);
+                op.log("audioInNode: ", audioInNode);
+                op.log("inputChannelIndex:", inputChannelIndex);
+                op.log("audioInNode.connect: ", audioInNode.connect);
+                throw e;
+            }
+        }
+        port.webAudio.previousAudioInNode = audioInNode;
+    };
+    // TODO: Maybe add subtype to audio-node-object?
+    return port;
+};
+
+/**
+ * Sometimes it is necessary to replace a node of a port, if so all
+ * connections to this node must be disconnected and connections to the new
+ * node must be made.
+ * Can be used for both Audio ports as well as AudioParam ports
+ * if used with an AudioParam pass e.g. `synth.frequency` as newNode
+ * @param {CABLES.Port} port - The port where the audio node needs to be replaced
+ */
+WEBAUDIO.replaceNodeInPort = function (port, oldNode, newNode)
+{
+    const connectedNode = port.webAudio.previousAudioInNode;
+    // check if connected
+    if (connectedNode && connectedNode.disconnect)
+    {
+        try
+        {
+            connectedNode.disconnect(oldNode);
+        }
+        catch (e)
+        {
+            if (e.printStackTrace)
+            {
+                e.printStackTrace();
+            }
+            throw new Error("replaceNodeInPort: Could not disconnect old audio node. " + e.name + " " + e.message);
+        }
+        port.webAudio.audioNode = newNode;
+        try
+        {
+            connectedNode.connect(newNode);
+        }
+        catch (e)
+        {
+            if (e.printStackTrace)
+            {
+                e.printStackTrace();
+            }
+            throw new Error("replaceNodeInPort: Could not connect to new node. " + e.name + " " + e.message);
+        }
+    }
+};
+
+/**
+ * Creates an audio out port which takes care of (dis-)connecting on it’s own
+ * @param {CABLES.op} op - The op to create an audio out port for
+ * @param {string} portName - The name of the port to be created
+ * @param {AudioNode} audioNode - The audio node to link to the port
+ * @returns {(CABLES.Port|undefined)} - The newly created audio out port or `undefined` if there was an error
+ */
+WEBAUDIO.createAudioOutPort = function (op, portName, audioNode)
+{
+    if (!op || !portName || !audioNode)
+    {
+        const msg = "ERROR: createAudioOutPort needs three parameters, op, portName and audioNode";
+        op.log(msg);
+        throw new Error(msg);
+    }
+
+    const port = op.outObject(portName);
+    // TODO: Maybe add subtype to audio-node-object?
+    port.set(audioNode);
+    return port;
+};
+
+/**
+ * Creates an audio param in port for the op with name portName.
+ * The port accepts other audio nodes as signals as well as values (numbers)
+ * When the port is disconnected it will disconnect the previous connected audio node
+ * from the op's audio node and restore the number value set before.
+ * @param {CABLES.Op} op - The operator to create an audio param input port for
+ * @param {string} portName - The name of the port to create
+ * @returns {(CABLES.Port|undefined)} - The newly created port, which takes care of (dis-)connecting on its own, or `undefined` if there was an error
+ */
+WEBAUDIO.createAudioParamInPort = function (op, portName, audioNode, options, defaultValue)
+{
+    if (!op || !portName || !audioNode)
+    {
+        op.log("ERROR: createAudioParamInPort needs three parameters, op, portName and audioNode");
+        if (op && op.name) op.log("opname: ", op.name);
+        op.log("portName", portName);
+        op.log("audioNode: ", audioNode);
+        return;
+    }
+    op.webAudio = op.webAudio || {};
+    op.webAudio.audioInPorts = op.webAudio.audioInPorts || [];
+    // var port = op.inObject(portName);
+    const port = op.inDynamic(
+        portName,
+        [CONSTANTS.OP.OP_PORT_TYPE_VALUE, CONSTANTS.OP.OP_PORT_TYPE_OBJECT],
+        options,
+        defaultValue,
+    );
+    port.webAudio = {};
+    port.webAudio.previousAudioInNode = null;
+    port.webAudio.audioNode = audioNode;
+
+    op.webAudio.audioInPorts[portName] = port;
+
+    // port.onLinkChanged = function() {
+    //   op.log("onLinkChanged");
+    //   if(port.isLinked()) {
+    //
+    //       if(port.links[0].portOut.type === CABLES.CONSTANTS.OP.OP_PORT_TYPE_) { // value
+    //
+    //       } else if(port.links[0].portOut.type === CABLES.CONSTANTS.OP.OP_PORT_TYPE_OBJECT) { // object
+    //
+    //       }
+    //   } else { // unlinked
+    //
+    //   }
+    // };
+
+    port.onChange = function ()
+    {
+        const audioInNode = port.get();
+        const node = port.webAudio.audioNode;
+        const audioCtx = WEBAUDIO.getAudioContext();
+
+        if (audioInNode != undefined)
+        {
+            if (typeof audioInNode === "object" && audioInNode.connect)
+            {
+                try
+                {
+                    audioInNode.connect(node);
+                }
+                catch (e)
+                {
+                    op.log("Could not connect audio node: ", e);
+                    if (e.printStackTrace)
+                    {
+                        e.printStackTrace();
+                    }
+                    throw e;
+                }
+                port.webAudio.previousAudioInNode = audioInNode;
+            }
+            else
+            {
+                // tone.js audio param
+                if (node._param && node._param.minValue && node._param.maxValue)
+                {
+                    if (audioInNode >= node._param.minValue && audioInNode <= node._param.maxValue)
+                    {
+                        try
+                        {
+                            if (node.setValueAtTime)
+                            {
+                                node.setValueAtTime(audioInNode, audioCtx.currentTime);
+                            }
+                            else
+                            {
+                                node.value = audioInNode;
+                            }
+                        }
+                        catch (e)
+                        {
+                            op.log("Possible AudioParam problem with tone.js op: ", e);
+                            if (e.printStackTrace)
+                            {
+                                e.printStackTrace();
+                            }
+                            throw e;
+                        }
+                    }
+                    else
+                    {
+                        op.log("Warning: The value for an audio parameter is out of range!");
+                    }
+                } // native Web Audio param
+                else if (node.minValue && node.maxValue)
+                {
+                    if (audioInNode >= node.minValue && audioInNode <= node.maxValue)
+                    {
+                        try
+                        {
+                            if (node.setValueAtTime)
+                            {
+                                node.setValueAtTime(audioInNode, audioCtx.currentTime);
+                            }
+                            else
+                            {
+                                node.value = audioInNode;
+                            }
+                        }
+                        catch (e)
+                        {
+                            op.log(
+                                "AudioParam has minValue / maxValue defined, and value is in range, but setting the value failed! ",
+                                e,
+                            );
+                            if (e.printStackTrace)
+                            {
+                                e.printStackTrace();
+                            }
+                            throw e;
+                        }
+                    }
+                    else
+                    {
+                        op.log("Warning: The value for an audio parameter is out of range!");
+                    }
+                } // no min-max values, try anyway
+                else
+                {
+                    try
+                    {
+                        if (node.setValueAtTime)
+                        {
+                            node.setValueAtTime(audioInNode, audioCtx.currentTime);
+                        }
+                        else
+                        {
+                            node.value = audioInNode;
+                        }
+                    }
+                    catch (e)
+                    {
+                        op.log("Possible AudioParam problem (without minValue / maxValue): ", e);
+                        if (e.printStackTrace)
+                        {
+                            e.printStackTrace();
+                        }
+                        throw e;
+                    }
+                }
+
+                if (port.webAudio.previousAudioInNode && port.webAudio.previousAudioInNode.disconnect)
+                {
+                    try
+                    {
+                        port.webAudio.previousAudioInNode.disconnect(node);
+                    }
+                    catch (e)
+                    {
+                        op.log("Could not disconnect previous audio node: ", e);
+                        throw e;
+                    }
+                    port.webAudio.previousAudioInNode = undefined;
+                }
+            }
+        }
+        else
+        {
+            // disconnected
+            if (port.webAudio.previousAudioInNode)
+            {
+            }
+        }
+    };
+    return port;
+};
+
+
+/**
+ * Loads an audio file and updates the loading indicators when cables is run in the editor.
+ * @param {CABLES.Patch} patch - The cables patch, when called from inside an op this is `op.patch`
+ * @param {string} url - The url of the audio file to load
+ * @param {loadAudioFileFinishedCallback} onFinished - The callback to be called when the loading is finished, passes the AudioBuffer
+ * @param {loadAudioFileErrorCallback} onError - The callback when there was an error loading the file, the rror message is passed
+ * @see {@link https://developer.mozilla.org/de/docs/Web/API/AudioContext/decodeAudioData}
+ */
+WEBAUDIO.loadAudioFile = function (patch, url, onFinished, onError, loadingTask)
+{
+    const audioContext = WEBAUDIO.createAudioContext();
+
+    let loadingId = null;
+    if (loadingTask || loadingTask === undefined)
+    {
+        loadingId = patch.loading.start("audio", url);
+        if (patch.isEditorMode()) gui.jobs().start({ "id": "loadaudio" + loadingId, "title": " loading audio (" + url + ")" });
+    }
+    const request = new XMLHttpRequest();
+    if (!url)
+    {
+        return;
+    }
+    request.open("GET", url, true);
+    request.responseType = "arraybuffer";
+    // TODO: maybe crossorigin stuff needed?
+    // Decode asynchronously
+    request.onload = function ()
+    {
+        patch.loading.finished(loadingId);
+        if (patch.isEditorMode()) gui.jobs().finish("loadaudio" + loadingId);
+        audioContext.decodeAudioData(request.response, onFinished, onError);
+    };
+    request.send();
+};
+
+/**
+ * Checks if the passed time is a valid time to be used in any of the Tone.js ops.
+ * @param {(string|number)} t - The time to check
+ * @returns {boolean} - True if time is valid, false if not
+ */
+WEBAUDIO.isValidToneTime = function (t)
+{
+    try
+    {
+        const time = new Tone.Time(t);
+    }
+    catch (e)
+    {
+        return false;
+    }
+    return true;
+};
+
+/**
+ * Checks if the passed note is a valid note to be used with Tone.js
+ * @param {string} note - The note to be checked, e.g. `"C4"`
+ * @returns {boolean} - True if the note is a valid note, false otherwise
+ */
+WEBAUDIO.isValidToneNote = function (note)
+{
+    try
+    {
+        Tone.Frequency(note);
+    }
+    catch (e)
+    {
+        return false;
+    }
+    return true;
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/sessionvar.js
+// todo: old... remove this from ops...
+
+const Variable = function ()
+{
+    let value = null;
+    const changedCallbacks = [];
+
+    this.onChanged = function (f)
+    {
+        changedCallbacks.push(f);
+    };
+
+    this.getValue = function ()
+    {
+        return value;
+    };
+
+    this.setValue = function (v)
+    {
+        value = v;
+        this.emitChanged();
+    };
+
+    this.emitChanged = function ()
+    {
+        for (let i = 0; i < changedCallbacks.length; i++)
+        {
+            changedCallbacks[i]();
+        }
+    };
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/banchprofiler.js
+class Branch
+{
+    constructor(name)
+    {
+        this.name = name;
+        this.dur = 0;
+        this._startTime = 0;
+        this.childs = [];
+    }
+
+    start()
+    {
+        this._startTime = performance.now();
+    }
+
+    end()
+    {
+        this.dur = performance.now() - this._startTime;
+    }
+
+    push(name)
+    {
+        const b = new Branch(name);
+        this.childs.push(b);
+        b.start();
+        return b;
+    }
+
+    print(level)
+    {
+        level = level || 0;
+
+        let str = "";
+        for (let i = 0; i < level; i++) str += "  ";
+
+        for (let i = 0; i < this.childs.length; i++)
+        {
+            this.childs[i].print(level + 1);
+        }
+    }
+}
+
+// //////////////////////////////////////////
+
+class BranchStack
+{
+    constructor()
+    {
+    }
+
+    start()
+    {
+        this.root = new Branch("Root");
+        this.root.start();
+
+        this.current = this.root;
+    }
+
+    push(name)
+    {
+        if (!this.current) this.start();
+
+        const prev = this.current;
+        this.current = this.current.push(name);
+        this.current.prev = prev;
+        this.current.start();
+        return this.current;
+    }
+
+    pop()
+    {
+        if (!this.current) return;
+        this.current.end();
+        this.current = this.current.prev;
+    }
+
+    finish()
+    {
+        this.current.end();
+        this.root.print();
+        this.current = null;
+    }
+}
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_uniform.js
+
+
+class cgp_uniform_Uniform extends cg_uniform
+{
+    constructor(__shader, __type, __name, _value, _port2, _port3, _port4, _structUniformName, _structName, _propertyName)
+    {
+        super(__shader, __type, __name, _value, _port2, _port3, _port4, _structUniformName, _structName, _propertyName);
+        this._loc = -1;
+        this._cgl = __shader._cgl;
+    }
+
+
+    updateValueF() { }
+
+    setValueF(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValue2F() { }
+
+    setValue2F(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValue3F() { }
+
+    setValue3F(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    updateValue4F() { }
+
+    setValue4F(v)
+    {
+        this.needsUpdate = true;
+        this._value = v;
+    }
+
+    getSizeBytes()
+    {
+        if (this._type == "f") return 1 * 4;
+        if (this._type == "i") return 1 * 4;
+        if (this._type == "2i") return 2 * 4;
+        if (this._type == "2f") return 2 * 4;
+        if (this._type == "3f") return 3 * 4;
+        if (this._type == "4f") return 4 * 4;
+        if (this._type == "m4") return 4 * 4 * 4;
+
+        this._log.warn("unknown type getSizeBytes");
+        // if (this._type == "t") return "sampler2D";
+        // if (this._type == "tc") return "samplerCube";
+        // if (this._type == "b") return "bool";
+
+        // if (t == "3f[]") return null; // ignore this for now...
+        // if (t == "m4[]") return null; // ignore this for now...
+        // if (t == "f[]") return null; // ignore this for now...
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_shader.js
+
+
+
+
+class cgp_shader_Shader
+{
+    constructor(_cgp, _name)
+    {
+        if (!_cgp) throw new Error("shader constructed without cgp " + _name);
+        this._log = new Logger("cgp_shader");
+        this._cgp = _cgp;
+        this._name = _name;
+        this._uniforms = [];
+
+        if (!_name) this._log.stack("no shader name given");
+        this._name = _name || "unknown";
+        this.id = simpleId();
+        this._isValid = true;
+        this._compileReason = "";
+        this.shaderModule = null;
+        this._needsRecompile = true;
+
+        this._src = "";
+    }
+
+    get isValid()
+    {
+        return this._isValid;
+    }
+
+    get uniforms()
+    {
+        return this._uniforms;
+    }
+
+    getName()
+    {
+        return this._name;
+    }
+
+    setWhyCompile(why)
+    {
+        this._compileReason = why;
+    }
+
+    setSource(src)
+    {
+        this._src = src;
+        this.setWhyCompile("Source changed");
+        this._needsRecompile = true;
+    }
+
+    compile()
+    {
+        this._isValid = true;
+        console.log("compiling shader...", this._compileReason);
+        this._cgp.pushErrorScope();
+        this.shaderModule = this._cgp.device.createShaderModule({ "code": this._src });
+        this._cgp.popErrorScope("cgp_shader " + this._name, this.error.bind(this));
+        this._needsRecompile = false;
+    }
+
+    error(e)
+    {
+        this._isValid = false;
+    }
+
+
+    bind()
+    {
+        let sizes = {};
+        for (let i = 0; i < this._uniforms.length; i++)
+        {
+            // console.log(this._uniforms[i]);
+        }
+
+        if (this._needsRecompile) this.compile();
+    }
+
+    /**
+     * add a uniform to the fragment shader
+     * @param {String} type ['f','t', etc]
+     * @param {String} name
+     * @param {any} value or port
+     * @memberof Shader
+     * @instance
+     * @function addUniformFrag
+     * @returns {Uniform}
+     */
+    addUniformFrag(type, name, valueOrPort, p2, p3, p4)
+    {
+        const uni = new cgp_uniform_Uniform(this, type, name, valueOrPort, p2, p3, p4);
+        uni.shaderType = "frag";
+        return uni;
+    }
+
+    /**
+     * add a uniform to the vertex shader
+     * @param {String} type ['f','t', etc]
+     * @param {String} name
+     * @param {any} value or port
+     * @memberof Shader
+     * @instance
+     * @function addUniformVert
+     * @returns {Uniform}
+     */
+    addUniformVert(type, name, valueOrPort, p2, p3, p4)
+    {
+        const uni = new cgp_uniform_Uniform(this, type, name, valueOrPort, p2, p3, p4);
+        uni.shaderType = "vert";
+        return uni;
+    }
+
+    /**
+     * add a uniform to all shader programs
+     * @param {String} type ['f','t', etc]
+     * @param {String} name
+     * @param {any} value or port
+     * @memberof Shader
+     * @instance
+     * @function addUniform
+     * @returns {Uniform}
+     */
+    addUniform(type, name, valueOrPort, p2, p3, p4)
+    {
+        const uni = new cgp_uniform_Uniform(this, type, name, valueOrPort, p2, p3, p4);
+        uni.shaderType = "both";
+        return uni;
+    }
+
+
+    _addUniform(uni)
+    {
+        this._uniforms.push(uni);
+        this.setWhyCompile("add uniform " + name);
+        this._needsRecompile = true;
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgl_shader_default.wgsl
+/* harmony default export */ const cgl_shader_default = ("struct VSUniforms\n{\n    modelMatrix: mat4x4<f32>,\n    viewMatrix: mat4x4<f32>,\n    projMatrix: mat4x4<f32>,\n};\n\nstruct FSUniforms\n{\n    color:vec4<f32>\n};\n\n@group(0) @binding(0) var<uniform> vsUniforms: VSUniforms;\n@group(0) @binding(1) var<uniform> fsUniforms: FSUniforms;\n\nstruct MyVSInput\n{\n    @location(0) position: vec3<f32>,\n    @location(1) normal: vec3<f32>,\n    @location(2) texcoord: vec2<f32>,\n};\n\nstruct MyVSOutput\n{\n    @builtin(position) position: vec4<f32>,\n    @location(0) normal: vec3<f32>,\n    @location(1) texcoord: vec2<f32>,\n};\n\n@vertex\nfn myVSMain(v: MyVSInput) -> MyVSOutput\n{\n    var vsOut: MyVSOutput;\n    var pos =vec4<f32>(v.position, 1.0);\n\n    var mvMatrix=vsUniforms.viewMatrix * vsUniforms.modelMatrix;\n    vsOut.position = vsUniforms.projMatrix * mvMatrix * pos;\n\n    vsOut.normal = v.normal;\n    vsOut.texcoord = v.texcoord;\n    return vsOut;\n}\n\n@fragment\nfn myFSMain(v: MyVSOutput) -> @location(0) vec4<f32>\n{\n    return fsUniforms.color+vec4<f32>(.5,.5,.5,1.0);\n}\n\n");
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_state.js
+
+
+
+
+
+// https://github.com/greggman/webgpu-utils
+// https://developer.chrome.com/blog/from-webgl-to-webgpu/
+// https://gpuweb.github.io/gpuweb/explainer/
+
+
+/**
+ * cables webgpu context/state manager
+ * @external CGP
+ * @namespace Context
+ * @class
+ * @hideconstructor
+ */
+// const Context = function (_patch)
+class WebGpuContext extends CGState
+{
+    constructor(_patch)
+    {
+        super();
+
+        this.patch = _patch;
+
+        this.gApi = CG.GAPI_WEBGPU;
+        this._viewport = [0, 0, 256, 256];
+        this._shaderStack = [];
+        this._simpleShader = null;
+
+        this._stackCullFaceFacing = [];
+        this._stackDepthTest = [];
+        this._stackCullFace = [];
+        this._stackDepthFunc = [];
+        this._stackDepthWrite = [];
+
+        this.DEPTH_FUNCS = [
+            "never",
+            "always",
+            "less",
+            "less-equal",
+            "greater",
+            "greater-equal",
+            "equal",
+            "not-equal"
+        ];
+
+        this.CULL_MODES = [
+            "none",
+            "back",
+            "front",
+            "none" // both does not exist in webgpu
+        ];
+    }
+
+
+    /// ////////////////////
+
+    getViewPort()
+    {
+        return [0, 0, this.canvasWidth, this.canvasHeight];
+    }
+
+    renderStart(cgp, identTranslate, identTranslateView)
+    {
+        if (!this._simpleShader)
+        {
+            this._simpleShader = new cgp_shader_Shader(this, "simple default shader");
+            this._simpleShader.setSource(cgl_shader_default);
+            this._simpleShader.addUniformFrag("4f", "color", 1, 1, 0, 1);
+        }
+
+        this.fpsCounter.startFrame();
+
+        this._startMatrixStacks(identTranslate, identTranslateView);
+        this.setViewPort(0, 0, this.canvasWidth, this.canvasHeight);
+
+        this.pushShader(this._simpleShader);
+        this.pushDepthTest(true);
+        this.pushDepthWrite(true);
+        this.pushDepthFunc("less-equal");
+
+        this.emitEvent("beginFrame");
+    }
+
+    renderEnd()
+    {
+        this._endMatrixStacks();
+
+        this.popShader();
+        this.popDepthFunc();
+        this.popDepthWrite();
+        this.popDepthTest();
+
+        this.emitEvent("endFrame");
+        this.fpsCounter.endFrame();
+    }
+
+
+    setViewPort(x, y, w, h)
+    {
+        this._viewport = [x, y, w, h];
+    }
+
+    /**
+     * @function getViewPort
+     * @memberof Context
+     * @instance
+     * @description get current gl viewport
+     * @returns {Array} array [x,y,w,h]
+     */
+    getViewPort()
+    {
+        return this._viewPort;
+    }
+
+
+    createMesh(geom, glPrimitive)
+    {
+        return new CGP.Mesh(this, geom, glPrimitive);
+    }
+
+    getShader()
+    {
+        return {};
+    }
+
+    /**
+     * push a shader to the shader stack
+     * @function pushShader
+     * @memberof Context
+     * @instance
+     * @param {Object} shader
+     * @function
+    */
+    pushShader(shader)
+    {
+        this._shaderStack.push(shader);
+        // currentShader = shader;
+    }
+
+    /**
+     * pop current used shader from shader stack
+     * @function popShader
+     * @memberof Context
+     * @instance
+     * @function
+     */
+    popShader()
+    {
+        if (this._shaderStack.length === 0) throw new Error("Invalid shader stack pop!");
+        this._shaderStack.pop();
+        // currentShader = this._shaderStack[this._shaderStack.length - 1];
+    }
+
+    getShader()
+    {
+        return this._shaderStack[this._shaderStack.length - 1];
+        // if (currentShader) if (!this.frameStore || ((this.frameStore.renderOffscreen === true) == currentShader.offScreenPass) === true) return currentShader;
+        // for (let i = this._shaderStack.length - 1; i >= 0; i--) if (this._shaderStack[i]) if (this.frameStore.renderOffscreen == this._shaderStack[i].offScreenPass) return this._shaderStack[i];
+    }
+
+    pushErrorScope()
+    {
+        this.device.pushErrorScope("validation");
+    }
+
+    popErrorScope(name, cb)
+    {
+        this.device.popErrorScope().then((error) =>
+        {
+            if (error)
+            {
+                this.patch.emitEvent("criticalError", { "title": "WebGPU error \"" + name + "\"", "codeText": error.message });
+                // if (this.patch.isEditorMode())console.log("WebGPU error " + this._name, error.message);
+
+                console.warn("[cgp]", name, error.message, error, cb);
+                if (cb)cb(error);
+            }
+        });
+    }
+
+    /**
+     * push depth testing enabled state
+     * @function pushDepthTest
+     * @param {Boolean} enabled
+     * @memberof Context
+     * @instance
+     */
+
+    pushDepthTest(b)
+    {
+        this._stackDepthTest.push(b);
+    }
+
+    /**
+     * current state of depth testing
+     * @function stateDepthTest
+     * @returns {Boolean} enabled
+     * @memberof Context
+     * @instance
+     */
+    stateDepthTest()
+    {
+        return this._stackDepthTest[this._stackDepthTest.length - 1];
+    }
+
+    /**
+     * pop depth testing state
+     * @function popDepthTest
+     * @memberof Context
+     * @instance
+     */
+    popDepthTest()
+    {
+        this._stackDepthTest.pop();
+    }
+
+    // --------------------------------------
+    // state depthwrite
+
+    /**
+     * push depth write enabled state
+     * @function pushDepthTest
+     * @param {Boolean} enabled
+     * @memberof Context
+     * @instance
+     */
+
+    pushDepthWrite(b)
+    {
+        b = b || false;
+        this._stackDepthWrite.push(b);
+    }
+
+    /**
+     * current state of depth writing
+     * @function stateCullFace
+     * @returns {Boolean} enabled
+     * @memberof Context
+     * @instance
+     */
+    stateDepthWrite()
+    {
+        return this._stackDepthWrite[this._stackDepthWrite.length - 1];
+    }
+
+    /**
+     * pop depth writing state
+     * @function popCullFace
+     * @memberof Context
+     * @instance
+     */
+    popDepthWrite()
+    {
+        this._stackDepthWrite.pop();
+    }
+
+
+    // --------------------------------------
+    // state depthfunc
+
+
+    /**
+     * @function pushDepthFunc
+     * @memberof Context
+     * @instance
+     * @param {string} depth compare func
+     */
+    pushDepthFunc(f)
+    {
+        this._stackDepthFunc.push(f);
+    }
+
+    /**
+     * @function stateDepthFunc
+     * @memberof Context
+     * @instance
+     * @returns {string}
+     */
+    stateDepthFunc()
+    {
+        if (this._stackDepthFunc.length > 0) return this._stackDepthFunc[this._stackDepthFunc.length - 1];
+        return false;
+    }
+
+    /**
+     * pop depth compare func
+     * @function popDepthFunc
+     * @memberof Context
+     * @instance
+     */
+    popDepthFunc()
+    {
+        this._stackDepthFunc.pop();
+    }
+
+
+
+    // --------------------------------------
+    // state CullFace
+
+    /**
+     * push face culling face enabled state
+     * @function pushCullFaceFacing
+     * @param {Boolean} enabled
+     * @memberof Context
+     * @instance
+     */
+    pushCullFace(b)
+    {
+        this._stackCullFace.push(b);
+    }
+
+    /**
+ * current state of face culling
+ * @function stateCullFace
+ * @returns {Boolean} enabled
+ * @memberof Context
+ * @instance
+ */
+    stateCullFace()
+    {
+        return this._stackCullFace[this._stackCullFace.length - 1];
+    }
+
+    /**
+ * pop face culling enabled state
+ * @function popCullFace
+ * @memberof Context
+ * @instance
+ */
+    popCullFace()
+    {
+        this._stackCullFace.pop();
+    }
+
+
+    // --------------------------------------
+    // state CullFace Facing
+
+
+    /**
+     * push face culling face side
+     * @function pushCullFaceFacing
+     * @memberof Context
+     * @instance
+     */
+
+    pushCullFaceFacing(b)
+    {
+        this._stackCullFaceFacing.push(b);
+    }
+
+    /**
+     * current state of face culling side
+     * @function stateCullFaceFacing
+     * @returns {Boolean} enabled
+     * @memberof Context
+     * @instance
+     */
+    stateCullFaceFacing()
+    {
+        return this._stackCullFaceFacing[this._stackCullFaceFacing.length - 1];
+    }
+
+    /**
+     * pop face culling face side
+     * @function popCullFaceFacing
+     * @memberof Context
+     * @instance
+     */
+    popCullFaceFacing()
+    {
+        this._stackCullFaceFacing.pop();
+    }
+}
+
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_uniformbuffer.js
+class UniformBuffer
+{
+    constructor(shader, shaderType)
+    {
+        this._shaderType = shaderType; // frag, vert...
+        this._shader = shader;
+        this._cgp = shader._cgp;
+
+        this._gpuBuffer = null;
+        this._values = null;
+
+        this._sizeBytes = 0;
+        this.update();
+    }
+
+    update()
+    {
+        this._sizeBytes = 0;
+
+        for (let i = 0; i < this._shader.uniforms.length; i++)
+        {
+            const uni = this._shader.uniforms[i];
+
+            if (this._shaderType == uni.shaderType)
+                this._sizeBytes += uni.getSizeBytes();
+        }
+
+        this._gpuBuffer = this._cgp.device.createBuffer(
+            {
+                "size": this._sizeBytes,
+                "usage": GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
+            });
+
+
+        this._values = new Float32Array(this._sizeBytes / 4);
+        this.updateUniformValues();
+    }
+
+    updateUniformValues()
+    {
+        let count = 0;
+        for (let i = 0; i < this._shader.uniforms.length; i++)
+        {
+            const uni = this._shader.uniforms[i];
+            if (uni.shaderType == this._shaderType)
+            {
+                if (uni.getSizeBytes() / 4 > 1)
+                {
+                    for (let j = 0; j < uni.getValue().length; j++)
+                    {
+                        this._values[count] = uni.getValue()[j];
+                        count++;
+                    }
+                }
+                else
+                {
+                    this._values[count] = uni.getValue();
+                    count++;
+                }
+            }
+        }
+
+
+        this._cgp.device.queue.writeBuffer(
+            this._gpuBuffer,
+            0,
+            this._values.buffer,
+            this._values.byteOffset,
+            this._values.byteLength
+        );
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_pipeline.js
+
+
+
+class Pipeline
+{
+    constructor(_cgp, _name)
+    {
+        if (!_cgp) throw new Error("Pipeline constructed without cgp " + _name);
+        this._cgp = _cgp;
+        this._isValid = true;
+
+        this._pipeCfg = null;
+        this._renderPipeline = null;
+
+        this._fsUniformBuffer = null;
+        this._vsUniformBuffer = null;
+
+        this._old = {};
+
+
+        this.DEPTH_COMPARE_FUNCS_STRINGS = [
+            "never",
+            "less",
+            "equal",
+            "lessequal",
+            "greater",
+            "notequal",
+            "greaterequal",
+            "always"];
+    }
+
+    get isValid() { return this._isValid; }
+
+    setPipeline(shader, mesh)
+    {
+        if (!mesh || !shader)
+        {
+            console.log("pipeline unknown shader/mesh");
+            return;
+        }
+
+        let needsRebuild =
+            !this._renderPipeline ||
+            !this._pipeCfg ||
+            this._old.mesh != mesh ||
+            this._old.shader != shader ||
+            mesh.needsPipelineUpdate ||
+            shader.needsPipelineUpdate;
+
+        if (this._pipeCfg)
+        {
+            if (this._pipeCfg.depthStencil.depthWriteEnabled != this._cgp.stateDepthWrite())
+            {
+                needsRebuild = true;
+                this._pipeCfg.depthStencil.depthWriteEnabled = this._cgp.stateDepthWrite();
+            }
+
+            if (this._cgp.stateDepthTest() === false)
+            {
+                if (this._pipeCfg.depthStencil.depthCompare != "never")
+                {
+                    this._pipeCfg.depthStencil.depthCompare = "never";
+                    needsRebuild = true;
+                }
+            }
+            else
+            if (this._pipeCfg.depthStencil.depthCompare != this._cgp.stateDepthFunc())
+            {
+                needsRebuild = true;
+                this._pipeCfg.depthStencil.depthCompare = this._cgp.stateDepthFunc();
+            }
+
+
+            if (this._cgp.stateCullFace() === false)
+            {
+                if (this._pipeCfg.primitive.cullMode != "none")
+                {
+                    needsRebuild = true;
+                    this._pipeCfg.primitive.cullMode = "none";
+                }
+            }
+            else
+            {
+                needsRebuild = true;
+                this._pipeCfg.primitive.cullMode = this._cgp.stateCullFaceFacing();
+            }
+        }
+
+        if (needsRebuild)
+        {
+            if (!this._pipeCfg || this._old.shader != shader) this._pipeCfg = this.getPiplelineObject(shader, mesh);
+
+            this._old.shader = shader;
+            this._old.mesh = mesh;
+
+
+            // try
+            // {
+            this._renderPipeline = this._cgp.device.createRenderPipeline(this._pipeCfg);
+            // }
+            // catch (e)
+            // {
+            //     console.error(e.message);
+            // }
+
+            this._bindUniforms(shader);
+        }
+
+        if (this._renderPipeline && this._isValid)
+        {
+            mat4.copy(this._matModel, this._cgp.mMatrix);
+            mat4.copy(this._matView, this._cgp.vMatrix);
+            mat4.copy(this._matProj, this._cgp.pMatrix);
+
+            this._cgp.device.queue.writeBuffer(
+                this._vsUniformBuffer,
+                0,
+                this._vsUniformValues.buffer,
+                this._vsUniformValues.byteOffset,
+                this._vsUniformValues.byteLength
+            );
+
+            this._uniBufFrag.updateUniformValues();
+
+            this._cgp.passEncoder.setPipeline(this._renderPipeline);
+            this._cgp.passEncoder.setBindGroup(0, this._bindGroup);
+            // this._pipeline = this._cgp.device.createRenderPipeline(this._pipeCfg);
+        }
+    }
+
+    getPiplelineObject(shader, mesh)
+    {
+        const pipeCfg = {
+            "layout": "auto",
+            "vertex": {
+                "module": shader.shaderModule,
+                "entryPoint": "myVSMain",
+                "buffers": [
+                    // position
+                    {
+                        "arrayStride": 3 * 4, // 3 floats, 4 bytes each
+                        "attributes": [
+                            { "shaderLocation": 0, "offset": 0, "format": "float32x3" },
+                        ],
+                    },
+                    // normals
+                    {
+                        "arrayStride": 3 * 4, // 3 floats, 4 bytes each
+                        "attributes": [
+                            { "shaderLocation": 1, "offset": 0, "format": "float32x3" },
+                        ],
+                    },
+                    // texcoords
+                    {
+                        "arrayStride": 2 * 4, // 2 floats, 4 bytes each
+                        "attributes": [
+                            { "shaderLocation": 2, "offset": 0, "format": "float32x2", },
+                        ],
+                    },
+                ],
+            },
+            "fragment": {
+                "module": shader.shaderModule,
+                "entryPoint": "myFSMain",
+                "targets": [
+                    { "format": this._cgp.presentationFormat },
+                ],
+            },
+            "primitive": {
+                "topology": "triangle-list",
+                "cullMode": "back", // back/none/front
+
+                // "point-list",
+                // "line-list",
+                // "line-strip",
+                // "triangle-list",
+                // "triangle-strip"
+            },
+            "depthStencil": {
+                "depthWriteEnabled": true,
+                "depthCompare": "less",
+                "format": "depth24plus",
+            },
+
+        };
+
+        return pipeCfg;
+    }
+
+
+    _bindUniforms(shader)
+    {
+        this._cgp.pushErrorScope();
+
+
+        const counts = { };
+
+        this._uniBufFrag = new UniformBuffer(shader, "frag");
+
+        // for (let i = 0; i < shader.uniforms.length; i++)
+        // {
+        //     const uni = shader.uniforms[i];
+        //     const type = uni.shaderType;
+        //     counts[type] = counts[type] || 0;
+
+
+        //     counts[type] += uni.getSizeBytes();
+        // }
+        // console.log(counts, counts.frag);
+
+
+        const vUniformBufferSize = 3 * 16 * 4; // 2 mat4s * 16 floats per mat * 4 bytes per float
+        // const fUniformBufferSize = counts.frag;// 2 * 3 * 4; // 1 vec3 * 3 floats per vec3 * 4 bytes per float
+
+        this._vsUniformBuffer = this._cgp.device.createBuffer({
+            "size": vUniformBufferSize,
+            "usage": GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
+        });
+
+        // this._fsUniformBuffer = this._cgp.device.createBuffer({
+        //     "size": fUniformBufferSize,
+        //     "usage": GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
+        // });
+
+        // this._fsUniformValues = new Float32Array(counts.frag / 4);
+
+        this._vsUniformValues = new Float32Array(vUniformBufferSize / 4);
+
+        this._matModel = this._vsUniformValues.subarray(0, 16);
+        this._matView = this._vsUniformValues.subarray(16, 32);
+        this._matProj = this._vsUniformValues.subarray(32, 48);
+
+
+        // this._fsUniformValues[1] = 1.0;
+        // this._fsUniformValues[0] = 1.0;
+        // const lightDirection = this._fsUniformValues.subarray(0, 3);
+
+        // console.log("pipeline bindgrouplayout ", pipeline.getBindGroupLayout(0));
+
+        this._bindGroup = this._cgp.device.createBindGroup(
+            {
+                "layout": this._renderPipeline.getBindGroupLayout(0),
+                "entries": [
+                    { "binding": 0, "resource": { "buffer": this._vsUniformBuffer } },
+                    { "binding": 1, "resource": { "buffer": this._uniBufFrag._gpuBuffer } }
+                    //   { binding: 2, resource: sampler },
+                    //   { binding: 3, resource: tex.createView() },
+                ],
+            });
+
+        this._cgp.device.queue.writeBuffer(
+            this._vsUniformBuffer,
+            0,
+            this._vsUniformValues.buffer,
+            this._vsUniformValues.byteOffset,
+            this._vsUniformValues.byteLength
+        );
+
+        this._uniBufFrag.updateUniformValues();
+        this._cgp.popErrorScope("cgp_pipeline end", (e) =>
+        {
+            this._isValid = false;
+        });
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_mesh.js
+
+
+
+class cgp_mesh_Mesh
+{
+    constructor(_cgp, __geom)
+    {
+        this._log = new Logger("cgl_mesh");
+        this._cgp = _cgp;
+        this._geom = null;
+        this.numIndex = 0;
+
+        this._pipe = new Pipeline(this._cgp);
+
+        this._numNonIndexed = 0;
+        this._positionBuffer = null;
+        this._bufVerticesIndizes = null;
+        this._attributes = [];
+
+        this._needsPipelineUpdate = false;
+
+        if (__geom) this.setGeom(__geom);
+    }
+
+    _createBuffer(device, data, usage)
+    {
+        const buffer = device.createBuffer({
+            "size": data.byteLength,
+            "usage": usage,
+            "mappedAtCreation": true,
+        });
+        const dst = new data.constructor(buffer.getMappedRange());
+        dst.set(data);
+        buffer.unmap();
+        return buffer;
+    }
+
+    /**
+     * @function setGeom
+     * @memberof Mesh
+     * @instance
+     * @description set geometry for mesh
+     * @param {Geometry} geometry
+     */
+    setGeom(geom, removeRef)
+    {
+        this._needsPipelineUpdate = true;
+        this._geom = geom;
+        this._disposeAttributes();
+
+        this._positionBuffer = this._createBuffer(this._cgp.device, new Float32Array(geom.vertices), GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST);
+
+        let vi = geom.verticesIndices;
+        if (!geom.isIndexed()) vi = Array.from(Array(geom.vertices.length / 3).keys());
+        this._numIndices = vi.length;
+        this._indicesBuffer = this._createBuffer(this._cgp.device, new Uint32Array(vi), GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST);
+
+        if (geom.texCoords && geom.texCoords.length) this.setAttribute("texCoords", geom.texCoords, 2);
+        if (geom.vertexNormals && geom.vertexNormals.length) this.setAttribute("normals", geom.vertexNormals, 3);
+    }
+
+
+    _disposeAttributes()
+    {
+        this._needsPipelineUpdate = true;
+        for (let i = 0; i < this._attributes.length; i++)
+        {
+            this._attributes[i].buffer.destroy();
+        }
+        this._attributes.length = 0;
+    }
+
+    dispose()
+    {
+        this._disposeAttributes();
+    }
+
+    /**
+     * @function setAttribute
+     * @description update attribute
+     * @memberof Mesh
+     * @instance
+     * @param {String} attribute name
+     * @param {Array} data
+     * @param {Number} itemSize
+     * @param {Object} options
+     */
+    setAttribute(name, array, itemSize, options)
+    {
+        if (!array)
+        {
+            this._log.error("mesh addAttribute - no array given! " + name);
+            throw new Error();
+        }
+
+        for (let i = 0; i < this._attributes.length; i++)
+        {
+            const attr = this._attributes[i];
+            if (attr.name == name)
+            {
+                // if (attr.numItems === numItems)
+                // {
+                // }
+                // else
+                // {
+                //     // this._log.log("wrong buffer size", this._geom.name, attr.name, attr.numItems, numItems);
+                //     this._resizeAttr(array, attr);
+                // }
+                // normalBuffer = this._createBuffer(this._cgp.device, new Float32Array(geom.vertexNormals), GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST);
+
+                // this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER, attr.buffer);
+                // this._bufferArray(array, attr);
+
+                return attr;
+            }
+        }
+
+        const buffer = this._createBuffer(this._cgp.device, new Float32Array(array), GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST);
+
+        const attr = {
+            "buffer": buffer,
+            "name": name,
+            // "cb": cb,
+            // "itemSize": itemSize,
+            // "numItems": numItems,
+            // "startItem": 0,
+            // "instanced": instanced,
+            // "type": type
+        };
+        this._attributes.push(attr);
+
+        return attr;
+    }
+
+    // setPipeline()
+    // {
+
+    //     this._cgp.passEncoder.setPipeline(this._pipe.getPiplelineObject(this._cgp.getShader(),this));
+
+
+    // }
+
+    render()
+    {
+        if (!this._positionBuffer) return;
+
+        // this.setPipeline();
+
+        const shader = this._cgp.getShader();
+        if (shader)shader.bind();
+
+        if (!this._cgp.getShader() || !this._cgp.getShader().isValid)
+        {
+            // console.log("invalid");
+            return;
+        }
+
+        this._pipe.setPipeline(this._cgp.getShader(), this);
+
+        if (!this._pipe.isValid)
+        {
+            // console.log("invalid");
+            return;
+        }
+
+
+        this._cgp.passEncoder.setVertexBuffer(0, this._positionBuffer);
+        for (let i = 0; i < this._attributes.length; i++)
+        {
+            this._cgp.passEncoder.setVertexBuffer(i + 1, this._attributes[i].buffer);
+        }
+
+        this._cgp.passEncoder.setIndexBuffer(this._indicesBuffer, "uint32");
+
+        if (this._numNonIndexed)
+            this._cgp.passEncoder.draw(this._numIndices);
+        else
+            this._cgp.passEncoder.drawIndexed(this._numIndices);
+
+        // if (shader)shader.unbind();
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cgp/cgp_texture.js
+
+
+class cgp_texture_Texture
+{
+    constructor(_cgp, options)
+    {
+        if (!_cgp) throw new Error("no cgp");
+        this._log = new Logger("cgp_texture");
+        this._cgp = _cgp;
+        this.id = CABLES.uuid();
+
+        options = options || {};
+
+        this.name = options.name || "unknown";
+    }
+
+    /**
+     * set texture data from an image/canvas object
+     * @function initTexture
+     * @memberof Texture
+     * @instance
+     * @param {Object} image
+     * @param {Number} filter
+     */
+    initTexture(img, filter)
+    {
+        this.width = img.width;
+        this.height = img.height;
+
+        this.textureType = "rgba8unorm";
+
+        const textureDescriptor = {
+            // Unlike in WebGL, the size of our texture must be set at texture creation time.
+            // This means we have to wait until the image is loaded to create the texture, since we won't
+            // know the size until then.
+            "size": { "width": img.width, "height": img.height },
+            "format": this.textureType,
+            "usage": GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST
+        };
+        const texture = this._cgp.device.createTexture(textureDescriptor);
+
+        this._cgp.device.queue.copyExternalImageToTexture({ "source": img }, { "texture": texture }, textureDescriptor.size);
+
+        return texture;
+    }
+
+    getInfo()
+    {
+        const tex = this;
+        const obj = {};
+
+        obj.name = tex.name;
+        obj.size = tex.width + " x " + tex.height;
+
+        obj.textureType = tex.textureType;
+
+        return obj;
+    }
+}
+
+
+/**
+ * @function load
+ * @static
+ * @memberof Texture
+ * @description load an image from an url
+ * @param {Context} cgl
+ * @param {String} url
+ * @param {Function} onFinished
+ * @param {Object} options
+ * @return {Texture}
+ */
+cgp_texture_Texture.load = function (cgp, url, onFinished, settings)
+{
+    fetch(url).then((response) =>
+    {
+        response.blob().then((blob) =>
+        {
+            createImageBitmap(blob).then((imgBitmap) =>
+            {
+                const texture = new cgp_texture_Texture(cgp, { "name": url });
+                texture.initTexture(imgBitmap);
+                if (onFinished)onFinished(texture);
+                else console.log("Texture.load no onFinished callback");
+            });
+        });
+    });
+};
+
+;// CONCATENATED MODULE: ./src/core/cgp/index.js
+
+
+
+
+
+
+const cgp_CGP = {
+    "Context": WebGpuContext,
+    "Shader": cgp_shader_Shader,
+    "Mesh": cgp_mesh_Mesh,
+    "Pipeline": Pipeline,
+    "Texture": cgp_texture_Texture,
+};
+
+window.CGP = cgp_CGP;
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_framebuffer.js
+
+
+
+// todo: convert to prototyped...
+
+/**
+ * a framebuffer
+ * @external CGL
+ * @namespace Framebuffer
+ * @constructor
+ * @param {Context} cgl
+ * @param {Number} width
+ * @param {Number} height
+ * @param {Object} [options]
+ */
+const Framebuffer = function (_cgl, _w, _h, options)
+{
+    const cgl = _cgl;
+    this._log = new Logger("Framebuffer");
+    this.valid = true;
+
+    let depthTextureExt = cgl.gl.DEPTH_TEXTURE;
+    if (!depthTextureExt) depthTextureExt = cgl.enableExtension("WEBGL_depth_texture");
+    if (!depthTextureExt) depthTextureExt = cgl.enableExtension("WEBKIT_WEBGL_depth_texture");
+    if (!depthTextureExt) depthTextureExt = cgl.enableExtension("MOZ_WEBGL_depth_texture");
+
+    if (!depthTextureExt)
+    {
+        cgl.exitError("NO_DEPTH_TEXTURE", "no depth texture support");
+        // return;
+    }
+
+    let width = _w || 512;
+    let height = _h || 512;
+
+    options = options || {
+        "isFloatingPointTexture": false,
+    };
+
+    if (!options.hasOwnProperty("clear")) options.clear = true;
+    if (!options.hasOwnProperty("filter")) options.filter = Texture.FILTER_LINEAR;
+
+    const texture = new Texture(cgl, {
+        "isFloatingPointTexture": options.isFloatingPointTexture,
+        "filter": options.filter,
+        "wrap": options.wrap || Texture.CLAMP_TO_EDGE
+    });
+
+    let textureDepth = null;
+    if (depthTextureExt)
+    {
+        textureDepth = new Texture(cgl, {
+            "isDepthTexture": true,
+        });
+    }
+    this._options = options;
+
+    const frameBuf = cgl.gl.createFramebuffer();
+    const depthBuffer = cgl.gl.createRenderbuffer();
+
+    this.getWidth = function ()
+    {
+        return width;
+    };
+    this.getHeight = function ()
+    {
+        return height;
+    };
+
+    /**
+     * get native gl framebuffer
+     * @function getGlFrameBuffer
+     * @memberof Framebuffer
+     * @returns {Object} framebuffer
+     */
+    this.getGlFrameBuffer = function ()
+    {
+        return frameBuf;
+    };
+
+    /**
+     * get depth renderbuffer
+     * @function getDepthRenderBuffer
+     * @memberof Framebuffer
+     * @returns {Object} renderbuffer
+     */
+    this.getDepthRenderBuffer = function ()
+    {
+        return depthBuffer;
+    };
+
+    /**
+     * get color texture
+     * @function getTextureColor
+     * @memberof Framebuffer
+     * @returns {Texture} rgba texture
+     */
+    this.getTextureColor = function ()
+    {
+        return texture;
+    };
+
+    /**
+     * get depth texture
+     * @function getTextureDepth
+     * @memberof Framebuffer
+     * @returns {Texture} depth texture
+     */
+    this.getTextureDepth = function ()
+    {
+        return textureDepth;
+    };
+
+    this.setFilter = function (f)
+    {
+        texture.filter = f;
+        texture.setSize(width, height);
+    };
+
+    this.setSize = function (w, h)
+    {
+        if (w < 2) w = 2;
+        if (h < 2) h = 2;
+
+        width = Math.ceil(w);
+        height = Math.ceil(h);
+
+        cgl.profileData.profileFrameBuffercreate++;
+
+        cgl.gl.bindFramebuffer(cgl.gl.FRAMEBUFFER, frameBuf);
+        cgl.gl.bindRenderbuffer(cgl.gl.RENDERBUFFER, depthBuffer);
+
+        texture.setSize(width, height);
+        if (textureDepth) textureDepth.setSize(width, height);
+
+        // if(depthTextureExt) cgl.gl.renderbufferStorage(cgl.gl.RENDERBUFFER, cgl.gl.DEPTH_COMPONENT16, width,height);
+        if (depthTextureExt) cgl.gl.renderbufferStorage(cgl.gl.RENDERBUFFER, cgl.gl.DEPTH_COMPONENT16, width, height);
+
+        cgl.gl.framebufferTexture2D(cgl.gl.FRAMEBUFFER, cgl.gl.COLOR_ATTACHMENT0, cgl.gl.TEXTURE_2D, texture.tex, 0);
+
+        if (depthTextureExt)
+        {
+            cgl.gl.framebufferRenderbuffer(cgl.gl.FRAMEBUFFER, cgl.gl.DEPTH_ATTACHMENT, cgl.gl.RENDERBUFFER, depthBuffer);
+            cgl.gl.framebufferTexture2D(
+                cgl.gl.FRAMEBUFFER,
+                cgl.gl.DEPTH_ATTACHMENT, // safari needs DEPTH_ATTACHMENT NOT DEPTH_ATTACHMENT16
+                // cgl.gl.DEPTH_COMPONENT16,
+                cgl.gl.TEXTURE_2D,
+                textureDepth.tex,
+                0,
+            );
+        }
+
+        if (!cgl.gl.isFramebuffer(frameBuf)) throw new Error("Invalid framebuffer");
+        const status = cgl.gl.checkFramebufferStatus(cgl.gl.FRAMEBUFFER);
+
+        switch (status)
+        {
+        case cgl.gl.FRAMEBUFFER_COMPLETE:
+            break;
+        case cgl.gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+            this._log.warn("FRAMEBUFFER_INCOMPLETE_ATTACHMENT...", width, height, texture.tex, depthBuffer);
+            this.valid = false;
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
+        case cgl.gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+            this._log.warn("FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
+            this.valid = false;
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
+        case cgl.gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
+            this._log.warn("FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
+            this.valid = false;
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
+        case cgl.gl.FRAMEBUFFER_UNSUPPORTED:
+            this._log.warn("FRAMEBUFFER_UNSUPPORTED");
+            this.valid = false;
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_UNSUPPORTED");
+        case 0x8CDB:
+            this._log.warn("Incomplete: FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER from ext. Or Safari/iOS undefined behaviour.");
+            this.valid = false;
+            break;
+        default:
+            this._log.warn("incomplete framebuffer", status);
+            this.valid = false;
+            throw new Error("Incomplete framebuffer: " + status);
+            // throw("Incomplete framebuffer: " + status);
+        }
+
+        cgl.gl.bindTexture(cgl.gl.TEXTURE_2D, null);
+        cgl.gl.bindRenderbuffer(cgl.gl.RENDERBUFFER, null);
+        cgl.gl.bindFramebuffer(cgl.gl.FRAMEBUFFER, null);
+    };
+
+    this.renderStart = function ()
+    {
+        cgl.pushModelMatrix();
+        cgl.gl.bindFramebuffer(cgl.gl.FRAMEBUFFER, frameBuf);
+        cgl.pushGlFrameBuffer(frameBuf);
+        cgl.pushFrameBuffer(this);
+
+        cgl.pushPMatrix();
+        cgl.gl.viewport(0, 0, width, height);
+
+        if (this._options.clear)
+        {
+            cgl.gl.clearColor(0, 0, 0, 0);
+            cgl.gl.clear(cgl.gl.COLOR_BUFFER_BIT | cgl.gl.DEPTH_BUFFER_BIT);
+        }
+    };
+
+    this.renderEnd = function ()
+    {
+        cgl.popPMatrix();
+        cgl.gl.bindFramebuffer(cgl.gl.FRAMEBUFFER, cgl.popGlFrameBuffer());
+        cgl.popFrameBuffer();
+
+        cgl.popModelMatrix();
+        cgl.resetViewPort();
+    };
+
+
+    this.delete = function ()
+    {
+        texture.delete();
+        this.valid = false;
+        if (textureDepth) textureDepth.delete();
+        cgl.gl.deleteRenderbuffer(depthBuffer);
+        cgl.gl.deleteFramebuffer(frameBuf);
+    };
+
+    this.dispose = this.delete;
+
+    this.setSize(width, height);
+};
+
+
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_framebuffer2.js
+// * see framebuffer1
+
+
+
+
+
+
+const Framebuffer2 = function (cgl, w, h, options)
+{
+    if (cgl.glVersion == 1) return console.log("framebuffer2 used on webgl1");
+    this._log = new Logger("cgl_framebuffer2");
+    this.Framebuffer2DrawTargetsDefault = null;
+    this.Framebuffer2BlittingFramebuffer = null;
+    this.Framebuffer2FinalFramebuffer = null;
+    this._cgl = cgl;
+
+    this._cgl.printError("before framebuffer2 constructor");
+
+    this._width = 0;
+    this._height = 0;
+    this.valid = true;
+
+    this._depthRenderbuffer = null;
+    this._frameBuffer = null;
+    this._textureFrameBuffer = null;
+    this._colorRenderbuffers = [];
+    this._drawTargetArray = [];
+    this._disposed = false;
+
+    if (!this.Framebuffer2BlittingFramebuffer) this.Framebuffer2BlittingFramebuffer = cgl.gl.createFramebuffer();
+    if (!this.Framebuffer2FinalFramebuffer) this.Framebuffer2FinalFramebuffer = cgl.gl.createFramebuffer();
+
+    if (!this.Framebuffer2DrawTargetsDefault) this.Framebuffer2DrawTargetsDefault = [cgl.gl.COLOR_ATTACHMENT0];
+
+    this._options = options || {
+        "isFloatingPointTexture": false,
+    };
+
+    // this._cgl.printError("fb2 before");
+
+    this.name = this._options.name || "unknown";
+
+    this._cgl.profileData.addHeavyEvent("framebuffer create", this.name);
+
+    if (!this._options.hasOwnProperty("numRenderBuffers")) this._options.numRenderBuffers = 1;
+    if (!this._options.hasOwnProperty("depth")) this._options.depth = true;
+    if (!this._options.hasOwnProperty("clear")) this._options.clear = true;
+    if (!this._options.hasOwnProperty("multisampling"))
+    {
+        this._options.multisampling = false;
+        this._options.multisamplingSamples = 0;
+    }
+
+    if (this._options.multisamplingSamples)
+    {
+        if (this._cgl.glSlowRenderer) this._options.multisamplingSamples = 0;
+        if (!this._cgl.gl.MAX_SAMPLES) this._options.multisamplingSamples = 0;
+        else this._options.multisamplingSamples = Math.min(this._cgl.maxSamples, this._options.multisamplingSamples);
+    }
+
+    if (!this._options.hasOwnProperty("filter")) this._options.filter = Texture.FILTER_LINEAR;
+    if (!this._options.hasOwnProperty("wrap")) this._options.wrap = Texture.WRAP_REPEAT;
+
+    this._numRenderBuffers = this._options.numRenderBuffers;
+    this._colorTextures = [];
+
+    this.clearColors = [];
+    for (let i = 0; i < this._numRenderBuffers; i++) this.clearColors.push([0, 0, 0, 1]);
+
+
+    if (!options.pixelFormat)
+    {
+        if (options.isFloatingPointTexture) this._options.pixelFormat = Texture.PFORMATSTR_RGBA32F;
+        else this._options.pixelFormat = Texture.PFORMATSTR_RGBA8UB;
+    }
+
+
+    for (let i = 0; i < this._numRenderBuffers; i++)
+    {
+        this._colorTextures[i] = new Texture(cgl, {
+            "name": "fb2 " + this.name + " " + i,
+            "isFloatingPointTexture": this._options.isFloatingPointTexture,
+            "anisotropic": this._options.anisotropic || 0,
+            "pixelFormat": this._options.pixelFormat,
+            "filter": this._options.filter,
+            "wrap": this._options.wrap,
+        });
+    }
+
+
+
+    let fil = Texture.FILTER_NEAREST;
+    if (this._options.shadowMap) fil = Texture.FILTER_LINEAR;
+
+    const defaultTexSize = 512;
+
+    if (this._options.depth)
+    {
+        this._textureDepth = new Texture(cgl,
+            {
+                "name": "fb2 depth " + this.name,
+                "isDepthTexture": true,
+                "filter": fil,
+                "shadowMap": this._options.shadowMap || false,
+                "width": w || defaultTexSize,
+                "height": h || defaultTexSize,
+            });
+    }
+
+    if (cgl.aborted) return;
+
+    this.setSize(w || defaultTexSize, h || defaultTexSize);
+
+    this._cgl.printError("framebuffer2 constructor");
+};
+
+Framebuffer2.prototype.getWidth = function ()
+{
+    return this._width;
+};
+Framebuffer2.prototype.getHeight = function ()
+{
+    return this._height;
+};
+
+Framebuffer2.prototype.getGlFrameBuffer = function ()
+{
+    return this._frameBuffer;
+};
+
+Framebuffer2.prototype.getDepthRenderBuffer = function ()
+{
+    return this._depthRenderbuffer;
+};
+
+Framebuffer2.prototype.getTextureColor = function ()
+{
+    return this._colorTextures[0];
+};
+
+Framebuffer2.prototype.getTextureColorNum = function (i)
+{
+    return this._colorTextures[i];
+};
+
+Framebuffer2.prototype.getTextureDepth = function ()
+{
+    return this._textureDepth;
+};
+
+Framebuffer2.prototype.setFilter = function (f)
+{
+    for (let i = 0; i < this._numRenderBuffers; i++)
+    {
+        this._colorTextures[i].filter = f;
+        this._colorTextures[i].setSize(this._width, this._height);
+    }
+};
+
+Framebuffer2.prototype.delete = Framebuffer2.prototype.dispose = function ()
+{
+    this._disposed = true;
+    let i = 0;
+    for (i = 0; i < this._numRenderBuffers; i++) this._colorTextures[i].delete();
+    // this._texture.delete();
+    if (this._textureDepth) this._textureDepth.delete();
+    for (i = 0; i < this._numRenderBuffers; i++) this._cgl.gl.deleteRenderbuffer(this._colorRenderbuffers[i]);
+    this._cgl.gl.deleteRenderbuffer(this._depthRenderbuffer);
+    this._cgl.gl.deleteFramebuffer(this._frameBuffer);
+    this._cgl.gl.deleteFramebuffer(this._textureFrameBuffer);
+};
+
+Framebuffer2.prototype.setSize = function (w, h)
+{
+    if (this._disposed) return this._log.warn("disposed framebuffer setsize...");
+    this._cgl.profileData.addHeavyEvent("framebuffer resize", this.name);
+
+    let i = 0;
+
+    this._width = this._cgl.checkTextureSize(w);
+    this._height = this._cgl.checkTextureSize(h);
+
+    this._cgl.profileData.profileFrameBuffercreate++;
+
+    if (this._frameBuffer)
+    {
+        for (i = 0; i < this._numRenderBuffers; i++) this._cgl.gl.deleteRenderbuffer(this._colorRenderbuffers[i]);
+        // this._cgl.gl.deleteRenderbuffer(this._colorRenderbuffer);
+        this._cgl.gl.deleteRenderbuffer(this._depthRenderbuffer);
+        this._cgl.gl.deleteFramebuffer(this._frameBuffer);
+        this._cgl.gl.deleteFramebuffer(this._textureFrameBuffer);
+    }
+
+    this._frameBuffer = this._cgl.gl.createFramebuffer();
+    this._textureFrameBuffer = this._cgl.gl.createFramebuffer();
+
+    const depth = this._options.depth;
+
+    for (i = 0; i < this._numRenderBuffers; i++)
+    {
+        this._colorTextures[i].setSize(this._width, this._height);
+    }
+
+
+
+    for (i = 0; i < this._numRenderBuffers; i++)
+    {
+        const renderBuffer = this._cgl.gl.createRenderbuffer();
+
+        // color renderbuffer
+
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuffer);
+        this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, renderBuffer);
+
+        const info = Texture.setUpGlPixelFormat(this._cgl, this._options.pixelFormat);
+        let internFormat = info.glInternalFormat;
+
+        // if (this._options.isFloatingPointTexture)
+        // {
+        if (CGL.Texture.isPixelFormatHalfFloat(info.pixelFormat))
+        {
+            if (!this._cgl.enableExtension("OES_texture_float_linear"))
+            {
+                this._options.filter = Texture.FILTER_NEAREST;
+                this.setFilter(this._options.filter);
+            }
+        }
+        else if (CGL.Texture.isPixelFormatFloat(info.pixelFormat))
+        {
+            if (!this._cgl.enableExtension("OES_texture_float_linear"))
+            {
+                console.log("no linear pixelformat,using nearest");
+                this._options.filter = Texture.FILTER_NEAREST;
+                this.setFilter(this._options.filter);
+            }
+        }
+        // else if (info.pixelFormat == Texture.PFORMATSTR_RGBA32F || info.pixelFormat == Texture.PFORMATSTR_R11FG11FB10F
+        // else if (info.pixelFormat == Texture.PFORMATSTR_RGBA32F || info.pixelFormat == Texture.PFORMATSTR_R11FG11FB10F
+        // else if (info.pixelFormat == Texture.PFORMATSTR_RG16F)
+        // {
+        //     const extcb = this._cgl.enableExtension("EXT_color_buffer_float");
+
+        //     if (!this._cgl.enableExtension("OES_texture_float_linear"))
+        //     {
+        //         console.log("no linear pixelformat,switching to nearest");
+        //         this._options.filter = Texture.FILTER_NEAREST;
+        //         this.setFilter(this._options.filter);
+        //     }
+        // }
+        // }
+
+        if (this._options.multisampling && this._options.multisamplingSamples)
+        {
+            this._cgl.gl.renderbufferStorageMultisample(this._cgl.gl.RENDERBUFFER, this._options.multisamplingSamples, internFormat, this._width, this._height);
+        }
+        else
+        {
+            this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER, internFormat, this._width, this._height);
+        }
+
+
+
+        this._cgl.gl.framebufferRenderbuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0 + i, this._cgl.gl.RENDERBUFFER, renderBuffer);
+        this._colorRenderbuffers[i] = renderBuffer;
+    }
+
+    // this._cgl.gl.bindFramebuffer(this._cgl.gl.DRAW_FRAMEBUFFER, this._textureFrameBuffer);
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._textureFrameBuffer);
+
+    for (i = 0; i < this._numRenderBuffers; i++)
+    {
+        this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0 + i, this._cgl.gl.TEXTURE_2D, this._colorTextures[i].tex, 0);
+    }
+
+    if (this._options.depth)
+    {
+        this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.DEPTH_ATTACHMENT, this._cgl.gl.TEXTURE_2D, this._textureDepth.tex, 0);
+    }
+
+    // depth renderbuffer
+
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuffer);
+
+
+    let depthType = this._cgl.gl.DEPTH_COMPONENT32F;
+
+    if (this._cgl.glSlowRenderer) depthType = this._cgl.gl.DEPTH_COMPONENT16;
+    if (depth)
+    {
+        this._textureDepth.setSize(this._width, this._height);
+        this._depthRenderbuffer = this._cgl.gl.createRenderbuffer();
+
+        this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, this._depthRenderbuffer);
+        if (this._options.isFloatingPointTexture)
+        {
+            if (this._options.multisampling) this._cgl.gl.renderbufferStorageMultisample(this._cgl.gl.RENDERBUFFER, this._options.multisamplingSamples, depthType, this._width, this._height);
+            else this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER, depthType, this._width, this._height);
+        }
+        else if (this._options.multisampling)
+        {
+            this._cgl.gl.renderbufferStorageMultisample(this._cgl.gl.RENDERBUFFER, this._options.multisamplingSamples, depthType, this._width, this._height);
+            // this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER,depthType, this._width, this._height);
+        }
+        else
+        {
+            this._cgl.gl.renderbufferStorage(this._cgl.gl.RENDERBUFFER, depthType, this._width, this._height);
+        }
+
+        this._cgl.gl.framebufferRenderbuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.DEPTH_ATTACHMENT, this._cgl.gl.RENDERBUFFER, this._depthRenderbuffer);
+    }
+
+    // this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+    // this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._textureFrameBuffer);
+
+    this._drawTargetArray.length = 0;
+    for (i = 0; i < this._numRenderBuffers; i++) this._drawTargetArray.push(this._cgl.gl.COLOR_ATTACHMENT0 + i);
+
+    // this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+
+
+    if (!this._cgl.gl.isFramebuffer(this._textureFrameBuffer)) this._log.warn("invalid framebuffer");// throw new Error("Invalid framebuffer");
+    const status = this._cgl.gl.checkFramebufferStatus(this._cgl.gl.FRAMEBUFFER);
+
+    if (status != this._cgl.gl.FRAMEBUFFER_COMPLETE)
+    {
+        this._log.error("framebuffer incomplete: " + this.name, this);
+        console.log("options", this._options);
+
+        switch (status)
+        {
+        case this._cgl.gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+            this._log.warn("FRAMEBUFFER_INCOMPLETE_ATTACHMENT...", this);
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_ATTACHMENT");
+        case this._cgl.gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+            this._log.warn("FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT");
+        case this._cgl.gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:
+            this._log.warn("FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_INCOMPLETE_DIMENSIONS");
+        case this._cgl.gl.FRAMEBUFFER_UNSUPPORTED:
+            this._log.warn("FRAMEBUFFER_UNSUPPORTED");
+            throw new Error("Incomplete framebuffer: FRAMEBUFFER_UNSUPPORTED");
+        default:
+            this.valid = false;
+            this._log.warn("incomplete framebuffer", status, this._frameBuffer);
+            this._cgl.printError();
+            this._cgl.exitError("Framebuffer incomplete...");
+
+            this._frameBuffer = null;
+            // debugger;
+            throw new Error("Incomplete framebuffer: " + status);
+
+        // throw("Incomplete framebuffer: " + status);
+        }
+    }
+
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+    this._cgl.gl.bindRenderbuffer(this._cgl.gl.RENDERBUFFER, null);
+
+    // this._cgl.printError("fb setsize");
+};
+
+Framebuffer2.prototype.renderStart = function ()
+{
+    if (this._disposed) return this._log.warn("disposed framebuffer renderStart...");
+    this._cgl.checkFrameStarted("fb2 renderstart");
+    this._cgl.pushModelMatrix(); // needed ??
+
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuffer);
+    this._cgl.pushGlFrameBuffer(this._frameBuffer);
+    this._cgl.pushFrameBuffer(this);
+
+    this._cgl.pushPMatrix();
+    this._cgl.pushViewPort(0, 0, this._width, this._height);
+
+    this._cgl.gl.drawBuffers(this._drawTargetArray);
+
+    if (this._options.clear)
+    {
+        this._cgl.gl.clearColor(0, 0, 0, 0);
+        this._cgl.gl.clear(this._cgl.gl.COLOR_BUFFER_BIT | this._cgl.gl.DEPTH_BUFFER_BIT);
+    }
+};
+
+Framebuffer2.prototype.clear = function ()
+{
+    if (this._numRenderBuffers <= 1)
+    {
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.READ_FRAMEBUFFER, this._frameBuffer);
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.DRAW_FRAMEBUFFER, this._textureFrameBuffer);
+    }
+    else this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._frameBuffer);
+
+    this._cgl.gl.drawBuffers(this._drawTargetArray);
+
+    for (let i = 0; i < this._numRenderBuffers; i++)
+    {
+        this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0 + i, this._cgl.gl.TEXTURE_2D, this._colorTextures[i].tex, 0);
+        this._cgl.gl.clearBufferfv(this._cgl.gl.COLOR, i, this.clearColors[i]);
+    }
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+};
+
+Framebuffer2.prototype.renderEnd = function ()
+{
+    if (this._disposed) return this._log.warn("disposed framebuffer renderEnd...");
+    this._cgl.popPMatrix();
+
+    this._cgl.profileData.profileFramebuffer++;
+
+
+    if (this._numRenderBuffers <= 1)
+    {
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.READ_FRAMEBUFFER, this._frameBuffer);
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.DRAW_FRAMEBUFFER, this._textureFrameBuffer);
+
+        // const a = this._cgl.gl.getFramebufferAttachmentParameter(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING);
+        // if (a == this._cgl.gl.SRGB)console.log("SRGB", this._cgl.gl.SRGB);
+        // else if (a == this._cgl.gl.LINEAR)console.log("LINEAR", this._cgl.gl.LINEAR);
+
+
+        this._cgl.gl.clearBufferfv(this._cgl.gl.COLOR, 0, [0.0, 0.0, 0.0, 1.0]);
+        this._cgl.gl.blitFramebuffer(0, 0, this._width, this._height, 0, 0, this._width, this._height, this._cgl.gl.COLOR_BUFFER_BIT | this._cgl.gl.DEPTH_BUFFER_BIT, this._cgl.gl.NEAREST);
+    }
+    else
+    {
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this.Framebuffer2BlittingFramebuffer);
+        this._cgl.gl.framebufferRenderbuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.DEPTH_ATTACHMENT, this._cgl.gl.RENDERBUFFER, this._depthRenderbuffer);
+
+        this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this.Framebuffer2FinalFramebuffer);
+        this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.DEPTH_ATTACHMENT, this._cgl.gl.TEXTURE_2D, this._textureDepth.tex, 0);
+
+        // console.log("fb this._numRenderBuffers", this._numRenderBuffers);
+        for (let i = 0; i < this._numRenderBuffers; i++)
+        {
+            this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this.Framebuffer2BlittingFramebuffer);
+            this._cgl.gl.framebufferRenderbuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.RENDERBUFFER, this._colorRenderbuffers[i]);
+
+
+            this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this.Framebuffer2FinalFramebuffer);
+            this._cgl.gl.framebufferTexture2D(this._cgl.gl.FRAMEBUFFER, this._cgl.gl.COLOR_ATTACHMENT0, this._cgl.gl.TEXTURE_2D, this._colorTextures[i].tex, 0);
+
+            this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, null);
+
+            this._cgl.gl.bindFramebuffer(this._cgl.gl.READ_FRAMEBUFFER, this.Framebuffer2BlittingFramebuffer);
+            this._cgl.gl.bindFramebuffer(this._cgl.gl.DRAW_FRAMEBUFFER, this.Framebuffer2FinalFramebuffer);
+
+            // this._cgl.gl.clearBufferfv(this._cgl.gl.COLOR, i, [0.0, 0.0, 0.0, 1.0]);
+
+
+
+            let flags = this._cgl.gl.COLOR_BUFFER_BIT;
+            if (i == 0) flags |= this._cgl.gl.DEPTH_BUFFER_BIT;
+
+            this._cgl.gl.blitFramebuffer(0, 0, this._width, this._height, 0, 0, this._width, this._height, flags, this._cgl.gl.NEAREST);
+        }
+    }
+
+    this._cgl.gl.bindFramebuffer(this._cgl.gl.FRAMEBUFFER, this._cgl.popGlFrameBuffer());
+    this._cgl.popFrameBuffer();
+
+    this._cgl.popModelMatrix();
+    // this._cgl.resetViewPort();
+    this._cgl.popViewPort();
+
+
+    if (this._colorTextures[0].filter == Texture.FILTER_MIPMAP)
+    {
+        for (let i = 0; i < this._numRenderBuffers; i++)
+        {
+            this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, this._colorTextures[i].tex);
+            this._colorTextures[i].updateMipMap();
+            this._cgl.gl.bindTexture(this._cgl.gl.TEXTURE_2D, null);
+        }
+    }
+};
+
+
+
+/// ///////
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_marker.js
+const Marker = function (_cgl) // deprecated...
+{
+    this.draw = function (cgl, _size, depthTest) {};
+};
+
+const WirePoint = function (cgl) // deprecated...
+{
+    this.render = function (_cgl, _size) {};
+};
+
+const WireCube = function (cgl) // deprecated...
+{
+    this.render = function (_cgl, sizeX, sizeY, sizeZ) {};
+};
+
+;// CONCATENATED MODULE: ./src/core/cgl/cgl_unicolorshader.js
+
+
+class UniColorShader
+{
+    constructor(_cgl)
+    {
+        this.shader = new CGL.Shader(_cgl, "markermaterial");
+
+        const frag = ""
+            .endl() + "void main()"
+            .endl() + "{"
+            .endl() + "    outColor = vec4(color.rgb,1.0);"
+            .endl() + "}";
+
+
+        const vert = ""
+            .endl() + "IN vec3 vPosition;"
+            .endl() + "UNI mat4 projMatrix;"
+            .endl() + "UNI mat4 mvMatrix;"
+
+            .endl() + "void main()"
+            .endl() + "{"
+            .endl() + "   gl_Position = projMatrix * mvMatrix * vec4(vPosition,1.0);"
+            .endl() + "}";
+
+        this.shader.setSource(vert, frag);
+        this.coloruni = this.shader.addUniformFrag("4f", "color", [1, 0.777, 1, 1]);
+    }
+
+    setColor(r, g, b, a)
+    {
+        this.coloruni.set(r, g, b, a);
+    }
+}
+
+;// CONCATENATED MODULE: ./src/core/cgl/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+const cgl_CGL = {
+    "Framebuffer": Framebuffer,
+    "Framebuffer2": Framebuffer2,
+    "Geometry": Geometry,
+    "BoundingBox": BoundingBox,
+    "Marker": Marker,
+    "WirePoint": WirePoint,
+    "WireCube": WireCube,
+    "MatrixStack": MatrixStack,
+    "Mesh": Mesh,
+    "MESH": MESH,
+    "ShaderLibMods": ShaderLibMods,
+    "Shader": Shader,
+    "Uniform": Uniform,
+    "MESHES": MESHES,
+    "Context": Context,
+    "Texture": Texture,
+    "TextureEffect": TextureEffect,
+    "isWindows": isWindows,
+    "getWheelSpeed": getWheelSpeed,
+    "getWheelDelta": getWheelDelta,
+    "onLoadingAssetsFinished": onLoadingAssetsFinished,
+    "ProfileData": ProfileData,
+    "UniColorShader": UniColorShader,
+    ...constants_CONSTANTS.BLEND_MODES,
+    ...constants_CONSTANTS.SHADER,
+    ...constants_CONSTANTS.MATH,
+    ...constants_CONSTANTS.BLEND_MODES,
+};
+
+window.CGL = cgl_CGL;
+
+
+
+
+
+;// CONCATENATED MODULE: ./src/core/index.js
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+window.CABLES = window.CABLES || {};
+
+CABLES.CGL = cgl_CGL;
+CABLES.CG = CG;
+CABLES.CGP = cgp_CGP;
+CABLES.EMBED = EMBED;
+CABLES.Link = Link;
+CABLES.Port = Port;
+CABLES.Op = Op;
+CABLES.Profiler = Profiler;
+CABLES.Patch = core_patch;
+CABLES.Instancing = Instancing;
+CABLES.Timer = Timer;
+CABLES.WEBAUDIO = WEBAUDIO;
+CABLES.Variable = Variable;
+CABLES.LoadingStatus = LoadingStatus;
+CABLES.now = now;
+CABLES.internalNow = internalNow;
+CABLES.BranchStack = BranchStack;
+CABLES.Branch = Branch;
+
+
+CABLES = Object.assign(CABLES,
+    base64_namespaceObject,
+    utils_namespaceObject,
+    anim_namespaceObject,
+    CONSTANTS.PORT,
+    CONSTANTS.PACO,
+    CONSTANTS.ANIM,
+    CONSTANTS.OP
+);
+
+/* harmony default export */ const core = (CABLES);
+
+if (!(function () { return !this; }())) console.warn("not in strict mode: index core"); // eslint-disable-line
+
+CABLES = __webpack_exports__["default"];
+/******/ })()
+;
+
+
+var CABLES = CABLES || {}; CABLES.build = {"timestamp":1715927482175,"created":"2024-05-17T06:31:22.175Z","git":{"branch":"master","commit":"83d9847c52906e47691c89c7ec564876e8749a3b","date":"1715927217","message":"subpatch ops wrong"}};
+/*!
+@fileoverview gl-matrix - High performance matrix and vector operations
+@author Brandon Jones
+@author Colin MacKenzie IV
+@version 3.1.0
+
+Copyright (c) 2015-2019, Brandon Jones, Colin MacKenzie IV.
+
+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.
+
+*/
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n((t=t||self).glMatrix={})}(this,function(t){"use strict";var n=1e-6,a="undefined"!=typeof Float32Array?Float32Array:Array,r=Math.random;var u=Math.PI/180;Math.hypot||(Math.hypot=function(){for(var t=0,n=arguments.length;n--;)t+=arguments[n]*arguments[n];return Math.sqrt(t)});var e=Object.freeze({EPSILON:n,get ARRAY_TYPE(){return a},RANDOM:r,setMatrixArrayType:function(t){a=t},toRadian:function(t){return t*u},equals:function(t,a){return Math.abs(t-a)<=n*Math.max(1,Math.abs(t),Math.abs(a))}});function o(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],c=a[1],h=a[2],s=a[3];return t[0]=r*i+e*c,t[1]=u*i+o*c,t[2]=r*h+e*s,t[3]=u*h+o*s,t}function i(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t}var c=o,h=i,s=Object.freeze({create:function(){var t=new a(4);return a!=Float32Array&&(t[1]=0,t[2]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},fromValues:function(t,n,r,u){var e=new a(4);return e[0]=t,e[1]=n,e[2]=r,e[3]=u,e},set:function(t,n,a,r,u){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t},transpose:function(t,n){if(t===n){var a=n[1];t[1]=n[2],t[2]=a}else t[0]=n[0],t[1]=n[2],t[2]=n[1],t[3]=n[3];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*e-u*r;return o?(o=1/o,t[0]=e*o,t[1]=-r*o,t[2]=-u*o,t[3]=a*o,t):null},adjoint:function(t,n){var a=n[0];return t[0]=n[3],t[1]=-n[1],t[2]=-n[2],t[3]=a,t},determinant:function(t){return t[0]*t[3]-t[2]*t[1]},multiply:o,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),c=Math.cos(a);return t[0]=r*c+e*i,t[1]=u*c+o*i,t[2]=r*-i+e*c,t[3]=u*-i+o*c,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],c=a[1];return t[0]=r*i,t[1]=u*i,t[2]=e*c,t[3]=o*c,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t},str:function(t){return"mat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3])},LDU:function(t,n,a,r){return t[2]=r[2]/r[0],a[0]=r[0],a[1]=r[1],a[3]=r[3]-t[2]*a[1],[t,n,a]},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t},subtract:i,exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=a[0],c=a[1],h=a[2],s=a[3];return Math.abs(r-i)<=n*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(u-c)<=n*Math.max(1,Math.abs(u),Math.abs(c))&&Math.abs(e-h)<=n*Math.max(1,Math.abs(e),Math.abs(h))&&Math.abs(o-s)<=n*Math.max(1,Math.abs(o),Math.abs(s))},multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t},mul:c,sub:h});function M(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=a[0],s=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return t[0]=r*h+e*s,t[1]=u*h+o*s,t[2]=r*M+e*f,t[3]=u*M+o*f,t[4]=r*l+e*v+i,t[5]=u*l+o*v+c,t}function f(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t}var l=M,v=f,b=Object.freeze({create:function(){var t=new a(6);return a!=Float32Array&&(t[1]=0,t[2]=0,t[4]=0,t[5]=0),t[0]=1,t[3]=1,t},clone:function(t){var n=new a(6);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t},fromValues:function(t,n,r,u,e,o){var i=new a(6);return i[0]=t,i[1]=n,i[2]=r,i[3]=u,i[4]=e,i[5]=o,i},set:function(t,n,a,r,u,e,o){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],c=a*e-r*u;return c?(c=1/c,t[0]=e*c,t[1]=-r*c,t[2]=-u*c,t[3]=a*c,t[4]=(u*i-e*o)*c,t[5]=(r*o-a*i)*c,t):null},determinant:function(t){return t[0]*t[3]-t[1]*t[2]},multiply:M,rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=Math.sin(a),s=Math.cos(a);return t[0]=r*s+e*h,t[1]=u*s+o*h,t[2]=r*-h+e*s,t[3]=u*-h+o*s,t[4]=i,t[5]=c,t},scale:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=a[0],s=a[1];return t[0]=r*h,t[1]=u*h,t[2]=e*s,t[3]=o*s,t[4]=i,t[5]=c,t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=a[0],s=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=r*h+e*s+i,t[5]=u*h+o*s+c,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=-a,t[3]=r,t[4]=0,t[5]=0,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=n[1],t[4]=0,t[5]=0,t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=n[0],t[5]=n[1],t},str:function(t){return"mat2d("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+")"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3],t[4],t[5],1)},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t},subtract:f,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],c=t[5],h=a[0],s=a[1],M=a[2],f=a[3],l=a[4],v=a[5];return Math.abs(r-h)<=n*Math.max(1,Math.abs(r),Math.abs(h))&&Math.abs(u-s)<=n*Math.max(1,Math.abs(u),Math.abs(s))&&Math.abs(e-M)<=n*Math.max(1,Math.abs(e),Math.abs(M))&&Math.abs(o-f)<=n*Math.max(1,Math.abs(o),Math.abs(f))&&Math.abs(i-l)<=n*Math.max(1,Math.abs(i),Math.abs(l))&&Math.abs(c-v)<=n*Math.max(1,Math.abs(c),Math.abs(v))},mul:l,sub:v});function m(){var t=new a(9);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[5]=0,t[6]=0,t[7]=0),t[0]=1,t[4]=1,t[8]=1,t}function d(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=n[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],x=a[6],p=a[7],y=a[8];return t[0]=f*r+l*o+v*h,t[1]=f*u+l*i+v*s,t[2]=f*e+l*c+v*M,t[3]=b*r+m*o+d*h,t[4]=b*u+m*i+d*s,t[5]=b*e+m*c+d*M,t[6]=x*r+p*o+y*h,t[7]=x*u+p*i+y*s,t[8]=x*e+p*c+y*M,t}function x(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t}var p=d,y=x,q=Object.freeze({create:m,fromMat4:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[4],t[4]=n[5],t[5]=n[6],t[6]=n[8],t[7]=n[9],t[8]=n[10],t},clone:function(t){var n=new a(9);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromValues:function(t,n,r,u,e,o,i,c,h){var s=new a(9);return s[0]=t,s[1]=n,s[2]=r,s[3]=u,s[4]=e,s[5]=o,s[6]=i,s[7]=c,s[8]=h,s},set:function(t,n,a,r,u,e,o,i,c,h){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=c,t[8]=h,t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[5];t[1]=n[3],t[2]=n[6],t[3]=a,t[5]=n[7],t[6]=r,t[7]=u}else t[0]=n[0],t[1]=n[3],t[2]=n[6],t[3]=n[1],t[4]=n[4],t[5]=n[7],t[6]=n[2],t[7]=n[5],t[8]=n[8];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],c=n[6],h=n[7],s=n[8],M=s*o-i*h,f=-s*e+i*c,l=h*e-o*c,v=a*M+r*f+u*l;return v?(v=1/v,t[0]=M*v,t[1]=(-s*r+u*h)*v,t[2]=(i*r-u*o)*v,t[3]=f*v,t[4]=(s*a-u*c)*v,t[5]=(-i*a+u*e)*v,t[6]=l*v,t[7]=(-h*a+r*c)*v,t[8]=(o*a-r*e)*v,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],c=n[6],h=n[7],s=n[8];return t[0]=o*s-i*h,t[1]=u*h-r*s,t[2]=r*i-u*o,t[3]=i*c-e*s,t[4]=a*s-u*c,t[5]=u*e-a*i,t[6]=e*h-o*c,t[7]=r*c-a*h,t[8]=a*o-r*e,t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],c=t[7],h=t[8];return n*(h*e-o*c)+a*(-h*u+o*i)+r*(c*u-e*i)},multiply:d,translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=n[8],f=a[0],l=a[1];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=c,t[6]=f*r+l*o+h,t[7]=f*u+l*i+s,t[8]=f*e+l*c+M,t},rotate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=n[8],f=Math.sin(a),l=Math.cos(a);return t[0]=l*r+f*o,t[1]=l*u+f*i,t[2]=l*e+f*c,t[3]=l*o-f*r,t[4]=l*i-f*u,t[5]=l*c-f*e,t[6]=h,t[7]=s,t[8]=M,t},scale:function(t,n,a){var r=a[0],u=a[1];return t[0]=r*n[0],t[1]=r*n[1],t[2]=r*n[2],t[3]=u*n[3],t[4]=u*n[4],t[5]=u*n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=n[0],t[7]=n[1],t[8]=1,t},fromRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=0,t[3]=-a,t[4]=r,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=n[1],t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromMat2d:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=0,t[3]=n[2],t[4]=n[3],t[5]=0,t[6]=n[4],t[7]=n[5],t[8]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,c=u+u,h=a*o,s=r*o,M=r*i,f=u*o,l=u*i,v=u*c,b=e*o,m=e*i,d=e*c;return t[0]=1-M-v,t[3]=s-d,t[6]=f+m,t[1]=s+d,t[4]=1-h-v,t[7]=l-b,t[2]=f-m,t[5]=l+b,t[8]=1-h-M,t},normalFromMat4:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],c=n[6],h=n[7],s=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,p=a*c-u*o,y=a*h-e*o,q=r*c-u*i,g=r*h-e*i,A=u*h-e*c,w=s*b-M*v,R=s*m-f*v,z=s*d-l*v,P=M*m-f*b,j=M*d-l*b,I=f*d-l*m,S=x*I-p*j+y*P+q*z-g*R+A*w;return S?(S=1/S,t[0]=(i*I-c*j+h*P)*S,t[1]=(c*z-o*I-h*R)*S,t[2]=(o*j-i*z+h*w)*S,t[3]=(u*j-r*I-e*P)*S,t[4]=(a*I-u*z+e*R)*S,t[5]=(r*z-a*j-e*w)*S,t[6]=(b*A-m*g+d*q)*S,t[7]=(m*y-v*A-d*p)*S,t[8]=(v*g-b*y+d*x)*S,t):null},projection:function(t,n,a){return t[0]=2/n,t[1]=0,t[2]=0,t[3]=0,t[4]=-2/a,t[5]=0,t[6]=-1,t[7]=1,t[8]=1,t},str:function(t){return"mat3("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+")"},frob:function(t){return Math.hypot(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t},subtract:x,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],c=t[5],h=t[6],s=t[7],M=t[8],f=a[0],l=a[1],v=a[2],b=a[3],m=a[4],d=a[5],x=a[6],p=a[7],y=a[8];return Math.abs(r-f)<=n*Math.max(1,Math.abs(r),Math.abs(f))&&Math.abs(u-l)<=n*Math.max(1,Math.abs(u),Math.abs(l))&&Math.abs(e-v)<=n*Math.max(1,Math.abs(e),Math.abs(v))&&Math.abs(o-b)<=n*Math.max(1,Math.abs(o),Math.abs(b))&&Math.abs(i-m)<=n*Math.max(1,Math.abs(i),Math.abs(m))&&Math.abs(c-d)<=n*Math.max(1,Math.abs(c),Math.abs(d))&&Math.abs(h-x)<=n*Math.max(1,Math.abs(h),Math.abs(x))&&Math.abs(s-p)<=n*Math.max(1,Math.abs(s),Math.abs(p))&&Math.abs(M-y)<=n*Math.max(1,Math.abs(M),Math.abs(y))},mul:p,sub:y});function g(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}function A(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=n[8],f=n[9],l=n[10],v=n[11],b=n[12],m=n[13],d=n[14],x=n[15],p=a[0],y=a[1],q=a[2],g=a[3];return t[0]=p*r+y*i+q*M+g*b,t[1]=p*u+y*c+q*f+g*m,t[2]=p*e+y*h+q*l+g*d,t[3]=p*o+y*s+q*v+g*x,p=a[4],y=a[5],q=a[6],g=a[7],t[4]=p*r+y*i+q*M+g*b,t[5]=p*u+y*c+q*f+g*m,t[6]=p*e+y*h+q*l+g*d,t[7]=p*o+y*s+q*v+g*x,p=a[8],y=a[9],q=a[10],g=a[11],t[8]=p*r+y*i+q*M+g*b,t[9]=p*u+y*c+q*f+g*m,t[10]=p*e+y*h+q*l+g*d,t[11]=p*o+y*s+q*v+g*x,p=a[12],y=a[13],q=a[14],g=a[15],t[12]=p*r+y*i+q*M+g*b,t[13]=p*u+y*c+q*f+g*m,t[14]=p*e+y*h+q*l+g*d,t[15]=p*o+y*s+q*v+g*x,t}function w(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=r+r,c=u+u,h=e+e,s=r*i,M=r*c,f=r*h,l=u*c,v=u*h,b=e*h,m=o*i,d=o*c,x=o*h;return t[0]=1-(l+b),t[1]=M+x,t[2]=f-d,t[3]=0,t[4]=M-x,t[5]=1-(s+b),t[6]=v+m,t[7]=0,t[8]=f+d,t[9]=v-m,t[10]=1-(s+l),t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t}function R(t,n){return t[0]=n[12],t[1]=n[13],t[2]=n[14],t}function z(t,n){var a=n[0],r=n[1],u=n[2],e=n[4],o=n[5],i=n[6],c=n[8],h=n[9],s=n[10];return t[0]=Math.hypot(a,r,u),t[1]=Math.hypot(e,o,i),t[2]=Math.hypot(c,h,s),t}function P(t,n){var r=new a(3);z(r,n);var u=1/r[0],e=1/r[1],o=1/r[2],i=n[0]*u,c=n[1]*e,h=n[2]*o,s=n[4]*u,M=n[5]*e,f=n[6]*o,l=n[8]*u,v=n[9]*e,b=n[10]*o,m=i+M+b,d=0;return m>0?(d=2*Math.sqrt(m+1),t[3]=.25*d,t[0]=(f-v)/d,t[1]=(l-h)/d,t[2]=(c-s)/d):i>M&&i>b?(d=2*Math.sqrt(1+i-M-b),t[3]=(f-v)/d,t[0]=.25*d,t[1]=(c+s)/d,t[2]=(l+h)/d):M>b?(d=2*Math.sqrt(1+M-i-b),t[3]=(l-h)/d,t[0]=(c+s)/d,t[1]=.25*d,t[2]=(f+v)/d):(d=2*Math.sqrt(1+b-i-M),t[3]=(c-s)/d,t[0]=(l+h)/d,t[1]=(f+v)/d,t[2]=.25*d),t}function j(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t[4]=n[4]-a[4],t[5]=n[5]-a[5],t[6]=n[6]-a[6],t[7]=n[7]-a[7],t[8]=n[8]-a[8],t[9]=n[9]-a[9],t[10]=n[10]-a[10],t[11]=n[11]-a[11],t[12]=n[12]-a[12],t[13]=n[13]-a[13],t[14]=n[14]-a[14],t[15]=n[15]-a[15],t}var I=A,S=j,E=Object.freeze({create:function(){var t=new a(16);return a!=Float32Array&&(t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=0,t[12]=0,t[13]=0,t[14]=0),t[0]=1,t[5]=1,t[10]=1,t[15]=1,t},clone:function(t){var n=new a(16);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n[8]=t[8],n[9]=t[9],n[10]=t[10],n[11]=t[11],n[12]=t[12],n[13]=t[13],n[14]=t[14],n[15]=t[15],n},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},fromValues:function(t,n,r,u,e,o,i,c,h,s,M,f,l,v,b,m){var d=new a(16);return d[0]=t,d[1]=n,d[2]=r,d[3]=u,d[4]=e,d[5]=o,d[6]=i,d[7]=c,d[8]=h,d[9]=s,d[10]=M,d[11]=f,d[12]=l,d[13]=v,d[14]=b,d[15]=m,d},set:function(t,n,a,r,u,e,o,i,c,h,s,M,f,l,v,b,m){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=c,t[8]=h,t[9]=s,t[10]=M,t[11]=f,t[12]=l,t[13]=v,t[14]=b,t[15]=m,t},identity:g,transpose:function(t,n){if(t===n){var a=n[1],r=n[2],u=n[3],e=n[6],o=n[7],i=n[11];t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=a,t[6]=n[9],t[7]=n[13],t[8]=r,t[9]=e,t[11]=n[14],t[12]=u,t[13]=o,t[14]=i}else t[0]=n[0],t[1]=n[4],t[2]=n[8],t[3]=n[12],t[4]=n[1],t[5]=n[5],t[6]=n[9],t[7]=n[13],t[8]=n[2],t[9]=n[6],t[10]=n[10],t[11]=n[14],t[12]=n[3],t[13]=n[7],t[14]=n[11],t[15]=n[15];return t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],c=n[6],h=n[7],s=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15],x=a*i-r*o,p=a*c-u*o,y=a*h-e*o,q=r*c-u*i,g=r*h-e*i,A=u*h-e*c,w=s*b-M*v,R=s*m-f*v,z=s*d-l*v,P=M*m-f*b,j=M*d-l*b,I=f*d-l*m,S=x*I-p*j+y*P+q*z-g*R+A*w;return S?(S=1/S,t[0]=(i*I-c*j+h*P)*S,t[1]=(u*j-r*I-e*P)*S,t[2]=(b*A-m*g+d*q)*S,t[3]=(f*g-M*A-l*q)*S,t[4]=(c*z-o*I-h*R)*S,t[5]=(a*I-u*z+e*R)*S,t[6]=(m*y-v*A-d*p)*S,t[7]=(s*A-f*y+l*p)*S,t[8]=(o*j-i*z+h*w)*S,t[9]=(r*z-a*j-e*w)*S,t[10]=(v*g-b*y+d*x)*S,t[11]=(M*y-s*g-l*x)*S,t[12]=(i*R-o*P-c*w)*S,t[13]=(a*P-r*R+u*w)*S,t[14]=(b*p-v*q-m*x)*S,t[15]=(s*q-M*p+f*x)*S,t):null},adjoint:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=n[4],i=n[5],c=n[6],h=n[7],s=n[8],M=n[9],f=n[10],l=n[11],v=n[12],b=n[13],m=n[14],d=n[15];return t[0]=i*(f*d-l*m)-M*(c*d-h*m)+b*(c*l-h*f),t[1]=-(r*(f*d-l*m)-M*(u*d-e*m)+b*(u*l-e*f)),t[2]=r*(c*d-h*m)-i*(u*d-e*m)+b*(u*h-e*c),t[3]=-(r*(c*l-h*f)-i*(u*l-e*f)+M*(u*h-e*c)),t[4]=-(o*(f*d-l*m)-s*(c*d-h*m)+v*(c*l-h*f)),t[5]=a*(f*d-l*m)-s*(u*d-e*m)+v*(u*l-e*f),t[6]=-(a*(c*d-h*m)-o*(u*d-e*m)+v*(u*h-e*c)),t[7]=a*(c*l-h*f)-o*(u*l-e*f)+s*(u*h-e*c),t[8]=o*(M*d-l*b)-s*(i*d-h*b)+v*(i*l-h*M),t[9]=-(a*(M*d-l*b)-s*(r*d-e*b)+v*(r*l-e*M)),t[10]=a*(i*d-h*b)-o*(r*d-e*b)+v*(r*h-e*i),t[11]=-(a*(i*l-h*M)-o*(r*l-e*M)+s*(r*h-e*i)),t[12]=-(o*(M*m-f*b)-s*(i*m-c*b)+v*(i*f-c*M)),t[13]=a*(M*m-f*b)-s*(r*m-u*b)+v*(r*f-u*M),t[14]=-(a*(i*m-c*b)-o*(r*m-u*b)+v*(r*c-u*i)),t[15]=a*(i*f-c*M)-o*(r*f-u*M)+s*(r*c-u*i),t},determinant:function(t){var n=t[0],a=t[1],r=t[2],u=t[3],e=t[4],o=t[5],i=t[6],c=t[7],h=t[8],s=t[9],M=t[10],f=t[11],l=t[12],v=t[13],b=t[14],m=t[15];return(n*o-a*e)*(M*m-f*b)-(n*i-r*e)*(s*m-f*v)+(n*c-u*e)*(s*b-M*v)+(a*i-r*o)*(h*m-f*l)-(a*c-u*o)*(h*b-M*l)+(r*c-u*i)*(h*v-s*l)},multiply:A,translate:function(t,n,a){var r,u,e,o,i,c,h,s,M,f,l,v,b=a[0],m=a[1],d=a[2];return n===t?(t[12]=n[0]*b+n[4]*m+n[8]*d+n[12],t[13]=n[1]*b+n[5]*m+n[9]*d+n[13],t[14]=n[2]*b+n[6]*m+n[10]*d+n[14],t[15]=n[3]*b+n[7]*m+n[11]*d+n[15]):(r=n[0],u=n[1],e=n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=n[8],f=n[9],l=n[10],v=n[11],t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=i,t[5]=c,t[6]=h,t[7]=s,t[8]=M,t[9]=f,t[10]=l,t[11]=v,t[12]=r*b+i*m+M*d+n[12],t[13]=u*b+c*m+f*d+n[13],t[14]=e*b+h*m+l*d+n[14],t[15]=o*b+s*m+v*d+n[15]),t},scale:function(t,n,a){var r=a[0],u=a[1],e=a[2];return t[0]=n[0]*r,t[1]=n[1]*r,t[2]=n[2]*r,t[3]=n[3]*r,t[4]=n[4]*u,t[5]=n[5]*u,t[6]=n[6]*u,t[7]=n[7]*u,t[8]=n[8]*e,t[9]=n[9]*e,t[10]=n[10]*e,t[11]=n[11]*e,t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15],t},rotate:function(t,a,r,u){var e,o,i,c,h,s,M,f,l,v,b,m,d,x,p,y,q,g,A,w,R,z,P,j,I=u[0],S=u[1],E=u[2],O=Math.hypot(I,S,E);return O<n?null:(I*=O=1/O,S*=O,E*=O,e=Math.sin(r),i=1-(o=Math.cos(r)),c=a[0],h=a[1],s=a[2],M=a[3],f=a[4],l=a[5],v=a[6],b=a[7],m=a[8],d=a[9],x=a[10],p=a[11],y=I*I*i+o,q=S*I*i+E*e,g=E*I*i-S*e,A=I*S*i-E*e,w=S*S*i+o,R=E*S*i+I*e,z=I*E*i+S*e,P=S*E*i-I*e,j=E*E*i+o,t[0]=c*y+f*q+m*g,t[1]=h*y+l*q+d*g,t[2]=s*y+v*q+x*g,t[3]=M*y+b*q+p*g,t[4]=c*A+f*w+m*R,t[5]=h*A+l*w+d*R,t[6]=s*A+v*w+x*R,t[7]=M*A+b*w+p*R,t[8]=c*z+f*P+m*j,t[9]=h*z+l*P+d*j,t[10]=s*z+v*P+x*j,t[11]=M*z+b*P+p*j,a!==t&&(t[12]=a[12],t[13]=a[13],t[14]=a[14],t[15]=a[15]),t)},rotateX:function(t,n,a){var r=Math.sin(a),u=Math.cos(a),e=n[4],o=n[5],i=n[6],c=n[7],h=n[8],s=n[9],M=n[10],f=n[11];return n!==t&&(t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[4]=e*u+h*r,t[5]=o*u+s*r,t[6]=i*u+M*r,t[7]=c*u+f*r,t[8]=h*u-e*r,t[9]=s*u-o*r,t[10]=M*u-i*r,t[11]=f*u-c*r,t},rotateY:function(t,n,a){var r=Math.sin(a),u=Math.cos(a),e=n[0],o=n[1],i=n[2],c=n[3],h=n[8],s=n[9],M=n[10],f=n[11];return n!==t&&(t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=e*u-h*r,t[1]=o*u-s*r,t[2]=i*u-M*r,t[3]=c*u-f*r,t[8]=e*r+h*u,t[9]=o*r+s*u,t[10]=i*r+M*u,t[11]=c*r+f*u,t},rotateZ:function(t,n,a){var r=Math.sin(a),u=Math.cos(a),e=n[0],o=n[1],i=n[2],c=n[3],h=n[4],s=n[5],M=n[6],f=n[7];return n!==t&&(t[8]=n[8],t[9]=n[9],t[10]=n[10],t[11]=n[11],t[12]=n[12],t[13]=n[13],t[14]=n[14],t[15]=n[15]),t[0]=e*u+h*r,t[1]=o*u+s*r,t[2]=i*u+M*r,t[3]=c*u+f*r,t[4]=h*u-e*r,t[5]=s*u-o*r,t[6]=M*u-i*r,t[7]=f*u-c*r,t},fromTranslation:function(t,n){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=n[0],t[13]=n[1],t[14]=n[2],t[15]=1,t},fromScaling:function(t,n){return t[0]=n[0],t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=n[1],t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=n[2],t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromRotation:function(t,a,r){var u,e,o,i=r[0],c=r[1],h=r[2],s=Math.hypot(i,c,h);return s<n?null:(i*=s=1/s,c*=s,h*=s,u=Math.sin(a),o=1-(e=Math.cos(a)),t[0]=i*i*o+e,t[1]=c*i*o+h*u,t[2]=h*i*o-c*u,t[3]=0,t[4]=i*c*o-h*u,t[5]=c*c*o+e,t[6]=h*c*o+i*u,t[7]=0,t[8]=i*h*o+c*u,t[9]=c*h*o-i*u,t[10]=h*h*o+e,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t)},fromXRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=r,t[6]=a,t[7]=0,t[8]=0,t[9]=-a,t[10]=r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromYRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=0,t[2]=-a,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=a,t[9]=0,t[10]=r,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromZRotation:function(t,n){var a=Math.sin(n),r=Math.cos(n);return t[0]=r,t[1]=a,t[2]=0,t[3]=0,t[4]=-a,t[5]=r,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},fromRotationTranslation:w,fromQuat2:function(t,n){var r=new a(3),u=-n[0],e=-n[1],o=-n[2],i=n[3],c=n[4],h=n[5],s=n[6],M=n[7],f=u*u+e*e+o*o+i*i;return f>0?(r[0]=2*(c*i+M*u+h*o-s*e)/f,r[1]=2*(h*i+M*e+s*u-c*o)/f,r[2]=2*(s*i+M*o+c*e-h*u)/f):(r[0]=2*(c*i+M*u+h*o-s*e),r[1]=2*(h*i+M*e+s*u-c*o),r[2]=2*(s*i+M*o+c*e-h*u)),w(t,n,r),t},getTranslation:R,getScaling:z,getRotation:P,fromRotationTranslationScale:function(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3],c=u+u,h=e+e,s=o+o,M=u*c,f=u*h,l=u*s,v=e*h,b=e*s,m=o*s,d=i*c,x=i*h,p=i*s,y=r[0],q=r[1],g=r[2];return t[0]=(1-(v+m))*y,t[1]=(f+p)*y,t[2]=(l-x)*y,t[3]=0,t[4]=(f-p)*q,t[5]=(1-(M+m))*q,t[6]=(b+d)*q,t[7]=0,t[8]=(l+x)*g,t[9]=(b-d)*g,t[10]=(1-(M+v))*g,t[11]=0,t[12]=a[0],t[13]=a[1],t[14]=a[2],t[15]=1,t},fromRotationTranslationScaleOrigin:function(t,n,a,r,u){var e=n[0],o=n[1],i=n[2],c=n[3],h=e+e,s=o+o,M=i+i,f=e*h,l=e*s,v=e*M,b=o*s,m=o*M,d=i*M,x=c*h,p=c*s,y=c*M,q=r[0],g=r[1],A=r[2],w=u[0],R=u[1],z=u[2],P=(1-(b+d))*q,j=(l+y)*q,I=(v-p)*q,S=(l-y)*g,E=(1-(f+d))*g,O=(m+x)*g,T=(v+p)*A,D=(m-x)*A,F=(1-(f+b))*A;return t[0]=P,t[1]=j,t[2]=I,t[3]=0,t[4]=S,t[5]=E,t[6]=O,t[7]=0,t[8]=T,t[9]=D,t[10]=F,t[11]=0,t[12]=a[0]+w-(P*w+S*R+T*z),t[13]=a[1]+R-(j*w+E*R+D*z),t[14]=a[2]+z-(I*w+O*R+F*z),t[15]=1,t},fromQuat:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a+a,i=r+r,c=u+u,h=a*o,s=r*o,M=r*i,f=u*o,l=u*i,v=u*c,b=e*o,m=e*i,d=e*c;return t[0]=1-M-v,t[1]=s+d,t[2]=f-m,t[3]=0,t[4]=s-d,t[5]=1-h-v,t[6]=l+b,t[7]=0,t[8]=f+m,t[9]=l-b,t[10]=1-h-M,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},frustum:function(t,n,a,r,u,e,o){var i=1/(a-n),c=1/(u-r),h=1/(e-o);return t[0]=2*e*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=2*e*c,t[6]=0,t[7]=0,t[8]=(a+n)*i,t[9]=(u+r)*c,t[10]=(o+e)*h,t[11]=-1,t[12]=0,t[13]=0,t[14]=o*e*2*h,t[15]=0,t},perspective:function(t,n,a,r,u){var e,o=1/Math.tan(n/2);return t[0]=o/a,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=o,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[11]=-1,t[12]=0,t[13]=0,t[15]=0,null!=u&&u!==1/0?(e=1/(r-u),t[10]=(u+r)*e,t[14]=2*u*r*e):(t[10]=-1,t[14]=-2*r),t},perspectiveFromFieldOfView:function(t,n,a,r){var u=Math.tan(n.upDegrees*Math.PI/180),e=Math.tan(n.downDegrees*Math.PI/180),o=Math.tan(n.leftDegrees*Math.PI/180),i=Math.tan(n.rightDegrees*Math.PI/180),c=2/(o+i),h=2/(u+e);return t[0]=c,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=h,t[6]=0,t[7]=0,t[8]=-(o-i)*c*.5,t[9]=(u-e)*h*.5,t[10]=r/(a-r),t[11]=-1,t[12]=0,t[13]=0,t[14]=r*a/(a-r),t[15]=0,t},ortho:function(t,n,a,r,u,e,o){var i=1/(n-a),c=1/(r-u),h=1/(e-o);return t[0]=-2*i,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*c,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*h,t[11]=0,t[12]=(n+a)*i,t[13]=(u+r)*c,t[14]=(o+e)*h,t[15]=1,t},lookAt:function(t,a,r,u){var e,o,i,c,h,s,M,f,l,v,b=a[0],m=a[1],d=a[2],x=u[0],p=u[1],y=u[2],q=r[0],A=r[1],w=r[2];return Math.abs(b-q)<n&&Math.abs(m-A)<n&&Math.abs(d-w)<n?g(t):(M=b-q,f=m-A,l=d-w,e=p*(l*=v=1/Math.hypot(M,f,l))-y*(f*=v),o=y*(M*=v)-x*l,i=x*f-p*M,(v=Math.hypot(e,o,i))?(e*=v=1/v,o*=v,i*=v):(e=0,o=0,i=0),c=f*i-l*o,h=l*e-M*i,s=M*o-f*e,(v=Math.hypot(c,h,s))?(c*=v=1/v,h*=v,s*=v):(c=0,h=0,s=0),t[0]=e,t[1]=c,t[2]=M,t[3]=0,t[4]=o,t[5]=h,t[6]=f,t[7]=0,t[8]=i,t[9]=s,t[10]=l,t[11]=0,t[12]=-(e*b+o*m+i*d),t[13]=-(c*b+h*m+s*d),t[14]=-(M*b+f*m+l*d),t[15]=1,t)},targetTo:function(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=r[0],c=r[1],h=r[2],s=u-a[0],M=e-a[1],f=o-a[2],l=s*s+M*M+f*f;l>0&&(s*=l=1/Math.sqrt(l),M*=l,f*=l);var v=c*f-h*M,b=h*s-i*f,m=i*M-c*s;return(l=v*v+b*b+m*m)>0&&(v*=l=1/Math.sqrt(l),b*=l,m*=l),t[0]=v,t[1]=b,t[2]=m,t[3]=0,t[4]=M*m-f*b,t[5]=f*v-s*m,t[6]=s*b-M*v,t[7]=0,t[8]=s,t[9]=M,t[10]=f,t[11]=0,t[12]=u,t[13]=e,t[14]=o,t[15]=1,t},str:function(t){return"mat4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+", "+t[8]+", "+t[9]+", "+t[10]+", "+t[11]+", "+t[12]+", "+t[13]+", "+t[14]+", "+t[15]+")"},frob:function(t){return Math.hypot(t[0],t[1],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t[8]=n[8]+a[8],t[9]=n[9]+a[9],t[10]=n[10]+a[10],t[11]=n[11]+a[11],t[12]=n[12]+a[12],t[13]=n[13]+a[13],t[14]=n[14]+a[14],t[15]=n[15]+a[15],t},subtract:j,multiplyScalar:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t[8]=n[8]*a,t[9]=n[9]*a,t[10]=n[10]*a,t[11]=n[11]*a,t[12]=n[12]*a,t[13]=n[13]*a,t[14]=n[14]*a,t[15]=n[15]*a,t},multiplyScalarAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t[4]=n[4]+a[4]*r,t[5]=n[5]+a[5]*r,t[6]=n[6]+a[6]*r,t[7]=n[7]+a[7]*r,t[8]=n[8]+a[8]*r,t[9]=n[9]+a[9]*r,t[10]=n[10]+a[10]*r,t[11]=n[11]+a[11]*r,t[12]=n[12]+a[12]*r,t[13]=n[13]+a[13]*r,t[14]=n[14]+a[14]*r,t[15]=n[15]+a[15]*r,t},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]&&t[8]===n[8]&&t[9]===n[9]&&t[10]===n[10]&&t[11]===n[11]&&t[12]===n[12]&&t[13]===n[13]&&t[14]===n[14]&&t[15]===n[15]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],c=t[5],h=t[6],s=t[7],M=t[8],f=t[9],l=t[10],v=t[11],b=t[12],m=t[13],d=t[14],x=t[15],p=a[0],y=a[1],q=a[2],g=a[3],A=a[4],w=a[5],R=a[6],z=a[7],P=a[8],j=a[9],I=a[10],S=a[11],E=a[12],O=a[13],T=a[14],D=a[15];return Math.abs(r-p)<=n*Math.max(1,Math.abs(r),Math.abs(p))&&Math.abs(u-y)<=n*Math.max(1,Math.abs(u),Math.abs(y))&&Math.abs(e-q)<=n*Math.max(1,Math.abs(e),Math.abs(q))&&Math.abs(o-g)<=n*Math.max(1,Math.abs(o),Math.abs(g))&&Math.abs(i-A)<=n*Math.max(1,Math.abs(i),Math.abs(A))&&Math.abs(c-w)<=n*Math.max(1,Math.abs(c),Math.abs(w))&&Math.abs(h-R)<=n*Math.max(1,Math.abs(h),Math.abs(R))&&Math.abs(s-z)<=n*Math.max(1,Math.abs(s),Math.abs(z))&&Math.abs(M-P)<=n*Math.max(1,Math.abs(M),Math.abs(P))&&Math.abs(f-j)<=n*Math.max(1,Math.abs(f),Math.abs(j))&&Math.abs(l-I)<=n*Math.max(1,Math.abs(l),Math.abs(I))&&Math.abs(v-S)<=n*Math.max(1,Math.abs(v),Math.abs(S))&&Math.abs(b-E)<=n*Math.max(1,Math.abs(b),Math.abs(E))&&Math.abs(m-O)<=n*Math.max(1,Math.abs(m),Math.abs(O))&&Math.abs(d-T)<=n*Math.max(1,Math.abs(d),Math.abs(T))&&Math.abs(x-D)<=n*Math.max(1,Math.abs(x),Math.abs(D))},mul:I,sub:S});function O(){var t=new a(3);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t}function T(t){var n=t[0],a=t[1],r=t[2];return Math.hypot(n,a,r)}function D(t,n,r){var u=new a(3);return u[0]=t,u[1]=n,u[2]=r,u}function F(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t}function L(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t[2]=n[2]*a[2],t}function V(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t[2]=n[2]/a[2],t}function Q(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return Math.hypot(a,r,u)}function Y(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2];return a*a+r*r+u*u}function X(t){var n=t[0],a=t[1],r=t[2];return n*n+a*a+r*r}function Z(t,n){var a=n[0],r=n[1],u=n[2],e=a*a+r*r+u*u;return e>0&&(e=1/Math.sqrt(e)),t[0]=n[0]*e,t[1]=n[1]*e,t[2]=n[2]*e,t}function _(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]}function B(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[0],i=a[1],c=a[2];return t[0]=u*c-e*i,t[1]=e*o-r*c,t[2]=r*i-u*o,t}var N,k=F,U=L,W=V,C=Q,G=Y,H=T,J=X,K=(N=O(),function(t,n,a,r,u,e){var o,i;for(n||(n=3),a||(a=0),i=r?Math.min(r*n+a,t.length):t.length,o=a;o<i;o+=n)N[0]=t[o],N[1]=t[o+1],N[2]=t[o+2],u(N,N,e),t[o]=N[0],t[o+1]=N[1],t[o+2]=N[2];return t}),$=Object.freeze({create:O,clone:function(t){var n=new a(3);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n},length:T,fromValues:D,copy:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t},set:function(t,n,a,r){return t[0]=n,t[1]=a,t[2]=r,t},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t},subtract:F,multiply:L,divide:V,ceil:function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t[2]=Math.ceil(n[2]),t},floor:function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t[2]=Math.floor(n[2]),t},min:function(t,n,a){return t[0]=Math.min(n[0],a[0]),t[1]=Math.min(n[1],a[1]),t[2]=Math.min(n[2],a[2]),t},max:function(t,n,a){return t[0]=Math.max(n[0],a[0]),t[1]=Math.max(n[1],a[1]),t[2]=Math.max(n[2],a[2]),t},round:function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t[2]=Math.round(n[2]),t},scale:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t},scaleAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t},distance:Q,squaredDistance:Y,squaredLength:X,negate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t},inverse:function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t},normalize:Z,dot:_,cross:B,lerp:function(t,n,a,r){var u=n[0],e=n[1],o=n[2];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t[2]=o+r*(a[2]-o),t},hermite:function(t,n,a,r,u,e){var o=e*e,i=o*(2*e-3)+1,c=o*(e-2)+e,h=o*(e-1),s=o*(3-2*e);return t[0]=n[0]*i+a[0]*c+r[0]*h+u[0]*s,t[1]=n[1]*i+a[1]*c+r[1]*h+u[1]*s,t[2]=n[2]*i+a[2]*c+r[2]*h+u[2]*s,t},bezier:function(t,n,a,r,u,e){var o=1-e,i=o*o,c=e*e,h=i*o,s=3*e*i,M=3*c*o,f=c*e;return t[0]=n[0]*h+a[0]*s+r[0]*M+u[0]*f,t[1]=n[1]*h+a[1]*s+r[1]*M+u[1]*f,t[2]=n[2]*h+a[2]*s+r[2]*M+u[2]*f,t},random:function(t,n){n=n||1;var a=2*r()*Math.PI,u=2*r()-1,e=Math.sqrt(1-u*u)*n;return t[0]=Math.cos(a)*e,t[1]=Math.sin(a)*e,t[2]=u*n,t},transformMat4:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[3]*r+a[7]*u+a[11]*e+a[15];return o=o||1,t[0]=(a[0]*r+a[4]*u+a[8]*e+a[12])/o,t[1]=(a[1]*r+a[5]*u+a[9]*e+a[13])/o,t[2]=(a[2]*r+a[6]*u+a[10]*e+a[14])/o,t},transformMat3:function(t,n,a){var r=n[0],u=n[1],e=n[2];return t[0]=r*a[0]+u*a[3]+e*a[6],t[1]=r*a[1]+u*a[4]+e*a[7],t[2]=r*a[2]+u*a[5]+e*a[8],t},transformQuat:function(t,n,a){var r=a[0],u=a[1],e=a[2],o=a[3],i=n[0],c=n[1],h=n[2],s=u*h-e*c,M=e*i-r*h,f=r*c-u*i,l=u*f-e*M,v=e*s-r*f,b=r*M-u*s,m=2*o;return s*=m,M*=m,f*=m,l*=2,v*=2,b*=2,t[0]=i+s+l,t[1]=c+M+v,t[2]=h+f+b,t},rotateX:function(t,n,a,r){var u=[],e=[];return u[0]=n[0]-a[0],u[1]=n[1]-a[1],u[2]=n[2]-a[2],e[0]=u[0],e[1]=u[1]*Math.cos(r)-u[2]*Math.sin(r),e[2]=u[1]*Math.sin(r)+u[2]*Math.cos(r),t[0]=e[0]+a[0],t[1]=e[1]+a[1],t[2]=e[2]+a[2],t},rotateY:function(t,n,a,r){var u=[],e=[];return u[0]=n[0]-a[0],u[1]=n[1]-a[1],u[2]=n[2]-a[2],e[0]=u[2]*Math.sin(r)+u[0]*Math.cos(r),e[1]=u[1],e[2]=u[2]*Math.cos(r)-u[0]*Math.sin(r),t[0]=e[0]+a[0],t[1]=e[1]+a[1],t[2]=e[2]+a[2],t},rotateZ:function(t,n,a,r){var u=[],e=[];return u[0]=n[0]-a[0],u[1]=n[1]-a[1],u[2]=n[2]-a[2],e[0]=u[0]*Math.cos(r)-u[1]*Math.sin(r),e[1]=u[0]*Math.sin(r)+u[1]*Math.cos(r),e[2]=u[2],t[0]=e[0]+a[0],t[1]=e[1]+a[1],t[2]=e[2]+a[2],t},angle:function(t,n){var a=D(t[0],t[1],t[2]),r=D(n[0],n[1],n[2]);Z(a,a),Z(r,r);var u=_(a,r);return u>1?0:u<-1?Math.PI:Math.acos(u)},zero:function(t){return t[0]=0,t[1]=0,t[2]=0,t},str:function(t){return"vec3("+t[0]+", "+t[1]+", "+t[2]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=a[0],i=a[1],c=a[2];return Math.abs(r-o)<=n*Math.max(1,Math.abs(r),Math.abs(o))&&Math.abs(u-i)<=n*Math.max(1,Math.abs(u),Math.abs(i))&&Math.abs(e-c)<=n*Math.max(1,Math.abs(e),Math.abs(c))},sub:k,mul:U,div:W,dist:C,sqrDist:G,len:H,sqrLen:J,forEach:K});function tt(){var t=new a(4);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[3]=0),t}function nt(t){var n=new a(4);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n}function at(t,n,r,u){var e=new a(4);return e[0]=t,e[1]=n,e[2]=r,e[3]=u,e}function rt(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t}function ut(t,n,a,r,u){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t}function et(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t}function ot(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t[2]=n[2]-a[2],t[3]=n[3]-a[3],t}function it(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t[2]=n[2]*a[2],t[3]=n[3]*a[3],t}function ct(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t[2]=n[2]/a[2],t[3]=n[3]/a[3],t}function ht(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t}function st(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2],e=n[3]-t[3];return Math.hypot(a,r,u,e)}function Mt(t,n){var a=n[0]-t[0],r=n[1]-t[1],u=n[2]-t[2],e=n[3]-t[3];return a*a+r*r+u*u+e*e}function ft(t){var n=t[0],a=t[1],r=t[2],u=t[3];return Math.hypot(n,a,r,u)}function lt(t){var n=t[0],a=t[1],r=t[2],u=t[3];return n*n+a*a+r*r+u*u}function vt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*a+r*r+u*u+e*e;return o>0&&(o=1/Math.sqrt(o)),t[0]=a*o,t[1]=r*o,t[2]=u*o,t[3]=e*o,t}function bt(t,n){return t[0]*n[0]+t[1]*n[1]+t[2]*n[2]+t[3]*n[3]}function mt(t,n,a,r){var u=n[0],e=n[1],o=n[2],i=n[3];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t[2]=o+r*(a[2]-o),t[3]=i+r*(a[3]-i),t}function dt(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]}function xt(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=a[0],c=a[1],h=a[2],s=a[3];return Math.abs(r-i)<=n*Math.max(1,Math.abs(r),Math.abs(i))&&Math.abs(u-c)<=n*Math.max(1,Math.abs(u),Math.abs(c))&&Math.abs(e-h)<=n*Math.max(1,Math.abs(e),Math.abs(h))&&Math.abs(o-s)<=n*Math.max(1,Math.abs(o),Math.abs(s))}var pt=ot,yt=it,qt=ct,gt=st,At=Mt,wt=ft,Rt=lt,zt=function(){var t=tt();return function(n,a,r,u,e,o){var i,c;for(a||(a=4),r||(r=0),c=u?Math.min(u*a+r,n.length):n.length,i=r;i<c;i+=a)t[0]=n[i],t[1]=n[i+1],t[2]=n[i+2],t[3]=n[i+3],e(t,t,o),n[i]=t[0],n[i+1]=t[1],n[i+2]=t[2],n[i+3]=t[3];return n}}(),Pt=Object.freeze({create:tt,clone:nt,fromValues:at,copy:rt,set:ut,add:et,subtract:ot,multiply:it,divide:ct,ceil:function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t[2]=Math.ceil(n[2]),t[3]=Math.ceil(n[3]),t},floor:function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t[2]=Math.floor(n[2]),t[3]=Math.floor(n[3]),t},min:function(t,n,a){return t[0]=Math.min(n[0],a[0]),t[1]=Math.min(n[1],a[1]),t[2]=Math.min(n[2],a[2]),t[3]=Math.min(n[3],a[3]),t},max:function(t,n,a){return t[0]=Math.max(n[0],a[0]),t[1]=Math.max(n[1],a[1]),t[2]=Math.max(n[2],a[2]),t[3]=Math.max(n[3],a[3]),t},round:function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t[2]=Math.round(n[2]),t[3]=Math.round(n[3]),t},scale:ht,scaleAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t[2]=n[2]+a[2]*r,t[3]=n[3]+a[3]*r,t},distance:st,squaredDistance:Mt,length:ft,squaredLength:lt,negate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=-n[3],t},inverse:function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t[2]=1/n[2],t[3]=1/n[3],t},normalize:vt,dot:bt,cross:function(t,n,a,r){var u=a[0]*r[1]-a[1]*r[0],e=a[0]*r[2]-a[2]*r[0],o=a[0]*r[3]-a[3]*r[0],i=a[1]*r[2]-a[2]*r[1],c=a[1]*r[3]-a[3]*r[1],h=a[2]*r[3]-a[3]*r[2],s=n[0],M=n[1],f=n[2],l=n[3];return t[0]=M*h-f*c+l*i,t[1]=-s*h+f*o-l*e,t[2]=s*c-M*o+l*u,t[3]=-s*i+M*e-f*u,t},lerp:mt,random:function(t,n){var a,u,e,o,i,c;n=n||1;do{i=(a=2*r()-1)*a+(u=2*r()-1)*u}while(i>=1);do{c=(e=2*r()-1)*e+(o=2*r()-1)*o}while(c>=1);var h=Math.sqrt((1-i)/c);return t[0]=n*a,t[1]=n*u,t[2]=n*e*h,t[3]=n*o*h,t},transformMat4:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3];return t[0]=a[0]*r+a[4]*u+a[8]*e+a[12]*o,t[1]=a[1]*r+a[5]*u+a[9]*e+a[13]*o,t[2]=a[2]*r+a[6]*u+a[10]*e+a[14]*o,t[3]=a[3]*r+a[7]*u+a[11]*e+a[15]*o,t},transformQuat:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=a[0],i=a[1],c=a[2],h=a[3],s=h*r+i*e-c*u,M=h*u+c*r-o*e,f=h*e+o*u-i*r,l=-o*r-i*u-c*e;return t[0]=s*h+l*-o+M*-c-f*-i,t[1]=M*h+l*-i+f*-o-s*-c,t[2]=f*h+l*-c+s*-i-M*-o,t[3]=n[3],t},zero:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t},str:function(t){return"vec4("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},exactEquals:dt,equals:xt,sub:pt,mul:yt,div:qt,dist:gt,sqrDist:At,len:wt,sqrLen:Rt,forEach:zt});function jt(){var t=new a(4);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0),t[3]=1,t}function It(t,n,a){a*=.5;var r=Math.sin(a);return t[0]=r*n[0],t[1]=r*n[1],t[2]=r*n[2],t[3]=Math.cos(a),t}function St(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],c=a[1],h=a[2],s=a[3];return t[0]=r*s+o*i+u*h-e*c,t[1]=u*s+o*c+e*i-r*h,t[2]=e*s+o*h+r*c-u*i,t[3]=o*s-r*i-u*c-e*h,t}function Et(t,n,a){a*=.5;var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),c=Math.cos(a);return t[0]=r*c+o*i,t[1]=u*c+e*i,t[2]=e*c-u*i,t[3]=o*c-r*i,t}function Ot(t,n,a){a*=.5;var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),c=Math.cos(a);return t[0]=r*c-e*i,t[1]=u*c+o*i,t[2]=e*c+r*i,t[3]=o*c-u*i,t}function Tt(t,n,a){a*=.5;var r=n[0],u=n[1],e=n[2],o=n[3],i=Math.sin(a),c=Math.cos(a);return t[0]=r*c+u*i,t[1]=u*c-r*i,t[2]=e*c+o*i,t[3]=o*c-e*i,t}function Dt(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=Math.sqrt(a*a+r*r+u*u),i=Math.exp(e),c=o>0?i*Math.sin(o)/o:0;return t[0]=a*c,t[1]=r*c,t[2]=u*c,t[3]=i*Math.cos(o),t}function Ft(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=Math.sqrt(a*a+r*r+u*u),i=o>0?Math.atan2(o,e)/o:0;return t[0]=a*i,t[1]=r*i,t[2]=u*i,t[3]=.5*Math.log(a*a+r*r+u*u+e*e),t}function Lt(t,a,r,u){var e,o,i,c,h,s=a[0],M=a[1],f=a[2],l=a[3],v=r[0],b=r[1],m=r[2],d=r[3];return(o=s*v+M*b+f*m+l*d)<0&&(o=-o,v=-v,b=-b,m=-m,d=-d),1-o>n?(e=Math.acos(o),i=Math.sin(e),c=Math.sin((1-u)*e)/i,h=Math.sin(u*e)/i):(c=1-u,h=u),t[0]=c*s+h*v,t[1]=c*M+h*b,t[2]=c*f+h*m,t[3]=c*l+h*d,t}function Vt(t,n){var a,r=n[0]+n[4]+n[8];if(r>0)a=Math.sqrt(r+1),t[3]=.5*a,a=.5/a,t[0]=(n[5]-n[7])*a,t[1]=(n[6]-n[2])*a,t[2]=(n[1]-n[3])*a;else{var u=0;n[4]>n[0]&&(u=1),n[8]>n[3*u+u]&&(u=2);var e=(u+1)%3,o=(u+2)%3;a=Math.sqrt(n[3*u+u]-n[3*e+e]-n[3*o+o]+1),t[u]=.5*a,a=.5/a,t[3]=(n[3*e+o]-n[3*o+e])*a,t[e]=(n[3*e+u]+n[3*u+e])*a,t[o]=(n[3*o+u]+n[3*u+o])*a}return t}var Qt,Yt,Xt,Zt,_t,Bt,Nt=nt,kt=at,Ut=rt,Wt=ut,Ct=et,Gt=St,Ht=ht,Jt=bt,Kt=mt,$t=ft,tn=$t,nn=lt,an=nn,rn=vt,un=dt,en=xt,on=(Qt=O(),Yt=D(1,0,0),Xt=D(0,1,0),function(t,n,a){var r=_(n,a);return r<-.999999?(B(Qt,Yt,n),H(Qt)<1e-6&&B(Qt,Xt,n),Z(Qt,Qt),It(t,Qt,Math.PI),t):r>.999999?(t[0]=0,t[1]=0,t[2]=0,t[3]=1,t):(B(Qt,n,a),t[0]=Qt[0],t[1]=Qt[1],t[2]=Qt[2],t[3]=1+r,rn(t,t))}),cn=(Zt=jt(),_t=jt(),function(t,n,a,r,u,e){return Lt(Zt,n,u,e),Lt(_t,a,r,e),Lt(t,Zt,_t,2*e*(1-e)),t}),hn=(Bt=m(),function(t,n,a,r){return Bt[0]=a[0],Bt[3]=a[1],Bt[6]=a[2],Bt[1]=r[0],Bt[4]=r[1],Bt[7]=r[2],Bt[2]=-n[0],Bt[5]=-n[1],Bt[8]=-n[2],rn(t,Vt(t,Bt))}),sn=Object.freeze({create:jt,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t},setAxisAngle:It,getAxisAngle:function(t,a){var r=2*Math.acos(a[3]),u=Math.sin(r/2);return u>n?(t[0]=a[0]/u,t[1]=a[1]/u,t[2]=a[2]/u):(t[0]=1,t[1]=0,t[2]=0),r},getAngle:function(t,n){var a=Jt(t,n);return Math.acos(2*a*a-1)},multiply:St,rotateX:Et,rotateY:Ot,rotateZ:Tt,calculateW:function(t,n){var a=n[0],r=n[1],u=n[2];return t[0]=a,t[1]=r,t[2]=u,t[3]=Math.sqrt(Math.abs(1-a*a-r*r-u*u)),t},exp:Dt,ln:Ft,pow:function(t,n,a){return Ft(t,n),Ht(t,t,a),Dt(t,t),t},slerp:Lt,random:function(t){var n=r(),a=r(),u=r(),e=Math.sqrt(1-n),o=Math.sqrt(n);return t[0]=e*Math.sin(2*Math.PI*a),t[1]=e*Math.cos(2*Math.PI*a),t[2]=o*Math.sin(2*Math.PI*u),t[3]=o*Math.cos(2*Math.PI*u),t},invert:function(t,n){var a=n[0],r=n[1],u=n[2],e=n[3],o=a*a+r*r+u*u+e*e,i=o?1/o:0;return t[0]=-a*i,t[1]=-r*i,t[2]=-u*i,t[3]=e*i,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t},fromMat3:Vt,fromEuler:function(t,n,a,r){var u=.5*Math.PI/180;n*=u,a*=u,r*=u;var e=Math.sin(n),o=Math.cos(n),i=Math.sin(a),c=Math.cos(a),h=Math.sin(r),s=Math.cos(r);return t[0]=e*c*s-o*i*h,t[1]=o*i*s+e*c*h,t[2]=o*c*h-e*i*s,t[3]=o*c*s+e*i*h,t},str:function(t){return"quat("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+")"},clone:Nt,fromValues:kt,copy:Ut,set:Wt,add:Ct,mul:Gt,scale:Ht,dot:Jt,lerp:Kt,length:$t,len:tn,squaredLength:nn,sqrLen:an,normalize:rn,exactEquals:un,equals:en,rotationTo:on,sqlerp:cn,setAxes:hn});function Mn(t,n,a){var r=.5*a[0],u=.5*a[1],e=.5*a[2],o=n[0],i=n[1],c=n[2],h=n[3];return t[0]=o,t[1]=i,t[2]=c,t[3]=h,t[4]=r*h+u*c-e*i,t[5]=u*h+e*o-r*c,t[6]=e*h+r*i-u*o,t[7]=-r*o-u*i-e*c,t}function fn(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=n[4],t[5]=n[5],t[6]=n[6],t[7]=n[7],t}var ln=Ut;var vn=Ut;function bn(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[4],c=a[5],h=a[6],s=a[7],M=n[4],f=n[5],l=n[6],v=n[7],b=a[0],m=a[1],d=a[2],x=a[3];return t[0]=r*x+o*b+u*d-e*m,t[1]=u*x+o*m+e*b-r*d,t[2]=e*x+o*d+r*m-u*b,t[3]=o*x-r*b-u*m-e*d,t[4]=r*s+o*i+u*h-e*c+M*x+v*b+f*d-l*m,t[5]=u*s+o*c+e*i-r*h+f*x+v*m+l*b-M*d,t[6]=e*s+o*h+r*c-u*i+l*x+v*d+M*m-f*b,t[7]=o*s-r*i-u*c-e*h+v*x-M*b-f*m-l*d,t}var mn=bn;var dn=Jt;var xn=$t,pn=xn,yn=nn,qn=yn;var gn=Object.freeze({create:function(){var t=new a(8);return a!=Float32Array&&(t[0]=0,t[1]=0,t[2]=0,t[4]=0,t[5]=0,t[6]=0,t[7]=0),t[3]=1,t},clone:function(t){var n=new a(8);return n[0]=t[0],n[1]=t[1],n[2]=t[2],n[3]=t[3],n[4]=t[4],n[5]=t[5],n[6]=t[6],n[7]=t[7],n},fromValues:function(t,n,r,u,e,o,i,c){var h=new a(8);return h[0]=t,h[1]=n,h[2]=r,h[3]=u,h[4]=e,h[5]=o,h[6]=i,h[7]=c,h},fromRotationTranslationValues:function(t,n,r,u,e,o,i){var c=new a(8);c[0]=t,c[1]=n,c[2]=r,c[3]=u;var h=.5*e,s=.5*o,M=.5*i;return c[4]=h*u+s*r-M*n,c[5]=s*u+M*t-h*r,c[6]=M*u+h*n-s*t,c[7]=-h*t-s*n-M*r,c},fromRotationTranslation:Mn,fromTranslation:function(t,n){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=.5*n[0],t[5]=.5*n[1],t[6]=.5*n[2],t[7]=0,t},fromRotation:function(t,n){return t[0]=n[0],t[1]=n[1],t[2]=n[2],t[3]=n[3],t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},fromMat4:function(t,n){var r=jt();P(r,n);var u=new a(3);return R(u,n),Mn(t,r,u),t},copy:fn,identity:function(t){return t[0]=0,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t[6]=0,t[7]=0,t},set:function(t,n,a,r,u,e,o,i,c){return t[0]=n,t[1]=a,t[2]=r,t[3]=u,t[4]=e,t[5]=o,t[6]=i,t[7]=c,t},getReal:ln,getDual:function(t,n){return t[0]=n[4],t[1]=n[5],t[2]=n[6],t[3]=n[7],t},setReal:vn,setDual:function(t,n){return t[4]=n[0],t[5]=n[1],t[6]=n[2],t[7]=n[3],t},getTranslation:function(t,n){var a=n[4],r=n[5],u=n[6],e=n[7],o=-n[0],i=-n[1],c=-n[2],h=n[3];return t[0]=2*(a*h+e*o+r*c-u*i),t[1]=2*(r*h+e*i+u*o-a*c),t[2]=2*(u*h+e*c+a*i-r*o),t},translate:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=.5*a[0],c=.5*a[1],h=.5*a[2],s=n[4],M=n[5],f=n[6],l=n[7];return t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=o*i+u*h-e*c+s,t[5]=o*c+e*i-r*h+M,t[6]=o*h+r*c-u*i+f,t[7]=-r*i-u*c-e*h+l,t},rotateX:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=i*o+s*r+c*e-h*u,f=c*o+s*u+h*r-i*e,l=h*o+s*e+i*u-c*r,v=s*o-i*r-c*u-h*e;return Et(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateY:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=i*o+s*r+c*e-h*u,f=c*o+s*u+h*r-i*e,l=h*o+s*e+i*u-c*r,v=s*o-i*r-c*u-h*e;return Ot(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateZ:function(t,n,a){var r=-n[0],u=-n[1],e=-n[2],o=n[3],i=n[4],c=n[5],h=n[6],s=n[7],M=i*o+s*r+c*e-h*u,f=c*o+s*u+h*r-i*e,l=h*o+s*e+i*u-c*r,v=s*o-i*r-c*u-h*e;return Tt(t,n,a),r=t[0],u=t[1],e=t[2],o=t[3],t[4]=M*o+v*r+f*e-l*u,t[5]=f*o+v*u+l*r-M*e,t[6]=l*o+v*e+M*u-f*r,t[7]=v*o-M*r-f*u-l*e,t},rotateByQuatAppend:function(t,n,a){var r=a[0],u=a[1],e=a[2],o=a[3],i=n[0],c=n[1],h=n[2],s=n[3];return t[0]=i*o+s*r+c*e-h*u,t[1]=c*o+s*u+h*r-i*e,t[2]=h*o+s*e+i*u-c*r,t[3]=s*o-i*r-c*u-h*e,i=n[4],c=n[5],h=n[6],s=n[7],t[4]=i*o+s*r+c*e-h*u,t[5]=c*o+s*u+h*r-i*e,t[6]=h*o+s*e+i*u-c*r,t[7]=s*o-i*r-c*u-h*e,t},rotateByQuatPrepend:function(t,n,a){var r=n[0],u=n[1],e=n[2],o=n[3],i=a[0],c=a[1],h=a[2],s=a[3];return t[0]=r*s+o*i+u*h-e*c,t[1]=u*s+o*c+e*i-r*h,t[2]=e*s+o*h+r*c-u*i,t[3]=o*s-r*i-u*c-e*h,i=a[4],c=a[5],h=a[6],s=a[7],t[4]=r*s+o*i+u*h-e*c,t[5]=u*s+o*c+e*i-r*h,t[6]=e*s+o*h+r*c-u*i,t[7]=o*s-r*i-u*c-e*h,t},rotateAroundAxis:function(t,a,r,u){if(Math.abs(u)<n)return fn(t,a);var e=Math.hypot(r[0],r[1],r[2]);u*=.5;var o=Math.sin(u),i=o*r[0]/e,c=o*r[1]/e,h=o*r[2]/e,s=Math.cos(u),M=a[0],f=a[1],l=a[2],v=a[3];t[0]=M*s+v*i+f*h-l*c,t[1]=f*s+v*c+l*i-M*h,t[2]=l*s+v*h+M*c-f*i,t[3]=v*s-M*i-f*c-l*h;var b=a[4],m=a[5],d=a[6],x=a[7];return t[4]=b*s+x*i+m*h-d*c,t[5]=m*s+x*c+d*i-b*h,t[6]=d*s+x*h+b*c-m*i,t[7]=x*s-b*i-m*c-d*h,t},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t[2]=n[2]+a[2],t[3]=n[3]+a[3],t[4]=n[4]+a[4],t[5]=n[5]+a[5],t[6]=n[6]+a[6],t[7]=n[7]+a[7],t},multiply:bn,mul:mn,scale:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t[2]=n[2]*a,t[3]=n[3]*a,t[4]=n[4]*a,t[5]=n[5]*a,t[6]=n[6]*a,t[7]=n[7]*a,t},dot:dn,lerp:function(t,n,a,r){var u=1-r;return dn(n,a)<0&&(r=-r),t[0]=n[0]*u+a[0]*r,t[1]=n[1]*u+a[1]*r,t[2]=n[2]*u+a[2]*r,t[3]=n[3]*u+a[3]*r,t[4]=n[4]*u+a[4]*r,t[5]=n[5]*u+a[5]*r,t[6]=n[6]*u+a[6]*r,t[7]=n[7]*u+a[7]*r,t},invert:function(t,n){var a=yn(n);return t[0]=-n[0]/a,t[1]=-n[1]/a,t[2]=-n[2]/a,t[3]=n[3]/a,t[4]=-n[4]/a,t[5]=-n[5]/a,t[6]=-n[6]/a,t[7]=n[7]/a,t},conjugate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t[2]=-n[2],t[3]=n[3],t[4]=-n[4],t[5]=-n[5],t[6]=-n[6],t[7]=n[7],t},length:xn,len:pn,squaredLength:yn,sqrLen:qn,normalize:function(t,n){var a=yn(n);if(a>0){a=Math.sqrt(a);var r=n[0]/a,u=n[1]/a,e=n[2]/a,o=n[3]/a,i=n[4],c=n[5],h=n[6],s=n[7],M=r*i+u*c+e*h+o*s;t[0]=r,t[1]=u,t[2]=e,t[3]=o,t[4]=(i-r*M)/a,t[5]=(c-u*M)/a,t[6]=(h-e*M)/a,t[7]=(s-o*M)/a}return t},str:function(t){return"quat2("+t[0]+", "+t[1]+", "+t[2]+", "+t[3]+", "+t[4]+", "+t[5]+", "+t[6]+", "+t[7]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]&&t[2]===n[2]&&t[3]===n[3]&&t[4]===n[4]&&t[5]===n[5]&&t[6]===n[6]&&t[7]===n[7]},equals:function(t,a){var r=t[0],u=t[1],e=t[2],o=t[3],i=t[4],c=t[5],h=t[6],s=t[7],M=a[0],f=a[1],l=a[2],v=a[3],b=a[4],m=a[5],d=a[6],x=a[7];return Math.abs(r-M)<=n*Math.max(1,Math.abs(r),Math.abs(M))&&Math.abs(u-f)<=n*Math.max(1,Math.abs(u),Math.abs(f))&&Math.abs(e-l)<=n*Math.max(1,Math.abs(e),Math.abs(l))&&Math.abs(o-v)<=n*Math.max(1,Math.abs(o),Math.abs(v))&&Math.abs(i-b)<=n*Math.max(1,Math.abs(i),Math.abs(b))&&Math.abs(c-m)<=n*Math.max(1,Math.abs(c),Math.abs(m))&&Math.abs(h-d)<=n*Math.max(1,Math.abs(h),Math.abs(d))&&Math.abs(s-x)<=n*Math.max(1,Math.abs(s),Math.abs(x))}});function An(){var t=new a(2);return a!=Float32Array&&(t[0]=0,t[1]=0),t}function wn(t,n,a){return t[0]=n[0]-a[0],t[1]=n[1]-a[1],t}function Rn(t,n,a){return t[0]=n[0]*a[0],t[1]=n[1]*a[1],t}function zn(t,n,a){return t[0]=n[0]/a[0],t[1]=n[1]/a[1],t}function Pn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return Math.hypot(a,r)}function jn(t,n){var a=n[0]-t[0],r=n[1]-t[1];return a*a+r*r}function In(t){var n=t[0],a=t[1];return Math.hypot(n,a)}function Sn(t){var n=t[0],a=t[1];return n*n+a*a}var En=In,On=wn,Tn=Rn,Dn=zn,Fn=Pn,Ln=jn,Vn=Sn,Qn=function(){var t=An();return function(n,a,r,u,e,o){var i,c;for(a||(a=2),r||(r=0),c=u?Math.min(u*a+r,n.length):n.length,i=r;i<c;i+=a)t[0]=n[i],t[1]=n[i+1],e(t,t,o),n[i]=t[0],n[i+1]=t[1];return n}}(),Yn=Object.freeze({create:An,clone:function(t){var n=new a(2);return n[0]=t[0],n[1]=t[1],n},fromValues:function(t,n){var r=new a(2);return r[0]=t,r[1]=n,r},copy:function(t,n){return t[0]=n[0],t[1]=n[1],t},set:function(t,n,a){return t[0]=n,t[1]=a,t},add:function(t,n,a){return t[0]=n[0]+a[0],t[1]=n[1]+a[1],t},subtract:wn,multiply:Rn,divide:zn,ceil:function(t,n){return t[0]=Math.ceil(n[0]),t[1]=Math.ceil(n[1]),t},floor:function(t,n){return t[0]=Math.floor(n[0]),t[1]=Math.floor(n[1]),t},min:function(t,n,a){return t[0]=Math.min(n[0],a[0]),t[1]=Math.min(n[1],a[1]),t},max:function(t,n,a){return t[0]=Math.max(n[0],a[0]),t[1]=Math.max(n[1],a[1]),t},round:function(t,n){return t[0]=Math.round(n[0]),t[1]=Math.round(n[1]),t},scale:function(t,n,a){return t[0]=n[0]*a,t[1]=n[1]*a,t},scaleAndAdd:function(t,n,a,r){return t[0]=n[0]+a[0]*r,t[1]=n[1]+a[1]*r,t},distance:Pn,squaredDistance:jn,length:In,squaredLength:Sn,negate:function(t,n){return t[0]=-n[0],t[1]=-n[1],t},inverse:function(t,n){return t[0]=1/n[0],t[1]=1/n[1],t},normalize:function(t,n){var a=n[0],r=n[1],u=a*a+r*r;return u>0&&(u=1/Math.sqrt(u)),t[0]=n[0]*u,t[1]=n[1]*u,t},dot:function(t,n){return t[0]*n[0]+t[1]*n[1]},cross:function(t,n,a){var r=n[0]*a[1]-n[1]*a[0];return t[0]=t[1]=0,t[2]=r,t},lerp:function(t,n,a,r){var u=n[0],e=n[1];return t[0]=u+r*(a[0]-u),t[1]=e+r*(a[1]-e),t},random:function(t,n){n=n||1;var a=2*r()*Math.PI;return t[0]=Math.cos(a)*n,t[1]=Math.sin(a)*n,t},transformMat2:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u,t[1]=a[1]*r+a[3]*u,t},transformMat2d:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[2]*u+a[4],t[1]=a[1]*r+a[3]*u+a[5],t},transformMat3:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[3]*u+a[6],t[1]=a[1]*r+a[4]*u+a[7],t},transformMat4:function(t,n,a){var r=n[0],u=n[1];return t[0]=a[0]*r+a[4]*u+a[12],t[1]=a[1]*r+a[5]*u+a[13],t},rotate:function(t,n,a,r){var u=n[0]-a[0],e=n[1]-a[1],o=Math.sin(r),i=Math.cos(r);return t[0]=u*i-e*o+a[0],t[1]=u*o+e*i+a[1],t},angle:function(t,n){var a=t[0],r=t[1],u=n[0],e=n[1],o=a*a+r*r;o>0&&(o=1/Math.sqrt(o));var i=u*u+e*e;i>0&&(i=1/Math.sqrt(i));var c=(a*u+r*e)*o*i;return c>1?0:c<-1?Math.PI:Math.acos(c)},zero:function(t){return t[0]=0,t[1]=0,t},str:function(t){return"vec2("+t[0]+", "+t[1]+")"},exactEquals:function(t,n){return t[0]===n[0]&&t[1]===n[1]},equals:function(t,a){var r=t[0],u=t[1],e=a[0],o=a[1];return Math.abs(r-e)<=n*Math.max(1,Math.abs(r),Math.abs(e))&&Math.abs(u-o)<=n*Math.max(1,Math.abs(u),Math.abs(o))},len:En,sub:On,mul:Tn,div:Dn,dist:Fn,sqrDist:Ln,sqrLen:Vn,forEach:Qn});t.glMatrix=e,t.mat2=s,t.mat2d=b,t.mat3=q,t.mat4=E,t.quat=sn,t.quat2=gn,t.vec2=Yn,t.vec3=$,t.vec4=Pt,Object.defineProperty(t,"__esModule",{value:!0})});
+
+// ["glMatrix", "mat2", "mat2d", "mat3", "mat4", "quat", "quat2", "vec2", "vec3", "vec4"]
+window.glMatrix = glMatrix;
+window.mat2 = glMatrix.mat2;
+window.mat2d = glMatrix.mat2d;
+window.mat3 = glMatrix.mat3;
+window.mat4 = glMatrix.mat4;
+window.quat = glMatrix.quat;
+window.quat2 = glMatrix.quat2;
+window.vec2 = glMatrix.vec2;
+window.vec3 = glMatrix.vec3;
+window.vec4 = glMatrix.vec4;
+
+
+if(!CABLES.exportedPatches)CABLES.exportedPatches={};CABLES.exportedPatches["uvBp73"]={_id:"65bcb16a71656d76fa1ec204",ops:[{id:"zdo60lxbk",uiAttribs:{},portsIn:[{name:"FPS Limit",value:0},{name:"Reduce FPS not focussed",value:1},{name:"Reduce FPS loading",value:0},{name:"Clear",value:1},{name:"ClearAlpha",value:0},{name:"Fullscreen Button",value:0},{name:"Active",value:1},{name:"Hires Displays",value:1},{name:"Pixel Unit index",value:0},{name:"Pixel Unit",value:"Display"}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"e0268dfa-e089-4f1f-966c-c30218792023",objOut:"zdo60lxbk"}]},{name:"width",value:1532},{name:"height",value:834}],objName:"Ops.Gl.MainLoop"},{id:"141502b6-2964-42b8-b273-c6d7f5bcf303",uiAttribs:{},portsOut:[{name:"trigger 0",links:[{portIn:"Trigger",portOut:"trigger 0",objIn:"e0698285-4e6a-4339-a9ba-d9b3e441372c",objOut:"141502b6-2964-42b8-b273-c6d7f5bcf303"},{portIn:"Increment",portOut:"trigger 0",objIn:"6hojoyomj",objOut:"141502b6-2964-42b8-b273-c6d7f5bcf303"}]},{name:"trigger 5",links:[{portIn:"in0 Cursor Update",portOut:"trigger 5",objIn:"cd9136e7-4c7b-4555-bf01-18381685410b",objOut:"141502b6-2964-42b8-b273-c6d7f5bcf303"}]},{name:"trigger 8",links:[{portIn:"Trigger",portOut:"trigger 8",objIn:"ch5u1xz0l",objOut:"141502b6-2964-42b8-b273-c6d7f5bcf303"}]},{name:"trigger 9",links:[{portIn:"exe",portOut:"trigger 9",objIn:"124910bf-e88f-4da5-847e-888a7ac73020",objOut:"141502b6-2964-42b8-b273-c6d7f5bcf303"}]},{name:"trigger 15",links:[{portIn:"Trigger",portOut:"trigger 15",objIn:"afa40c7e-19f5-4546-911c-1e34c62f310b",objOut:"141502b6-2964-42b8-b273-c6d7f5bcf303"}]}],objName:"Ops.Trigger.Sequence"},{id:"4950e7c1-dcaf-47ac-9ca9-512013c4e9c9",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Coordinates index",value:0},{name:"Coordinates",value:"-1 to 1"},{name:"Area index",value:3},{name:"Area",value:"Canvas Area"},{name:"flip y",value:0},{name:"right click prevent default",value:1},{name:"Touch support",value:1},{name:"Passive Events",value:0},{name:"Active",value:1}],portsOut:[{name:"x",links:[{portIn:"out1 Ops.Devices.Mouse.Mouse_v3 x",portOut:"x",objIn:"7bebb5f0-9d69-43ee-98be-27a13edd98db",objOut:"4950e7c1-dcaf-47ac-9ca9-512013c4e9c9"}]},{name:"y",links:[{portIn:"out2 Ops.Devices.Mouse.Mouse_v3 y",portOut:"y",objIn:"7bebb5f0-9d69-43ee-98be-27a13edd98db",objOut:"4950e7c1-dcaf-47ac-9ca9-512013c4e9c9"}]},{name:"click",links:[{portIn:"Trigger",portOut:"click",objIn:"xz7qgpta6",objOut:"4950e7c1-dcaf-47ac-9ca9-512013c4e9c9"}]},{name:"Button is down",value:0},{name:"Mouse is hovering",links:[{portIn:"Value",portOut:"Mouse is hovering",objIn:"d155f04b-ae78-473c-994b-81138389d0f0",objOut:"4950e7c1-dcaf-47ac-9ca9-512013c4e9c9"}]},{name:"Movement X",value:0},{name:"Movement Y",value:0}],objName:"Ops.Devices.Mouse.Mouse_v3"},{id:"d155f04b-ae78-473c-994b-81138389d0f0",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Variable",value:"ui_mouseOver"}],objName:"Ops.Vars.VarSetNumber_v2"},{id:"dq71li66q",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Multiply",value:1},{name:"Limit",value:1},{name:"Min",value:0},{name:"Max",value:1},{name:"Rubberband",value:0}],portsOut:[{name:"Absolute Value",links:[{portIn:"out0 DeltaSum Absolute Value",portOut:"Absolute Value",objIn:"7bebb5f0-9d69-43ee-98be-27a13edd98db",objOut:"dq71li66q"}]}],objName:"Ops.Math.DeltaSum"},{id:"9d85ffdc-685a-42ef-bd41-b501521a114c",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsOut:[{name:"create port",value:0}],objName:"Ops.Ui.PatchInput"},{id:"7bebb5f0-9d69-43ee-98be-27a13edd98db",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"create port",value:0}],objName:"Ops.Ui.PatchOutput"},{id:"cd9136e7-4c7b-4555-bf01-18381685410b",uiAttribs:{},storage:{subPatchVer:1},portsIn:[{name:"create port",value:0},{name:"dataStr",value:'{"ports":[{"name":"in0 Cursor Update","type":1}],"portsOut":[{"name":"out0 DeltaSum Absolute Value","type":0},{"name":"out1 Ops.Devices.Mouse.Mouse_v3 x","type":0},{"name":"out2 Ops.Devices.Mouse.Mouse_v3 y","type":0}]}'},{name:"patchId",value:"66dae55a-8297-4120-81e2-d946cc6b2b60"}],portsOut:[{name:"create port out",value:0},{name:"out0 DeltaSum Absolute Value",links:[{portIn:"Value",portOut:"out0 DeltaSum Absolute Value",objIn:"9fsk0rgx7",objOut:"cd9136e7-4c7b-4555-bf01-18381685410b"}]}],objName:"Ops.Ui.SubPatch"},{id:"c2a85325-d75f-4f01-9b5c-83a2edd8d35d",uiAttribs:{},portsIn:[{name:"posY",value:-.2},{name:"posZ",value:0},{name:"scale",value:.25},{name:"rotX",value:0},{name:"rotY",value:180},{name:"rotZ",value:315.48}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"li365texv",objOut:"c2a85325-d75f-4f01-9b5c-83a2edd8d35d"},{portIn:"render",portOut:"trigger",objIn:"i111f5qjb",objOut:"c2a85325-d75f-4f01-9b5c-83a2edd8d35d"}]}],objName:"Ops.Gl.Matrix.Transform"},{id:"e0268dfa-e089-4f1f-966c-c30218792023",uiAttribs:{},portsIn:[{name:"r",value:0},{name:"g",value:0},{name:"b",value:0},{name:"a",value:1}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"te11ob7nw",objOut:"e0268dfa-e089-4f1f-966c-c30218792023"},{portIn:"Trigger",portOut:"trigger",objIn:"zcc6zzw4d",objOut:"e0268dfa-e089-4f1f-966c-c30218792023"}]}],objName:"Ops.Gl.ClearColor"},{id:"b65ca0b8-40c9-4d0a-9e22-aba7d89f3abf",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Active",value:1},{name:"Speed",value:-.01},{name:"Input Type index",value:0},{name:"Input Type",value:"All"},{name:"Area index",value:0},{name:"Area",value:"Canvas Area"}],portsOut:[{name:"Delta X",value:0},{name:"Delta Y",links:[{portIn:"Delta Value",portOut:"Delta Y",objIn:"dq71li66q",objOut:"b65ca0b8-40c9-4d0a-9e22-aba7d89f3abf"}]},{name:"Is Dragging",links:[{portIn:"Value",portOut:"Is Dragging",objIn:"ls3p3eowk",objOut:"b65ca0b8-40c9-4d0a-9e22-aba7d89f3abf"}]}],objName:"Ops.Patch.PuvBp73.MouseDrag"},{id:"b6dd9bba-0e82-4220-a27d-884c1d3887a3",uiAttribs:{},portsIn:[{name:"Attribute index",value:1},{name:"Attribute",value:"TexCoords"},{name:"Absolute",value:0},{name:"World Space",value:1}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"gfjoyon3n",objOut:"b6dd9bba-0e82-4220-a27d-884c1d3887a3"}]}],objName:"Ops.Gl.Shader.AttributeAsColorMaterial"},{id:"e0698285-4e6a-4339-a9ba-d9b3e441372c",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"mainExe"}],objName:"Ops.Trigger.TriggerSend"},{id:"babe81ef-3ee9-4ed3-ba28-8b648c21dd11",uiAttribs:{},portsIn:[{name:"Title",value:"Dial Blueprint"}],objName:"Ops.Ui.Area"},{id:"a82e74aa-f66f-47c9-a07a-2f1b0376925b",uiAttribs:{},portsIn:[{name:"Title",value:"Data"}],objName:"Ops.Ui.Area"},{id:"afa40c7e-19f5-4546-911c-1e34c62f310b",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"finalExe"}],objName:"Ops.Trigger.TriggerSend"},{id:"1aaf40f7-386a-40d0-80de-4857b3f558f4",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_NormValue"}],portsOut:[{name:"Value",links:[{portIn:"Number",portOut:"Value",objIn:"rjsjd3otn",objOut:"1aaf40f7-386a-40d0-80de-4857b3f558f4"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"7dq6j5p5k",uiAttribs:{},portsIn:[{name:"Check Body Collisions",value:0}],portsOut:[{name:"Next",links:[{portIn:"Trigger",portOut:"Next",objIn:"9sm9dp98r",objOut:"7dq6j5p5k"}]},{name:"Total Bodies",value:4}],objName:"Ops.Graphics.Intersection.IntersectWorld"},{id:"9sm9dp98r",uiAttribs:{},portsIn:[{name:"Coordinate Format index",value:0},{name:"Coordinate Format",value:"-1 to 1"},{name:"Z",value:0},{name:"To X",value:0},{name:"To Y",value:0},{name:"To Z",value:0},{name:"Active",value:1},{name:"Change Cursor",value:0}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"ge3zj70cy",objOut:"9sm9dp98r"},{portIn:"render",portOut:"Next",objIn:"mbk4m8pcr",objOut:"9sm9dp98r"},{portIn:"render",portOut:"Next",objIn:"7qikt1vaf",objOut:"9sm9dp98r"},{portIn:"render",portOut:"Next",objIn:"aupoduf7d",objOut:"9sm9dp98r"}]},{name:"Has Hit",value:0},{name:"Hit Body Name",links:[{portIn:"Value",portOut:"Hit Body Name",objIn:"tg35ehmtt",objOut:"9sm9dp98r"}]},{name:"Hit X",value:0},{name:"Hit Y",value:0},{name:"Hit Z",value:0}],objName:"Ops.Graphics.Intersection.IntersectTestRaycast"},{id:"jrkdakvqd",uiAttribs:{},portsIn:[{name:"Shape index",value:0},{name:"Shape",value:"Sphere"},{name:"Name",value:"dial.1"},{name:"Radius",value:.22},{name:"Size X",value:.55},{name:"Size Y",value:.55},{name:"Size Z",value:0},{name:"Positions"},{name:"Append Index to name",value:1}],objName:"Ops.Graphics.Intersection.IntersectBody"},{id:"bs0d2bloj",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"mainExe"}],portsOut:[{name:"Triggered",links:[{portIn:"Trigger",portOut:"Triggered",objIn:"7dq6j5p5k",objOut:"bs0d2bloj"}]}],objName:"Ops.Trigger.TriggerReceive"},{id:"ge3zj70cy",uiAttribs:{},portsIn:[{name:"x",value:-.88},{name:"y",value:-.19},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Trigger",portOut:"trigger",objIn:"jrkdakvqd",objOut:"ge3zj70cy"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"5me0htliz",uiAttribs:{},portsIn:[{name:"Shape index",value:0},{name:"Shape",value:"Sphere"},{name:"Name",value:"dial.2"},{name:"Radius",value:.22},{name:"Size X",value:.55},{name:"Size Y",value:.55},{name:"Size Z",value:0},{name:"Positions"},{name:"Append Index to name",value:1}],objName:"Ops.Graphics.Intersection.IntersectBody"},{id:"mbk4m8pcr",uiAttribs:{},portsIn:[{name:"x",value:-.3},{name:"y",value:-.19},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Trigger",portOut:"trigger",objIn:"5me0htliz",objOut:"mbk4m8pcr"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"adh054ku6",uiAttribs:{},portsIn:[{name:"Shape index",value:0},{name:"Shape",value:"Sphere"},{name:"Name",value:"dial.3"},{name:"Radius",value:.23},{name:"Size X",value:.55},{name:"Size Y",value:.55},{name:"Size Z",value:0},{name:"Positions"},{name:"Append Index to name",value:1}],objName:"Ops.Graphics.Intersection.IntersectBody"},{id:"yjtjh6kai",uiAttribs:{},portsIn:[{name:"Shape index",value:0},{name:"Shape",value:"Sphere"},{name:"Name",value:"dial.4"},{name:"Radius",value:.23},{name:"Size X",value:.55},{name:"Size Y",value:.55},{name:"Size Z",value:0},{name:"Positions"},{name:"Append Index to name",value:1}],objName:"Ops.Graphics.Intersection.IntersectBody"},{id:"sfqxroo9q",uiAttribs:{},portsIn:[{name:"Coordinates index",value:0},{name:"Coordinates",value:"-1 to 1"},{name:"Area index",value:0},{name:"Area",value:"Canvas"},{name:"flip y",value:1},{name:"right click prevent default",value:1},{name:"Touch support",value:1},{name:"Passive Events",value:0},{name:"Active",value:1}],portsOut:[{name:"x",links:[{portIn:"X",portOut:"x",objIn:"9sm9dp98r",objOut:"sfqxroo9q"}]},{name:"y",links:[{portIn:"Y",portOut:"y",objIn:"9sm9dp98r",objOut:"sfqxroo9q"}]},{name:"Button is down",links:[{portIn:"Value",portOut:"Button is down",objIn:"er6016ry9",objOut:"sfqxroo9q"}]},{name:"Mouse is hovering",value:1},{name:"Movement X",value:0},{name:"Movement Y",value:-.5}],objName:"Ops.Devices.Mouse.Mouse_v3"},{id:"124910bf-e88f-4da5-847e-888a7ac73020",uiAttribs:{},portsIn:[{name:"num x",value:4},{name:"num y",value:1},{name:"center",value:1}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"c2a85325-d75f-4f01-9b5c-83a2edd8d35d",objOut:"124910bf-e88f-4da5-847e-888a7ac73020"},{portIn:"render",portOut:"trigger",objIn:"zlpf1p0f5",objOut:"124910bf-e88f-4da5-847e-888a7ac73020"}]},{name:"x",links:[{portIn:"posX",portOut:"x",objIn:"c2a85325-d75f-4f01-9b5c-83a2edd8d35d",objOut:"124910bf-e88f-4da5-847e-888a7ac73020"},{portIn:"posX",portOut:"x",objIn:"zlpf1p0f5",objOut:"124910bf-e88f-4da5-847e-888a7ac73020"}]},{name:"y",value:0},{name:"index",links:[{portIn:"Value",portOut:"index",objIn:"euqza6b25",objOut:"124910bf-e88f-4da5-847e-888a7ac73020"}]},{name:"total iterations",value:4}],objName:"Ops.Trigger.Repeat2d"},{id:"7qikt1vaf",uiAttribs:{},portsIn:[{name:"x",value:.31},{name:"y",value:-.19},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Trigger",portOut:"trigger",objIn:"adh054ku6",objOut:"7qikt1vaf"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"aupoduf7d",uiAttribs:{},portsIn:[{name:"x",value:.9},{name:"y",value:-.19},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Trigger",portOut:"trigger",objIn:"yjtjh6kai",objOut:"aupoduf7d"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"32lmfrmux",uiAttribs:{},portsIn:[{name:"Title",value:"Intersect"}],objName:"Ops.Ui.Area"},{id:"tg35ehmtt",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_hitBodyName"}],objName:"Ops.Vars.VarSetString_v2"},{id:"gb0lraco2",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_activeDial_ID"}],portsOut:[{name:"Value",links:[{portIn:"number1",portOut:"Value",objIn:"kcwn0w2tu",objOut:"gb0lraco2"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"qyara3wac",uiAttribs:{},portsOut:[{name:"result",value:0}],objName:"Ops.Math.Compare.Equals"},{id:"xz7qgpta6",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Named Trigger",value:"mouseDown"}],objName:"Ops.Trigger.TriggerSend"},{id:"v1hlb4w7t",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_activeDial_ID"}],portsOut:[{name:"Value",links:[{portIn:"number1",portOut:"Value",objIn:"k9cpiqwvn",objOut:"v1hlb4w7t"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"k9cpiqwvn",uiAttribs:{},portsIn:[{name:"number2",value:1}],portsOut:[{name:"result",links:[{portIn:"Index",portOut:"result",objIn:"rjsjd3otn",objOut:"k9cpiqwvn"}]}],objName:"Ops.Math.Subtract"},{id:"53603a6e-a331-41a7-9822-120aba8de4f8",uiAttribs:{},portsIn:[{name:"number2",value:270}],portsOut:[{name:"result",links:[{portIn:"rotY",portOut:"result",objIn:"li365texv",objOut:"53603a6e-a331-41a7-9822-120aba8de4f8"}]}],objName:"Ops.Math.Multiply"},{id:"931c114e-4c92-4747-896b-6697a0610953",uiAttribs:{},portsIn:[{name:"number2",value:.75}],portsOut:[{name:"result",links:[{portIn:"percent",portOut:"result",objIn:"gfjoyon3n",objOut:"931c114e-4c92-4747-896b-6697a0610953"},{portIn:"percent",portOut:"result",objIn:"8eccns7e5",objOut:"931c114e-4c92-4747-896b-6697a0610953"}]}],objName:"Ops.Math.Multiply"},{id:"9fsk0rgx7",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_NormValue"}],objName:"Ops.Vars.VarSetNumber_v2"},{id:"aqjh1act1",uiAttribs:{},portsIn:[{name:"Value Invalid Index",value:0}],portsOut:[{name:"value",links:[{portIn:"number1",portOut:"value",objIn:"53603a6e-a331-41a7-9822-120aba8de4f8",objOut:"aqjh1act1"},{portIn:"number1",portOut:"value",objIn:"931c114e-4c92-4747-896b-6697a0610953",objOut:"aqjh1act1"},{portIn:"Value",portOut:"value",objIn:"j3kd0q09w",objOut:"aqjh1act1"},{portIn:"Value",portOut:"value",objIn:"1rc15x0gs",objOut:"aqjh1act1"}]},{name:"Valid Index",value:1}],objName:"Ops.Array.ArrayGetNumber"},{id:"x6efudpvd",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_dialValues"}],objName:"Ops.Vars.VarSetArray_v2"},{id:"i0rjtphmz",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_dialValues"}],portsOut:[{name:"Value",links:[{portIn:"array",portOut:"Value",objIn:"aqjh1act1",objOut:"i0rjtphmz"}]}],objName:"Ops.Vars.VarGetArray_v2"},{id:"hsmbgpnm6",uiAttribs:{},portsIn:[{name:"Array length",value:4},{name:"Mode select index",value:0},{name:"Mode select",value:"Number"},{name:"Default Value",value:0},{name:"Reverse",value:0}],portsOut:[{name:"Array",links:[{portIn:"Array",portOut:"Array",objIn:"rjsjd3otn",objOut:"hsmbgpnm6"}]},{name:"Array length out",value:4}],objName:"Ops.Array.Array_v3"},{id:"er6016ry9",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_buttonIsDown"}],objName:"Ops.Vars.VarSetNumber_v2"},{id:"ls3p3eowk",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Variable",value:"ui_mouseIsDragging"}],objName:"Ops.Vars.VarSetNumber_v2"},{id:"c390aebl7",uiAttribs:{},portsIn:[{name:"Variable",value:"ui_mouseIsDragging"}],portsOut:[{name:"Value",links:[{portIn:"Pass Through",portOut:"Value",objIn:"d7vl5bf8b",objOut:"c390aebl7"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"kcwn0w2tu",uiAttribs:{},portsIn:[{name:"number2",value:1}],portsOut:[{name:"result",links:[{portIn:"number1",portOut:"result",objIn:"qyara3wac",objOut:"kcwn0w2tu"}]}],objName:"Ops.Math.Subtract"},{id:"pd9s43czm",uiAttribs:{},storage:{blueprintVer:2,subPatchVer:2},portsIn:[{name:"patchId",value:"bp2sub_pd9s43czm"}],objName:"Ops.Patch.PuvBp73.SubPatch2"},{id:"te11ob7nw",uiAttribs:{},portsIn:[{name:"projection mode index",value:0},{name:"projection mode",value:"prespective"},{name:"frustum near",value:.01},{name:"frustum far",value:5e3},{name:"fov",value:30},{name:"Auto Aspect Ratio",value:1},{name:"Aspect Ratio",value:1},{name:"eye X",value:0},{name:"eye Y",value:-.03},{name:"eye Z",value:.73},{name:"center X",value:0},{name:"center Y",value:0},{name:"center Z",value:0},{name:"truck",value:0},{name:"boom",value:.23},{name:"dolly",value:0},{name:"tilt",value:0},{name:"pan",value:0},{name:"roll",value:0}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"p78s2gczc",objOut:"te11ob7nw"}]},{name:"Aspect",value:1.8369304556354915}],objName:"Ops.Gl.Matrix.Camera"},{id:"p78s2gczc",uiAttribs:{},portsIn:[{name:"min distance",value:.001},{name:"max distance",value:1},{name:"min rot y",value:0},{name:"max rot y",value:0},{name:"initial radius",value:0},{name:"initial axis y",value:.5},{name:"initial axis x",value:.25},{name:"mul",value:1},{name:"Smoothness",value:.3},{name:"Speed X",value:1},{name:"Speed Y",value:1},{name:"Active",value:1},{name:"Allow Panning",value:1},{name:"Allow Zooming",value:1},{name:"Allow Rotation",value:0},{name:"restricted",value:1}],portsOut:[{name:"trigger",links:[{portIn:"exe",portOut:"trigger",objIn:"141502b6-2964-42b8-b273-c6d7f5bcf303",objOut:"p78s2gczc"},{portIn:"Trigger",portOut:"trigger",objIn:"4pu8mr0y2",objOut:"p78s2gczc"}]},{name:"radius",value:.001},{name:"Rot X",value:90},{name:"Rot Y",value:90}],objName:"Ops.Gl.Matrix.OrbitControls"},{id:"uc9r4wu0r",uiAttribs:{},portsIn:[{name:"b",value:.856},{name:"a",value:.63},{name:"colorizeTexture",value:1},{name:"Vertex Colors",value:0},{name:"Alpha Mask Source index",value:0},{name:"Alpha Mask Source",value:"Luminance"},{name:"Opacity TexCoords Transform",value:0},{name:"Discard Transparent Pixels",value:0},{name:"diffuseRepeatX",value:1},{name:"diffuseRepeatY",value:1},{name:"Tex Offset X",value:0},{name:"Tex Offset Y",value:0},{name:"Crop TexCoords",value:0},{name:"billboard",value:0}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"8eccns7e5",objOut:"uc9r4wu0r"}]}],objName:"Ops.Gl.Shader.BasicMaterial_v3"},{id:"j3kd0q09w",uiAttribs:{},portsIn:[{name:"Min",value:0},{name:"Max",value:.9},{name:"Easing index",value:4},{name:"Easing",value:"Cubic In"}],portsOut:[{name:"Result",links:[{portIn:"Value",portOut:"Result",objIn:"conrnxfgk",objOut:"j3kd0q09w"},{portIn:"r",portOut:"Result",objIn:"uc9r4wu0r",objOut:"j3kd0q09w"}]}],objName:"Ops.Math.Ease"},{id:"dugq70sv7",uiAttribs:{},portsOut:[{name:"Used Heap Size",value:80.84566116333008},{name:"Total Heap Size",value:87.53744506835938}],objName:"Ops.Devices.Browser.JsMemory"},{id:"conrnxfgk",uiAttribs:{},portsIn:[{name:"Min",value:0},{name:"Max",value:.27},{name:"Easing index",value:5},{name:"Easing",value:"Cubic Out"}],portsOut:[{name:"Result",links:[{portIn:"Offset X",portOut:"Result",objIn:"chztenqi0",objOut:"conrnxfgk"},{portIn:"g",portOut:"Result",objIn:"uc9r4wu0r",objOut:"conrnxfgk"}]}],objName:"Ops.Math.Ease"},{id:"8dsa2kb7j",uiAttribs:{},portsIn:[{name:"Draw",value:1,title:"Render mesh"},{name:"segments",value:32},{name:"stacks",value:1},{name:"length",value:.22},{name:"outer radius",value:.58},{name:"inner radius",value:.32},{name:"UV mode index",value:0},{name:"UV mode",value:"simple"},{name:"Flip Mapping",value:0},{name:"Caps",value:1},{name:"Flat Normals",value:0}],objName:"Ops.Gl.Meshes.Cylinder_v2"},{id:"chztenqi0",uiAttribs:{},portsIn:[{name:"r",value:.412},{name:"g",value:.512},{name:"b",value:.553},{name:"Opacity",value:1},{name:"AO Intensity",value:1},{name:"Normal Map Intensity",value:1},{name:"Repeat X",value:0},{name:"Repeat Y",value:1},{name:"Offset Y",value:0},{name:"Screen Space Normals",value:0},{name:"Calc normal tangents",value:0},{name:"Opacity TexCoords Transform",value:0},{name:"Discard Transparent Pixels",value:1},{name:"Alpha Mask Source index",value:0},{name:"Alpha Mask Source",value:"Luminance"}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"8dsa2kb7j",objOut:"chztenqi0"}]}],objName:"Ops.Gl.Shader.MatCapMaterial_v3"},{id:"0oya8etuv",uiAttribs:{},portsIn:[{name:"File",value:"assets/lib_matcaps_Chrome_Blue_Tint-White.png",display:"file"},{name:"Filter index",value:1},{name:"Filter",value:"linear"},{name:"Wrap index",value:0},{name:"Wrap",value:"repeat"},{name:"Anisotropic index",value:0},{name:"Anisotropic",value:"0"},{name:"Data Format index",value:3},{name:"Data Format",value:"RGBA"},{name:"Flip",value:0},{name:"Pre Multiplied Alpha",value:0},{name:"Active",value:1},{name:"Save Memory",value:1},{name:"Add Cachebuster",value:1}],portsOut:[{name:"Texture",links:[{portIn:"MatCap",portOut:"Texture",objIn:"chztenqi0",objOut:"0oya8etuv"}]},{name:"Width",value:256},{name:"Height",value:256},{name:"Aspect Ratio",value:1},{name:"Loaded",value:1},{name:"Loading",value:0}],objName:"Ops.Gl.Texture_v2"},{id:"li365texv",uiAttribs:{},portsIn:[{name:"posX",value:0},{name:"posY",value:0},{name:"posZ",value:0},{name:"scale",value:1},{name:"rotX",value:0},{name:"rotZ",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Render",portOut:"trigger",objIn:"chztenqi0",objOut:"li365texv"}]}],objName:"Ops.Gl.Matrix.Transform"},{id:"bd0mu1qkj",uiAttribs:{},portsIn:[{name:"Title",value:"Main"}],objName:"Ops.Ui.Area"},{id:"fvg1zz75v",uiAttribs:{},portsIn:[{name:"Size index",value:0},{name:"Size",value:"Canvas"},{name:"texture width",value:1532},{name:"texture height",value:834},{name:"Auto Aspect",value:1},{name:"filter index",value:1},{name:"filter",value:"linear"},{name:"Wrap index",value:0},{name:"Wrap",value:"Clamp"},{name:"MSAA index",value:2},{name:"MSAA",value:"4x"},{name:"Pixel Format index",value:5},{name:"Pixel Format",value:"SRGBA 8bit ubyte"},{name:"Depth",value:1},{name:"Clear",value:1}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"tckfhevim",objOut:"fvg1zz75v"}]},{name:"texture",links:[{portIn:"Base Texture",portOut:"texture",objIn:"48vrkn65x",objOut:"fvg1zz75v"}]}],objName:"Ops.Gl.RenderToTexture_v3"},{id:"9dqwuc8l6",uiAttribs:{},portsIn:[{name:"render",title:"Trigger"},{name:"Render Mesh",value:1,title:"Render"},{name:"width",value:1},{name:"height",value:1.8},{name:"pivot x index",value:1},{name:"pivot x",value:"center"},{name:"pivot y index",value:1},{name:"pivot y",value:"center"},{name:"axis index",value:0},{name:"axis",value:"xy"},{name:"Flip TexCoord X",value:0},{name:"Flip TexCoord Y",value:1},{name:"num columns",value:1},{name:"num rows",value:1}],objName:"Ops.Gl.Meshes.Rectangle_v4"},{id:"62jtojeuu",uiAttribs:{},portsIn:[{name:"posX",value:0},{name:"posY",value:-.97},{name:"posZ",value:-2.94},{name:"scale",value:3.57},{name:"rotX",value:-84.79},{name:"rotY",value:0},{name:"rotZ",value:180.28}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"9dqwuc8l6",objOut:"62jtojeuu"}]}],objName:"Ops.Gl.Matrix.TransformView"},{id:"flor1ge09",uiAttribs:{},portsIn:[{name:"r",value:.07},{name:"g",value:.06},{name:"b",value:.51},{name:"Opacity",value:.78},{name:"AO Intensity",value:1},{name:"Normal Map Intensity",value:1},{name:"Repeat X",value:1},{name:"Repeat Y",value:1},{name:"Offset X",value:0},{name:"Offset Y",value:0},{name:"Screen Space Normals",value:0},{name:"Calc normal tangents",value:1},{name:"Opacity TexCoords Transform",value:0},{name:"Discard Transparent Pixels",value:1},{name:"Alpha Mask Source index",value:0},{name:"Alpha Mask Source",value:"Luminance"}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"wcm52u6xo",objOut:"flor1ge09"}]}],objName:"Ops.Gl.Shader.MatCapMaterial_v3"},{id:"wcm52u6xo",uiAttribs:{},portsIn:[{name:"x",value:-1.26},{name:"y",value:.46},{name:"z",value:-1.17}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"62jtojeuu",objOut:"wcm52u6xo"}]}],objName:"Ops.Gl.Matrix.ScaleXYZViewMatrix"},{id:"tckfhevim",uiAttribs:{},portsIn:[{name:"x",value:1.2},{name:"y",value:-2.97},{name:"z",value:-1}],portsOut:[{name:"trigger",links:[{portIn:"exe",portOut:"trigger",objIn:"124910bf-e88f-4da5-847e-888a7ac73020",objOut:"tckfhevim"}]}],objName:"Ops.Deprecated.Gl.Matrix.ScaleXYZ"},{id:"x8l31ycyr",uiAttribs:{},portsIn:[{name:"Num",value:64},{name:"Spacing",value:.3},{name:"Center",value:1},{name:"Axis index",value:1},{name:"Axis",value:"XZ"}],objName:"Ops.Gl.Meshes.Grid"},{id:"33hdtkr51",uiAttribs:{},portsIn:[{name:"x",value:0},{name:"y",value:.22},{name:"z",value:-.01}],portsOut:[{name:"trigger",links:[{portIn:"Render",portOut:"trigger",objIn:"flor1ge09",objOut:"33hdtkr51"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"ajz3m2b7r",uiAttribs:{},portsIn:[{name:"r",value:.4752931908661422},{name:"g",value:.36659911993317373},{name:"b",value:.9581856509868598},{name:"a",value:1},{name:"colorizeTexture",value:1},{name:"Vertex Colors",value:0},{name:"Alpha Mask Source index",value:0},{name:"Alpha Mask Source",value:"Luminance"},{name:"Opacity TexCoords Transform",value:0},{name:"Discard Transparent Pixels",value:1},{name:"diffuseRepeatX",value:1},{name:"diffuseRepeatY",value:1},{name:"Tex Offset X",value:-2.19},{name:"Tex Offset Y",value:11.92},{name:"Crop TexCoords",value:0},{name:"billboard",value:0}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"o4q65sx2h",objOut:"ajz3m2b7r"}]}],objName:"Ops.Gl.Shader.BasicMaterial_v3"},{id:"6a24jo2e0",uiAttribs:{},portsIn:[{name:"Title",value:"Setting"}],objName:"Ops.Ui.Area"},{id:"o4q65sx2h",uiAttribs:{},portsIn:[{name:"x",value:0},{name:"y",value:-.56},{name:"z",value:3.58}],portsOut:[{name:"trigger",links:[{portIn:"Render",portOut:"trigger",objIn:"x8l31ycyr",objOut:"o4q65sx2h"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"eupi4n3t8",uiAttribs:{},portsIn:[{name:"Scale index",value:0},{name:"Scale",value:"Stretch"},{name:"Flip Y",value:0},{name:"Flip X",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Execute",portOut:"trigger",objIn:"ii9hyaw76",objOut:"eupi4n3t8"}]}],objName:"Ops.Gl.Meshes.FullscreenRectangle_v2"},{id:"txsuzzmpp",uiAttribs:{},portsIn:[{name:"Gradient",value:'{"keys" : [{"pos":0,"r":0,"g":0,"b":0},{"pos":1,"r":1,"g":1,"b":1}]}'},{name:"Direction index",value:1},{name:"Direction",value:"Y"},{name:"Smoothstep",value:0},{name:"Step",value:0},{name:"Flip",value:1},{name:"sRGB",value:1},{name:"Oklab",value:0},{name:"Size",value:64},{name:"filter index",value:1},{name:"filter",value:"linear"},{name:"wrap index",value:0},{name:"wrap",value:"clamp to edge"},{name:"Gradient Array",value:0}],portsOut:[{name:"Texture",links:[{portIn:"R",portOut:"Texture",objIn:"ii9hyaw76",objOut:"txsuzzmpp"}]}],objName:"Ops.Gl.GradientTexture"},{id:"ii9hyaw76",uiAttribs:{},portsIn:[{name:"Filter index",value:1},{name:"Filter",value:"linear"},{name:"Wrap index",value:1},{name:"Wrap",value:"repeat"},{name:"Pixel Format index",value:9},{name:"Pixel Format",value:"RGBA 16bit float"},{name:"Size index",value:0},{name:"Size",value:"Biggest"},{name:"R Source index",value:0},{name:"R Source",value:"R"},{name:"R Value index",value:0},{name:"R Value",value:"Source"},{name:"R Default",value:1},{name:"G Source index",value:0},{name:"G Source",value:"R"},{name:"G Value index",value:1},{name:"G Value",value:"Invert"},{name:"G Default",value:1},{name:"B Source index",value:2},{name:"B Source",value:"B"},{name:"B Value index",value:0},{name:"B Value",value:"Source"},{name:"B Default",value:1},{name:"A Source index",value:0},{name:"A Source",value:"R"},{name:"A Value index",value:0},{name:"A Value",value:"Source"},{name:"A Default",value:1}],portsOut:[{name:"Next",links:[{portIn:"Render",portOut:"Next",objIn:"bom62ei05",objOut:"ii9hyaw76"}]},{name:"Texture",links:[{portIn:"Base Texture",portOut:"Texture",objIn:"bom62ei05",objOut:"ii9hyaw76"}]}],objName:"Ops.Gl.Textures.CombineTextures"},{id:"dvpyr3uz9",uiAttribs:{},portsIn:[{name:"File",value:"assets/65bbe44771656d76fa1e7e54_voro.png",display:"file"},{name:"Filter index",value:2},{name:"Filter",value:"mipmap"},{name:"Wrap index",value:0},{name:"Wrap",value:"repeat"},{name:"Anisotropic index",value:0},{name:"Anisotropic",value:"0"},{name:"Data Format index",value:3},{name:"Data Format",value:"RGBA"},{name:"Flip",value:0},{name:"Pre Multiplied Alpha",value:0},{name:"Active",value:1},{name:"Save Memory",value:1},{name:"Add Cachebuster",value:1}],portsOut:[{name:"Texture",links:[{portIn:"G",portOut:"Texture",objIn:"ii9hyaw76",objOut:"dvpyr3uz9"}]},{name:"Width",value:1660},{name:"Height",value:840},{name:"Aspect Ratio",value:1.9761904761904763},{name:"Loaded",value:1},{name:"Loading",value:0}],objName:"Ops.Gl.Texture_v2"},{id:"48vrkn65x",uiAttribs:{},portsIn:[{name:"Size index",value:0},{name:"Size",value:"Auto"},{name:"Width",value:640},{name:"Height",value:480},{name:"Filter index",value:1},{name:"Filter",value:"linear"},{name:"Wrap index",value:1},{name:"Wrap",value:"repeat"},{name:"Anisotropic index",value:0},{name:"Anisotropic",value:"0"},{name:"Pixel Format index",value:5},{name:"Pixel Format",value:"SRGBA 8bit ubyte"},{name:"R",value:0},{name:"G",value:0},{name:"B",value:0},{name:"A",value:0}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"6fb2f0244",objOut:"48vrkn65x"}]},{name:"texture_out",links:[{portIn:"Diffuse",portOut:"texture_out",objIn:"flor1ge09",objOut:"48vrkn65x"}]},{name:"Aspect Ratio",value:1.8369304556354915},{name:"Texture Width",value:1532},{name:"Texture Height",value:834}],objName:"Ops.Gl.ImageCompose.ImageCompose_v4"},{id:"6fb2f0244",uiAttribs:{},portsIn:[{name:"Passes",value:1},{name:"Clamp",value:0},{name:"direction index",value:0},{name:"direction",value:"both"},{name:"Mask Invert",value:0}],objName:"Ops.Gl.ImageCompose.FastBlur_v2"},{id:"bom62ei05",uiAttribs:{},portsIn:[{name:"Size index",value:0},{name:"Size",value:"Auto"},{name:"Width",value:640},{name:"Height",value:480},{name:"Filter index",value:1},{name:"Filter",value:"linear"},{name:"Wrap index",value:1},{name:"Wrap",value:"repeat"},{name:"Anisotropic index",value:0},{name:"Anisotropic",value:"0"},{name:"Pixel Format index",value:4},{name:"Pixel Format",value:"RGBA 8bit ubyte"},{name:"R",value:0},{name:"G",value:0},{name:"B",value:0},{name:"A",value:0}],portsOut:[{name:"Next",links:[{portIn:"Render",portOut:"Next",objIn:"m6kwtuieo",objOut:"bom62ei05"}]},{name:"texture_out",links:[{portIn:"Texture",portOut:"texture_out",objIn:"eupi4n3t8",objOut:"bom62ei05"}]},{name:"Aspect Ratio",value:1.9761904761904763},{name:"Texture Width",value:1660},{name:"Texture Height",value:840}],objName:"Ops.Gl.ImageCompose.ImageCompose_v4"},{id:"m6kwtuieo",uiAttribs:{},portsIn:[{name:"Blend Mode index",value:0},{name:"Blend Mode",value:"normal"},{name:"Alpha Mask index",value:0},{name:"Alpha Mask",value:"Off"},{name:"Amount",value:1},{name:"Strength",value:1},{name:"Radius",value:.3},{name:"Sharp",value:.25},{name:"Aspect",value:1},{name:"r",value:0},{name:"g",value:0},{name:"b",value:0},{name:"Alpha",value:0}],objName:"Ops.Gl.ImageCompose.Vignette_v3"},{id:"kgtq6kbqp",uiAttribs:{},portsIn:[{name:"Font",value:"chivo"},{name:"Scale",value:.11},{name:"Letter Spacing",value:-.02},{name:"Line Height",value:1},{name:"Align index",value:0},{name:"Align",value:"Left"},{name:"Vertical Align index",value:2},{name:"Vertical Align",value:"Middle"},{name:"r",value:0},{name:"g",value:0},{name:"b",value:0},{name:"a",value:.91},{name:"SDF",value:1},{name:"Smoothing",value:.126},{name:"Border",value:1},{name:"Border Width",value:.222},{name:"Smoothness",value:.25},{name:"Border r",value:0},{name:"Border g",value:0},{name:"Border b",value:1},{name:"Shadow",value:0},{name:"Positions",value:0},{name:"Scalings",value:0},{name:"Rotations",value:0},{name:"Colors",value:0}],portsOut:[{name:"Num Lines",value:1},{name:"Width",value:.23304531249999996},{name:"Height",value:.06678697916666666},{name:"Start Y",value:.03477526041666667},{name:"Num Chars",value:9}],objName:"Ops.Gl.TextMeshMSDF_v2"},{id:"1rc15x0gs",uiAttribs:{},portsIn:[{name:"Variable",value:"_currentDialValueInsideRepeat2D"}],objName:"Ops.Vars.VarSetNumber_v2"},{id:"o8zk12f1r",uiAttribs:{},portsIn:[{name:"Variable",value:"_currentDialValueInsideRepeat2D"}],portsOut:[{name:"Value",links:[{portIn:"number",portOut:"Value",objIn:"2lpsqzgrb",objOut:"o8zk12f1r"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"2lpsqzgrb",uiAttribs:{},portsIn:[{name:"Decimal Places",value:4}],portsOut:[{name:"result",links:[{portIn:"Number",portOut:"result",objIn:"vib72zx3n",objOut:"2lpsqzgrb"}]}],objName:"Ops.Math.Round"},{id:"vib72zx3n",uiAttribs:{},portsOut:[{name:"Result",links:[{portIn:"String B",portOut:"Result",objIn:"hhpgrbf2g",objOut:"vib72zx3n"}]}],objName:"Ops.String.NumberToString_v2"},{id:"i111f5qjb",uiAttribs:{},portsIn:[{name:"x",value:0},{name:"y",value:0},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"uc9r4wu0r",objOut:"i111f5qjb"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"zlpf1p0f5",uiAttribs:{},portsIn:[{name:"posY",value:.09},{name:"posZ",value:.24},{name:"scale",value:1},{name:"rotX",value:0},{name:"rotY",value:0},{name:"rotZ",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Render",portOut:"trigger",objIn:"kgtq6kbqp",objOut:"zlpf1p0f5"}]}],objName:"Ops.Gl.Matrix.TransformView"},{id:"prvtvnqot",uiAttribs:{},portsIn:[{name:"Font Name",value:"chivo"},{name:"Font Data",value:"assets/ChivoMono-Medium-msdf.json",display:"file"},{name:"Font Image",value:"assets/ChivoMono-Medium.png",display:"file"},{name:"Font Image 1",value:0,display:"file"},{name:"Font Image 2",value:0,display:"file"},{name:"Font Image 3",value:0,display:"file"}],portsOut:[{name:"Loaded",value:true},{name:"Total Chars",value:66},{name:"Chars",value:"jQgbdf03689CGOShikl12457ABDEFHIJKLMNPRTUVWXYZpqtyw+acemnorsuvxz*-."}],objName:"Ops.Gl.FontMSDF_v2"},{id:"f67se0kft",uiAttribs:{},portsIn:[{name:"Title",value:"Text"}],objName:"Ops.Ui.Area"},{id:"6hojoyomj",uiAttribs:{},portsIn:[{name:"Limit",value:1},{name:"Length",value:10},{name:"Mode index",value:1},{name:"Mode",value:"Stop at Max"},{name:"Default",value:0}],portsOut:[{name:"Value",links:[{portIn:"val",portOut:"Value",objIn:"1b7ls5v00",objOut:"6hojoyomj"}]}],objName:"Ops.Math.Incrementor"},{id:"m4wpz0q5c",uiAttribs:{},portsIn:[{name:"number2",value:.06}],portsOut:[{name:"result",links:[{portIn:"mul",portOut:"result",objIn:"124910bf-e88f-4da5-847e-888a7ac73020",objOut:"m4wpz0q5c"}]}],objName:"Ops.Math.Multiply"},{id:"1b7ls5v00",uiAttribs:{},portsIn:[{name:"min",value:0},{name:"max",value:9}],portsOut:[{name:"result",links:[{portIn:"number1",portOut:"result",objIn:"m4wpz0q5c",objOut:"1b7ls5v00"}]}],objName:"Ops.Math.SmootherStep"},{id:"hhpgrbf2g",uiAttribs:{},portsIn:[{name:"Format",value:"*$a $b"},{name:"String C",value:2},{name:"String D",value:3},{name:"String E",value:""},{name:"String F",value:""}],portsOut:[{name:"Result",links:[{portIn:"Text",portOut:"Result",objIn:"kgtq6kbqp",objOut:"hhpgrbf2g"}]}],objName:"Ops.String.StringCompose_v3"},{id:"euqza6b25",uiAttribs:{},portsIn:[{name:"Variable",value:"_currentIndexInsideRepeat2D"}],objName:"Ops.Vars.VarSetNumber_v2"},{id:"34zd4vl4f",uiAttribs:{},portsIn:[{name:"Variable",value:"_currentIndexInsideRepeat2D"}],portsOut:[{name:"Value",links:[{portIn:"index",portOut:"Value",objIn:"aqjh1act1",objOut:"34zd4vl4f"},{portIn:"number2",portOut:"Value",objIn:"qyara3wac",objOut:"34zd4vl4f"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"8eccns7e5",uiAttribs:{},portsIn:[{name:"radius",value:.97},{name:"innerRadius",value:.949},{name:"segments",value:32},{name:"steps",value:1},{name:"invertSteps",value:0},{name:"mapping index",value:1},{name:"mapping",value:"round"},{name:"Spline",value:0},{name:"Draw",value:1,title:"Render mesh"}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"b6dd9bba-0e82-4220-a27d-884c1d3887a3",objOut:"8eccns7e5"}]}],objName:"Ops.Gl.Meshes.Circle_v3"},{id:"gfjoyon3n",uiAttribs:{},portsIn:[{name:"radius",value:.86},{name:"innerRadius",value:.895},{name:"segments",value:100},{name:"steps",value:2},{name:"invertSteps",value:1},{name:"mapping index",value:0},{name:"mapping",value:"flat"},{name:"Spline",value:0},{name:"Draw",value:1,title:"Render mesh"}],objName:"Ops.Gl.Meshes.Circle_v3"},{id:"mtxdae1jj",uiAttribs:{},portsIn:[{name:"Variable",value:"_currentIndexInsideRepeat2D"}],portsOut:[{name:"Value",links:[{portIn:"index",portOut:"Value",objIn:"fxd9qy0nv",objOut:"mtxdae1jj"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"ejryfn62d",uiAttribs:{},portsIn:[{name:"Title",value:"*"}],objName:"Ops.Ui.Area"},{id:"yvvnsby8j",uiAttribs:{},portsIn:[{name:"text",value:"decay, size, mod, mix"},{name:"separator",value:","},{name:"Numbers",value:0},{name:"Trim",value:1},{name:"Split Lines",value:0}],portsOut:[{name:"array",links:[{portIn:"array",portOut:"array",objIn:"fxd9qy0nv",objOut:"yvvnsby8j"}]},{name:"length",value:4}],objName:"Ops.Array.StringToArray_v2"},{id:"fxd9qy0nv",uiAttribs:{},portsOut:[{name:"result",links:[{portIn:"String A",portOut:"result",objIn:"hhpgrbf2g",objOut:"fxd9qy0nv"}]}],objName:"Ops.Array.ArrayGetString"},{id:"xqowbomkj",uiAttribs:{},portsIn:[{name:"Title",value:"*"}],objName:"Ops.Ui.Area"},{id:"rdmibd961",uiAttribs:{},portsIn:[{name:"Start Row",value:0}],objName:"Ops.Ui.VizArrayTable"},{id:"okiq8ed9q",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"mainExe"}],portsOut:[{name:"Triggered",links:[{portIn:"render",portOut:"Triggered",objIn:"eupi4n3t8",objOut:"okiq8ed9q"}]}],objName:"Ops.Trigger.TriggerReceive"},{id:"ch5u1xz0l",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"midExe"}],objName:"Ops.Trigger.TriggerSend"},{id:"faiior48h",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"midExe"}],portsOut:[{name:"Triggered",links:[{portIn:"render",portOut:"Triggered",objIn:"fvg1zz75v",objOut:"faiior48h"},{portIn:"Render",portOut:"Triggered",objIn:"48vrkn65x",objOut:"faiior48h"},{portIn:"render",portOut:"Triggered",objIn:"33hdtkr51",objOut:"faiior48h"}]}],objName:"Ops.Trigger.TriggerReceive"},{id:"smns78b6k",uiAttribs:{},portsIn:[{name:"Title",value:"*"}],objName:"Ops.Ui.Area"},{id:"c9u5wxkzu",uiAttribs:{},portsIn:[{name:"Value",value:0}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"33hdtkr51",objOut:"c9u5wxkzu"}]},{name:"Number",value:0}],objName:"Ops.Number.TriggerOnChangeNumber"},{id:"piq1e64rw",uiAttribs:{},portsIn:[{name:"Title",value:"*"}],objName:"Ops.Ui.Area"},{id:"t83msa078",uiAttribs:{},portsIn:[{name:"Title",value:"*"}],objName:"Ops.Ui.Area"},{id:"ifc049dka",uiAttribs:{},portsIn:[{name:"Id",value:""},{name:"Class",value:"nel-logo"},{name:"Style",value:""},{name:"Interactive",value:1},{name:"Visible",value:1},{name:"Convert Line Breaks",value:0},{name:"Propagate Click-Events",value:1}],portsOut:[{name:"DOM Element",links:[{portIn:"DOMElement",portOut:"DOM Element",objIn:"m4lf0ljbk",objOut:"ifc049dka"},{portIn:"Element",portOut:"DOM Element",objIn:"ql6igmez3",objOut:"ifc049dka"}]},{name:"Hover",links:[{portIn:"Use Value 1",portOut:"Hover",objIn:"acmkbycvu",objOut:"ifc049dka"}]},{name:"Clicked",links:[{portIn:"Open",portOut:"Clicked",objIn:"g5qz1ee85",objOut:"ifc049dka"}]}],objName:"Ops.Html.DivElement_v3"},{id:"p1qw1y67z",uiAttribs:{},portsIn:[{name:"value",value:'<?xml version="1.0" encoding="utf-8"?>\n\x3c!-- Generator: Adobe Illustrator 24.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  --\x3e\n<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"\n    width="300px" viewBox="0 0 400 120" xml:space="preserve">\n    <style type="text/css">\n        .st0 {\n            fill: #F79355;\n        }\n\n        .st1 {\n            fill: #33C21C;\n        }\n\n        .st2 {\n            fill: #00000000\n        }\n    </style>\n    <symbol id="a59f87b6-0439-40fb-bcac-5aff05fde512" viewBox="-76.33 -6.58 152.66 13.16">\n        <g>\n            <g>\n                <rect x="-76.32" y="-6.58" class="st0" width="6.53" height="1.89" />\n                <rect x="-76.33" y="-2.8" class="st0" width="2.95" height="1.85" />\n                <rect x="-70.44" y="-2.8" class="st0" width="2.92" height="1.85" />\n                <rect x="-68.18" y="-6.58" class="st0" width="6.53" height="1.89" />\n                <rect x="-76.32" y="4.69" class="st0" width="6.53" height="1.89" />\n                <rect x="-68.18" y="4.69" class="st0" width="6.53" height="1.89" />\n                <rect x="-64.6" y="-2.8" class="st0" width="2.95" height="1.85" />\n                <rect x="-76.33" y="0.95" class="st0" width="2.95" height="1.85" />\n                <rect x="-70.44" y="0.95" class="st0" width="2.92" height="1.85" />\n                <rect x="-64.6" y="0.95" class="st0" width="2.95" height="1.85" />\n            </g>\n            <path class="st1" d="M-54.33-3.09l1.16,3v-3h1.18V3h-1.15l-1.19-3.05V3h-1.16v-6.09H-54.33z" />\n            <path class="st1" d="M-42.82-3.09v1.22h-2.35v1.23h2.35v1.19h-2.35v1.23h2.35V3h-3.51v-6.09H-42.82z" />\n            <path class="st1" d="M-36.04-3.09l0.58,3l0.58-3h1.19L-34.88,3h-1.16l-1.19-6.09H-36.04z" />\n            <path class="st1" d="M-24.56-3.09v1.22h-2.35v1.23h2.35v1.19h-2.35v1.23h2.35V3h-3.53v-6.09H-24.56z" />\n            <path class="st1"\n                d="M-16.62-3.09c0.32,0.01,0.62,0.14,0.84,0.37c0.23,0.22,0.36,0.53,0.35,0.85v1.23c0,0.24-0.07,0.47-0.19,0.67\n\t\t\tc-0.13,0.2-0.31,0.35-0.53,0.44L-15.43,3h-1.19l-0.71-2.45h-0.47V3h-1.16v-6.09H-16.62z M-17.78-0.64h1.16v-1.23h-1.16V-0.64z" />\n            <path class="st1" d="M-6.33-3.09v1.22h-2.32v1.23h2.32v1.19h-2.32v1.23h2.32V3h-3.5v-6.09H-6.33z" />\n            <path class="st1" d="M0.49-3.09l1.15,3v-3h1.19V3H1.67L0.52,0v3H-0.7v-6.09H0.49z" />\n            <path class="st1" d="M11.96-3.09v1.22H9.67v3.65h1.16v-2.42h1.18v2.42c0.01,0.32-0.11,0.63-0.34,0.85\n\t\t\tC11.45,2.86,11.15,2.99,10.83,3H9.67C9.35,2.99,9.05,2.85,8.82,2.63C8.59,2.41,8.47,2.1,8.48,1.78v-3.65\n\t\t\tC8.47-2.19,8.59-2.5,8.82-2.72c0.23-0.22,0.53-0.36,0.85-0.37H11.96z" />\n            <path class="st1" d="M20.51-3.09v1.22h-0.6v3.65h0.6V3h-2.37V1.78h0.61v-3.65h-0.61v-1.22H20.51z" />\n            <path class="st1" d="M28.33-3.09l1.15,3v-3h1.19V3h-1.19l-1.15-3v3h-1.19v-6.09H28.33z" />\n            <path class="st1" d="M39.8-3.09v1.22h-2.34v1.23h2.34v1.19h-2.34v1.23h2.34V3h-3.53v-6.09H39.8z" />\n            <path class="st1" d="M46.59-3.09v4.87h2.34V3H45.4v-6.09H46.59z" />\n            <path class="st1" d="M56.88-3.09c0.32,0.01,0.62,0.14,0.84,0.37c0.23,0.22,0.36,0.53,0.35,0.85V3h-1.19V0.55h-1.16V3h-1.19v-4.87\n\t\t\tc-0.01-0.32,0.12-0.63,0.35-0.85c0.22-0.23,0.52-0.36,0.84-0.37L56.88-3.09z M55.72-0.64h1.16v-1.23h-1.16V-0.64z" />\n            <path class="st1" d="M66.93-0.32c-0.16,0.17-0.38,0.27-0.62,0.27c0.24,0,0.46,0.1,0.62,0.28c0.17,0.17,0.27,0.4,0.27,0.64v0.91\n\t\t\tc0.01,0.32-0.12,0.63-0.35,0.85C66.63,2.86,66.33,2.99,66.01,3h-2.34v-6.09h2.35c0.32,0.01,0.62,0.14,0.84,0.37\n\t\t\tc0.23,0.22,0.36,0.53,0.35,0.85v0.91C67.21-0.72,67.11-0.48,66.93-0.32z M66.01-1.87h-1.16v1.23h1.16V-1.87z M66.01,0.55h-1.16\n\t\t\tv1.23h1.16V0.55z" />\n            <path class="st1" d="M76.33-3.09v1.22h-2.35v1.23h1.16c0.31-0.01,0.62,0.12,0.84,0.34c0.23,0.22,0.36,0.53,0.35,0.85v1.23\n\t\t\tc0.01,0.32-0.12,0.63-0.35,0.85C75.76,2.86,75.46,2.99,75.14,3H72.8V1.78h2.34V0.55h-1.16c-0.64,0.01-1.17-0.5-1.18-1.14\n\t\t\tc0-0.02,0-0.03,0-0.05v-1.23c-0.01-0.32,0.11-0.63,0.34-0.85c0.22-0.23,0.52-0.36,0.84-0.37L76.33-3.09z" />\n        </g>\n    </symbol>\n    <g id="Layer_2">\n        <rect x="1.46" y="1.46" class="st2" width="400" height="114.29" />\n    </g>\n    <g id="ab50a4d6-51e3-4638-b29d-7ff1e5b6a9df">\n        <g>\n            <defs>\n                <rect id="SVGID_1_" x="21.91" y="46.04" width="367.73" height="31.38" />\n            </defs>\n            <clipPath id="SVGID_2_">\n                <use xlink:href="#SVGID_1_" style="overflow:visible;" />\n            </clipPath>\n            <g style="clip-path:url(#SVGID_2_);">\n\n                <use xlink:href="#a59f87b6-0439-40fb-bcac-5aff05fde512" width="152.66" height="13.16" x="-76.33"\n                    y="-6.58" transform="matrix(2.4088 0 0 2.3848 205.7744 61.728)" style="overflow:visible;" />\n            </g>\n        </g>\n    </g>\n</svg>'},{name:"Syntax index",value:3},{name:"Syntax",value:"html"}],portsOut:[{name:"Result",links:[{portIn:"Text",portOut:"Result",objIn:"ifc049dka",objOut:"p1qw1y67z"}]}],objName:"Ops.String.StringEditor"},{id:"ehh39rz6v",uiAttribs:{},portsIn:[{name:"css code",value:".nel-logo {\n    \nposition:absolute;\nz-index:100;\nleft: 100px;\nopacity: 0.9;\n}"},{name:"Active",value:1}],objName:"Ops.Html.CSS_v2"},{id:"p160hjd8r",uiAttribs:{},portsIn:[{name:"posX",value:-1.53},{name:"posY",value:-1.09},{name:"posZ",value:-1.65},{name:"scale",value:1},{name:"rotX",value:8.63},{name:"rotY",value:69.58},{name:"rotZ",value:0}],portsOut:[{name:"trigger",links:[{portIn:"trigger",portOut:"trigger",objIn:"m4lf0ljbk",objOut:"p160hjd8r"}]}],objName:"Ops.Gl.Matrix.Transform"},{id:"m4lf0ljbk",uiAttribs:{},portsIn:[{name:"origin index",value:7},{name:"origin",value:"bottom-middle"}],objName:"Ops.Html.TransformCSS3DElement"},{id:"4pu8mr0y2",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"preSequenceFlow"}],objName:"Ops.Trigger.TriggerSend"},{id:"jfun4qac1",uiAttribs:{},portsIn:[{name:"Pixel Unit index",value:0},{name:"Pixel Unit",value:"Display"}],portsOut:[{name:"width",value:1532},{name:"height",value:834},{name:"Pixel Ratio",value:2},{name:"Pixel Width",links:[{portIn:"number1",portOut:"Pixel Width",objIn:"cd0k5qsyf",objOut:"jfun4qac1"}]},{name:"Pixel Height",value:1668},{name:"Aspect Ratio",value:1.8369304556354915},{name:"Landscape",value:1}],objName:"Ops.Gl.CanvasInfo_v2"},{id:"cd0k5qsyf",uiAttribs:{},portsIn:[{name:"number2",value:800}],portsOut:[{name:"result",value:3.83}],objName:"Ops.Math.Divide"},{id:"of6q9dm1m",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"mainExe"}],portsOut:[{name:"Triggered",links:[{portIn:"render",portOut:"Triggered",objIn:"ajz3m2b7r",objOut:"of6q9dm1m"}]}],objName:"Ops.Trigger.TriggerReceive"},{id:"rid9x7kap",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"preSequenceFlow"}],portsOut:[{name:"Triggered",links:[{portIn:"render",portOut:"Triggered",objIn:"p160hjd8r",objOut:"rid9x7kap"}]}],objName:"Ops.Trigger.TriggerReceive"},{id:"efooconni",uiAttribs:{},portsIn:[{name:"Title",value:"HTML"}],objName:"Ops.Ui.Area"},{id:"ql6igmez3",uiAttribs:{},portsIn:[{name:"Property",value:"opacity"},{name:"Value Suffix",value:""}],objName:"Ops.Html.CSSProperty_v2"},{id:"acmkbycvu",uiAttribs:{},portsIn:[{name:"Value 0",value:.7},{name:"Value 1",value:1}],portsOut:[{name:"Out Value",links:[{portIn:"Value",portOut:"Out Value",objIn:"ql6igmez3",objOut:"acmkbycvu"}]}],objName:"Ops.Boolean.BoolToNumber_v2"},{id:"g5qz1ee85",uiAttribs:{},portsIn:[{name:"URL",value:"https://neverenginelabs.com"},{name:"Target Name",value:"_blank"},{name:"Specs",value:""}],objName:"Ops.Html.HyperLink_v2"},{id:"zcc6zzw4d",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"exeNoCamera"}],objName:"Ops.Trigger.TriggerSend"},{id:"catyviogw",uiAttribs:{},portsIn:[{name:"x",value:1.73},{name:"y",value:.95},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"Trigger",portOut:"trigger",objIn:"ny2jicns4",objOut:"catyviogw"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"jmw19jjzi",uiAttribs:{},portsIn:[{name:"r",value:.222},{name:"g",value:.898},{name:"b",value:1},{name:"Vertex Colors",value:0},{name:"Alpha Mask Source index",value:0},{name:"Alpha Mask Source",value:"Luminance"},{name:"Opacity TexCoords Transform",value:0},{name:"Discard Transparent Pixels",value:0},{name:"diffuseRepeatX",value:-.36},{name:"diffuseRepeatY",value:-.18},{name:"Tex Offset X",value:-24.27},{name:"Tex Offset Y",value:7.78},{name:"Crop TexCoords",value:0},{name:"billboard",value:0}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"catyviogw",objOut:"jmw19jjzi"},{portIn:"Update",portOut:"trigger",objIn:"gf07781ar",objOut:"jmw19jjzi"}]}],objName:"Ops.Gl.Shader.BasicMaterial_v3"},{id:"avhqfpehd",uiAttribs:{},portsIn:[{name:"Named Trigger",value:"exeNoCamera"}],portsOut:[{name:"Triggered",links:[{portIn:"Trigger",portOut:"Triggered",objIn:"12xx7g980",objOut:"avhqfpehd"}]}],objName:"Ops.Trigger.TriggerReceive"},{id:"0cristvpm",uiAttribs:{},portsIn:[{name:"Font File",value:"assets/forkawesome-webfont.ttf",display:"file"}],portsOut:[{name:"Opentype Font",links:[{portIn:"Opentype Font",portOut:"Opentype Font",objIn:"btqy1laa6",objOut:"0cristvpm"}]}],objName:"Ops.Extension.OpenType.OpentypeFont"},{id:"btqy1laa6",uiAttribs:{},portsIn:[{name:"Text",value:""},{name:"Letter Spacing",value:0}],portsOut:[{name:"Path String",links:[{portIn:"SVG Path",portOut:"Path String",objIn:"m3rdjk1xk",objOut:"btqy1laa6"}]}],objName:"Ops.Extension.OpenType.OpentypeToSvgPath"},{id:"m3rdjk1xk",uiAttribs:{},portsIn:[{name:"Bezier Stepsize",value:3},{name:"Rescale",value:.07}],portsOut:[{name:"Geometry",links:[{portIn:"Geometry",portOut:"Geometry",objIn:"s71v490xs",objOut:"m3rdjk1xk"}]}],objName:"Ops.Graphics.Geometry.SvgPathToGeometry_v2"},{id:"9vf5ijecy",uiAttribs:{},portsIn:[{name:"Render Mesh",value:1},{name:"Add Vertex Numbers",value:0}],objName:"Ops.Gl.RenderGeometry_v2"},{id:"12xx7g980",uiAttribs:{},portsIn:[{name:"Check Body Collisions",value:0}],portsOut:[{name:"Next",links:[{portIn:"Trigger",portOut:"Next",objIn:"zmasrvvjw",objOut:"12xx7g980"}]},{name:"Total Bodies",value:1}],objName:"Ops.Graphics.Intersection.IntersectWorld"},{id:"ny2jicns4",uiAttribs:{},portsIn:[{name:"Shape index",value:1},{name:"Shape",value:"BoxAA"},{name:"Name",value:"icon.save"},{name:"Radius",value:.09},{name:"Size X",value:.24},{name:"Size Y",value:.23},{name:"Size Z",value:.19},{name:"Positions"},{name:"Append Index to name",value:0}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"lp0zvoc9g",objOut:"ny2jicns4"}]}],objName:"Ops.Graphics.Intersection.IntersectBody"},{id:"zmasrvvjw",uiAttribs:{},portsIn:[{name:"Coordinate Format index",value:0},{name:"Coordinate Format",value:"-1 to 1"},{name:"Z",value:0},{name:"To X",value:0},{name:"To Y",value:0},{name:"To Z",value:0},{name:"Active",value:1},{name:"Change Cursor",value:1}],portsOut:[{name:"Next",links:[{portIn:"render",portOut:"Next",objIn:"jmw19jjzi",objOut:"zmasrvvjw"}]},{name:"Has Hit",value:0},{name:"Hit Body Name",value:""},{name:"Hit X",links:[{portIn:"colorizeTexture",portOut:"Hit X",objIn:"jmw19jjzi",objOut:"zmasrvvjw"}]},{name:"Hit Y",links:[{portIn:"number1",portOut:"Hit Y",objIn:"w59tgvg1u",objOut:"zmasrvvjw"}]},{name:"Hit Z",links:[{portIn:"A",portOut:"Hit Z",objIn:"yn916v8en",objOut:"zmasrvvjw"}]}],objName:"Ops.Graphics.Intersection.IntersectTestRaycast"},{id:"mts5kprh0",uiAttribs:{},portsIn:[{name:"Coordinates index",value:0},{name:"Coordinates",value:"-1 to 1"},{name:"Area index",value:0},{name:"Area",value:"Canvas"},{name:"flip y",value:1},{name:"right click prevent default",value:1},{name:"Touch support",value:1},{name:"Passive Events",value:0},{name:"Active",value:1}],portsOut:[{name:"x",links:[{portIn:"X",portOut:"x",objIn:"zmasrvvjw",objOut:"mts5kprh0"}]},{name:"y",links:[{portIn:"Y",portOut:"y",objIn:"zmasrvvjw",objOut:"mts5kprh0"}]},{name:"Button is down",value:0},{name:"Mouse is hovering",value:1},{name:"Movement X",value:0},{name:"Movement Y",value:-.5}],objName:"Ops.Devices.Mouse.Mouse_v3"},{id:"s71v490xs",uiAttribs:{},portsIn:[{name:"Smooth",value:1},{name:"Walls",value:0},{name:"Top",value:1},{name:"Bottom",value:0}],portsOut:[{name:"Result Geometry",links:[{portIn:"Geometry",portOut:"Result Geometry",objIn:"9vf5ijecy",objOut:"s71v490xs"}]}],objName:"Ops.Graphics.Geometry.GeometryExtrude"},{id:"w59tgvg1u",uiAttribs:{},portsIn:[{name:"number2",value:.05}],portsOut:[{name:"result",links:[{portIn:"Value",portOut:"result",objIn:"gf07781ar",objOut:"w59tgvg1u"}]}],objName:"Ops.Math.Multiply"},{id:"lp0zvoc9g",uiAttribs:{},portsIn:[{name:"x",value:-.05},{name:"y",value:-.05},{name:"z",value:0}],portsOut:[{name:"trigger",links:[{portIn:"render",portOut:"trigger",objIn:"9vf5ijecy",objOut:"lp0zvoc9g"}]}],objName:"Ops.Gl.Matrix.Translate"},{id:"lk6h207g7",uiAttribs:{},portsIn:[{name:"File",value:"assets/lib_matcaps_Chrome_Blue_Tint-White.png",display:"file"},{name:"Filter index",value:1},{name:"Filter",value:"linear"},{name:"Wrap index",value:0},{name:"Wrap",value:"repeat"},{name:"Anisotropic index",value:0},{name:"Anisotropic",value:"0"},{name:"Data Format index",value:3},{name:"Data Format",value:"RGBA"},{name:"Flip",value:1},{name:"Pre Multiplied Alpha",value:1},{name:"Active",value:1},{name:"Save Memory",value:1},{name:"Add Cachebuster",value:1}],portsOut:[{name:"Texture",links:[{portIn:"texture",portOut:"Texture",objIn:"jmw19jjzi",objOut:"lk6h207g7"}]},{name:"Width",value:256},{name:"Height",value:256},{name:"Aspect Ratio",value:1},{name:"Loaded",value:1},{name:"Loading",value:0}],objName:"Ops.Gl.Texture_v2"},{id:"gf07781ar",uiAttribs:{},portsIn:[{name:"Separate inc/dec",value:0},{name:"Inc factor",value:4,title:"Inc/Dec factor"},{name:"Dec factor",value:4}],portsOut:[{name:"Result",links:[{portIn:"Height",portOut:"Result",objIn:"s71v490xs",objOut:"gf07781ar"}]}],objName:"Ops.Anim.Smooth"},{id:"g464u24ms",uiAttribs:{},portsIn:[{name:"Title",value:"Icons"}],objName:"Ops.Ui.Area"},{id:"yn916v8en",uiAttribs:{},portsIn:[{name:"B",value:5},{name:"C",value:.5},{name:"D",value:3},{name:"Expression",value:"(a*b) + c"}],portsOut:[{name:"Result",links:[{portIn:"a",portOut:"Result",objIn:"jmw19jjzi",objOut:"yn916v8en"}]},{name:"Expression Valid",value:true}],objName:"Ops.Math.MathExpression"},{id:"zi3u8x4zd",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Variable",value:"ui_activeDial_ID"}],portsOut:[{name:"Value",links:[{portIn:"number1",portOut:"Value",objIn:"zhjkbd61e",objOut:"zi3u8x4zd"}]}],objName:"Ops.Vars.VarGetNumber_v2"},{id:"0txm5qrgs",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Variable",value:"ui_dialValues"}],portsOut:[{name:"Value",links:[{portIn:"array",portOut:"Value",objIn:"ccotjup9t",objOut:"0txm5qrgs"}]}],objName:"Ops.Vars.VarGetArray_v2"},{id:"ccotjup9t",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"Value Invalid Index",value:0}],portsOut:[{name:"value",links:[{portIn:"Default Value",portOut:"value",objIn:"dq71li66q",objOut:"ccotjup9t"}]},{name:"Valid Index",value:1}],objName:"Ops.Array.ArrayGetNumber"},{id:"zhjkbd61e",uiAttribs:{subPatch:"66dae55a-8297-4120-81e2-d946cc6b2b60"},portsIn:[{name:"number2",value:1}],portsOut:[{name:"result",links:[{portIn:"index",portOut:"result",objIn:"ccotjup9t",objOut:"zhjkbd61e"}]}],objName:"Ops.Math.Subtract"},{id:"d7vl5bf8b",uiAttribs:{},portsIn:[{name:"When False index",value:0},{name:"When False",value:"keep last array"}],portsOut:[{name:"Array Out",links:[{portIn:"Value",portOut:"Array Out",objIn:"x6efudpvd",objOut:"d7vl5bf8b"}]}],objName:"Ops.Array.GateArray_v2"},{id:"rjsjd3otn",uiAttribs:{},portsOut:[{name:"Result",links:[{portIn:"Array",portOut:"Result",objIn:"rdmibd961",objOut:"rjsjd3otn"},{portIn:"Array in",portOut:"Result",objIn:"d7vl5bf8b",objOut:"rjsjd3otn"}]}],objName:"Ops.Patch.PuvBp73.ArraySetNumberAtIndex_v4"}],export:{time:"2024-06-29 16:32:47",service:"download",exportNumber:8}};if(!CABLES.exportedPatch){CABLES.exportedPatch=CABLES.exportedPatches["uvBp73"]}"use strict";var CABLES=CABLES||{};CABLES.OPS=CABLES.OPS||{};var Ops=Ops||{};Ops.Gl=Ops.Gl||{};Ops.Ui=Ops.Ui||{};Ops.Anim=Ops.Anim||{};Ops.Html=Ops.Html||{};Ops.Math=Ops.Math||{};Ops.Vars=Ops.Vars||{};Ops.Array=Ops.Array||{};Ops.Patch=Ops.Patch||{};Ops.Number=Ops.Number||{};Ops.String=Ops.String||{};Ops.Boolean=Ops.Boolean||{};Ops.Devices=Ops.Devices||{};Ops.Trigger=Ops.Trigger||{};Ops.Graphics=Ops.Graphics||{};Ops.Extension=Ops.Extension||{};Ops.Gl.Matrix=Ops.Gl.Matrix||{};Ops.Gl.Meshes=Ops.Gl.Meshes||{};Ops.Gl.Shader=Ops.Gl.Shader||{};Ops.Deprecated=Ops.Deprecated||{};Ops.Gl.Textures=Ops.Gl.Textures||{};Ops.Math.Compare=Ops.Math.Compare||{};Ops.Deprecated.Gl=Ops.Deprecated.Gl||{};Ops.Devices.Mouse=Ops.Devices.Mouse||{};Ops.Patch.PuvBp73=Ops.Patch.PuvBp73||{};Ops.Devices.Browser=Ops.Devices.Browser||{};Ops.Gl.ImageCompose=Ops.Gl.ImageCompose||{};Ops.Graphics.Geometry=Ops.Graphics.Geometry||{};Ops.Extension.OpenType=Ops.Extension.OpenType||{};Ops.Deprecated.Gl.Matrix=Ops.Deprecated.Gl.Matrix||{};Ops.Graphics.Intersection=Ops.Graphics.Intersection||{};Ops.Patch.PuvBp73.SubPatch2=function(){CABLES.Op.apply(this,arguments);const e=this;const n=e.attachments={inc_gen_ports_js:"op.initInnerPorts=function(addedOps)\n{\n  for(let i=0;i<addedOps.length;i++)\n  {\n    if(addedOps[i].innerInput)\n    {\n    }\nif(addedOps[i].innerOutput)\n{\n}\n}\n};\n",subpatch_json:'{"ops":[{"id":"bp0-0","uiAttribs":{"subPatch":"6d80loy1x"},"portsOut":[{"name":"Number","links":[{"portIn":"number1","portOut":"Number","objIn":"bp0-3","objOut":"bp0-0"},{"portIn":"Value In","portOut":"Number","objIn":"bp0-5","objOut":"bp0-0"}]}],"storage":{"ref":"bp0-0"},"objName":"Ops.String.ParseInt_v2"},{"id":"bp0-1","uiAttribs":{"subPatch":"6d80loy1x"},"portsIn":[{"name":"Variable","value":"ui_hitBodyName"}],"portsOut":[{"name":"Value","links":[{"portIn":"String","portOut":"Value","objIn":"bp0-2","objOut":"bp0-1"}]}],"storage":{"ref":"bp0-1"},"objName":"Ops.Vars.VarGetString"},{"id":"bp0-2","uiAttribs":{"subPatch":"6d80loy1x"},"portsIn":[{"name":"Search For","value":"dial."},{"name":"Replace","value":""},{"name":"Replace What index","value":0},{"name":"Replace What","value":"All"}],"portsOut":[{"name":"Result","links":[{"portIn":"String","portOut":"Result","objIn":"bp0-0","objOut":"bp0-2"}]}],"storage":{"ref":"bp0-2"},"objName":"Ops.String.StringReplace"},{"id":"bp0-3","uiAttribs":{"subPatch":"6d80loy1x"},"portsIn":[{"name":"number2","value":0}],"portsOut":[{"name":"result","links":[{"portIn":"Pass Through","portOut":"result","objIn":"bp0-5","objOut":"bp0-3"}]}],"storage":{"ref":"bp0-3"},"objName":"Ops.Math.Compare.GreaterThan"},{"id":"bp0-4","uiAttribs":{"subPatch":"6d80loy1x"},"portsIn":[{"name":"Variable","value":"ui_activeDial_ID"}],"storage":{"ref":"bp0-4"},"objName":"Ops.Vars.VarSetNumber_v2"},{"id":"bp0-5","uiAttribs":{"subPatch":"6d80loy1x"},"portsOut":[{"name":"Value Out","links":[{"portIn":"Value","portOut":"Value Out","objIn":"bp0-4","objOut":"bp0-5"}]}],"storage":{"ref":"bp0-5"},"objName":"Ops.Number.GateNumber"},{"id":"bp0-6","uiAttribs":{"subPatch":"6d80loy1x"},"storage":{"ref":"bp0-6"},"objName":"Ops.Ui.SubPatchInput"},{"id":"bp0-7","uiAttribs":{"subPatch":"6d80loy1x"},"storage":{"ref":"bp0-7"},"objName":"Ops.Ui.SubPatchOutput"}]}'};e.initInnerPorts=function(t){for(let e=0;e<t.length;e++){if(t[e].innerInput){}if(t[e].innerOutput){}}};const r="bp2sub_"+e.id;new CABLES.SubPatchOp(e,{subId:r});t();function t(){const t=JSON.parse(n.subpatch_json);CABLES.Patch.replaceOpIds(t,{parentSubPatchId:r,prefixHash:r,oldIdAsRef:true,doNotUnlinkLostLinks:true});for(let e=0;e<t.ops.length;e++){t.ops[e].uiAttribs.blueprintSubpatch2=true}e.patch.deSerialize(t,{opsCreated:e.initInnerPorts});if(CABLES.UI)gui.savedState.setSaved("blueprintloaded",r);e.patch.emitEvent("subpatchExpose",r);e.setStorage({blueprintVer:2});e.patch.emitEvent("subpatchExpose",r)}};Ops.Patch.PuvBp73.SubPatch2.prototype=new CABLES.Op;CABLES.OPS["26622971-92ff-4790-a68e-d502135e936f"]={f:Ops.Patch.PuvBp73.SubPatch2,objName:"Ops.Patch.PuvBp73.SubPatch2"};Ops.String.ParseInt_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inString("String",5711),r=e.outNumber("Number");n.onChange=function(){let e=parseInt(n.get());if(e!=e)e=0;r.set(e)}};Ops.String.ParseInt_v2.prototype=new CABLES.Op;CABLES.OPS["6d208424-daf2-4a2b-874f-daac406c1f66"]={f:Ops.String.ParseInt_v2,objName:"Ops.String.ParseInt_v2"};Ops.Vars.VarGetString=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};var n=e.outString("Value");e.varName=e.inValueSelect("Variable",[],"",true);new CABLES.VarGetOpWrapper(e,"string",e.varName,n)};Ops.Vars.VarGetString.prototype=new CABLES.Op;CABLES.OPS["3ad08cfc-bce6-4175-9746-fef2817a3b12"]={f:Ops.Vars.VarGetString,objName:"Ops.Vars.VarGetString"};Ops.String.StringReplace=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inString("String"),r=t.inString("Search For","foo"),i=t.inString("Replace","bar"),a=t.inSwitch("Replace What",["All","First"],"All"),s=t.outString("Result");i.onChange=n.onChange=a.onChange=r.onChange=o;function o(){t.setUiError("exception",null);let e="";try{if(a.get()=="All")e=String(n.get()).replace(new RegExp(r.get(),"g"),i.get());else e=String(n.get()).replace(r.get(),i.get())}catch(e){t.setUiError("exception","exception "+e.message)}s.set(e)}};Ops.String.StringReplace.prototype=new CABLES.Op;CABLES.OPS["4a053e7a-6b00-4e71-bd51-90cdb190994c"]={f:Ops.String.StringReplace,objName:"Ops.String.StringReplace"};Ops.Math.Compare.GreaterThan=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValueFloat("number1"),r=e.inValueFloat("number2"),i=e.outBoolNum("result");e.setUiAttribs({mathTitle:true});n.onChange=r.onChange=a;function a(){i.set(n.get()>r.get())}};Ops.Math.Compare.GreaterThan.prototype=new CABLES.Op;CABLES.OPS["b250d606-f7f8-44d3-b099-c29efff2608a"]={f:Ops.Math.Compare.GreaterThan,objName:"Ops.Math.Compare.GreaterThan"};Ops.Vars.VarSetNumber_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValueFloat("Value",0);e.varName=e.inDropDown("Variable",[],"",true);new CABLES.VarSetOpWrapper(e,"number",n,e.varName)};Ops.Vars.VarSetNumber_v2.prototype=new CABLES.Op;CABLES.OPS["b5249226-6095-4828-8a1c-080654e192fa"]={f:Ops.Vars.VarSetNumber_v2,objName:"Ops.Vars.VarSetNumber_v2"};Ops.Number.GateNumber=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValue("Value In",0),r=e.inValueBool("Pass Through"),i=e.inSwitch("When False",["keep last number","custom"],"keep last number"),a=e.inFloat("Custom Value",0),s=e.outNumber("Value Out");n.onChange=l;r.onChange=l;n.changeAlways=s.changeAlways=true;i.onChange=o;function o(){a.setUiAttribs({greyout:i.get()!="custom"});l()}function l(){if(r.get()){s.set(n.get())}else{if(i.get()=="custom")s.set(a.get())}}};Ops.Number.GateNumber.prototype=new CABLES.Op;CABLES.OPS["594105c8-1fdb-4f3c-bbd5-29b9ad6b33e0"]={f:Ops.Number.GateNumber,objName:"Ops.Number.GateNumber"};Ops.Ui.SubPatchInput=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};t.innerInput=true;const n=t.inTriggerButton("Goto SubPatchOp");n.setUiAttribs({hidePort:true});n.onTriggered=()=>{const e=t.patch.getSubPatchOuterOp(t.uiAttribs.subPatch);gui.patchView.centerSelectOp(e.id)}};Ops.Ui.SubPatchInput.prototype=new CABLES.Op;CABLES.OPS["c4e4e933-136e-479e-8de8-0b35b75d9217"]={f:Ops.Ui.SubPatchInput,objName:"Ops.Ui.SubPatchInput"};Ops.Ui.SubPatchOutput=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};e.innerOutput=true};Ops.Ui.SubPatchOutput.prototype=new CABLES.Op;CABLES.OPS["02d45073-7936-4830-81ad-59a162febf1f"]={f:Ops.Ui.SubPatchOutput,objName:"Ops.Ui.SubPatchOutput"};Ops.Gl.MainLoop=function(){CABLES.Op.apply(this,arguments);const r=this;const e=r.attachments={};const t=r.inValue("FPS Limit",0),n=r.outTrigger("trigger"),i=r.outNumber("width"),a=r.outNumber("height"),s=r.inValueBool("Reduce FPS not focussed",false),o=r.inValueBool("Reduce FPS loading"),l=r.inValueBool("Clear",true),u=r.inValueBool("ClearAlpha",true),c=r.inValueBool("Fullscreen Button",false),p=r.inValueBool("Active",true),h=r.inValueBool("Hires Displays",false),f=r.inSwitch("Pixel Unit",["Display","CSS"],"Display");r.onAnimFrame=T;h.onChange=function(){if(h.get())r.patch.cgl.pixelDensity=window.devicePixelRatio;else r.patch.cgl.pixelDensity=1;r.patch.cgl.updateSize();if(CABLES.UI)gui.setLayout()};p.onChange=function(){r.patch.removeOnAnimFrame(r);if(p.get()){r.setUiAttrib({extendTitle:""});r.onAnimFrame=T;r.patch.addOnAnimFrame(r);r.log("adding again!")}else{r.setUiAttrib({extendTitle:"Inactive"})}};const d=r.patch.cgl;let g=0;let m=0;let v=null;let b=false;if(!r.patch.cgl)r.uiAttr({error:"No webgl cgl context"});const y=vec3.create();vec3.set(y,0,0,0);const x=vec3.create();vec3.set(x,0,0,-2);c.onChange=C;setTimeout(C,100);let S=null;let O=true;let _=true;window.addEventListener("blur",()=>{O=false});window.addEventListener("focus",()=>{O=true});document.addEventListener("visibilitychange",()=>{_=!document.hidden});I();d.mainloopOp=this;f.onChange=()=>{i.set(0);a.set(0)};function A(){if(o.get()&&r.patch.loading.getProgress()<1)return 5;if(s.get()){if(!_)return 10;if(!O)return 30}return t.get()}function C(){function e(){if(S)S.style.display="block"}function t(){if(S)S.style.display="none"}r.patch.cgl.canvas.addEventListener("mouseleave",t);r.patch.cgl.canvas.addEventListener("mouseenter",e);if(c.get()){if(!S){S=document.createElement("div");const n=r.patch.cgl.canvas.parentElement;if(n)n.appendChild(S);S.addEventListener("mouseenter",e);S.addEventListener("click",function(e){if(CABLES.UI&&!e.shiftKey)gui.cycleFullscreen();else d.fullScreen()})}S.style.padding="10px";S.style.position="absolute";S.style.right="5px";S.style.top="5px";S.style.width="20px";S.style.height="20px";S.style.cursor="pointer";S.style["border-radius"]="40px";S.style.background="#444";S.style["z-index"]="9999";S.style.display="none";S.innerHTML='<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 490 490" style="width:20px;height:20px;" xml:space="preserve" width="512px" height="512px"><g><path d="M173.792,301.792L21.333,454.251v-80.917c0-5.891-4.776-10.667-10.667-10.667C4.776,362.667,0,367.442,0,373.333V480     c0,5.891,4.776,10.667,10.667,10.667h106.667c5.891,0,10.667-4.776,10.667-10.667s-4.776-10.667-10.667-10.667H36.416     l152.459-152.459c4.093-4.237,3.975-10.99-0.262-15.083C184.479,297.799,177.926,297.799,173.792,301.792z" fill="#FFFFFF"/><path d="M480,0H373.333c-5.891,0-10.667,4.776-10.667,10.667c0,5.891,4.776,10.667,10.667,10.667h80.917L301.792,173.792     c-4.237,4.093-4.354,10.845-0.262,15.083c4.093,4.237,10.845,4.354,15.083,0.262c0.089-0.086,0.176-0.173,0.262-0.262     L469.333,36.416v80.917c0,5.891,4.776,10.667,10.667,10.667s10.667-4.776,10.667-10.667V10.667C490.667,4.776,485.891,0,480,0z" fill="#FFFFFF"/><path d="M36.416,21.333h80.917c5.891,0,10.667-4.776,10.667-10.667C128,4.776,123.224,0,117.333,0H10.667     C4.776,0,0,4.776,0,10.667v106.667C0,123.224,4.776,128,10.667,128c5.891,0,10.667-4.776,10.667-10.667V36.416l152.459,152.459     c4.237,4.093,10.99,3.975,15.083-0.262c3.992-4.134,3.992-10.687,0-14.82L36.416,21.333z" fill="#FFFFFF"/><path d="M480,362.667c-5.891,0-10.667,4.776-10.667,10.667v80.917L316.875,301.792c-4.237-4.093-10.99-3.976-15.083,0.261     c-3.993,4.134-3.993,10.688,0,14.821l152.459,152.459h-80.917c-5.891,0-10.667,4.776-10.667,10.667s4.776,10.667,10.667,10.667     H480c5.891,0,10.667-4.776,10.667-10.667V373.333C490.667,367.442,485.891,362.667,480,362.667z" fill="#FFFFFF"/></g></svg>'}else{if(S){S.style.display="none";S.remove();S=null}}}r.onDelete=function(){d.gl.clearColor(0,0,0,0);d.gl.clear(d.gl.COLOR_BUFFER_BIT|d.gl.DEPTH_BUFFER_BIT)};function T(e){if(!p.get())return;if(d.aborted||d.canvas.clientWidth===0||d.canvas.clientHeight===0)return;r.patch.cg=d;if(h.get())r.patch.cgl.pixelDensity=window.devicePixelRatio;const t=performance.now();r.patch.config.fpsLimit=A();if(d.canvasWidth==-1){d.setCanvas(r.patch.config.glCanvasId);return}if(d.canvasWidth!=i.get()||d.canvasHeight!=a.get()){let e=1;if(f.get()=="CSS")e=r.patch.cgl.pixelDensity;i.set(d.canvasWidth/e);a.set(d.canvasHeight/e)}if(CABLES.now()-m>1e3){CGL.fpsReport=CGL.fpsReport||[];if(r.patch.loading.getProgress()>=1&&m!==0)CGL.fpsReport.push(g);g=0;m=CABLES.now()}CGL.MESH.lastShader=null;CGL.MESH.lastMesh=null;d.renderStart(d,y,x);if(l.get()){d.gl.clearColor(0,0,0,1);d.gl.clear(d.gl.COLOR_BUFFER_BIT|d.gl.DEPTH_BUFFER_BIT)}n.trigger();if(CGL.MESH.lastMesh)CGL.MESH.lastMesh.unBind();if(CGL.Texture.previewTexture){if(!CGL.Texture.texturePreviewer)CGL.Texture.texturePreviewer=new CGL.Texture.texturePreview(d);CGL.Texture.texturePreviewer.render(CGL.Texture.previewTexture)}d.renderEnd(d);r.patch.cg=null;if(u.get()){d.gl.clearColor(1,1,1,1);d.gl.colorMask(false,false,false,true);d.gl.clear(d.gl.COLOR_BUFFER_BIT);d.gl.colorMask(true,true,true,true)}if(!d.frameStore.phong)d.frameStore.phong={};g++;r.patch.cgl.profileData.profileMainloopMs=performance.now()-t}function I(){clearTimeout(v);v=setTimeout(()=>{if(r.patch.getOpsByObjName(r.name).length>1){r.setUiError("multimainloop","there should only be one mainloop op!");if(!b)b=r.patch.addEventListener("onOpDelete",I)}else r.setUiError("multimainloop",null,1)},500)}};Ops.Gl.MainLoop.prototype=new CABLES.Op;CABLES.OPS["b0472a1d-db16-4ba6-8787-f300fbdc77bb"]={f:Ops.Gl.MainLoop,objName:"Ops.Gl.MainLoop"};Ops.Trigger.Sequence=function(){CABLES.Op.apply(this,arguments);const a=this;const e=a.attachments={};const t=a.inTrigger("exe"),n=a.inTriggerButton("Clean up connections");a.setUiAttrib({resizable:true,resizableY:false,stretchPorts:true});const r=[],s=[],i=16;let o=null,l=[];t.onTriggered=p;n.onTriggered=h;n.setUiAttribs({hideParam:true,hidePort:true});for(let t=0;t<i;t++){const f=a.outTrigger("trigger "+t);s.push(f);f.onLinkChanged=c;if(t<i-1){let e=a.inTrigger("exe "+t);e.onTriggered=p;r.push(e)}}u();function u(){l.length=0;for(let e=0;e<s.length;e++)if(s[e].links.length>0)l.push(s[e])}function c(){u();clearTimeout(o);o=setTimeout(()=>{let t=false;for(let e=0;e<s.length;e++)if(s[e].links.length>1)t=true;n.setUiAttribs({hideParam:!t});if(a.isCurrentUiOp())a.refreshParams()},60)}function p(){for(let e=0;e<l.length;e++)l[e].trigger()}function h(){let r=0;for(let n=0;n<s.length;n++){let t=[];if(s[n].links.length>1)for(let e=1;e<s[n].links.length;e++){while(s[r].links.length>0)r++;t.push(s[n].links[e]);const i=s[n].links[e].getOtherPort(s[n]);a.patch.link(a,"trigger "+r,i.op,i.name);r++}for(let e=0;e<t.length;e++)t[e].remove()}c();u()}};Ops.Trigger.Sequence.prototype=new CABLES.Op;CABLES.OPS["a466bc1f-06e9-4595-8849-bffb9fe22f99"]={f:Ops.Trigger.Sequence,objName:"Ops.Trigger.Sequence"};Ops.Devices.Mouse.Mouse_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const k=e.attachments={};const t=e.inSwitch("Coordinates",["-1 to 1","Pixel Display","Pixel","0 to 1"],"-1 to 1"),i=e.inValueSelect("Area",["Canvas","Document","Parent Element","Canvas Area"],"Canvas"),a=e.inValueBool("flip y",true),n=e.inBool("right click prevent default",true),r=e.inValueBool("Touch support",true),s=e.inValueBool("Passive Events",false),o=e.inValueBool("Active",true),l=e.outNumber("x",0),u=e.outNumber("y",0),c=e.outTrigger("click"),p=e.outTrigger("click right"),h=e.outBoolNum("Button is down"),f=e.outBoolNum("Mouse is hovering"),d=e.outNumber("Movement X",0),g=e.outNumber("Movement Y",0);const m=e.patch.cgl;let v=1;let b=null;let y=null;s.onChange=i.onChange=M;t.onChange=B;e.onDelete=P;M();e.on("loadedValueSet",x);function x(){if(v==0){if(y.clientWidth===0){console.log("mouse waiting for listenerelement");setTimeout(x,50)}l.set(y.clientWidth/2);u.set(y.clientHeight/2)}else if(v==1){l.set(0);u.set(0)}else if(v==2){l.set(.5);u.set(.5)}else if(v==3){if(y.clientWidth===0){console.log("mouse waiting for listenerelement");setTimeout(x,50)}l.set(y.clientWidth/2/m.pixelDensity);u.set(y.clientHeight/2/m.pixelDensity)}else console.log("unknown normalize mouse",v)}function w(i,a){i=i||0;a=a||0;if(v==0){l.set(i);u.set(a)}else if(v==3){l.set(i*m.pixelDensity);u.set(a*m.pixelDensity)}else{let n=y.clientWidth/m.pixelDensity;let r=y.clientHeight/m.pixelDensity;n=n||1;r=r||1;if(v==1){let e=i/n*2-1;let t=a/r*2-1;e=CABLES.clamp(e,-1,1);t=CABLES.clamp(t,-1,1);l.set(e);u.set(t)}else if(v==2){let e=i/n;let t=a/r;e=CABLES.clamp(e,0,1);t=CABLES.clamp(t,0,1);l.set(e);u.set(t)}}}function S(e){const t=y.getBoundingClientRect();return e.clientX>t.left&&e.clientX<t.left+t.width&&e.clientY>t.top&&e.clientY<t.top+t.height}r.onChange=function(){P();M()};o.onChange=function(){if(b)P();if(o.get())M()};function B(){if(t.get()=="Pixel")v=0;else if(t.get()=="-1 to 1")v=1;else if(t.get()=="0 to 1")v=2;else if(t.get()=="Pixel Display")v=3}function O(e){h.set(false);f.set(S(e))}function _(e){if(!S(e))return;h.set(true)}function A(e){h.set(false)}function C(e){if(!S(e))return;p.trigger();if(n.get())e.preventDefault()}function T(e){if(!S(e))return;c.trigger()}function I(e){h.set(false);f.set(S(e))}function E(e){let t=e.clientX;let n=e.clientY;if(i.get()!="Document"){t=e.offsetX;n=e.offsetY}if(i.get()==="Canvas Area"){const r=y.getBoundingClientRect();t=e.clientX-r.left;n=e.clientY-r.top}if(a.get())n=y.clientHeight-n;w(t/m.pixelDensity,n/m.pixelDensity)}function L(e){f.set(S(e));E(e);d.set(e.movementX/m.pixelDensity);g.set(e.movementY/m.pixelDensity)}function N(e){if(event.touches&&event.touches.length>0)E(e.touches[0])}function U(e){h.set(true);if(e.touches&&e.touches.length>0)_(e.touches[0])}function R(e){h.set(false);A()}function P(){if(!b)return;b.removeEventListener("touchend",R);b.removeEventListener("touchstart",U);b.removeEventListener("touchmove",N);b.removeEventListener("click",T);b.removeEventListener("mousemove",L);b.removeEventListener("mouseleave",I);b.removeEventListener("mousedown",_);b.removeEventListener("mouseup",A);b.removeEventListener("mouseenter",O);b.removeEventListener("contextmenu",C);b=null}function M(){if(b||!o.get())P();if(!o.get())return;b=y=m.canvas;if(i.get()=="Canvas Area"){y=m.canvas.parentElement;b=document.body}if(i.get()=="Document")y=b=document.body;if(i.get()=="Parent Element")b=y=m.canvas.parentElement;let e=false;if(s.get())e={passive:true};if(r.get()){b.addEventListener("touchend",R,e);b.addEventListener("touchstart",U,e);b.addEventListener("touchmove",N,e)}b.addEventListener("mousemove",L,e);b.addEventListener("mouseleave",I,e);b.addEventListener("mousedown",_,e);b.addEventListener("mouseup",A,e);b.addEventListener("mouseenter",O,e);b.addEventListener("contextmenu",C,e);b.addEventListener("click",T,e)}};Ops.Devices.Mouse.Mouse_v3.prototype=new CABLES.Op;CABLES.OPS["6d1edbc0-088a-43d7-9156-918fb3d7f24b"]={f:Ops.Devices.Mouse.Mouse_v3,objName:"Ops.Devices.Mouse.Mouse_v3"};Ops.Math.DeltaSum=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const o=e.inValue("Delta Value"),n=e.inValue("Default Value",0),l=e.inValue("Multiply",1),r=e.inTriggerButton("Reset"),a=e.inValueBool("Limit",false),u=e.inValue("Min",0),c=e.inValue("Max",100),p=e.inValue("Rubberband",0),s=e.outNumber("Absolute Value");o.changeAlways=true;e.setPortGroup("Limit",[a,u,c,p]);let h=0;let f=CABLES.now();let d=null;a.onChange=g;n.onChange=r.onTriggered=i;c.onChange=u.onChange=v;g();function i(){let e=n.get();if(a.get()){e=Math.max(u.get(),e);e=Math.min(c.get(),e)}h=e;s.set(h)}function g(){u.setUiAttribs({greyout:!a.get()});c.setUiAttribs({greyout:!a.get()});p.setUiAttribs({greyout:!a.get()});v()}function m(){const e=u.get();const t=c.get();if(h<e)h=e;if(h>t)h=t;s.set(h)}function v(){if(a.get()){const e=u.get();const t=c.get();const n=p.get();const r=u.get()-n;const i=c.get()+n;if(h<r)h=r;if(h>i)h=i;if(n!==0){clearTimeout(d);d=setTimeout(m.bind(this),300)}}s.set(h)}o.onChange=function(){let e=o.get();const t=p.get();if(t!==0){const n=u.get();const r=c.get();const i=u.get()-t;const a=c.get()+t;if(h<n){const s=Math.abs(h-i)/t;e*=s*s}if(h>r){const s=Math.abs(a-h)/t;e*=s*s}}f=CABLES.now();h+=e*l.get();v()}};Ops.Math.DeltaSum.prototype=new CABLES.Op;CABLES.OPS["d9d4b3db-c24b-48da-b798-9e6230d861f7"]={f:Ops.Math.DeltaSum,objName:"Ops.Math.DeltaSum"};Ops.Ui.PatchInput=function(){CABLES.Op.apply(this,arguments);const i=this;const e=i.attachments={};const a=i.addOutPort(new CABLES.Port(i,"create port",CABLES.OP_PORT_TYPE_DYNAMIC));function s(){for(let e in i.patch.ops){if(i.patch.ops[e].patchId){if(i.patch.ops[e].patchId.get()==i.uiAttribs.subPatch){return i.patch.ops[e]}}}}a.onLinkChanged=()=>{const e=s();if(!a.links.length||!e||!e.addNewInPort)return;const t=a.links[0].getOtherPort(a);a.removeLinks();const n=e.addNewInPort(t);const r=gui.scene().link(t.parent,t.getName(),i,n);e.saveData()}};Ops.Ui.PatchInput.prototype=new CABLES.Op;CABLES.OPS["e3f68bc3-892a-4c78-9974-aca25c27025d"]={f:Ops.Ui.PatchInput,objName:"Ops.Ui.PatchInput"};Ops.Ui.PatchOutput=function(){CABLES.Op.apply(this,arguments);const i=this;const e=i.attachments={};const a=i.addInPort(new CABLES.Port(i,"create port",CABLES.OP_PORT_TYPE_DYNAMIC));function s(){for(let e in i.patch.ops){if(i.patch.ops[e].patchId){if(i.patch.ops[e].patchId.get()==i.uiAttribs.subPatch){return i.patch.ops[e]}}}}a.onLinkChanged=()=>{const e=s();if(!a.links.length)return;const t=a.links[0].getOtherPort(a);a.removeLinks();const n=e.addNewOutPort(t);const r=gui.scene().link(t.parent,t.getName(),i,n);e.saveData()}};Ops.Ui.PatchOutput.prototype=new CABLES.Op;CABLES.OPS["851b44cb-5667-4140-9800-5aeb7031f1d7"]={f:Ops.Ui.PatchOutput,objName:"Ops.Ui.PatchOutput"};Ops.Ui.SubPatch=function(){CABLES.Op.apply(this,arguments);const u=this;const e=u.attachments={};u.dyn=u.addInPort(new CABLES.Port(u,"create port",CABLES.OP_PORT_TYPE_DYNAMIC));u.dynOut=u.addOutPort(new CABLES.Port(u,"create port out",CABLES.OP_PORT_TYPE_DYNAMIC));const t=u.addInPort(new CABLES.Port(u,"dataStr",CABLES.OP_PORT_TYPE_VALUE,{display:"readonly"}));u.patchId=u.addInPort(new CABLES.Port(u,"patchId",CABLES.OP_PORT_TYPE_VALUE,{display:"readonly"}));t.setUiAttribs({hideParam:true});u.patchId.setUiAttribs({hidePort:true});let c={ports:[],portsOut:[]};let n=CABLES.generateUUID();u.patchId.set(n);d();f();let p=false;u.saveData=s;u.init=()=>{u.setStorage({subPatchVer:1})};u.patchId.onChange=function(){if(!u.patch.isEditorMode())return;const t=u.patch.getSubPatchOps(n);if(t.length===2){if(u.patch.isEditorMode()&&CABLES.UI.DEFAULTOPS.isInBlueprint(u))CABLES.UI.undo.pause();for(let e=0;e<t.length;e++){u.patch.deleteOp(t[e].id)}if(u.patch.isEditorMode()&&CABLES.UI.DEFAULTOPS.isInBlueprint(u))CABLES.UI.undo.resume()}};u.onLoaded=function(){};u.onLoadedValueSet=function(){c=JSON.parse(t.get());if(!c){c={ports:[],portsOut:[]}}a()};function r(){}t.onChange=function(){if(p)return;if(!t.get())return;try{r()}catch(e){u.logError("cannot load subpatch data...");u.logError(e)}};function s(){try{t.set(JSON.stringify(c))}catch(e){u.log(e)}}u.addPortListener=h;function h(n,e){if(!n.hasSubpatchLstener){n.hasSubpatchLstener=true;n.addEventListener("onUiAttrChange",function(t){if(t.title){let e=0;for(e=0;e<c.portsOut.length;e++)if(c.portsOut[e].name==n.name)c.portsOut[e].title=t.title;for(e=0;e<c.ports.length;e++)if(c.ports[e].name==n.name)c.ports[e].title=t.title;s()}})}if(n.direction==CABLES.PORT_DIR_IN){if(n.type==CABLES.OP_PORT_TYPE_FUNCTION){n.onTriggered=function(){if(e.isLinked())e.trigger()}}else{n.onChange=function(){e.set(n.get());if(!n.isLinked()){for(let e=0;e<c.ports.length;e++){if(c.ports[e].name===n.name){c.ports[e].value=n.get()}}s()}}}}}u.setupPorts=a;function a(){if(!u.patchId.get())return;const e=c.ports||[];const t=c.portsOut||[];let n=0;for(n=0;n<e.length;n++){if(!u.getPortByName(e[n].name)){const r=u.addInPort(new CABLES.Port(u,e[n].name,e[n].type));const i=d();const a=i.addOutPort(new CABLES.Port(i,e[n].name,e[n].type));r.ignoreValueSerialize=true;r.setUiAttribs({editableTitle:true});if(e[n].title){r.setUiAttribs({title:e[n].title});a.setUiAttribs({title:e[n].title})}if(e[n].objType){r.setUiAttribs({objType:e[n].objType});a.setUiAttribs({objType:e[n].objType})}if(e[n].value){r.set(e[n].value);a.set(e[n].value)}h(r,a)}}for(n=0;n<t.length;n++){if(!u.getPortByName(t[n].name)){const s=u.addOutPort(new CABLES.Port(u,t[n].name,t[n].type));const o=f();const l=o.addInPort(new CABLES.Port(o,t[n].name,t[n].type));s.ignoreValueSerialize=true;s.setUiAttribs({editableTitle:true});if(t[n].title){s.setUiAttribs({title:t[n].title});l.setUiAttribs({title:t[n].title})}if(t[n].objType){s.setUiAttribs({objType:t[n].objType});l.setUiAttribs({objType:t[n].objType})}h(l,s)}}p=true}u.addNewInPort=function(e,t,n){const r="in"+c.ports.length+" "+e.op.name+" "+e.name;const i={name:r,type:e.type};if(e.uiAttribs.objType)i.objType=e.uiAttribs.objType;c.ports.push(i);a();return r};u.dyn.onLinkChanged=function(){if(u.dyn.isLinked()){const e=u.dyn.links[0].getOtherPort(u.dyn);u.dyn.removeLinks();e.removeLinkTo(u.dyn);u.log("dyn link changed!!!");const t=u.addNewInPort(e);const n=gui.scene().link(e.op,e.getName(),u,t);p=true;s()}else{setTimeout(function(){u.dyn.removeLinks()},100)}};u.addNewOutPort=function(e,t,n){const r="out"+c.portsOut.length+" "+e.op.name+" "+e.name;const i={name:r,type:e.type};if(e.uiAttribs.objType)i.objType=e.uiAttribs.objType;c.portsOut.push(i);a();return r};u.dynOut.onLinkChanged=function(){if(u.dynOut.isLinked()){const e=u.dynOut.links[0].getOtherPort(u.dynOut);u.dynOut.removeLinks();e.removeLinkTo(u.dynOut);const t=u.addNewOutPort(e);gui.scene().link(e.op,e.getName(),u,t);p=true;s()}else{setTimeout(function(){u.dynOut.removeLinks()},100);u.log("dynOut unlinked...")}};function f(){let e=u.patch.getSubPatchOp(u.patchId.get(),"Ops.Ui.PatchOutput");if(!e){u.patch.addOp("Ops.Ui.PatchOutput",{subPatch:u.patchId.get(),translate:{x:0,y:0}});e=u.patch.getSubPatchOp(u.patchId.get(),"Ops.Ui.PatchOutput");if(!e)u.warn("no patchoutput!")}return e}function d(){let e=u.patch.getSubPatchOp(u.patchId.get(),"Ops.Ui.PatchInput");if(!e){u.patch.addOp("Ops.Ui.PatchInput",{subPatch:u.patchId.get(),translate:{x:0,y:0}});e=u.patch.getSubPatchOp(u.patchId.get(),"Ops.Ui.PatchInput");if(!e)u.warn("no patchinput2!")}return e}u.addSubLink=function(e,t){const n=c.ports.length;const r="in"+(n-1)+" "+t.op.name+" "+t.name;if(e.direction==CABLES.PORT_DIR_IN){gui.scene().link(e.op,e.getName(),d(),r)}else{const a=c.portsOut.length;gui.scene().link(e.op,e.getName(),f(),"out"+(a-1)+" "+t.op.name+" "+t.name)}const i=gui.patchView.getSubPatchBounds(u.patchId.get());d().uiAttr({translate:{x:i.minx,y:i.miny-100}});f().uiAttr({translate:{x:i.minx,y:i.maxy+100}});s();return r};u.onDelete=function(){for(let e=u.patch.ops.length-1;e>=0;e--){if(u.patch.ops[e]&&u.patch.ops[e].uiAttribs&&u.patch.ops[e].uiAttribs.subPatch==u.patchId.get()){u.patch.deleteOp(u.patch.ops[e].id)}}};u.rebuildListeners=()=>{u.log("rebuild listeners...");const t=f();for(let e=0;e<t.portsIn.length;e++){if(t.portsIn[e].isLinked()){h(t.portsIn[e],this.portsOut[e])}}}};Ops.Ui.SubPatch.prototype=new CABLES.Op;CABLES.OPS["84d9a6f0-ed7a-466d-b386-225ed9e89c60"]={f:Ops.Ui.SubPatch,objName:"Ops.Ui.SubPatch"};Ops.Gl.Matrix.Transform=function(){CABLES.Op.apply(this,arguments);const n=this;const e=n.attachments={};const t=n.inTrigger("render"),r=n.inValue("posX",0),i=n.inValue("posY",0),a=n.inValue("posZ",0),s=n.inValue("scale",1),o=n.inValue("rotX",0),l=n.inValue("rotY",0),u=n.inValue("rotZ",0),c=n.outTrigger("trigger");n.setPortGroup("Rotation",[o,l,u]);n.setPortGroup("Position",[r,i,a]);n.setPortGroup("Scale",[s]);n.setUiAxisPorts(r,i,a);n.toWorkPortsNeedToBeLinked(t,c);const p=vec3.create();const h=vec3.create();const f=mat4.create();mat4.identity(f);let d=false,g=false,m=true,v=true,b=true;o.onChange=l.onChange=u.onChange=A;r.onChange=i.onChange=a.onChange=O;s.onChange=_;t.onTriggered=function(){let e=false;if(m){x();e=true}if(v){S();e=true}if(b)e=true;if(e)y();const t=n.patch.cg||n.patch.cgl;t.pushModelMatrix();mat4.multiply(t.mMatrix,t.mMatrix,f);c.trigger();t.popModelMatrix();if(CABLES.UI)gui.setTransform(n.id,r.get(),i.get(),a.get());if(n.isCurrentUiOp())gui.setTransformGizmo({posX:r,posY:i,posZ:a})};function y(){mat4.identity(f);if(g)mat4.translate(f,f,p);if(o.get()!==0)mat4.rotateX(f,f,o.get()*CGL.DEG2RAD);if(l.get()!==0)mat4.rotateY(f,f,l.get()*CGL.DEG2RAD);if(u.get()!==0)mat4.rotateZ(f,f,u.get()*CGL.DEG2RAD);if(d)mat4.scale(f,f,h);b=false}function x(){g=false;if(r.get()!==0||i.get()!==0||a.get()!==0)g=true;vec3.set(p,r.get(),i.get(),a.get());m=false}function S(){d=true;vec3.set(h,s.get(),s.get(),s.get());v=false}function O(){m=true}function _(){v=true}function A(){b=true}y()};Ops.Gl.Matrix.Transform.prototype=new CABLES.Op;CABLES.OPS["650baeb1-db2d-4781-9af6-ab4e9d4277be"]={f:Ops.Gl.Matrix.Transform,objName:"Ops.Gl.Matrix.Transform"};Ops.Gl.ClearColor=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("render"),r=e.outTrigger("trigger"),i=e.inFloatSlider("r",.1),a=e.inFloatSlider("g",.1),s=e.inFloatSlider("b",.1),o=e.inFloatSlider("a",1);i.setUiAttribs({colorPick:true});const l=e.patch.cgl;n.onTriggered=function(){l.gl.clearColor(i.get(),a.get(),s.get(),o.get());l.gl.clear(l.gl.COLOR_BUFFER_BIT|l.gl.DEPTH_BUFFER_BIT);r.trigger()}};Ops.Gl.ClearColor.prototype=new CABLES.Op;CABLES.OPS["19b441eb-9f63-4f35-ba08-b87841517c4d"]={f:Ops.Gl.ClearColor,objName:"Ops.Gl.ClearColor"};Ops.Patch.PuvBp73.MouseDrag=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inValueBool("Active",true),r=t.inValue("Speed",.01),i=t.inSwitch("Input Type",["All","Mouse","Touch"],"All"),a=t.inSwitch("Area",["Canvas Area","Canvas","Document"],"Canvas Area"),s=t.outNumber("Delta X"),o=t.outNumber("Delta Y"),l=t.outNumber("Is Dragging");let u=null;let c=null;const p=0;const h=0;let f=false;let d=0;let g=0;let m=true;i.onChange=a.onChange=O;O();function v(e){if(a.get()==="Canvas Area"){const t=c.getBoundingClientRect();return e.clientX>t.left&&e.clientX<t.left+t.width&&e.clientY>t.top&&e.clientY<t.top+t.height}return true}function b(e){if(e.touches)e=e.touches[0];if(f&&e&&v(e)){if(!m){l.set(true);const t=(e.clientX-d)*r.get();const n=(e.clientY-g)*r.get();s.set(0);o.set(0);s.set(t);o.set(n)}m=false;d=e.clientX;g=e.clientY}}function y(e){try{u.setPointerCapture(e.pointerId)}catch(e){}f=true}function x(e){try{u.releasePointerCapture(e.pointerId)}catch(e){}f=false;l.set(false);d=0;g=0;m=true}function S(){const e=t.patch.cg.canvas;if(document.pointerLockElement===e||document.mozPointerLockElement===e||document.webkitPointerLockElement===e){document.addEventListener("mousemove",onmousemove,false)}}function O(){A();if(a.get()=="Canvas Area"){u=document;c=t.patch.cgl.canvas}else if(a.get()=="Document")u=c=document;else u=c=t.patch.cgl.canvas;if(n.get())_()}function _(){if(!u)O();if(i.get()=="All"||i.get()=="Mouse"){u.addEventListener("mousemove",b);u.addEventListener("mousedown",y);u.addEventListener("mouseup",x);u.addEventListener("mouseenter",x);u.addEventListener("mouseleave",x)}if(i.get()=="All"||i.get()=="Touch"){u.addEventListener("touchmove",b);u.addEventListener("touchend",x);u.addEventListener("touchstart",y)}}function A(){if(!u)return;u.removeEventListener("mousemove",b);u.removeEventListener("mousedown",y);u.removeEventListener("mouseup",x);u.removeEventListener("mouseenter",x);u.removeEventListener("mouseleave",x);u.removeEventListener("touchmove",b);u.removeEventListener("touchend",x);u.removeEventListener("touchstart",y)}n.onChange=function(){if(n.get())_();else A()};t.onDelete=function(){A()}};Ops.Patch.PuvBp73.MouseDrag.prototype=new CABLES.Op;CABLES.OPS["6210a0fd-6a09-4b18-a8f8-a51d0887834e"]={f:Ops.Patch.PuvBp73.MouseDrag,objName:"Ops.Patch.PuvBp73.MouseDrag"};Ops.Gl.Shader.AttributeAsColorMaterial=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={normalsmaterial_frag:"IN vec3 normal;\nIN vec3 outTangent;\nIN vec3 outBiTangent;\nIN vec4 outPosition;\nIN mat4 mMatrix;\nIN vec2 texCoord;\nIN vec2 texCoord1;\nIN vec3 vert;\nIN mat4 mvMatrix;\n\n\n{{MODULES_HEAD}}\n\nvoid main()\n{\n    #ifdef MULMODEL\n        vec4 attr;\n        attr.w=1.0;\n    #endif\n    #ifndef MULMODEL\n        vec3 attr;\n    #endif\n\n    #ifdef SHOW_NORMALS\n        attr.xyz=normal;\n    #endif\n    #ifdef SHOW_BITANGENTS\n        attr.xyz=outBiTangent;\n    #endif\n    #ifdef SHOW_TANGENTS\n        attr.xyz=outTangent;\n    #endif\n    #ifdef SHOW_TEXCOORDS\n        attr.xy=texCoord;\n    #endif\n    #ifdef SHOW_TEXCOORDS1\n        attr.xy=texCoord1;\n    #endif\n    #ifdef SHOW_POS\n        attr.xyz=outPosition.xyz;\n    #endif\n\n    #ifdef MULMODEL\n        attr*=mMatrix;\n        attr.xyz=normalize(vec3(attr.x,attr.y,attr.z));\n    #endif\n\n    vec4 col=vec4(attr.x,attr.y,attr.z,1.0);\n\n    #ifdef ABS\n        col=abs(col);\n    #endif\n\n    {{MODULE_COLOR}}\n\n    outColor=col;\n}",normalsmaterial_vert:"IN vec3 vPosition;\nIN vec2 attrTexCoord;\nIN vec2 attrTexCoord1;\nIN float attrVertIndex;\nIN vec3 attrVertNormal,attrTangent,attrBiTangent;\nOUT vec2 texCoord;\nOUT vec2 texCoord1;\nOUT vec3 normal;\nOUT vec3 tangent;\nOUT vec3 bitangent;\nOUT vec3 outTangent,outBiTangent;\nOUT vec4 outPosition;\nOUT mat4 mMatrix;\nOUT vec3 vert;\nOUT mat4 mvMatrix;\nUNI mat4 projMatrix;\n\nUNI mat4 modelMatrix;\nUNI mat4 viewMatrix;\n\n\n{{MODULES_HEAD}}\n\nvoid main()\n{\n    texCoord=attrTexCoord;\n    texCoord1=attrTexCoord1;\n    vec3 norm=attrVertNormal;\n    tangent=attrTangent;\n    bitangent=attrBiTangent;\n\n    vec4 pos=vec4(vPosition,1.0);\n    mMatrix=modelMatrix;\n\n    {{MODULE_VERTEX_POSITION}}\n\n    mat4 modelViewMatrix=viewMatrix*mMatrix;\n\n    vert=pos.xyz;\n    normal=norm;\n    outTangent=tangent;\n    outBiTangent=bitangent;\n    outPosition= mMatrix * pos;\n\n    {{MODULE_VERTEX_MOVELVIEW}}\n\n    gl_Position = projMatrix*viewMatrix*outPosition;\n}"};const n=e.inTrigger("render"),r=e.inSwitch("Attribute",["Position","TexCoords","TexCoords 1","Normals","Tangents","BiTangents"],"Normals"),i=e.inBool("Absolute",false),a=e.inBool("World Space",false),s=e.outTrigger("trigger"),o=e.outObject("Shader");const l=e.patch.cgl;const u=new CGL.Shader(l,e.name,e);u.setSource(t.normalsmaterial_vert,t.normalsmaterial_frag);o.set(u);n.onTriggered=p;c();a.onChange=i.onChange=r.onChange=c;function c(){u.toggleDefine("SHOW_POS",r.get()=="Position");u.toggleDefine("SHOW_NORMALS",r.get()=="Normals");u.toggleDefine("SHOW_TANGENTS",r.get()=="Tangents");u.toggleDefine("SHOW_BITANGENTS",r.get()=="BiTangents");u.toggleDefine("SHOW_TEXCOORDS",r.get()=="TexCoords");u.toggleDefine("SHOW_TEXCOORDS1",r.get()=="TexCoords 1");u.toggleDefine("ABS",i.get());u.toggleDefine("MULMODEL",a.get())}function p(){l.pushShader(u);s.trigger();l.popShader()}};Ops.Gl.Shader.AttributeAsColorMaterial.prototype=new CABLES.Op;CABLES.OPS["2963fd23-a860-461a-a3cf-394b8261159f"]={f:Ops.Gl.Shader.AttributeAsColorMaterial,objName:"Ops.Gl.Shader.AttributeAsColorMaterial"};Ops.Trigger.TriggerSend=function(){CABLES.Op.apply(this,arguments);const r=this;const e=r.attachments={};const t=r.inTriggerButton("Trigger");r.varName=r.inValueSelect("Named Trigger",[],"",true);r.varName.onChange=i;t.onTriggered=a;r.patch.addEventListener("namedTriggersChanged",n);n();function n(){if(CABLES.UI){const e=[];const t=r.patch.namedTriggers;e.push("+ create new one");for(const n in t)e.push(n);r.varName.uiAttribs.values=e}}function i(){if(CABLES.UI){if(r.varName.get()=="+ create new one"){new CABLES.UI.ModalDialog({prompt:true,title:"New Trigger",text:"Enter a name for the new trigger",promptValue:"",promptOk:e=>{r.varName.set(e);r.patch.namedTriggers[e]=r.patch.namedTriggers[e]||[];n()}});return}r.refreshParams()}if(!r.patch.namedTriggers[r.varName.get()]){r.patch.namedTriggers[r.varName.get()]=r.patch.namedTriggers[r.varName.get()]||[];r.patch.emitEvent("namedTriggersChanged")}r.setTitle(">"+r.varName.get());r.refreshParams();r.patch.emitEvent("opTriggerNameChanged",r,r.varName.get())}function a(){const t=r.patch.namedTriggers[r.varName.get()];r.patch.emitEvent("namedTriggerSent",r.varName.get());if(!t){r.setUiError("unknowntrigger","unknown trigger");return}else r.setUiError("unknowntrigger",null);for(let e=0;e<t.length;e++){t[e]()}}};Ops.Trigger.TriggerSend.prototype=new CABLES.Op;CABLES.OPS["ce1eaf2b-943b-4dc0-ab5e-ee11b63c9ed0"]={f:Ops.Trigger.TriggerSend,objName:"Ops.Trigger.TriggerSend"};Ops.Ui.Area=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inString("Title","");n.setUiAttribs({hidePort:true});e.setUiAttrib({hasArea:true});e.init=n.onChange=e.onLoaded=r;r();function r(){if(CABLES.UI){gui.savedState.setUnSaved("areaOp");e.uiAttr({comment_title:n.get()||" "});e.name=n.get()}}};Ops.Ui.Area.prototype=new CABLES.Op;CABLES.OPS["38f79614-b0de-4960-8da5-2827e7f43415"]={f:Ops.Ui.Area,objName:"Ops.Ui.Area"};Ops.Vars.VarGetNumber_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.outNumber("Value");e.varName=e.inValueSelect("Variable",[],"",true);new CABLES.VarGetOpWrapper(e,"number",e.varName,n)};Ops.Vars.VarGetNumber_v2.prototype=new CABLES.Op;CABLES.OPS["421f5b52-c0fa-47c4-8b7a-012b9e1c864a"]={f:Ops.Vars.VarGetNumber_v2,objName:"Ops.Vars.VarGetNumber_v2"};Ops.Graphics.Intersection.IntersectWorld=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("Trigger"),r=e.inBool("Check Body Collisions",false),i=e.outTrigger("Next"),a=e.outNumber("Total Bodies"),s=e.outArray("Collisions",[]);n.onTriggered=p;const l=1;const u=2;const c=3;const o=e.patch.cgl;function p(){o.frameStore.collisionWorld={bodies:[],testCollision:h};i.trigger();a.set(o.frameStore.collisionWorld.bodies.length);if(r.get())f()}function h(a,s){if(a.type===l&&s.type===l){const n=vec3.distance(a.pos,s.pos);if(n<a.radius+s.radius){return{body0:a,name0:a.name,body1:s,name1:s.name}}}else if(a.type===c&&s.type===c){if(a.pos[0]===s.pos[0]&&a.pos[1]===s.pos[1]&&a.pos[2]===s.pos[2]){return{body0:a,name0:a.name,body1:s,name1:s.name}}}else if(s.type===l&&a.type===c||a.type===l&&s.type===c){let e=a;let t=s;if(a.type===l){e=s;t=a}const r=Math.abs(e.pos[0]-t.pos[0]);const i=Math.abs(e.pos[1]-t.pos[1]);const o=Math.abs(e.pos[2]-t.pos[2]);const n=Math.sqrt(r*r+i*i+o*o);if(n<t.radius){return{body0:a,name0:a.name,body1:s,name1:s.name}}}else if(s.type===u&&a.type===c||a.type===u&&s.type===c){let e=a;let t=s;if(a.type===u){e=s;t=a}if(e.pos[0]>t.minX&&e.pos[0]<t.maxX&&(e.pos[1]>t.minY&&e.pos[1]<t.maxY)&&(e.pos[2]>t.minZ&&e.pos[2]<t.maxZ)){return{body0:a,name0:a.name,body1:s,name1:s.name}}}else if(a.type===l&&s.type===u||a.type===u&&s.type===l){let e=a;let t=s;if(s.type===u){e=s;t=a}let n=t.radius*t.radius;let r=0;let i=t.radius*t.radius;if(t.pos[0]<e.minX)i-=(t.pos[0]-e.minX)**2;else if(t.pos[0]>e.maxX)i-=(t.pos[0]-e.maxX)**2;if(t.pos[1]<e.minY)i-=(t.pos[1]-e.minY)**2;else if(t.pos[1]>e.maxY)i-=(t.pos[1]-e.maxY)**2;if(t.pos[2]<e.minZ)i-=(t.pos[2]-e.minZ)**2;else if(t.pos[2]>e.maxZ)i-=(t.pos[2]-e.maxZ)**2;if(i>0){return{body0:a,name0:a.name,body1:s,name1:s.name}}}else{console.warn("unknown collision pair...",a.type,s.type)}}function f(){const n=[];const r=o.frameStore.collisionWorld.bodies;for(let t=0;t<r.length;t++){for(let e=t+1;e<r.length;e++){if(e!=t){const i=h(r[e],r[t]);if(i)n.push(i)}}}s.setRef(n,[])}};Ops.Graphics.Intersection.IntersectWorld.prototype=new CABLES.Op;CABLES.OPS["6ebdec23-6e10-48c9-87cf-43d488e4290f"]={f:Ops.Graphics.Intersection.IntersectWorld,objName:"Ops.Graphics.Intersection.IntersectWorld"};Ops.Graphics.Intersection.IntersectTestRaycast=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("Trigger"),y=e.inSwitch("Coordinate Format",["-1 to 1","XYZ-XYZ"],"-1 to 1"),x=e.inValueFloat("X"),S=e.inValueFloat("Y"),O=e.inValueFloat("Z"),_=e.inValueFloat("To X"),A=e.inValueFloat("To Y"),C=e.inValueFloat("To Z"),r=e.inBool("Active",true),i=e.inBool("Change Cursor",true),T=e.outTrigger("Next"),I=e.outBoolNum("Has Hit",false),E=e.outString("Hit Body Name",""),L=e.outNumber("Hit X"),N=e.outNumber("Hit Y"),U=e.outNumber("Hit Z");const R=e.patch.cgl;const P=vec3.create();const M=mat4.create();const k=vec3.create();let a=false;let s=true;e.toWorkPortsNeedToBeLinked(n);n.onTriggered=l;y.onChange=o;o();function o(){O.setUiAttribs({greyout:y.get()!="XYZ-XYZ"});_.setUiAttribs({greyout:y.get()!="XYZ-XYZ"});A.setUiAttribs({greyout:y.get()!="XYZ-XYZ"});C.setUiAttribs({greyout:y.get()!="XYZ-XYZ"})}function l(){T.trigger();if(R.frameStore.collisionWorld){let t=vec3.create();if(y.get()=="-1 to 1"){t=vec3.fromValues(x.get(),S.get(),-1);mat4.mul(M,R.pMatrix,R.vMatrix);mat4.invert(M,M);vec3.transformMat4(t,t,M)}if(y.get()=="XYZ-XYZ"){t=vec3.fromValues(x.get(),S.get(),O.get())}let e=vec3.create();if(y.get()=="-1 to 1"){e=vec3.fromValues(x.get(),S.get(),1);mat4.mul(M,R.pMatrix,R.vMatrix);mat4.invert(M,M);vec3.transformMat4(e,e,M)}if(y.get()=="XYZ-XYZ"){e=vec3.fromValues(_.get(),A.get(),C.get())}vec3.sub(k,e,t);vec3.normalize(k,k);const i=vec3.dot(k,k);let n=9999999;let r=false;const a=R.frameStore.collisionWorld.bodies;for(let e=0;e<a.length;e++){const s=a[e];if(s.type==1){vec3.sub(P,t,s.pos);const o=2*vec3.dot(P,k);const l=vec3.dot(P,P)-s.radius*s.radius;const u=o*o-4*i*l;if(u>0){const c=(-o-Math.sqrt(u))/(2+i);if(c<n){r=true;E.set(s.name);I.set(true);n=c;vec3.mul(P,k,[c,c,c]);vec3.add(P,P,t);L.set(P[0]);N.set(P[1]);U.set(P[2])}}}else if(s.type==2){const p=(s.minX-t[0])/k[0];const h=(s.maxX-t[0])/k[0];const f=(s.minY-t[1])/k[1];const d=(s.maxY-t[1])/k[1];const g=(s.minZ-t[2])/k[2];const m=(s.maxZ-t[2])/k[2];const v=Math.max(Math.max(Math.min(p,h),Math.min(f,d)),Math.min(g,m));const b=Math.min(Math.min(Math.max(p,h),Math.max(f,d)),Math.max(g,m));if(b<0)continue;if(v>b)continue;r=true;E.set(s.name);I.set(true);vec3.mul(P,k,[v,v,v]);vec3.add(P,P,t);L.set(P[0]);N.set(P[1]);U.set(P[2])}}if(!r){E.set("");I.set(false);L.set(0);N.set(0);U.set(0)}}}};Ops.Graphics.Intersection.IntersectTestRaycast.prototype=new CABLES.Op;CABLES.OPS["dd5d9b39-75c2-40b1-98a4-7a0fdafdb5cb"]={f:Ops.Graphics.Intersection.IntersectTestRaycast,objName:"Ops.Graphics.Intersection.IntersectTestRaycast"};Ops.Graphics.Intersection.IntersectBody=function(){CABLES.Op.apply(this,arguments);const a=this;const e=a.attachments={};const t=["Sphere","BoxAA","Point"],n=a.inTrigger("Trigger"),r=a.inSwitch("Shape",t,"Sphere"),s=a.inString("Name",""),o=a.inFloat("Radius",.5),l=a.inFloat("Size X",1),u=a.inFloat("Size Y",1),c=a.inFloat("Size Z",1),p=a.inArray("Positions",null,3),h=a.inBool("Append Index to name",true),f=a.outTrigger("Next");a.setPortGroup("Array",[p,h]);const d=a.patch.cgl;const i=vec3.create();const g=vec3.create();y();let m=[];let v={name:"???",type:1};n.onTriggered=C;function b(){return{name:v.name,type:v.type}}r.onChange=()=>{v.type=t.indexOf(r.get())+1;y()};function y(){o.setUiAttribs({greyout:r.get()!="Sphere"});l.setUiAttribs({greyout:r.get()!="BoxAA"});u.setUiAttribs({greyout:r.get()!="BoxAA"});c.setUiAttribs({greyout:r.get()!="BoxAA"})}function x(e){e.minX=e.pos[0]-e.size[0]/2;e.maxX=e.pos[0]+e.size[0]/2;e.minY=e.pos[1]-e.size[1]/2;e.maxY=e.pos[1]+e.size[1]/2;e.minZ=e.pos[2]-e.size[2]/2;e.maxZ=e.pos[2]+e.size[2]/2}const S=1;const O=2;const _=3;function A(e){if(!CABLES.UI)return;if(!d.shouldDrawHelpers(a))return;if(e.type===S){d.pushModelMatrix();CABLES.UI.OverlayMeshes.drawSphere(a,e.radius,true);d.popModelMatrix()}else if(e.type===O){d.pushModelMatrix();CABLES.UI.OverlayMeshes.drawCube(a,e.size[0]/2,e.size[1]/2,e.size[2]/2);d.popModelMatrix()}else if(e.type===_){d.pushModelMatrix();CABLES.UI.OverlayMeshes.drawAxisMarker(a,.05);d.popModelMatrix()}else console.warn("[intersectWorld] unknown col shape")}function C(){if(!d.frameStore||!d.frameStore.collisionWorld)return;const t=a.patch.cgl;const n=p.get();const r=o.get();if(n&&n.length>0&&n.length%3==0){m.length=n.length/3;for(let e=0;e<n.length;e+=3){const i=m[e/3]||{};if(h.get())i.name=s.get()+"."+e/3;else i.name=s.get();i.pos=[n[e+0],n[e+1],n[e+2]];vec3.transformMat4(i.pos,i.pos,t.mMatrix);i.type=v.type;i.size=[l.get(),u.get(),c.get()];if(i.type==2)x(i);if(i.type==1)i.radius=r;d.frameStore.collisionWorld.bodies.push(i);A(i)}}else{const e=b();d.frameStore.collisionWorld.bodies.push(e);e.name=s.get();e.pos=[0,0,0];vec3.transformMat4(e.pos,e.pos,t.mMatrix);e.size=[l.get(),u.get(),c.get()];if(e.type==2)x(e);if(e.type==1)e.radius=r;A(e)}f.trigger()}};Ops.Graphics.Intersection.IntersectBody.prototype=new CABLES.Op;CABLES.OPS["b2e39096-8a02-4a50-b2f5-3e68f2c16ad7"]={f:Ops.Graphics.Intersection.IntersectBody,objName:"Ops.Graphics.Intersection.IntersectBody"};Ops.Trigger.TriggerReceive=function(){CABLES.Op.apply(this,arguments);const r=this;const e=r.attachments={};const t=r.outTrigger("Triggered");r.varName=r.inValueSelect("Named Trigger",[],"",true);a();r.patch.addEventListener("namedTriggersChanged",a);let n=null;function i(){t.trigger()}function a(){if(CABLES.UI){let t=[];let n=r.patch.namedTriggers;for(let e in n)t.push(e);r.varName.uiAttribs.values=t}}r.varName.onChange=function(){if(n){let e=r.patch.namedTriggers[n];let t=e.indexOf(i);if(t!=-1)e.splice(t,1)}r.setTitle(">"+r.varName.get());r.patch.namedTriggers[r.varName.get()]=r.patch.namedTriggers[r.varName.get()]||[];let e=r.patch.namedTriggers[r.varName.get()];e.push(i);n=r.varName.get();s();r.patch.emitEvent("opTriggerNameChanged",r,r.varName.get())};r.on("uiParamPanel",s);function s(){if(!r.varName.get()){r.setUiError("unknowntrigger","unknown trigger")}else r.setUiError("unknowntrigger",null)}};Ops.Trigger.TriggerReceive.prototype=new CABLES.Op;CABLES.OPS["0816c999-f2db-466b-9777-2814573574c5"]={f:Ops.Trigger.TriggerReceive,objName:"Ops.Trigger.TriggerReceive"};Ops.Gl.Matrix.Translate=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inTrigger("render"),r=t.outTrigger("trigger"),i=t.inValue("x"),a=t.inValue("y"),s=t.inValue("z");const o=vec3.create();n.onTriggered=function(){const e=t.patch.cg;vec3.set(o,i.get(),a.get(),s.get());e.pushModelMatrix();mat4.translate(e.mMatrix,e.mMatrix,o);r.trigger();e.popModelMatrix()}};Ops.Gl.Matrix.Translate.prototype=new CABLES.Op;CABLES.OPS["1f89ba0e-e7eb-46d7-8c66-7814b7c528b9"]={f:Ops.Gl.Matrix.Translate,objName:"Ops.Gl.Matrix.Translate"};Ops.Trigger.Repeat2d=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("exe"),s=e.inValueInt("num x",5),o=e.inValueInt("num y",5),l=e.inValueFloat("mul",1),u=e.inValueBool("center"),c=e.outTrigger("trigger"),p=e.outNumber("x"),h=e.outNumber("y"),f=e.outNumber("index"),d=e.outNumber("total iterations");n.onTriggered=function(){let n=0;let e=0;const r=l.get();const i=s.get();const a=o.get();if(u.get()){n=(i-1)*r/2;e=(a-1)*r/2}for(let t=0;t<a;t++){h.set(t*r-e);for(let e=0;e<i;e++){p.set(e*r-n);f.set(e+t*i);c.trigger()}}d.set(s.get()*o.get())}};Ops.Trigger.Repeat2d.prototype=new CABLES.Op;CABLES.OPS["79934693-5887-4173-8b48-3e3a18fcf225"]={f:Ops.Trigger.Repeat2d,objName:"Ops.Trigger.Repeat2d"};Ops.Vars.VarSetString_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inString("Value","New String");e.varName=e.inDropDown("Variable",[],"",true);new CABLES.VarSetOpWrapper(e,"string",n,e.varName)};Ops.Vars.VarSetString_v2.prototype=new CABLES.Op;CABLES.OPS["0b4d9229-8024-4a30-9cc0-f6653942c2e4"]={f:Ops.Vars.VarSetString_v2,objName:"Ops.Vars.VarSetString_v2"};Ops.Math.Compare.Equals=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValue("number1",1),r=e.inValue("number2",1),i=e.outBoolNum("result");n.onChange=r.onChange=a;a();function a(){i.set(n.get()==r.get())}};Ops.Math.Compare.Equals.prototype=new CABLES.Op;CABLES.OPS["4dd3cc55-eebc-4187-9d4e-2e053a956fab"]={f:Ops.Math.Compare.Equals,objName:"Ops.Math.Compare.Equals"};Ops.Math.Subtract=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValue("number1",1),r=e.inValue("number2",1),i=e.outNumber("result");e.setUiAttribs({mathTitle:true});n.onChange=r.onChange=a;a();function a(){let e=n.get()-r.get();if(!isNaN(e))i.set(e)}};Ops.Math.Subtract.prototype=new CABLES.Op;CABLES.OPS["a4ffe852-d200-4b96-9347-68feb01122ca"]={f:Ops.Math.Subtract,objName:"Ops.Math.Subtract"};Ops.Math.Multiply=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValueFloat("number1",1),r=e.inValueFloat("number2",1),i=e.outNumber("result");e.setUiAttribs({mathTitle:true});n.onChange=r.onChange=a;a();function a(){const e=n.get();const t=r.get();i.set(e*t)}};Ops.Math.Multiply.prototype=new CABLES.Op;CABLES.OPS["1bbdae06-fbb2-489b-9bcc-36c9d65bd441"]={f:Ops.Math.Multiply,objName:"Ops.Math.Multiply"};Ops.Array.ArrayGetNumber=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inArray("array"),r=e.inValueInt("index"),i=e.inFloat("Value Invalid Index",0),a=e.outNumber("value"),s=e.outBoolNum("Valid Index",true);n.ignoreValueSerialize=true;r.onChange=n.onChange=o;function o(){if(n.get()){const e=n.get()[r.get()];if(isNaN(e)){a.set(i.get());s.set(false)}else{s.set(true);a.set(parseFloat(e))}}}};Ops.Array.ArrayGetNumber.prototype=new CABLES.Op;CABLES.OPS["d1189078-70cf-437d-9a37-b2ebe89acdaf"]={f:Ops.Array.ArrayGetNumber,objName:"Ops.Array.ArrayGetNumber"};Ops.Vars.VarSetArray_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inArray("Value",null);e.varName=e.inDropDown("Variable",[],"",true);new CABLES.VarSetOpWrapper(e,"array",n,e.varName)};Ops.Vars.VarSetArray_v2.prototype=new CABLES.Op;CABLES.OPS["8088290f-45d4-4312-b4ca-184d34ca4667"]={f:Ops.Vars.VarSetArray_v2,objName:"Ops.Vars.VarSetArray_v2"};Ops.Vars.VarGetArray_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.outArray("Value");e.varName=e.inValueSelect("Variable",[],"",true);new CABLES.VarGetOpWrapper(e,"array",e.varName,n)};Ops.Vars.VarGetArray_v2.prototype=new CABLES.Op;CABLES.OPS["afa79294-aa9c-43bc-a49a-cade000a1de5"]={f:Ops.Vars.VarGetArray_v2,objName:"Ops.Vars.VarGetArray_v2"};Ops.Array.Array_v3=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const r=t.inValueInt("Array length",10),n=t.inSwitch("Mode select",["Number","1,2,3,4","0-1"],"Number"),i=t.inValueFloat("Default Value"),a=t.inBool("Reverse",false),s=t.outArray("Array"),o=t.outNumber("Array length out");let l=[];let u=0;const c=0;const p=1;const h=2;n.onChange=f;a.onChange=i.onChange=r.onChange=d;f();d();function f(){let e=n.get();if(e==="Number")u=c;else if(e==="1,2,3,4")u=p;else if(e==="0-1")u=h;i.setUiAttribs({greyout:u!==c});t.setUiAttrib({extendTitle:n.get()});d()}function d(){l.length=0;let e=r.get();let t=i.get();let n;if(u===c){for(n=0;n<e;n++){l[n]=t}}else if(u===p){for(n=0;n<e;n++){l[n]=n}}else if(u===h){for(n=0;n<e;n++){l[n]=n/(e-1)}}if(a.get())l=l.reverse();s.setRef(l);o.set(l.length)}};Ops.Array.Array_v3.prototype=new CABLES.Op;CABLES.OPS["e4d31a46-bf64-42a8-be34-4cbb2bbc2600"]={f:Ops.Array.Array_v3,objName:"Ops.Array.Array_v3"};Ops.Gl.Matrix.Camera=function(){CABLES.Op.apply(this,arguments);const e=this;const k=e.attachments={};const t=e.inTrigger("render");const n=e.outTrigger("trigger");const r=e.inValueSelect("projection mode",["prespective","ortogonal"],"prespective");const i=e.inValue("frustum near",.01);const a=e.inValue("frustum far",5e3);const s=e.inValue("fov",45);const o=e.inValueBool("Auto Aspect Ratio",true);const l=e.inValue("Aspect Ratio",1);const u=e.inValue("eye X",0);const c=e.inValue("eye Y",0);const p=e.inValue("eye Z",5);const h=e.inValue("center X",0);const f=e.inValue("center Y",0);const d=e.inValue("center Z",0);const g=e.inValue("truck",0);const m=e.inValue("boom",0);const v=e.inValue("dolly",0);const b=e.inValue("tilt",0);const y=e.inValue("pan",0);const x=e.inValue("roll",0);const S=e.outNumber("Aspect");const O=e.outArray("Look At Array");const _=e.patch.cgl;let A=0;const C=vec3.create();const T=vec3.create();const I=vec3.create();const E=mat4.create();mat4.identity(E);const L=[];const N=vec3.create();const U=mat4.create();mat4.identity(U);let R=true;t.onTriggered=function(){if(_.frameStore.shadowPass)return n.trigger();if(!o.get())A=l.get();else A=_.getViewPort()[2]/_.getViewPort()[3];S.set(A);_.pushViewMatrix();if(R){mat4.identity(U);vec3.set(N,g.get(),m.get(),v.get());if(g.get()!==0||m.get()!==0||v.get()!==0)mat4.translate(U,U,N);if(b.get()!==0)mat4.rotateX(U,U,b.get()*CGL.DEG2RAD);if(y.get()!==0)mat4.rotateY(U,U,y.get()*CGL.DEG2RAD);if(x.get()!==0)mat4.rotateZ(U,U,x.get()*CGL.DEG2RAD);R=false}mat4.multiply(_.vMatrix,_.vMatrix,U);_.pushPMatrix();_.pushViewMatrix();if(r.get()=="prespective"){mat4.perspective(_.pMatrix,s.get()*.0174533,A,i.get(),a.get())}else if(r.get()=="ortogonal"){mat4.ortho(_.pMatrix,-1*(s.get()/14),1*(s.get()/14),-1*(s.get()/14)/A,1*(s.get()/14)/A,i.get(),a.get())}L[0]=u.get();L[1]=c.get();L[2]=p.get();L[3]=h.get();L[4]=f.get();L[5]=d.get();L[6]=0;L[7]=1;L[8]=0;O.setRef(L);vec3.set(C,0,1,0);vec3.set(T,u.get(),c.get(),p.get());vec3.set(I,h.get(),f.get(),d.get());mat4.lookAt(E,T,I,C);mat4.multiply(_.vMatrix,_.vMatrix,E);n.trigger();_.popViewMatrix();_.popPMatrix();_.popViewMatrix();if(e.isCurrentUiOp())gui.setTransformGizmo({posX:g,posY:m,posZ:v})};const P=function(){if(!o.get()){l.setUiAttribs({greyout:false})}else{l.setUiAttribs({greyout:true})}};const M=function(){R=true};g.onChange=M;m.onChange=M;v.onChange=M;b.onChange=M;y.onChange=M;x.onChange=M;o.onChange=P;P()};Ops.Gl.Matrix.Camera.prototype=new CABLES.Op;CABLES.OPS["b24dbfdc-485c-49d2-92a1-7258efd9239a"]={f:Ops.Gl.Matrix.Camera,objName:"Ops.Gl.Matrix.Camera"};Ops.Gl.Matrix.OrbitControls=function(){CABLES.Op.apply(this,arguments);const i=this;const w=i.attachments={};const B=i.inTrigger("render"),a=i.inValueFloat("min distance"),s=i.inValueFloat("max distance"),o=i.inValue("min rot y",0),l=i.inValue("max rot y",0),t=i.inValue("initial radius",0),n=i.inValueSlider("initial axis y"),r=i.inValueSlider("initial axis x"),u=i.inValueFloat("mul"),e=i.inValueSlider("Smoothness",1),G=i.inValue("Speed X",1),V=i.inValue("Speed Y",1),D=i.inValueBool("Active",true),F=i.inValueBool("Allow Panning",true),j=i.inValueBool("Allow Zooming",true),z=i.inValueBool("Allow Rotation",true),H=i.inValueBool("restricted",true),X=i.outTrigger("trigger"),c=i.outNumber("radius"),Y=i.outNumber("Rot X"),W=i.outNumber("Rot Y"),q=i.inTriggerButton("Reset");i.setPortGroup("Initial Values",[n,r,t]);i.setPortGroup("Interaction",[u,e,G,V]);i.setPortGroup("Boundaries",[o,l,a,s]);u.set(1);a.set(.01);s.set(99999);q.onTriggered=$;let p=vec3.create();const h=vec3.create();const f=vec3.create();const d=mat4.create();const Z=mat4.create();const g=vec3.create();const K=vec3.create();n.set(.5);let m=false;let v=5;c.set(v);let b=0,y=0;let x=0,S=0;vec3.set(f,0,0,0);vec3.set(h,0,1,0);const O=vec3.create();const _=vec3.create();const A=vec3.create();const C=vec3.create();let T=0;let I=0;let Q=1;let E=null;ee();i.onDelete=he;const J=Math.PI;const L=Math.PI*2;function $(){let e=0;if(T%L<-J){e=-L;T%=-L}else if(T%L>J){e=L;T%=L}else T%=L;I%=Math.PI;vec3.set(g,0,0,0);vec3.set(f,0,0,0);vec3.set(h,0,1,0);x=r.get()*Math.PI*2+e;S=n.get()-.5;v=t.get();p=R(S)}function ee(){Q=e.get()*10+1}e.onChange=ee;let te=true;function N(e,t){if(te)return t;return e+(t-e)/Q}let U=0;const ne=0;B.onTriggered=function(){const e=i.patch.cg;if(!E){ce(e.canvas);pe()}e.pushViewMatrix();T=N(T,x);I=N(I,S);let t=(I+.5)*180;if(o.get()!==0&&t<o.get()){t=o.get();I=U}else if(l.get()!==0&&t>l.get()){t=l.get();I=U}else{U=I}const n=T*CGL.RAD2DEG;W.set(t);Y.set(n);re(p,I);vec3.add(O,p,g);vec3.add(A,f,g);_[0]=N(_[0],O[0]);_[1]=N(_[1],O[1]);_[2]=N(_[2],O[2]);C[0]=N(C[0],A[0]);C[1]=N(C[1],A[1]);C[2]=N(C[2],A[2]);const r=vec3.create();mat4.lookAt(d,_,C,h);mat4.rotate(d,d,T,h);mat4.multiply(e.vMatrix,e.vMatrix,d);X.trigger();e.popViewMatrix();te=false};function re(e,t){const n=u.get();if(v<a.get()*n)v=a.get()*n;if(v>s.get()*n)v=s.get()*n;c.set(v*n);let r=0,i=0;i=360*t/2*CGL.DEG2RAD;vec3.set(e,Math.cos(i)*v*n,Math.sin(i)*v*n,0);return e}function R(e){const t=u.get();if(v<a.get()*t)v=a.get()*t;if(v>s.get()*t)v=s.get()*t;c.set(v*t);let n=0,r=0;const i=vec3.create();r=360*e/2*CGL.DEG2RAD;vec3.set(i,Math.cos(r)*v*t,Math.sin(r)*v*t,0);return i}function P(e){if(!m)return;const t=e.clientX;const n=e.clientY;let r=t-b;let i=n-y;r*=G.get();i*=V.get();if(e.buttons==2&&F.get()){g[2]+=r*.01*u.get();g[1]+=i*.01*u.get()}else if(e.buttons==4&&j.get()){v+=i*.05;p=R(S)}else{if(z.get()){x+=r*.003;S+=i*.002;if(H.get()){if(S>.5)S=.5;if(S<-.5)S=-.5}}}b=t;y=n}function M(e){b=e.clientX;y=e.clientY;m=true;try{E.setPointerCapture(e.pointerId)}catch(e){}}function k(e){m=false;try{E.releasePointerCapture(e.pointerId)}catch(e){}}function ie(){const e=i.patch.cg.canvas;if(document.pointerLockElement===e||document.mozPointerLockElement===e||document.webkitPointerLockElement===e){document.addEventListener("mousemove",P,false)}}function ae(e){}t.onChange=function(){v=t.get();$()};r.onChange=function(){T=x=r.get()*Math.PI*2};n.onChange=function(){I=S=n.get()-.5;p=R(S)};const se=function(e){if(j.get()){const t=CGL.getWheelSpeed(e)*.06;v+=parseFloat(t)*1.2;p=R(S)}};const oe=function(e){if(e.touches&&e.touches.length>0)M(e.touches[0])};const le=function(e){k()};const ue=function(e){if(e.touches&&e.touches.length>0)P(e.touches[0])};D.onChange=function(){if(D.get())pe();else he()};function ce(e){he();E=e;pe()}function pe(){if(!E)return;E.addEventListener("pointermove",P);E.addEventListener("pointerdown",M);E.addEventListener("pointerup",k);E.addEventListener("pointerleave",k);E.addEventListener("pointerenter",ae);E.addEventListener("contextmenu",function(e){e.preventDefault()});E.addEventListener("wheel",se,{passive:true})}function he(){if(!E)return;E.removeEventListener("pointermove",P);E.removeEventListener("pointerdown",M);E.removeEventListener("pointerup",k);E.removeEventListener("pointerleave",k);E.removeEventListener("pointerenter",k);E.removeEventListener("wheel",se)}p=R(0);r.set(.25);t.set(.05)};Ops.Gl.Matrix.OrbitControls.prototype=new CABLES.Op;CABLES.OPS["eaf4f7ce-08a3-4d1b-b9f4-ebc0b7b1cde1"]={f:Ops.Gl.Matrix.OrbitControls,objName:"Ops.Gl.Matrix.OrbitControls"};Ops.Gl.Shader.BasicMaterial_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={basicmaterial_frag:"{{MODULES_HEAD}}\n\nIN vec2 texCoord;\n\n#ifdef VERTEX_COLORS\nIN vec4 vertCol;\n#endif\n\n#ifdef HAS_TEXTURES\n    IN vec2 texCoordOrig;\n    #ifdef HAS_TEXTURE_DIFFUSE\n        UNI sampler2D tex;\n    #endif\n    #ifdef HAS_TEXTURE_OPACITY\n        UNI sampler2D texOpacity;\n   #endif\n#endif\n\n\n\nvoid main()\n{\n    {{MODULE_BEGIN_FRAG}}\n    vec4 col=color;\n\n\n    #ifdef HAS_TEXTURES\n        vec2 uv=texCoord;\n\n        #ifdef CROP_TEXCOORDS\n            if(uv.x<0.0 || uv.x>1.0 || uv.y<0.0 || uv.y>1.0) discard;\n        #endif\n\n        #ifdef HAS_TEXTURE_DIFFUSE\n            col=texture(tex,uv);\n\n            #ifdef COLORIZE_TEXTURE\n                col.r*=color.r;\n                col.g*=color.g;\n                col.b*=color.b;\n            #endif\n        #endif\n        col.a*=color.a;\n        #ifdef HAS_TEXTURE_OPACITY\n            #ifdef TRANSFORMALPHATEXCOORDS\n                uv=texCoordOrig;\n            #endif\n            #ifdef ALPHA_MASK_IR\n                col.a*=1.0-texture(texOpacity,uv).r;\n            #endif\n            #ifdef ALPHA_MASK_IALPHA\n                col.a*=1.0-texture(texOpacity,uv).a;\n            #endif\n            #ifdef ALPHA_MASK_ALPHA\n                col.a*=texture(texOpacity,uv).a;\n            #endif\n            #ifdef ALPHA_MASK_LUMI\n                col.a*=dot(vec3(0.2126,0.7152,0.0722), texture(texOpacity,uv).rgb);\n            #endif\n            #ifdef ALPHA_MASK_R\n                col.a*=texture(texOpacity,uv).r;\n            #endif\n            #ifdef ALPHA_MASK_G\n                col.a*=texture(texOpacity,uv).g;\n            #endif\n            #ifdef ALPHA_MASK_B\n                col.a*=texture(texOpacity,uv).b;\n            #endif\n            // #endif\n        #endif\n    #endif\n\n    {{MODULE_COLOR}}\n\n    #ifdef DISCARDTRANS\n        if(col.a<0.2) discard;\n    #endif\n\n    #ifdef VERTEX_COLORS\n        col*=vertCol;\n    #endif\n\n    outColor = col;\n}\n",basicmaterial_vert:"\n{{MODULES_HEAD}}\n\nOUT vec2 texCoord;\nOUT vec2 texCoordOrig;\n\nUNI mat4 projMatrix;\nUNI mat4 modelMatrix;\nUNI mat4 viewMatrix;\n\n#ifdef HAS_TEXTURES\n    UNI float diffuseRepeatX;\n    UNI float diffuseRepeatY;\n    UNI float texOffsetX;\n    UNI float texOffsetY;\n#endif\n\n#ifdef VERTEX_COLORS\n    in vec4 attrVertColor;\n    out vec4 vertCol;\n\n#endif\n\n\nvoid main()\n{\n    mat4 mMatrix=modelMatrix;\n    mat4 modelViewMatrix;\n\n    norm=attrVertNormal;\n    texCoordOrig=attrTexCoord;\n    texCoord=attrTexCoord;\n    #ifdef HAS_TEXTURES\n        texCoord.x=texCoord.x*diffuseRepeatX+texOffsetX;\n        texCoord.y=(1.0-texCoord.y)*diffuseRepeatY+texOffsetY;\n    #endif\n\n    #ifdef VERTEX_COLORS\n        vertCol=attrVertColor;\n    #endif\n\n    vec4 pos = vec4(vPosition, 1.0);\n\n    #ifdef BILLBOARD\n       vec3 position=vPosition;\n       modelViewMatrix=viewMatrix*modelMatrix;\n\n       gl_Position = projMatrix * modelViewMatrix * vec4((\n           position.x * vec3(\n               modelViewMatrix[0][0],\n               modelViewMatrix[1][0],\n               modelViewMatrix[2][0] ) +\n           position.y * vec3(\n               modelViewMatrix[0][1],\n               modelViewMatrix[1][1],\n               modelViewMatrix[2][1]) ), 1.0);\n    #endif\n\n    {{MODULE_VERTEX_POSITION}}\n\n    #ifndef BILLBOARD\n        modelViewMatrix=viewMatrix * mMatrix;\n\n        {{MODULE_VERTEX_MOVELVIEW}}\n\n    #endif\n\n    // mat4 modelViewMatrix=viewMatrix*mMatrix;\n\n    #ifndef BILLBOARD\n        // gl_Position = projMatrix * viewMatrix * modelMatrix * pos;\n        gl_Position = projMatrix * modelViewMatrix * pos;\n    #endif\n}\n"};const n=e.inTrigger("render");const r=e.outTrigger("trigger");const i=e.outObject("shader",null,"shader");i.ignoreValueSerialize=true;e.toWorkPortsNeedToBeLinked(n);e.toWorkShouldNotBeChild("Ops.Gl.TextureEffects.ImageCompose",CABLES.OP_PORT_TYPE_FUNCTION);const a=e.patch.cgl;const s=new CGL.Shader(a,"basicmaterialnew",this);s.addAttribute({type:"vec3",name:"vPosition"});s.addAttribute({type:"vec2",name:"attrTexCoord"});s.addAttribute({type:"vec3",name:"attrVertNormal",nameFrag:"norm"});s.addAttribute({type:"float",name:"attrVertIndex"});s.setModules(["MODULE_VERTEX_POSITION","MODULE_COLOR","MODULE_BEGIN_FRAG","MODULE_VERTEX_MOVELVIEW"]);s.setSource(t.basicmaterial_vert,t.basicmaterial_frag);i.setRef(s);n.onTriggered=I;const o=e.inValueSlider("r",Math.random());const l=e.inValueSlider("g",Math.random());const u=e.inValueSlider("b",Math.random());const c=e.inValueSlider("a",1);o.setUiAttribs({colorPick:true});const p=s.addUniformFrag("4f","color",o,l,u,c);s.uniformColorDiffuse=p;const h=e.inTexture("texture");let f=null;h.onChange=L;const d=e.inValueBool("colorizeTexture",false);const g=e.inValueBool("Vertex Colors",false);const m=e.inTexture("textureOpacity");let v=null;const b=e.inSwitch("Alpha Mask Source",["Luminance","R","G","B","A","1-A","1-R"],"Luminance");b.setUiAttribs({greyout:true});m.onChange=E;const y=e.inValueBool("Opacity TexCoords Transform",false);const x=e.inValueBool("Discard Transparent Pixels");const S=e.inValue("diffuseRepeatX",1),O=e.inValue("diffuseRepeatY",1),_=e.inValue("Tex Offset X",0),A=e.inValue("Tex Offset Y",0),C=e.inBool("Crop TexCoords",false);s.addUniformFrag("f","diffuseRepeatX",S);s.addUniformFrag("f","diffuseRepeatY",O);s.addUniformFrag("f","texOffsetX",_);s.addUniformFrag("f","texOffsetY",A);const T=e.inValueBool("billboard",false);b.onChange=T.onChange=x.onChange=y.onChange=C.onChange=g.onChange=d.onChange=U;e.setPortGroup("Color",[o,l,u,c]);e.setPortGroup("Color Texture",[h,g,d]);e.setPortGroup("Opacity",[m,b,x,y]);e.setPortGroup("Texture Transform",[S,O,_,A,C]);E();L();e.preRender=function(){s.bind();I()};function I(){if(!s)return;a.pushShader(s);s.popTextures();if(f&&h.get())s.pushTexture(f,h.get());if(v&&m.get())s.pushTexture(v,m.get());r.trigger();a.popShader()}function E(){if(m.get()){if(v!==null)return;s.removeUniform("texOpacity");s.define("HAS_TEXTURE_OPACITY");if(!v)v=new CGL.Uniform(s,"t","texOpacity")}else{s.removeUniform("texOpacity");s.removeDefine("HAS_TEXTURE_OPACITY");v=null}U()}function L(){if(h.get()){if(!s.hasDefine("HAS_TEXTURE_DIFFUSE"))s.define("HAS_TEXTURE_DIFFUSE");if(!f)f=new CGL.Uniform(s,"t","texDiffuse")}else{s.removeUniform("texDiffuse");s.removeDefine("HAS_TEXTURE_DIFFUSE");f=null}N()}function N(){const e=h.isLinked()||m.isLinked();S.setUiAttribs({greyout:!e});O.setUiAttribs({greyout:!e});_.setUiAttribs({greyout:!e});A.setUiAttribs({greyout:!e});d.setUiAttribs({greyout:!e});b.setUiAttribs({greyout:!m.get()});y.setUiAttribs({greyout:!m.get()});let t=true;t=h.get()&&!d.get();o.setUiAttribs({greyout:t});l.setUiAttribs({greyout:t});u.setUiAttribs({greyout:t})}function U(){s.toggleDefine("VERTEX_COLORS",g.get());s.toggleDefine("CROP_TEXCOORDS",C.get());s.toggleDefine("COLORIZE_TEXTURE",d.get());s.toggleDefine("TRANSFORMALPHATEXCOORDS",y.get());s.toggleDefine("DISCARDTRANS",x.get());s.toggleDefine("BILLBOARD",T.get());s.toggleDefine("ALPHA_MASK_ALPHA",b.get()=="A");s.toggleDefine("ALPHA_MASK_IALPHA",b.get()=="1-A");s.toggleDefine("ALPHA_MASK_IR",b.get()=="1-R");s.toggleDefine("ALPHA_MASK_LUMI",b.get()=="Luminance");s.toggleDefine("ALPHA_MASK_R",b.get()=="R");s.toggleDefine("ALPHA_MASK_G",b.get()=="G");s.toggleDefine("ALPHA_MASK_B",b.get()=="B");N()}};Ops.Gl.Shader.BasicMaterial_v3.prototype=new CABLES.Op;CABLES.OPS["ec55d252-3843-41b1-b731-0482dbd9e72b"]={f:Ops.Gl.Shader.BasicMaterial_v3,objName:"Ops.Gl.Shader.BasicMaterial_v3"};Ops.Math.Ease=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValue("Value"),r=e.inValue("Min",0),i=e.inValue("Max",1),a=e.outNumber("Result"),s=new CABLES.Anim;s.createPort(e,"Easing",l);s.setValue(0,0);s.setValue(1,1);e.onLoaded=r.onChange=i.onChange=o;function o(){s.keys[0].time=s.keys[0].value=Math.min(r.get(),i.get());s.keys[1].time=s.keys[1].value=Math.max(r.get(),i.get())}function l(){s.keys[0].setEasing(s.defaultEasing)}n.onChange=function(){const e=s.getValue(n.get());a.set(e)}};Ops.Math.Ease.prototype=new CABLES.Op;CABLES.OPS["8f6e4a08-33e6-408f-ac4a-198bd03b417b"]={f:Ops.Math.Ease,objName:"Ops.Math.Ease"};Ops.Devices.Browser.JsMemory=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("Update"),r=e.outNumber("Used Heap Size",0),i=e.outNumber("Total Heap Size",0);if(performance.memory&&performance.memory.usedJSHeapSize)n.onTriggered=a;function a(){r.set(performance.memory.usedJSHeapSize/1024/1024);i.set(performance.memory.totalJSHeapSize/1024/1024)}};Ops.Devices.Browser.JsMemory.prototype=new CABLES.Op;CABLES.OPS["7176f9c7-1ee8-419e-b58b-178cca9265e7"]={f:Ops.Devices.Browser.JsMemory,objName:"Ops.Devices.Browser.JsMemory"};Ops.Gl.Meshes.Cylinder_v2=function(){CABLES.Op.apply(this,arguments);const _=this;const e=_.attachments={};const t=_.inTrigger("render"),n=_.inValueBool("Draw",true),A=_.inValueInt("segments",40),C=_.inValueInt("stacks",1),T=_.inValueFloat("length",1),I=_.inValueFloat("outer radius",.5),E=_.inValueFloat("inner radius",0),L=_.inValueSelect("UV mode",["simple","atlas"],"simple"),N=_.inValueBool("Flip Mapping",false),U=_.inValueBool("Caps",true),R=_.inValueBool("Flat Normals",false),r=_.outTrigger("next"),P=_.outObject("geometry"),M=new CGL.Geometry("cylinder");n.setUiAttribs({title:"Render mesh"});const k=Math.PI*2,i=_.patch.cgl;let w=true;let B=null;L.setUiAttribs({hidePort:true});_.preRender=a;function a(){const e=N.get();const t=Math.max(A.get(),3)|0,n=Math.max(E.get(),0),r=Math.max(I.get(),n),i=Math.max(C.get(),C.defaultValue)|0,a=T.get(),s=a/i,o=k/t,l=L.get();let u=[],c=[],p=[],h=[],f=[],d=[],g,m,v,b,y,x,S,O;if(l=="atlas")O=.5;else O=1;for(b=0,v=-a/2;b<=i;b++,v+=s){for(y=x=0;y<=t;y++,x+=o){u.push((g=Math.sin(x))*r,(m=Math.cos(x))*r,v);S=Math.sqrt(g*g+m*m);g/=S;m/=S;c.push(g,m,0);p.push(-m,g,0);h.push(0,0,1);if(e)f.push(y/t,1-(v/a+.5)*O);else f.push((v/a+.5)*O,y/t)}}for(y=0;y<i;y++){for(b=0,S=y*(t+1);b<t;b++,S++){x=S+1;d.push(S+(t+1),x,S,S+(t+1),x+(t+1),x)}}if(n){S=u.length;for(b=y=0;b<S;b+=3,y+=2){u.push(u[b]/r*n,u[b+1]/r*n,u[b+2]);c.push(-c[b],-c[b+1],0);p.push(-p[b],-p[b+1],0);h.push(0,-h[b+1],-h[b+2]);f.push(f[y],1-f[y+1])}x=S/3;S=d.length;for(b=0;b<S;b+=6){d.push(x+d[b],x+d[b+2],x+d[b+1],x+d[b+3],x+d[b+5],x+d[b+4])}if(U.get()){x=u.length;O=x/2;S=t*3;Array.prototype.push.apply(u,u.slice(0,S));Array.prototype.push.apply(u,u.slice(O,O+S));Array.prototype.push.apply(u,u.slice(O-S,O));Array.prototype.push.apply(u,u.slice(x-S,x));S=t*2;for(b=0;b<S;b++)c.push(0,0,-1),p.push(-1,0,0),h.push(0,-1,0);for(b=0;b<S;b++)c.push(0,0,1),p.push(1,0,0),h.push(0,1,0);if(l=="atlas"){S=n/r*.5;for(b=O=0;b<t;b++,O+=o)f.push(Math.sin(O)*.25+.75,Math.cos(O)*.25+.25);for(b=O=0;b<t;b++,O+=o)f.push((Math.sin(O)*S+.5)*.5+.5,(Math.cos(O)*S+.5)*.5);for(b=O=0;b<t;b++,O+=o)f.push(Math.sin(O)*.25+.75,Math.cos(O)*.25+.75);for(b=O=0;b<t;b++,O+=o)f.push((Math.sin(O)*S+.5)*.5+.5,(Math.cos(O)*S+.5)*.5+.5)}else{for(b=0;b<S;b++)f.push(0,0);for(b=0;b<S;b++)f.push(1,1)}for(b=0,O=x/3+g;b<t-1;b++,O++){d.push(O+1,O+t,O,O+t+1,O+t,O+1)}d.push(O+t,x/3+g,x/3+t+g,O+t,O,x/3+g);g+=t*2;for(b=0,O=x/3+g;b<t-1;b++,O++){d.push(O,O+t,O+1,O+1,O+t,O+t+1)}d.push(x/3+t+g,x/3+g,O+t,x/3+g,O,O+t)}}else{x=u.length;S=x/3;u.push(0,0,-a/2);Array.prototype.push.apply(u,u.slice(0,t*3));for(b=0;b<=t;b++)c.push(0,0,-1),p.push(-1,0,0),h.push(0,-1,0);if(U.get()){u.push(0,0,a/2);Array.prototype.push.apply(u,u.slice(x-t*3,x));for(b=0;b<=t;b++)c.push(0,0,1),p.push(1,0,0),h.push(0,1,0);if(l=="atlas"){f.push(.75,.25);for(b=x=0;b<t;b++,x+=o)f.push(Math.sin(x)*.25+.75,Math.cos(x)*.25+.25);f.push(.75,.75);for(b=x=0;b<t;b++,x+=o)f.push(Math.sin(x)*.25+.75,Math.cos(x)*.25+.75)}else{for(b=0;b<=t;b++)f.push(0,0);for(b=0;b<=t;b++)f.push(1,1)}d.push(S+1,S,S+t);for(b=1;b<t;b++)d.push(S,S+b,S+b+1);S+=t+1;d.push(S,S+1,S+t);for(b=1;b<t;b++)d.push(S,S+b+1,S+b);S+=t+1}}M.clear();M.vertices=u;M.texCoords=f;M.vertexNormals=c;M.tangents=p;M.biTangents=h;M.verticesIndices=d;if(R.get())M.unIndex();P.setRef(M);if(!B)B=_.patch.cg.createMesh(M,{opId:_.id});else B.setGeom(M);w=false}t.onTriggered=function(){if(w)a();if(n.get())B.render(i.getShader());r.trigger()};A.onChange=I.onChange=E.onChange=U.onChange=T.onChange=N.onChange=C.onChange=R.onChange=L.onChange=function(){w=true};_.onDelete=function(){if(B)B.dispose()}};Ops.Gl.Meshes.Cylinder_v2.prototype=new CABLES.Op;CABLES.OPS["2899ad67-1e64-4692-af2a-c3b9078f1b5f"]={f:Ops.Gl.Meshes.Cylinder_v2,objName:"Ops.Gl.Meshes.Cylinder_v2"};Ops.Gl.Shader.MatCapMaterial_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={matcap_frag:"{{MODULES_HEAD}}\n\n#ifdef HAS_TEXTURES\n    IN vec2 texCoord;\n#endif\n\nIN vec3 transformedNormal;\nIN vec3 viewSpacePosition;\n\nUNI vec4 inColor;\n\nUNI sampler2D texMatcap;\n\n#ifdef HAS_DIFFUSE_TEXTURE\n   UNI sampler2D texDiffuse;\n#endif\n\n#ifdef USE_SPECULAR_TEXTURE\n   UNI sampler2D texSpec;\n   UNI sampler2D texSpecMatCap;\n#endif\n\n#ifdef HAS_AO_TEXTURE\n    UNI sampler2D texAo;\n    UNI float aoIntensity;\n#endif\n\n#ifdef HAS_NORMAL_TEXTURE\n    IN vec3 vBiTangent;\n    IN vec3 vTangent;\n    IN mat3 normalMatrix;\n\n    UNI sampler2D texNormal;\n    UNI float normalMapIntensity;\n#endif\n\n#ifdef HAS_TEXTURE_OPACITY\n    UNI sampler2D texOpacity;\n#endif\n\n#ifdef CALC_SSNORMALS\n    IN vec3 eye_relative_pos;\n\n    // from https://www.enkisoftware.com/devlogpost-20150131-1-Normal_generation_in_the_pixel_shader\n    vec3 CalculateScreenSpaceNormals() {\n    \tvec3 dFdxPos = dFdx(eye_relative_pos);\n    \tvec3 dFdyPos = dFdy(eye_relative_pos);\n    \tvec3 screenSpaceNormal = normalize( cross(dFdxPos, dFdyPos));\n        return normalize(screenSpaceNormal);\n    }\n#endif\n\n// * taken & modified from https://github.com/mrdoob/three.js/blob/dev/src/renderers/shaders/ShaderLib/meshmatcap_frag.glsl.js\nvec2 getMatCapUV(vec3 viewSpacePosition, vec3 normal) {\n    vec3 viewDir = normalize(-viewSpacePosition);\n\tvec3 x = normalize(vec3(viewDir.z, 0.0, - viewDir.x));\n\tvec3 y = normalize(cross(viewDir, x));\n\tvec2 uv = vec2(dot(x, normal), dot(y, normal)) * 0.495 + 0.5; // 0.495 to remove artifacts caused by undersized matcap disks\n\treturn uv;\n}\n\nvoid main()\n{\n    vec3 viewSpaceNormal = normalize(transformedNormal);\n\n    #ifdef HAS_TEXTURES\n        vec2 texCoords = texCoord;\n        {{MODULE_BEGIN_FRAG}}\n    #endif\n\n\n    #ifdef CALC_SSNORMALS\n        viewSpaceNormal = CalculateScreenSpaceNormals();\n    #endif\n\n\n   #ifdef HAS_NORMAL_TEXTURE\n        vec3 normalFromMap = texture( texNormal, texCoord ).xyz * 2.0 - 1.0;\n        normalFromMap = normalize(normalFromMap);\n\n        vec3 tangent;\n        vec3 binormal;\n\n        #ifdef CALC_TANGENT\n            vec3 c1 = cross(normalFromMap, vec3(0.0, 0.0, 1.0));\n            vec3 c2 = cross(normalFromMap, vec3(0.0, 1.0, 0.0));\n\n            tangent = c1;\n            tangent = normalize(tangent);\n            binormal = cross(viewSpaceNormal, tangent);\n            binormal = normalize(binormal);\n        #endif\n\n        #ifndef CALC_TANGENT\n            tangent = normalize(normalMatrix * vTangent);\n            vec3 bitangent = normalize(normalMatrix * vBiTangent);\n            binormal = normalize(cross(viewSpaceNormal, bitangent));\n        #endif\n\n        normalFromMap = normalize(\n            tangent * normalFromMap.x\n            + binormal * normalFromMap.y\n            + viewSpaceNormal * normalFromMap.z\n        );\n\n        vec3 mixedNormal = normalize(viewSpaceNormal + normalFromMap * normalMapIntensity);\n\n        viewSpaceNormal = mixedNormal;\n    #endif\n\n    vec4 col = texture(texMatcap, getMatCapUV(viewSpacePosition, viewSpaceNormal));\n\n    #ifdef HAS_DIFFUSE_TEXTURE\n        col = col*texture(texDiffuse, texCoords);\n    #endif\n\n    col.rgb *= inColor.rgb;\n\n\n    #ifdef HAS_AO_TEXTURE\n        col = col\n            * mix(\n                vec4(1.0,1.0,1.0,1.0),\n                texture(texAo, texCoords),\n                aoIntensity\n            );\n    #endif\n\n    #ifdef USE_SPECULAR_TEXTURE\n        vec4 spec = texture(texSpecMatCap, getMatCapUV(viewSpacePosition, viewSpaceNormal));\n        spec *= texture(texSpec, texCoords);\n        col += spec;\n    #endif\n\n    col.a *= inColor.a;\n\n    #ifdef HAS_TEXTURE_OPACITY\n        #ifdef TRANSFORMALPHATEXCOORDS\n            texCoords=vec2(texCoord.s,1.0-texCoord.t);\n            texCoords.y = 1. - texCoords.y;\n        #endif\n        #ifdef ALPHA_MASK_ALPHA\n            col.a*=texture(texOpacity,texCoords).a;\n        #endif\n        #ifdef ALPHA_MASK_LUMI\n            col.a*=dot(vec3(0.2126,0.7152,0.0722), texture(texOpacity,texCoords).rgb);\n        #endif\n        #ifdef ALPHA_MASK_R\n            col.a*=texture(texOpacity,texCoords).r;\n        #endif\n        #ifdef ALPHA_MASK_G\n            col.a*=texture(texOpacity,texCoords).g;\n        #endif\n        #ifdef ALPHA_MASK_B\n            col.a*=texture(texOpacity,texCoords).b;\n        #endif\n\n        #ifdef DISCARDTRANS\n            if(col.a < 0.2) discard;\n        #endif\n    #endif\n\n    {{MODULE_COLOR}}\n\n    outColor = col;\n}",matcap_vert:"IN vec3 vPosition;\n\n#ifdef HAS_TEXTURES\n    IN vec2 attrTexCoord;\n#endif\n\nIN vec3 attrVertNormal;\nIN float attrVertIndex;\n\n#ifdef HAS_NORMAL_TEXTURE\n    IN vec3 attrTangent;\n    IN vec3 attrBiTangent;\n    OUT vec3 vBiTangent;\n    OUT vec3 vTangent;\n#endif\n\nUNI mat4 projMatrix;\nUNI mat4 modelMatrix;\nUNI mat4 viewMatrix;\nUNI vec3 camPos;\n\n#ifdef HAS_TEXTURES\n    UNI vec2 texOffset;\n    UNI vec2 texRepeat;\n    OUT vec2 texCoord;\n#endif\n\nOUT mat3 normalMatrix;\nOUT vec3 viewSpacePosition;\nOUT vec3 transformedNormal;\n\n{{MODULES_HEAD}}\n\n#ifdef CALC_SSNORMALS\n    // from https://www.enkisoftware.com/devlogpost-20150131-1-Normal_generation_in_the_pixel_shader\n    OUT vec3 eye_relative_pos;\n#endif\n\nmat3 transposeMat3(mat3 m) {\n    return mat3(m[0][0], m[1][0], m[2][0],\n        m[0][1], m[1][1], m[2][1],\n        m[0][2], m[1][2], m[2][2]);\n}\n\n mat3 inverseMat3(mat3 m) {\n    float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];\n    float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];\n    float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];\n\n    float b01 = a22 * a11 - a12 * a21;\n    float b11 = -a22 * a10 + a12 * a20;\n    float b21 = a21 * a10 - a11 * a20;\n\n    float det = a00 * b01 + a01 * b11 + a02 * b21;\n\n    return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),\n        b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),\n        b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det;\n}\n\nvoid main()\n{\n    #ifdef HAS_TEXTURES\n        texCoord = texRepeat * vec2(attrTexCoord.x, attrTexCoord.y) + texOffset;\n        texCoord.y = 1. - texCoord.y;\n    #endif\n\n    mat4 mMatrix = modelMatrix;\n    mat4 mvMatrix;\n\n    #ifdef HAS_NORMAL_TEXTURE\n        vec3 tangent = attrTangent;\n        vec3 bitangent = attrBiTangent;\n        vTangent = attrTangent;\n        vBiTangent = attrBiTangent;\n    #endif\n\n    vec4 pos = vec4(vPosition, 1.);\n    vec3 norm = attrVertNormal;\n\n    {{MODULE_VERTEX_POSITION}}\n\n    mvMatrix = viewMatrix * mMatrix;\n    vec3 normal = norm;\n\n    normalMatrix = transposeMat3(inverseMat3(mat3(mvMatrix)));\n\n    vec3 fragPos = vec3((mvMatrix) * pos);\n    viewSpacePosition = normalize(fragPos);\n\n    #ifdef CALC_SSNORMALS\n        eye_relative_pos = -(vec3(viewMatrix * vec4(camPos, 1.)) - fragPos);\n    #endif\n\n    transformedNormal = normalize(mat3(normalMatrix) * normal);\n\n    mat4 modelViewMatrix=mvMatrix;\n    {{MODULE_VERTEX_MOVELVIEW}}\n\n    gl_Position = projMatrix * modelViewMatrix * pos;\n\n}"};const n=e.patch.cgl;const w=e.inTrigger("Render"),r=e.inTexture("MatCap"),i=e.inTexture("Diffuse"),a=e.inTexture("Normal"),s=e.inTexture("Specular Mask"),o=e.inTexture("Specular MatCap"),l=e.inTexture("AO Texture"),u=e.inTexture("Opacity Texture"),c=e.inValueSlider("r",1),p=e.inValueSlider("g",1),h=e.inValueSlider("b",1),f=e.inValueSlider("Opacity",1),d=e.inValueSlider("AO Intensity",1),g=e.inFloatSlider("Normal Map Intensity",1),m=e.inValue("Repeat X",1),v=e.inValue("Repeat Y",1),b=e.inValue("Offset X",0),y=e.inValue("Offset Y",0),x=e.inValueBool("Screen Space Normals"),S=e.inValueBool("Calc normal tangents",true),O=e.inValueBool("Opacity TexCoords Transform",false),_=e.inValueBool("Discard Transparent Pixels"),B=e.outTrigger("Next"),G=e.outObject("Shader");c.setUiAttribs({colorPick:true});const A=e.inSwitch("Alpha Mask Source",["Luminance","R","G","B","A"],"Luminance");A.setUiAttribs({greyout:true});e.setPortGroup("Texture Opacity",[A,O,_]);e.setPortGroup("Texture Transforms",[d,g,m,v,b,y,S,x]);e.setPortGroup("Texture Maps",[i,a,s,o,l,u]);e.setPortGroup("Color",[c,p,h,f]);const C=new CGL.Shader(n,"MatCapMaterialNew3");const V=new CGL.Uniform(C,"f","opacity",f);C.setModules(["MODULE_VERTEX_POSITION","MODULE_COLOR","MODULE_BEGIN_FRAG","MODULE_VERTEX_MOVELVIEW"]);C.setSource(t.matcap_vert,t.matcap_frag);G.set(C);const D=new CGL.Uniform(C,"t","texMatcap");let T=null;let I=null;let E=null;let L=null;let N=null;let U=null;const F=new CGL.Uniform(C,"2f","texOffset",b,y);const j=new CGL.Uniform(C,"2f","texRepeat",m,v);const z=new CGL.Uniform(C,"f","aoIntensity",d);const H=new CGL.Uniform(C,"4f","inColor",c,p,h,f);S.onChange=R;R();function R(){if(S.get())C.define("CALC_TANGENT");else C.removeDefine("CALC_TANGENT")}x.onChange=function(){if(x.get()){if(n.glVersion<2){n.gl.getExtension("OES_standard_derivatives");C.enableExtension("GL_OES_standard_derivatives")}C.define("CALC_SSNORMALS")}else C.removeDefine("CALC_SSNORMALS")};r.onChange=P;function P(){if(!n.defaultMatcapTex3){const r=new Uint8Array(256*4);for(let n=0;n<16;n++){for(let t=0;t<16;t++){let e=t*16;e*=Math.min(1,(n+t/3)/8);r[(n+t*16)*4+0]=r[(n+t*16)*4+1]=r[(n+t*16)*4+2]=e;r[(n+t*16)*4+3]=255}}n.defaultMatcapTex3=new CGL.Texture(n);n.defaultMatcapTex3.initFromData(r,16,16,CGL.Texture.FILTER_LINEAR,CGL.Texture.WRAP_REPEAT)}}i.onChange=function(){if(i.get()){if(T!==null)return;C.define("HAS_DIFFUSE_TEXTURE");C.removeUniform("texDiffuse");T=new CGL.Uniform(C,"t","texDiffuse")}else{C.removeDefine("HAS_DIFFUSE_TEXTURE");C.removeUniform("texDiffuse");T=null}};a.onChange=function(){if(a.get()){if(I!==null)return;C.define("HAS_NORMAL_TEXTURE");C.removeUniform("texNormal");I=new CGL.Uniform(C,"t","texNormal");if(!E)E=new CGL.Uniform(C,"f","normalMapIntensity",g)}else{C.removeDefine("HAS_NORMAL_TEXTURE");C.removeUniform("texNormal");I=null}};l.onChange=function(){if(l.get()){if(U!==null)return;C.define("HAS_AO_TEXTURE");C.removeUniform("texAo");U=new CGL.Uniform(C,"t","texAo")}else{C.removeDefine("HAS_AO_TEXTURE");C.removeUniform("texAo");U=null}};s.onChange=o.onChange=function(){if(s.get()&&o.get()){if(L!==null)return;C.define("USE_SPECULAR_TEXTURE");C.removeUniform("texSpec");C.removeUniform("texSpecMatCap");L=new CGL.Uniform(C,"t","texSpec");N=new CGL.Uniform(C,"t","texSpecMatCap")}else{C.removeDefine("USE_SPECULAR_TEXTURE");C.removeUniform("texSpec");C.removeUniform("texSpecMatCap");L=null;N=null}};function M(){if(A.get()=="Alpha Channel")C.define("ALPHA_MASK_ALPHA");else C.removeDefine("ALPHA_MASK_ALPHA");if(A.get()=="Luminance")C.define("ALPHA_MASK_LUMI");else C.removeDefine("ALPHA_MASK_LUMI");if(A.get()=="R")C.define("ALPHA_MASK_R");else C.removeDefine("ALPHA_MASK_R");if(A.get()=="G")C.define("ALPHA_MASK_G");else C.removeDefine("ALPHA_MASK_G");if(A.get()=="B")C.define("ALPHA_MASK_B");else C.removeDefine("ALPHA_MASK_B")}A.onChange=M;u.onChange=X;let k=null;function X(){if(u.get()){if(k!==null)return;C.removeUniform("texOpacity");C.define("HAS_TEXTURE_OPACITY");if(!k)k=new CGL.Uniform(C,"t","texOpacity");A.setUiAttribs({greyout:false});_.setUiAttribs({greyout:false});O.setUiAttribs({greyout:false})}else{C.removeUniform("texOpacity");C.removeDefine("HAS_TEXTURE_OPACITY");k=null;A.setUiAttribs({greyout:true});_.setUiAttribs({greyout:true});O.setUiAttribs({greyout:true})}M()}_.onChange=function(){if(_.get())C.define("DISCARDTRANS");else C.removeDefine("DISCARDTRANS")};O.onChange=function(){if(O.get())C.define("TRANSFORMALPHATEXCOORDS");else C.removeDefine("TRANSFORMALPHATEXCOORDS")};function Y(){if(s.get()&&!o.get()){e.setUiError("specNoMatCapSpec","You connected a specular texture but have not connected a specular matcap texture. You need to connect both texture inputs for the specular input to work.",1);e.setUiError("noSpecMatCapSpec",null)}else if(!s.get()&&o.get()){e.setUiError("noSpecMatCapSpec","You connected a specular matcap texture but have not connected a specular texture. You need to connect both texture inputs for the specular input to work.",1);e.setUiError("specNoMatCapSpec",null)}else if(s.get()&&o.get()){e.setUiError("specNoMatCapSpec",null);e.setUiError("noSpecMatCapSpec",null)}else{e.setUiError("specNoMatCapSpec",null);e.setUiError("noSpecMatCapSpec",null)}}w.onTriggered=function(){Y();if(!n.defaultMatcapTex3)P();C.popTextures();const e=r.get()||n.defaultMatcapTex3;C.pushTexture(D,e.tex);if(i.get()&&T)C.pushTexture(T,i.get().tex);if(a.get()&&I)C.pushTexture(I,a.get().tex);if(s.get()&&L)C.pushTexture(L,s.get().tex);if(o.get()&&N)C.pushTexture(N,o.get().tex);if(l.get()&&U)C.pushTexture(U,l.get().tex);if(u.get()&&k)C.pushTexture(k,u.get().tex);n.pushShader(C);B.trigger();n.popShader()}};Ops.Gl.Shader.MatCapMaterial_v3.prototype=new CABLES.Op;CABLES.OPS["c1dd6e76-61b4-471a-b8d1-f550a5a9a4f4"]={f:Ops.Gl.Shader.MatCapMaterial_v3,objName:"Ops.Gl.Shader.MatCapMaterial_v3"};Ops.Gl.Texture_v2=function(){CABLES.Op.apply(this,arguments);const i=this;const e=i.attachments={};const a=i.inUrl("File",[".jpg",".png",".webp",".jpeg",".avif"]),t=i.inSwitch("Filter",["nearest","linear","mipmap"]),n=i.inValueSelect("Wrap",["repeat","mirrored repeat","clamp to edge"],"clamp to edge"),r=i.inSwitch("Anisotropic",["0","1","2","4","8","16"],"0"),s=i.inSwitch("Data Format",["R","RG","RGB","RGBA","SRGBA"],"RGBA"),o=i.inValueBool("Flip",false),l=i.inValueBool("Pre Multiplied Alpha",false),u=i.inValueBool("Active",true),c=i.inBool("Save Memory",true),p=i.outTexture("Texture"),h=i.inBool("Add Cachebuster",true),f=i.outNumber("Width"),d=i.outNumber("Height"),g=i.outNumber("Aspect Ratio"),m=i.outBoolNum("Loaded",0),v=i.outBoolNum("Loading",0);const b=i.patch.cgl;i.toWorkPortsNeedToBeLinked(p);i.setPortGroup("Size",[f,d]);let y=null;let x=null;let S=null;let O=CGL.Texture.FILTER_MIPMAP;let _=CGL.Texture.WRAP_REPEAT;let A=0;let C=0;l.setUiAttribs({hidePort:true});l.onChange=a.onChange=s.onChange=h.onChange=o.onChange=I;r.onChange=t.onChange=N;n.onChange=U;t.set("mipmap");n.set("repeat");p.set(CGL.Texture.getEmptyTexture(b));u.onChange=function(){if(u.get()){if(y!=a.get()||!S)I();else p.set(S)}else{p.set(CGL.Texture.getEmptyTexture(b));f.set(CGL.Texture.getEmptyTexture(b).width);d.set(CGL.Texture.getEmptyTexture(b).height);if(S)S.delete();i.setUiAttrib({extendTitle:""});S=null}};const T=function(){const e=CGL.Texture.getTempTexture(b);p.set(e)};function I(e){clearTimeout(C);C=setTimeout(function(){L(e)},30)}function E(){if(s.get()=="R")return CGL.Texture.PFORMATSTR_R8UB;if(s.get()=="RG")return CGL.Texture.PFORMATSTR_RG8UB;if(s.get()=="RGB")return CGL.Texture.PFORMATSTR_RGB8UB;if(s.get()=="SRGBA")return CGL.Texture.PFORMATSTR_SRGBA8;return CGL.Texture.PFORMATSTR_RGBA8UB}function L(e){i.checkMainloopExists();if(!u.get())return;if(x)x=b.patch.loading.finished(x);x=b.patch.loading.start("textureOp",a.get(),i);let t=i.patch.getFilePath(String(a.get()));if((h.get()||e)&&CABLES.UI)t=CABLES.cacheBust(t);if(String(a.get()).indexOf("data:")==0)t=a.get();let n=false;y=a.get();if(a.get()&&a.get().length>1){m.set(false);v.set(true);const r=a.get();i.setUiAttrib({extendTitle:CABLES.basename(t)});if(n)i.refreshParams();b.patch.loading.addAssetLoadingTask(()=>{i.setUiError("urlerror",null);CGL.Texture.load(b,t,function(e,t){b.checkFrameStarted("texture inittexture");if(a.get()!=r){b.patch.loading.finished(x);x=null;return}if(S)S.delete();if(e){const n=CGL.Texture.getErrorTexture(b);p.setRef(n);i.setUiError("urlerror",'could not load texture: "'+a.get()+'"',2);b.patch.loading.finished(x);x=null;return}f.set(t.width);d.set(t.height);g.set(t.width/t.height);S=t;p.setRef(S);v.set(false);m.set(true);if(c.get())S.image=null;if(x){b.patch.loading.finished(x);x=null}i.checkMainloopExists()},{anisotropic:A,wrap:_,flip:o.get(),unpackAlpha:l.get(),pixelFormat:E(),filter:O});i.checkMainloopExists()})}else{b.patch.loading.finished(x);x=null;T()}}function N(){if(t.get()=="nearest")O=CGL.Texture.FILTER_NEAREST;else if(t.get()=="linear")O=CGL.Texture.FILTER_LINEAR;else if(t.get()=="mipmap")O=CGL.Texture.FILTER_MIPMAP;else if(t.get()=="Anisotropic")O=CGL.Texture.FILTER_ANISOTROPIC;r.setUiAttribs({greyout:O!=CGL.Texture.FILTER_MIPMAP});A=parseFloat(r.get());I()}function U(){if(n.get()=="repeat")_=CGL.Texture.WRAP_REPEAT;if(n.get()=="mirrored repeat")_=CGL.Texture.WRAP_MIRRORED_REPEAT;if(n.get()=="clamp to edge")_=CGL.Texture.WRAP_CLAMP_TO_EDGE;I()}i.onFileChanged=function(e){if(a.get()&&a.get().indexOf(e)>-1){p.set(CGL.Texture.getEmptyTexture(i.patch.cgl));p.set(CGL.Texture.getTempTexture(b));L(true)}}};Ops.Gl.Texture_v2.prototype=new CABLES.Op;CABLES.OPS["790f3702-9833-464e-8e37-6f0f813f7e16"]={f:Ops.Gl.Texture_v2,objName:"Ops.Gl.Texture_v2"};Ops.Gl.RenderToTexture_v3=function(){CABLES.Op.apply(this,arguments);const i=this;const e=i.attachments={};const t=i.inTrigger("render"),n=i.inSwitch("Size",["Canvas","Manual"],"Canvas"),r=i.inValueInt("texture width",512),a=i.inValueInt("texture height",512),s=i.inBool("Auto Aspect",true),o=i.inSwitch("filter",["nearest","linear","mipmap"],"linear"),l=i.inSwitch("Wrap",["Clamp","Repeat","Mirror"],"Repeat"),u=i.inSwitch("MSAA",["none","2x","4x","8x"],"none"),c=i.outTrigger("trigger"),p=i.outTexture("texture"),h=i.outTexture("textureDepth"),f=i.inDropDown("Pixel Format",CGL.Texture.PIXELFORMATS,CGL.Texture.PFORMATSTR_RGBA8UB),d=i.inValueBool("Depth",true),g=i.inValueBool("Clear",true);const m=i.patch.cgl;let v=null;let b=true;i.setPortGroup("Size",[n,r,a,s]);f.onChange=d.onChange=g.onChange=o.onChange=l.onChange=u.onChange=x;n.onChange=y;t.onTriggered=i.preRender=S;y();function y(){r.setUiAttribs({greyout:n.get()!="Manual"});a.setUiAttribs({greyout:n.get()!="Manual"});s.setUiAttribs({greyout:n.get()!="Manual"})}function x(){b=true}function S(){CGL.TextureEffect.checkOpNotInTextureEffect(i);if(!v||b){if(v)v.delete();let n=CGL.Texture.WRAP_REPEAT;if(l.get()=="Clamp")n=CGL.Texture.WRAP_CLAMP_TO_EDGE;else if(l.get()=="Mirror")n=CGL.Texture.WRAP_MIRRORED_REPEAT;let r=CGL.Texture.FILTER_NEAREST;if(o.get()=="nearest")r=CGL.Texture.FILTER_NEAREST;else if(o.get()=="linear")r=CGL.Texture.FILTER_LINEAR;else if(o.get()=="mipmap")r=CGL.Texture.FILTER_MIPMAP;if(f.get().indexOf("loat")&&o.get()=="mipmap")i.setUiError("fpmipmap","Can't use mipmap and float texture at the same time");else i.setUiError("fpmipmap",null);if(m.glVersion>=2){let e=true;let t=4;if(u.get()=="none"){t=0;e=false}if(u.get()=="2x")t=2;if(u.get()=="4x")t=4;if(u.get()=="8x")t=8;v=new CGL.Framebuffer2(m,8,8,{name:"render2texture "+i.id,pixelFormat:f.get(),multisampling:e,multisamplingSamples:t,wrap:n,filter:r,depth:d.get(),clear:g.get()})}else{v=new CGL.Framebuffer(m,8,8,{isFloatingPointTexture:false,clear:g.get()})}if(v&&v.valid){h.set(v.getTextureDepth());b=false}else{v=null;b=true}}let e=s.get();if(n.get()=="Canvas"){e=true;r.set(i.patch.cgl.checkTextureSize(m.canvasWidth));a.set(i.patch.cgl.checkTextureSize(m.canvasHeight))}if(v.getWidth()!=i.patch.cgl.checkTextureSize(r.get())||v.getHeight()!=i.patch.cgl.checkTextureSize(a.get())){v.setSize(i.patch.cgl.checkTextureSize(r.get()),i.patch.cgl.checkTextureSize(a.get()))}v.renderStart(m);m.pushViewPort(0,0,r.get(),a.get());if(e)mat4.perspective(m.pMatrix,45,r.get()/a.get(),.1,1e3);c.trigger();v.renderEnd(m);m.popViewPort();h.setRef(v.getTextureDepth());p.setRef(v.getTextureColor())}};Ops.Gl.RenderToTexture_v3.prototype=new CABLES.Op;CABLES.OPS["41eec5c7-c480-477a-be81-04c3efac8357"]={f:Ops.Gl.RenderToTexture_v3,objName:"Ops.Gl.RenderToTexture_v3"};Ops.Gl.Meshes.Rectangle_v4=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inTrigger("render"),r=t.inValueBool("Render Mesh",true),I=t.inValue("width",1),E=t.inValue("height",1),L=t.inSwitch("pivot x",["left","center","right"],"center"),N=t.inSwitch("pivot y",["top","center","bottom"],"center"),U=t.inSwitch("axis",["xy","xz"],"xy"),R=t.inBool("Flip TexCoord X",false),P=t.inBool("Flip TexCoord Y",true),M=t.inValueInt("num columns",1),k=t.inValueInt("num rows",1),i=t.outTrigger("trigger"),w=t.outObject("geometry",null,"geometry");w.ignoreValueSerialize=true;const a=t.patch.cgl;const B=new CGL.Geometry("rectangle");r.setUiAttribs({title:"Render"});n.setUiAttribs({title:"Trigger"});i.setUiAttribs({title:"Next"});t.setPortGroup("Pivot",[L,N,U]);t.setPortGroup("Size",[I,E]);t.setPortGroup("Structure",[M,k]);t.toWorkPortsNeedToBeLinked(n);t.toWorkShouldNotBeChild("Ops.Gl.TextureEffects.ImageCompose",CABLES.OP_PORT_TYPE_TRIGGER);const G=0;const V=1;let D=G;let F=null;let j=true;let z=true;const s=vec3.create();vec3.set(s,1,1,1);U.onChange=L.onChange=N.onChange=R.onChange=P.onChange=k.onChange=M.onChange=o;H();I.onChange=E.onChange=()=>{if(z)H();else j=true};function H(){if(D===G)vec3.set(s,I.get(),E.get(),1);if(D===V)vec3.set(s,I.get(),1,E.get())}w.onLinkChanged=()=>{z=!w.isLinked();H();j=true};function o(){j=true}n.onTriggered=()=>{if(j)l();const e=t.patch.cg;if(F&&r.get()){if(z){e.pushModelMatrix();mat4.scale(e.mMatrix,e.mMatrix,s)}F.render(e.getShader());if(z)e.popModelMatrix()}i.trigger()};t.onDelete=()=>{if(F)F.dispose();o()};function l(){if(U.get()=="xy")D=G;if(U.get()=="xz")D=V;H();let n=I.get();let r=E.get();if(z)n=r=1;let i=0;let a=0;if(L.get()=="center")i=0;else if(L.get()=="right")i=-n/2;else if(L.get()=="left")i=+n/2;if(N.get()=="center")a=0;else if(N.get()=="top")a=-r/2;else if(N.get()=="bottom")a=+r/2;const s=Math.max(1,Math.round(k.get()));const o=Math.max(1,Math.round(M.get()));const l=n/o;const u=r/s;const c=[];const p=new Float32Array((o+1)*(s+1)*2);const h=new Float32Array((o+1)*(s+1)*3);const f=new Float32Array((o+1)*(s+1)*3);const d=new Float32Array((o+1)*(s+1)*3);const g=new Float32Array((o+1)*(s+1)*3);let m=0;let v=0;let b=0;let y=0;let x=0;for(let t=0;t<=s;t++){for(let e=0;e<=o;e++){h[v++]=e*l-n/2+i;if(D==V)h[v++]=0;h[v++]=t*u-r/2+a;if(D==G)h[v++]=0;p[m++]=e/o;p[m++]=t/s;if(D==G){f[b++]=0;f[b++]=0;f[b++]=1;d[y++]=1;d[y++]=0;d[y++]=0;g[x++]=0;g[x++]=1;g[x++]=0}else if(D==V){f[b++]=0;f[b++]=1;f[b++]=0;g[x++]=0;g[x++]=0;g[x++]=1}}}c.length=o*s*6;let S=0;for(let t=0;t<o;t++){for(let e=0;e<s;e++){const O=t+(o+1)*e;const _=O;const A=O+1;const C=O+o+1;const T=O+1+o+1;if(D==G){c[S++]=_;c[S++]=A;c[S++]=C;c[S++]=C;c[S++]=A;c[S++]=T}else if(D==V){c[S++]=_;c[S++]=C;c[S++]=A;c[S++]=A;c[S++]=C;c[S++]=T}}}if(P.get())for(let e=0;e<p.length;e+=2)p[e+1]=1-p[e+1];if(R.get())for(let e=0;e<p.length;e+=2)p[e]=1-p[e];B.clear();B.vertices=h;B.texCoords=p;B.verticesIndices=c;B.vertexNormals=f;B.tangents=d;B.biTangents=g;if(!F)F=t.patch.cg.createMesh(B,{opId:t.id});else F.setGeom(B);w.setRef(B);j=false}};Ops.Gl.Meshes.Rectangle_v4.prototype=new CABLES.Op;CABLES.OPS["cc8c3ede-7103-410b-849f-a645793cab39"]={f:Ops.Gl.Meshes.Rectangle_v4,objName:"Ops.Gl.Meshes.Rectangle_v4"};Ops.Gl.Matrix.TransformView=function(){CABLES.Op.apply(this,arguments);const n=this;const e=n.attachments={};const t=n.inTrigger("render"),r=n.inValueFloat("posX"),i=n.inValueFloat("posY"),a=n.inValueFloat("posZ"),s=n.inValueFloat("scale"),o=n.inValueFloat("rotX"),l=n.inValueFloat("rotY"),u=n.inValueFloat("rotZ"),c=n.outTrigger("trigger");n.setPortGroup("Position",[r,i,a]);n.setPortGroup("Scale",[s]);n.setPortGroup("Rotation",[o,u,l]);const p=vec3.create();const h=vec3.create();const f=mat4.create();mat4.identity(f);let d=false;let g=false;let m=true;let v=true;let b=true;t.onTriggered=function(){const e=n.patch.cgl;let t=false;if(m){x();t=true}if(v){S();t=true}if(b){t=true}if(t)y();e.pushViewMatrix();mat4.multiply(e.vMatrix,e.vMatrix,f);c.trigger();e.popViewMatrix();if(n.isCurrentUiOp())gui.setTransformGizmo({posX:r,posY:i,posZ:a})};n.transform3d=function(){return{pos:[r,i,a]}};function y(){mat4.identity(f);if(g)mat4.translate(f,f,p);if(o.get()!==0)mat4.rotateX(f,f,o.get()*CGL.DEG2RAD);if(l.get()!==0)mat4.rotateY(f,f,l.get()*CGL.DEG2RAD);if(u.get()!==0)mat4.rotateZ(f,f,u.get()*CGL.DEG2RAD);if(d)mat4.scale(f,f,h);A=false}function x(){g=false;if(r.get()!==0||i.get()!==0||a.get()!==0)g=true;vec3.set(p,r.get(),i.get(),a.get());m=false}function S(){d=false;if(s.get()!==0)d=true;vec3.set(h,s.get(),s.get(),s.get());_=false}function O(){m=true}function _(){v=true}function A(){b=true}o.onChange=l.onChange=u.onChange=A;s.onChange=_;r.onChange=i.onChange=a.onChange=O;o.set(0);l.set(0);u.set(0);s.set(1);r.set(0);i.set(0);a.set(0);y()};Ops.Gl.Matrix.TransformView.prototype=new CABLES.Op;CABLES.OPS["0b3e04f7-323e-4ac8-8a22-a21e2f36e0e9"]={f:Ops.Gl.Matrix.TransformView,objName:"Ops.Gl.Matrix.TransformView"};Ops.Gl.Matrix.ScaleXYZViewMatrix=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("render"),r=e.inValueFloat("x",1),i=e.inValueFloat("y",1),a=e.inValueFloat("z",1),s=e.outTrigger("trigger");const o=e.patch.cgl;let l=vec3.create();let u=mat4.create();mat4.identity(u);r.onChange=i.onChange=a.onChange=p;p();n.onTriggered=c;function c(){o.pushViewMatrix();mat4.multiply(o.vMatrix,o.vMatrix,u);s.trigger();o.popViewMatrix()}function p(){vec3.set(l,r.get(),i.get(),a.get());mat4.identity(u);mat4.scale(u,u,l)}};Ops.Gl.Matrix.ScaleXYZViewMatrix.prototype=new CABLES.Op;CABLES.OPS["8b1fa9c9-0c4d-41b6-9c4f-8f4b633a9d7f"]={f:Ops.Gl.Matrix.ScaleXYZViewMatrix,objName:"Ops.Gl.Matrix.ScaleXYZViewMatrix"};Ops.Deprecated.Gl.Matrix.ScaleXYZ=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inTrigger("render"),r=t.inValueFloat("x",1),i=t.inValueFloat("y",1),a=t.inValueFloat("z",1),s=t.outTrigger("trigger");const o=vec3.create();let l=true;r.onChange=i.onChange=a.onChange=c;c();n.onTriggered=u;function u(){const e=t.patch.cg||t.patch.cgl;if(l){vec3.set(o,r.get(),i.get(),a.get());l=false}e.pushModelMatrix();mat4.scale(e.mMatrix,e.mMatrix,o);s.trigger();e.popModelMatrix()}function c(){l=true}};Ops.Deprecated.Gl.Matrix.ScaleXYZ.prototype=new CABLES.Op;CABLES.OPS["9ba52457-5f0d-4b20-a97c-4ec4856b8e29"]={f:Ops.Deprecated.Gl.Matrix.ScaleXYZ,objName:"Ops.Deprecated.Gl.Matrix.ScaleXYZ"};Ops.Gl.Meshes.Grid=function(){CABLES.Op.apply(this,arguments);const l=this;const e=l.attachments={};const t=l.inTrigger("Render"),u=l.inInt("Num",10),c=l.inValue("Spacing",1),p=l.inBool("Center",true),h=l.inSwitch("Axis",["XY","XZ"],"XY"),n=l.outTrigger("Next");const f=l.patch.cgl;let d=null;h.onChange=p.onChange=u.onChange=c.onChange=function(){if(d)d.dispose();d=null};function r(){const t=new CGL.Geometry(l.name);const e=new CGL.Geometry(l.name);const n=c.get();const r=Math.floor(u.get());const i=n*r/2;const a=[];let s=-r/2;let o=r/2+1;if(h.get()=="XY")for(let e=s;e<o;e++){t.vertices.push(-i,e*n,0);t.vertices.push(i,e*n,0);t.vertices.push(e*n,-i,0);t.vertices.push(e*n,i,0);a.push(0,0,0,0,0,0,0,0)}else for(let e=s;e<o;e++){t.vertices.push(-i,0,e*n);t.vertices.push(i,0,e*n);t.vertices.push(e*n,0,-i);t.vertices.push(e*n,0,i);a.push(0,0,0,0,0,0,0,0)}if(!p.get()){for(let e=0;e<t.vertices.length;e+=3){t.vertices[e+0]+=i;t.vertices[e+1]+=i}}t.setTexCoords(a);t.calculateNormals();if(!d)d=new CGL.Mesh(f,t);else d.setGeom(t)}t.onTriggered=function(){if(!d)r();let e=f.getShader();if(!e)return;let t=e.glPrimitive;e.glPrimitive=f.gl.LINES;d.render(e);e.glPrimitive=t;n.trigger()}};Ops.Gl.Meshes.Grid.prototype=new CABLES.Op;CABLES.OPS["677a7c03-6885-46b4-8a64-e4ea54ee5d7f"]={f:Ops.Gl.Meshes.Grid,objName:"Ops.Gl.Meshes.Grid"};Ops.Gl.Meshes.FullscreenRectangle_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={shader_frag:"UNI sampler2D tex;\nIN vec2 texCoord;\n\nvoid main()\n{\n    outColor= texture(tex,texCoord);\n}\n\n",shader_vert:"{{MODULES_HEAD}}\n\nIN vec3 vPosition;\nUNI mat4 projMatrix;\nUNI mat4 mvMatrix;\n\nOUT vec2 texCoord;\nIN vec2 attrTexCoord;\n\nvoid main()\n{\n   vec4 pos=vec4(vPosition,  1.0);\n\n   texCoord=vec2(attrTexCoord.x,(1.0-attrTexCoord.y));\n\n   gl_Position = projMatrix * mvMatrix * pos;\n}\n"};const n=e.inTrigger("render"),r=e.inSwitch("Scale",["Stretch","Fit"],"Fit"),i=e.inValueBool("Flip Y"),a=e.inValueBool("Flip X"),s=e.inTexture("Texture"),o=e.outTrigger("trigger");const l=e.patch.cgl;let u=null;let c=new CGL.Geometry("fullscreen rectangle");let p=0,h=0,f=0,d=0;e.toWorkShouldNotBeChild("Ops.Gl.TextureEffects.ImageCompose",CABLES.OP_PORT_TYPE_FUNCTION);e.toWorkPortsNeedToBeLinked(n);a.onChange=_;i.onChange=_;n.onTriggered=O;s.onLinkChanged=y;r.onChange=S;const g=new CGL.Shader(l,"fullscreenrectangle",this);g.setModules(["MODULE_VERTEX_POSITION","MODULE_COLOR","MODULE_BEGIN_FRAG"]);g.setSource(t.shader_vert,t.shader_frag);g.fullscreenRectUniform=new CGL.Uniform(g,"t","tex",0);g.aspectUni=new CGL.Uniform(g,"f","aspectTex",0);let m=false;let v=true;let b=false;y();S();s.onChange=function(){v=true};function y(){if(!CABLES.UI)return;i.setUiAttribs({greyout:!s.isLinked()});a.setUiAttribs({greyout:!s.isLinked()});r.setUiAttribs({greyout:!s.isLinked()})}function x(){let e=s.get();if(e)m=true;else m=false}e.preRender=function(){x();g.bind();if(u)u.render(g);O()};function S(){b=r.get()=="Fit"}function O(){if(l.viewPort[2]!=f||l.viewPort[3]!=d||!u)A();if(v)x();l.pushPMatrix();mat4.identity(l.pMatrix);mat4.ortho(l.pMatrix,0,f,d,0,-10,1e3);l.pushModelMatrix();mat4.identity(l.mMatrix);l.pushViewMatrix();mat4.identity(l.vMatrix);if(b&&s.get()){const n=s.get().width/s.get().height;let e=d;let t=d*n;if(t>f){e=f*1/n;t=f}l.pushViewPort((f-t)/2,(d-e)/2,t,e)}if(m){if(s.get())l.setTexture(0,s.get().tex);u.render(g)}else{u.render(l.getShader())}l.gl.clear(l.gl.DEPTH_BUFFER_BIT);l.popPMatrix();l.popModelMatrix();l.popViewMatrix();if(b&&s.get())l.popViewPort();o.trigger()}function _(){u=null}function A(){if(l.viewPort[2]==f&&l.viewPort[3]==d&&u)return;let e=0,t=0;f=l.viewPort[2];d=l.viewPort[3];c.vertices=new Float32Array([e+f,t+d,0,e,t+d,0,e+f,t,0,e,t,0]);let n=null;if(i.get())n=new Float32Array([1,0,0,0,1,1,0,1]);else n=new Float32Array([1,1,0,1,1,0,0,0]);if(a.get()){n[0]=0;n[2]=1;n[4]=0;n[6]=1}c.setTexCoords(n);c.verticesIndices=new Uint16Array([2,1,0,3,1,2]);c.vertexNormals=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1]);c.tangents=new Float32Array([-1,0,0,-1,0,0,-1,0,0,-1,0,0]);c.biTangents==new Float32Array([0,-1,0,0,-1,0,0,-1,0,0,-1,0]);if(!u)u=new CGL.Mesh(l,c);else u.setGeom(c)}};Ops.Gl.Meshes.FullscreenRectangle_v2.prototype=new CABLES.Op;CABLES.OPS["fb70721a-eac2-4ff5-a5a2-5c59e2393972"]={f:Ops.Gl.Meshes.FullscreenRectangle_v2,objName:"Ops.Gl.Meshes.FullscreenRectangle_v2"};Ops.Gl.GradientTexture=function(){CABLES.Op.apply(this,arguments);const n=this;const e=n.attachments={};const T=n.inGradient("Gradient"),I=n.inValueSelect("Direction",["X","Y","XY","YX","Radial"],"X"),E=n.inValueBool("Smoothstep",false),L=n.inBool("Step",false),N=n.inBool("Flip",false),U=n.inBool("sRGB",false),R=n.inBool("Oklab",false),P=n.inValueInt("Size",256),M=n.inSwitch("filter",["nearest","linear","mipmap"],"linear"),k=n.inValueSelect("wrap",["clamp to edge","repeat","mirrored repeat"],"clamp to edge"),r=n.inArray("Gradient Array"),t=n.inTriggerButton("Randomize Colors"),w=n.outTexture("Texture"),B=n.outArray("Colors",null,3),G=n.outArray("Colors Pos",null,1);const V=n.patch.cgl;let i=null;T.setUiAttribs({editShortcut:true});k.onChange=M.onChange=L.onChange=N.onChange=U.onChange=R.onChange=P.onChange=T.onChange=E.onChange=I.onChange=r.onChange=a;T.set('{"keys" : [{"pos":0,"r":0,"g":0,"b":0},{"pos":1,"r":1,"g":1,"b":1}]}');n.onLoaded=a;t.onTriggered=()=>{const e=s();if(e){e.forEach(e=>{e.r=Math.random();e.g=Math.random();e.b=Math.random()});const t=JSON.stringify({keys:e});T.set(t)}};function D(e,t,n){let r=.4122214708*e+.5363325363*t+.0514459929*n;let i=.2119034982*e+.6806995451*t+.1073969566*n;let a=.0883024619*e+.2817188376*t+.6299787005*n;r=Math.cbrt(r);i=Math.cbrt(i);a=Math.cbrt(a);return[r*+.2104542553+i*+.793617785+a*-.0040720468,r*+1.9779984951+i*-2.428592205+a*+.4505937099,r*+.0259040371+i*+.7827717662+a*-.808675766]}function F(e,t,n){let r=e+t*+.3963377774+n*+.2158037573;let i=e+t*-.1055613458+n*-.0638541728;let a=e+t*-.0894841775+n*-1.291485548;r**=3;i**=3;a**=3;let s=r*+4.0767416621+i*-3.3077115913+a*+.2309699292;let o=r*-1.2684380046+i*+2.6097574011+a*-.3413193965;let l=r*-.0041960863+i*-.7034186147+a*+1.707614701;s=CABLES.clamp(s,0,1);o=CABLES.clamp(o,0,1);l=CABLES.clamp(l,0,1);return[s,o,l]}function j(e,t,n){e/=255;const r=.0031308;let i=12.92*e;let a=1.055*Math.pow(e,.41666)-.055;return(e<r?i:a)*255}function a(){clearTimeout(i);i=setTimeout(()=>{const e=s();if(e)o(e)},5)}function s(){let t=null;n.setUiError("nodata",null);n.setUiError("parse",null);if(Array.isArray(r.get())){t=r.get()}else{let e=null;if(!T.get()||T.get()===""){return null}try{e=JSON.parse(T.get())}catch(e){n.setUiError("parse","could not parse gradient data")}if(!e||!e.keys){n.setUiError("nodata","gradient no data");return null}t=e.keys}return t}function o(t){let i=Math.round(P.get());if(i<4)i=4;T.setUiAttribs({editShortcut:true,gradEditSmoothstep:E.get(),gradEditStep:L.get(),gradOklab:R.get()});let e=0;let n=0;if(k.get()=="repeat")e=CGL.Texture.WRAP_REPEAT;else if(k.get()=="mirrored repeat")e=CGL.Texture.WRAP_MIRRORED_REPEAT;else if(k.get()=="clamp to edge")e=CGL.Texture.WRAP_CLAMP_TO_EDGE;if(M.get()=="nearest")n=CGL.Texture.FILTER_NEAREST;else if(M.get()=="linear")n=CGL.Texture.FILTER_LINEAR;else if(M.get()=="mipmap")n=CGL.Texture.FILTER_MIPMAP;const r=new CGL.Texture(V);let a=new Uint8Array(i*4);for(let e=0;e<t.length-1;e++){const l=t[e];const u=t[e+1];for(let n=l.pos*i;n<u.pos*i;n++){let e=CABLES.map(n,l.pos*i,u.pos*i,0,1);if(L.get())e=Math.round(e);if(E.get())e=CABLES.smoothStep(e);n=Math.round(n);let t=n;if(N.get())t=i-n-1;if(R.get()){const c=D(l.r,l.g,l.b);const p=c[0];const h=c[1];const f=c[2];const d=D(u.r,u.g,u.b);const g=d[0];const m=d[1];const v=d[2];const b=e*g+(1-e)*p;const y=e*m+(1-e)*h;const x=e*v+(1-e)*f;const S=F(b,y,x);a[t*4+0]=Math.round(S[0]*255);a[t*4+1]=Math.round(S[1]*255);a[t*4+2]=Math.round(S[2]*255)}else{a[t*4+0]=Math.round((e*u.r+(1-e)*l.r)*255);a[t*4+1]=Math.round((e*u.g+(1-e)*l.g)*255);a[t*4+2]=Math.round((e*u.b+(1-e)*l.b)*255)}if(typeof l.a!=="undefined"&&typeof u.a!=="undefined"){const O=Math.round((e*u.a+(1-e)*l.a)*255);a[t*4+3]=O}else{a[t*4+3]=Math.round(255)}}}if(U.get())for(let e=0;e<a.length;e+=4){a[e+0]=j(a[e+0]);a[e+1]=j(a[e+1]);a[e+2]=j(a[e+2])}if(I.get()=="X")r.initFromData(a,i,1,n,e);if(I.get()=="Y")r.initFromData(a,1,i,n,e);if(I.get()=="Radial"){const _=new Uint8Array(i*i*4);for(let r=0;r<i;r++){for(let n=0;n<i;n++){const A=r-(i-1)/2;const C=n-(i-1)/2;let e=Math.sqrt(A*A+C*C)/i*2;if(E.get())e=CABLES.smoothStep(e);let t=Math.round(e*i)*4;if(t>=i*4)t=i*4-4;_[r*4+n*4*i+0]=a[t+0];_[r*4+n*4*i+1]=a[t+1];_[r*4+n*4*i+2]=a[t+2];_[r*4+n*4*i+3]=Math.round(255)}}a=_;r.initFromData(a,i,i,n,e)}if(I.get()=="XY"||I.get()=="YX"){const _=new Uint8Array(i*i*4);for(let r=0;r<i;r++){let n=r;if(I.get()=="YX")n=i-r-1;for(let t=0;t<i;t++){let e=Math.round((n+t)/2)*4;_[r*4+t*4*i+0]=a[e+0];_[r*4+t*4*i+1]=a[e+1];_[r*4+t*4*i+2]=a[e+2];_[r*4+t*4*i+3]=Math.round(255)}}a=_;r.initFromData(a,i,i,n,e)}const s=[];for(let e=0;e<t.length-1;e++){s.push(t[e].r,t[e].g,t[e].b)}const o=[];for(let e=0;e<t.length-1;e++){o.push(t[e].pos)}B.set(s);G.set(o);w.setRef(r)}};Ops.Gl.GradientTexture.prototype=new CABLES.Op;CABLES.OPS["01380a50-2dbb-4465-ae80-86349b0b717a"]={f:Ops.Gl.GradientTexture,objName:"Ops.Gl.GradientTexture"};Ops.Gl.Textures.CombineTextures=function(){CABLES.Op.apply(this,arguments);const e=this;const k=e.attachments={rgbe2fp_frag:"UNI sampler2D texR;\nUNI sampler2D texG;\nUNI sampler2D texB;\nUNI sampler2D texA;\nIN vec2 texCoord;\n\nUNI float defaultR;\nUNI float defaultG;\nUNI float defaultB;\nUNI float defaultA;\n\nvoid main()\n{\n    float r=defaultR, g=defaultG, b=defaultB, a=defaultA;\n\n    #ifdef HAS_R\n        #ifdef R_SRC_R\n            r=texture(texR,texCoord).r;\n        #endif\n        #ifdef R_SRC_G\n            r=texture(texR,texCoord).g;\n        #endif\n        #ifdef R_SRC_B\n            r=texture(texR,texCoord).b;\n        #endif\n        #ifdef R_SRC_A\n            r=texture(texR,texCoord).a;\n        #endif\n    #endif\n\n    #ifdef HAS_G\n        #ifdef G_SRC_R\n            g=texture(texG,texCoord).r;\n        #endif\n        #ifdef G_SRC_G\n            g=texture(texG,texCoord).g;\n        #endif\n        #ifdef G_SRC_B\n            g=texture(texG,texCoord).b;\n        #endif\n        #ifdef G_SRC_A\n            g=texture(texG,texCoord).a;\n        #endif\n    #endif\n\n    #ifdef HAS_B\n        #ifdef B_SRC_R\n            b=texture(texB,texCoord).r;\n        #endif\n        #ifdef B_SRC_G\n            b=texture(texB,texCoord).g;\n        #endif\n        #ifdef B_SRC_B\n            b=texture(texB,texCoord).b;\n        #endif\n        #ifdef B_SRC_A\n            b=texture(texB,texCoord).a;\n        #endif\n    #endif\n\n    #ifdef HAS_A\n        #ifdef A_SRC_R\n            a=texture(texA,texCoord).r;\n        #endif\n        #ifdef A_SRC_G\n            a=texture(texA,texCoord).g;\n        #endif\n        #ifdef A_SRC_B\n            a=texture(texA,texCoord).b;\n        #endif\n        #ifdef A_SRC_A\n            a=texture(texA,texCoord).a;\n        #endif\n    #endif\n\n    #ifdef INV_R\n        r=1.0-r;\n    #endif\n    #ifdef INV_G\n        g=1.0-g;\n    #endif\n    #ifdef INV_B\n        b=1.0-b;\n    #endif\n    #ifdef INV_A\n        a=1.0-a;\n    #endif\n\n\n    outColor = vec4(r,g,b,a);\n}\n\n\n"};const w=e.inTrigger("Execute"),n=e.inSwitch("Filter",["nearest","linear","mipmap"],"linear"),r=e.inValueSelect("Wrap",["clamp to edge","repeat","mirrored repeat"],"repeat"),i=e.inDropDown("Pixel Format",CGL.Texture.PIXELFORMATS,CGL.Texture.PFORMATSTR_RGBA8UB),t=e.inSwitch("Size",["Biggest","Smallest","R","G","B","A"],"Biggest"),a=e.inTexture("R"),s=e.inSwitch("R Source",["R","G","B","A"],"R"),o=e.inSwitch("R Value",["Source","Invert"],"Source"),l=e.inFloatSlider("R Default",1),u=e.inTexture("G"),c=e.inSwitch("G Source",["R","G","B","A"],"G"),p=e.inSwitch("G Value",["Source","Invert"],"Source"),h=e.inFloatSlider("G Default",1),f=e.inTexture("B"),d=e.inSwitch("B Source",["R","G","B","A"],"B"),g=e.inSwitch("B Value",["Source","Invert"],"Source"),m=e.inFloatSlider("B Default",1),v=e.inTexture("A"),b=e.inSwitch("A Source",["R","G","B","A"],"R"),y=e.inSwitch("A Value",["Source","Invert"],"Source"),x=e.inFloatSlider("A Default",1),B=e.outTrigger("Next"),G=e.outTexture("Texture");e.setPortGroup("Red",[l,a,s,o]);e.setPortGroup("Green",[h,u,c,p]);e.setPortGroup("Blue",[m,f,d,g]);e.setPortGroup("Alpha",[x,v,b,y]);const S=e.patch.cgl;let O=[2,2];let _=true;let A=null;let C,T,I,E,L,N,U,R;l.onChange=h.onChange=m.onChange=x.onChange=a.onChange=u.onChange=f.onChange=i.onChange=v.onChange=()=>{O=P();_=true};a.onLinkChanged=u.onLinkChanged=f.onLinkChanged=v.onLinkChanged=s.onChange=c.onChange=d.onChange=b.onChange=o.onChange=p.onChange=g.onChange=y.onChange=M;t.onChange=n.onChange=r.onChange=()=>{A=null};function P(){let n=4;let r=4;let i=[];if(t.get()=="Biggest"||t.get()=="Smallest"){if(a.get())i.push([a.get().width,a.get().height,a.get().width*a.get().height]);if(u.get())i.push([u.get().width,u.get().height,u.get().width*u.get().height]);if(f.get())i.push([f.get().width,f.get().height,f.get().width*f.get().height]);if(v.get())i.push([v.get().width,v.get().height,v.get().width*v.get().height])}if(t.get()=="Biggest"){let t=0;for(let e=0;e<i.length;e++){if(i[e][2]>t){n=i[e][0];r=i[e][1];t=i[e][2]}}}else if(t.get()=="Smallest"){let t=e.patch.cgl.gl.MAX_TEXTURE_SIZE+1;for(let e=0;e<i.length;e++){if(i[e][2]<t){n=i[e][0];r=i[e][1];t=i[e][2]}}}else if(t.get()=="R"&&a.get()){n=a.get().width;r=a.get().height}else if(t.get()=="G"&&u.get()){n=u.get().width;r=u.get().height}else if(t.get()=="B"&&f.get()){n=f.get().width;r=f.get().height}else if(t.get()=="A"&&v.get()){n=v.get().width;r=v.get().height}return[n,r]}function V(){let e=CGL.Texture.WRAP_REPEAT;if(r.get()=="mirrored repeat")e=CGL.Texture.WRAP_MIRRORED_REPEAT;if(r.get()=="clamp to edge")e=CGL.Texture.WRAP_CLAMP_TO_EDGE;let t=CGL.Texture.FILTER_NEAREST;if(n.get()=="linear")t=CGL.Texture.FILTER_LINEAR;if(n.get()=="mipmap")t=CGL.Texture.FILTER_MIPMAP;if(A)A.dispose();O=P();A=new CGL.CopyTexture(S,"combinetextures",{shader:k.rgbe2fp_frag,isFloatingPointTexture:i.get()==CGL.Texture.PFORMATSTR_RGBA32F,filter:t,wrap:e,width:O[0],height:O[1]});C=new CGL.Uniform(A.bgShader,"t","texR",0);T=new CGL.Uniform(A.bgShader,"t","texG",1);I=new CGL.Uniform(A.bgShader,"t","texB",2);E=new CGL.Uniform(A.bgShader,"t","texA",3);L=new CGL.Uniform(A.bgShader,"f","defaultR",l);N=new CGL.Uniform(A.bgShader,"f","defaultG",h);U=new CGL.Uniform(A.bgShader,"f","defaultB",m);R=new CGL.Uniform(A.bgShader,"f","defaultA",x);M();_=true}function M(){if(!A)return;s.setUiAttribs({greyout:!a.isLinked()});c.setUiAttribs({greyout:!u.isLinked()});d.setUiAttribs({greyout:!f.isLinked()});b.setUiAttribs({greyout:!v.isLinked()});o.setUiAttribs({greyout:!a.isLinked()});p.setUiAttribs({greyout:!u.isLinked()});g.setUiAttribs({greyout:!f.isLinked()});y.setUiAttribs({greyout:!v.isLinked()});l.setUiAttribs({greyout:a.isLinked()});h.setUiAttribs({greyout:u.isLinked()});m.setUiAttribs({greyout:f.isLinked()});x.setUiAttribs({greyout:v.isLinked()});A.bgShader.toggleDefine("R_SRC_R",s.get()=="R");A.bgShader.toggleDefine("R_SRC_G",s.get()=="G");A.bgShader.toggleDefine("R_SRC_B",s.get()=="B");A.bgShader.toggleDefine("R_SRC_A",s.get()=="A");A.bgShader.toggleDefine("G_SRC_R",c.get()=="R");A.bgShader.toggleDefine("G_SRC_G",c.get()=="G");A.bgShader.toggleDefine("G_SRC_B",c.get()=="B");A.bgShader.toggleDefine("G_SRC_A",c.get()=="A");A.bgShader.toggleDefine("B_SRC_R",d.get()=="R");A.bgShader.toggleDefine("B_SRC_G",d.get()=="G");A.bgShader.toggleDefine("B_SRC_B",d.get()=="B");A.bgShader.toggleDefine("B_SRC_A",d.get()=="A");A.bgShader.toggleDefine("A_SRC_R",b.get()=="R");A.bgShader.toggleDefine("A_SRC_G",b.get()=="G");A.bgShader.toggleDefine("A_SRC_B",b.get()=="B");A.bgShader.toggleDefine("A_SRC_A",b.get()=="A");A.bgShader.toggleDefine("INV_R",o.get()=="Invert");A.bgShader.toggleDefine("INV_G",p.get()=="Invert");A.bgShader.toggleDefine("INV_B",g.get()=="Invert");A.bgShader.toggleDefine("INV_A",y.get()=="Invert");A.bgShader.toggleDefine("HAS_R",a.isLinked());A.bgShader.toggleDefine("HAS_G",u.isLinked());A.bgShader.toggleDefine("HAS_B",f.isLinked());A.bgShader.toggleDefine("HAS_A",v.isLinked());_=true}w.onTriggered=()=>{if(!A||_&&!e.patch.cgl.frameStore.shadowPass){if(!A)V();A.bgShader.popTextures();if(a.get())A.bgShader.pushTexture(C,a.get().tex);else A.bgShader.pushTexture(C,CGL.Texture.getEmptyTexture(S).tex);if(u.get())A.bgShader.pushTexture(T,u.get().tex);else A.bgShader.pushTexture(T,CGL.Texture.getEmptyTexture(S).tex);if(f.get())A.bgShader.pushTexture(I,f.get().tex);else A.bgShader.pushTexture(I,CGL.Texture.getEmptyTexture(S).tex);if(v.get())A.bgShader.pushTexture(E,v.get().tex);else A.bgShader.pushTexture(E,CGL.Texture.getEmptyTexture(S).tex);L.setValue(l.get());N.setValue(h.get());U.setValue(m.get());R.setValue(x.get());A.setSize(O[0],O[1]);G.setRef(A.copy(a.get()||u.get()||f.get()||v.get()||CGL.Texture.getEmptyTexture(S)));_=false}B.trigger()}};Ops.Gl.Textures.CombineTextures.prototype=new CABLES.Op;CABLES.OPS["5f33dd4a-a553-4f0f-b3b1-66a80cd240a7"]={f:Ops.Gl.Textures.CombineTextures,objName:"Ops.Gl.Textures.CombineTextures"};Ops.Gl.ImageCompose.ImageCompose_v4=function(){CABLES.Op.apply(this,arguments);const n=this;const e=n.attachments={imgcomp_frag:"IN vec2 texCoord;\nUNI vec4 bgColor;\nUNI sampler2D tex;\n#ifdef USE_UVTEX\nUNI sampler2D UVTex;\n#endif\n\nvoid main()\n{\n\n    #ifndef USE_TEX\n        outColor=bgColor;\n    #endif\n    #ifdef USE_TEX\n        #ifndef USE_UVTEX\n        outColor=texture(tex,texCoord);\n        #else\n        outColor=texture(tex,texture(UVTex,texCoord).xy);\n        #endif\n    #endif\n\n\n\n}\n"};const t=n.patch.cgl,r=n.inTrigger("Render"),i=n.inTexture("Base Texture"),a=n.inTexture("UV Texture"),s=n.inSwitch("Size",["Auto","Canvas","Manual"],"Auto"),o=n.inValueInt("Width",640),l=n.inValueInt("Height",480),u=n.inSwitch("Filter",["nearest","linear","mipmap"],"linear"),c=n.inValueSelect("Wrap",["clamp to edge","repeat","mirrored repeat"],"repeat"),p=n.inSwitch("Anisotropic",["0","1","2","4","8","16"],"0"),h=n.inDropDown("Pixel Format",CGL.Texture.PIXELFORMATS,CGL.Texture.PFORMATSTR_RGBA8UB),f=n.inValueSlider("R",0),d=n.inValueSlider("G",0),g=n.inValueSlider("B",0),m=n.inValueSlider("A",0),v=n.outTrigger("Next"),b=n.outTexture("texture_out",CGL.Texture.getEmptyTexture(t)),y=n.outNumber("Aspect Ratio"),x=n.outNumber("Texture Width"),k=n.outNumber("Texture Height");n.setPortGroup("Texture Size",[s,o,l]);n.setPortGroup("Texture Parameters",[c,p,u,h]);f.setUiAttribs({colorPick:true});n.setPortGroup("Color",[f,d,g,m]);n.toWorkPortsNeedToBeLinked(r);const w=[0,0,0,0];let S=null;let O=null;let _=true;let B=false;let A=null;let G=null;let V=null;let D=null;c.onChange=u.onChange=p.onChange=h.onChange=F;i.onLinkChanged=s.onChange=a.onChange=R;r.onTriggered=n.preRender=M;R();function C(){if(S)S.delete();if(O)O.delete();O=null;S=new CGL.TextureEffect(t,{isFloatingPointTexture:CGL.Texture.isPixelFormatFloat(h.get()),name:n.name});const e=Math.min(t.maxAnisotropic,parseFloat(p.get()));O=new CGL.Texture(t,{anisotropic:e,name:"image_compose_v2_"+n.id,pixelFormat:h.get(),filter:T(),wrap:I(),width:E(),height:L()});S.setSourceTexture(O);x.set(E());k.set(L());y.set(E()/L());b.set(CGL.Texture.getEmptyTexture(t));_=false;R()}function T(){if(u.get()=="nearest")return CGL.Texture.FILTER_NEAREST;else if(u.get()=="linear")return CGL.Texture.FILTER_LINEAR;else if(u.get()=="mipmap")return CGL.Texture.FILTER_MIPMAP}function I(){if(c.get()=="repeat")return CGL.Texture.WRAP_REPEAT;else if(c.get()=="mirrored repeat")return CGL.Texture.WRAP_MIRRORED_REPEAT;else if(c.get()=="clamp to edge")return CGL.Texture.WRAP_CLAMP_TO_EDGE}function E(){let e=0;if(i.get()&&s.get()=="Auto")e=i.get().width;else if(s.get()=="Auto"||s.get()=="Canvas")e=t.canvasWidth;else if(s.get()=="ViewPort")e=t.getViewPort()[2];else e=Math.ceil(o.get());return n.patch.cgl.checkTextureSize(e)}function L(){let e=0;if(i.get()&&s.get()=="Auto")e=i.get().height;else if(s.get()=="Auto"||s.get()=="Canvas")e=t.canvasHeight;else if(s.get()=="ViewPort")e=t.getViewPort()[3];else e=Math.ceil(l.get());return n.patch.cgl.checkTextureSize(e)}function F(){_=true}function j(){if((E()!=O.width||L()!=O.height||O.pixelFormat!=h.get()||O.filter!=T()||O.wrap!=I())&&(E()!==0&&L()!==0)){C();S.setSourceTexture(O);b.set(CGL.Texture.getEmptyTexture(t));b.set(O);N();P()}}function N(){let e=null;if(s.get()=="Manual"){e=null}else if(s.get()=="Auto"){if(i.get())e="Input Texture";else e="Canvas Size";e+=": "+E()+" x "+L()}let t=false;t=s.uiAttribs.info!=e;s.setUiAttribs({info:e});if(t)n.refreshParams()}function U(){if(A)A.toggleDefine("USE_TEX",i.isLinked());if(A)A.toggleDefine("USE_UVTEX",a.isLinked())}function R(){p.setUiAttribs({greyout:T()!=CGL.Texture.FILTER_MIPMAP});f.setUiAttribs({greyout:i.isLinked()});g.setUiAttribs({greyout:i.isLinked()});d.setUiAttribs({greyout:i.isLinked()});m.setUiAttribs({greyout:i.isLinked()});o.setUiAttribs({greyout:s.get()!="Manual"});l.setUiAttribs({greyout:s.get()!="Manual"});if(O)if(CGL.Texture.isPixelFormatFloat(h.get())&&T()==CGL.Texture.FILTER_MIPMAP)n.setUiError("fpmipmap","Don't use mipmap and 32bit at the same time, many systems do not support this.");else n.setUiError("fpmipmap",null);N();U();P()}function P(){if(O)if(i.isLinked()&&i.get()&&O.isFloatingPoint()!=i.get().isFloatingPoint())n.setUiError("textypediff","Warning: Mixing floating point and non floating point texture can result in data/precision loss",1);else n.setUiError("textypediff",null)}n.preRender=()=>{M()};function z(){if(!A){A=new CGL.Shader(t,"copytextureshader");A.setSource(A.getDefaultVertexShader(),e.imgcomp_frag);G=new CGL.Uniform(A,"t","tex",0);V=new CGL.Uniform(A,"t","UVTex",1);D=new CGL.Uniform(A,"4f","bgColor",f,d,g,m);U()}t.pushShader(A);t.currentTextureEffect.bind();if(i.get())t.setTexture(0,i.get().tex);if(a.get())t.setTexture(1,a.get().tex);t.currentTextureEffect.finish();t.popShader()}function M(){if(!S||_)C();t.pushBlend(false);j();const e=t.currentTextureEffect;t.currentTextureEffect=S;t.currentTextureEffect.imgCompVer=3;t.currentTextureEffect.width=o.get();t.currentTextureEffect.height=l.get();S.setSourceTexture(O);S.startEffect(i.get()||CGL.Texture.getEmptyTexture(t,B),true);z();v.trigger();t.pushViewPort(0,0,o.get(),l.get());S.endEffect();b.setRef(S.getCurrentSourceTexture());t.popViewPort();t.popBlend();t.currentTextureEffect=e}};Ops.Gl.ImageCompose.ImageCompose_v4.prototype=new CABLES.Op;CABLES.OPS["17212e2b-d692-464c-8f8d-2d511dd3410a"]={f:Ops.Gl.ImageCompose.ImageCompose_v4,objName:"Ops.Gl.ImageCompose.ImageCompose_v4"};Ops.Gl.ImageCompose.FastBlur_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={blur_frag:"\nUNI sampler2D tex;\n#ifdef USE_MASK\n    UNI sampler2D texMask;\n#endif\nUNI float amount;\nUNI float pass;\n\nIN vec2 texCoord;\n\nUNI float dirX;\nUNI float dirY;\nUNI float width;\nUNI float height;\n\nIN vec2 coord0;\nIN vec2 coord1;\nIN vec2 coord2;\nIN vec2 coord3;\nIN vec2 coord4;\nIN vec2 coord5;\nIN vec2 coord6;\n\n#ifdef HAS_MASK\n    UNI sampler2D imageMask;\n#endif\n\nvoid main()\n{\n    vec4 color = vec4(0.0);\n\n    #ifdef USE_MASK\n        #ifdef MASK_INVERT\n            if(texture(texMask,texCoord).r<0.5)\n            {\n                outColor= texture(tex, texCoord);\n                return;\n            }\n        #endif\n\n        #ifndef MASK_INVERT\n            if(texture(texMask,texCoord).r>0.5)\n            {\n                outColor= texture(tex, texCoord);\n                return;\n            }\n        #endif\n    #endif\n\n    color += texture(tex, coord0) * 0.06927096443792478;\n    color += texture(tex, coord1) * 0.1383328848652136;\n    color += texture(tex, coord2) * 0.21920904690397863;\n    color += texture(tex, coord3) * 0.14637421;\n    color += texture(tex, coord4) * 0.21920904690397863;\n    color += texture(tex, coord5) * 0.1383328848652136;\n    color += texture(tex, coord6) * 0.06927096443795711;\n\n    outColor= color;\n}",blur_vert:"\nIN vec3 vPosition;\nIN vec2 attrTexCoord;\nIN vec3 attrVertNormal;\nOUT vec2 texCoord;\nOUT vec3 norm;\nUNI mat4 projMatrix;\nUNI mat4 mvMatrix;\nUNI mat4 modelMatrix;\n\nUNI float pass;\nUNI float dirX;\nUNI float dirY;\nUNI float width;\nUNI float height;\n\nOUT vec2 coord0;\nOUT vec2 coord1;\nOUT vec2 coord2;\nOUT vec2 coord3;\nOUT vec2 coord4;\nOUT vec2 coord5;\nOUT vec2 coord6;\n\nvoid main()\n{\n    texCoord=attrTexCoord;\n    norm=attrVertNormal;\n    vec4 pos=vec4(vPosition,  1.0);\n    {{MODULE_VERTEX_POSITION}}\n\n    vec2 dir=vec2(dirX,dirY);\n    vec2 res=vec2( (1.) / width , (1.) / height )*dir;\n\n    coord3= attrTexCoord;\n\n    coord0= attrTexCoord + (-3.0368997744118595 * res);\n    coord1= attrTexCoord + (-2.089778445362373 * res);\n    coord2= attrTexCoord + (-1.2004366090034069 * res);\n    coord4= attrTexCoord + (1.2004366090034069 * res);\n    coord5= attrTexCoord + (2.089778445362373* res);\n    coord6= attrTexCoord + (3.0368997744118595 * res);\n\n    #ifdef CLAMP\n        coord0=clamp(coord0,0.0,1.0);\n        coord1=clamp(coord1,0.0,1.0);\n        coord2=clamp(coord2,0.0,1.0);\n        coord3=clamp(coord3,0.0,1.0);\n        coord4=clamp(coord4,0.0,1.0);\n        coord5=clamp(coord5,0.0,1.0);\n        coord6=clamp(coord6,0.0,1.0);\n    #endif\n\n    gl_Position = projMatrix * mvMatrix * pos;\n}\n"};const n=e.inTrigger("render"),r=e.outTrigger("trigger"),i=e.inFloat("Passes",3),a=e.inBool("Clamp",false),s=e.inDropDown("direction",["both","vertical","horizontal"],"both"),o=e.inTexture("Mask"),l=e.inBool("Mask Invert",false);const u=e.patch.cgl;const c=new CGL.Shader(u,"fastblur");e.setPortGroup("Mask",[o,l]);c.setSource(t.blur_vert,t.blur_frag);const p=new CGL.Uniform(c,"t","tex",0),h=new CGL.Uniform(c,"f","dirX",0),f=new CGL.Uniform(c,"f","dirY",0),d=new CGL.Uniform(c,"f","width",0),g=new CGL.Uniform(c,"f","height",0),m=new CGL.Uniform(c,"f","pass",0),v=new CGL.Uniform(c,"f","amount",i.get()),b=new CGL.Uniform(c,"t","texMask",1);i.onChange=()=>{v.setValue(i.get())};let y=0;s.onChange=()=>{if(s.get()=="both")y=0;if(s.get()=="horizontal")y=1;if(s.get()=="vertical")y=2};a.onChange=()=>{c.toggleDefine("CLAMP",a.get())};l.onChange=o.onChange=x;x();function x(){c.toggleDefine("USE_MASK",o.isLinked());c.toggleDefine("MASK_INVERT",l.get());l.setUiAttribs({greyout:!o.isLinked()})}n.onTriggered=function(){if(!CGL.TextureEffect.checkOpInEffect(e,3))return;d.setValue(u.currentTextureEffect.getCurrentSourceTexture().width);g.setValue(u.currentTextureEffect.getCurrentSourceTexture().height);const t=i.get();if(o.get())u.setTexture(1,o.get().tex);for(let e=0;e<t;e++){u.pushShader(c);m.setValue(e/t);if(y===0||y==2){u.currentTextureEffect.bind();u.setTexture(0,u.currentTextureEffect.getCurrentSourceTexture().tex);h.setValue(0);f.setValue(1+e*e);u.currentTextureEffect.finish()}if(y===0||y==1){u.currentTextureEffect.bind();u.setTexture(0,u.currentTextureEffect.getCurrentSourceTexture().tex);h.setValue(1+e*e);f.setValue(0);u.currentTextureEffect.finish()}u.popShader()}r.trigger()}};Ops.Gl.ImageCompose.FastBlur_v2.prototype=new CABLES.Op;CABLES.OPS["61ed277f-d096-43b2-9de8-dc87fb3a9169"]={f:Ops.Gl.ImageCompose.FastBlur_v2,objName:"Ops.Gl.ImageCompose.FastBlur_v2"};Ops.Gl.ImageCompose.Vignette_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={vignette_frag:"IN vec2 texCoord;\nUNI sampler2D tex;\nUNI float lensRadius1;\nUNI float aspect;\nUNI float amount;\nUNI float strength;\nUNI float sharp;\n\nUNI vec3 vcol;\n\n{{CGL.BLENDMODES3}}\n\nvoid main()\n{\n    vec4 base=texture(tex,texCoord);\n    vec4 vvcol=vec4(vcol,1.0);\n    vec4 col=texture(tex,texCoord);\n    vec2 tcPos=vec2(texCoord.x,(texCoord.y-0.5)*aspect+0.5);\n    float dist = distance(tcPos, vec2(0.5,0.5));\n    float am = (1.0-smoothstep( (lensRadius1+0.5), (lensRadius1*0.99+0.5)*sharp, dist));\n\n    col=mix(col,vvcol,am*strength);\n\n    #ifndef ALPHA\n        outColor=cgl_blendPixel(base,col,amount);\n    #endif\n\n    #ifdef ALPHA\n        outColor=vec4(base.rgb,base.a*(1.0-am*strength));\n    #endif\n}\n"};const n=e.inTrigger("Render"),r=CGL.TextureEffect.AddBlendSelect(e,"Blend Mode","normal"),i=CGL.TextureEffect.AddBlendAlphaMask(e),a=e.inValueSlider("Amount",1),s=e.outTrigger("Trigger"),o=e.inValueSlider("Strength",1),l=e.inValueSlider("Radius",.3),u=e.inValueSlider("Sharp",.25),c=e.inValue("Aspect",1),p=e.inValueSlider("r",0),h=e.inValueSlider("g",0),f=e.inValueSlider("b",0),d=e.inBool("Alpha",false);p.setUiAttribs({colorPick:true});const g=e.patch.cgl;const m=new CGL.Shader(g,"vignette");m.setSource(m.getDefaultVertexShader(),t.vignette_frag);const v=new CGL.Uniform(m,"t","tex",0),b=new CGL.Uniform(m,"f","amount",a),y=new CGL.Uniform(m,"f","lensRadius1",l),x=new CGL.Uniform(m,"f","aspect",c),S=new CGL.Uniform(m,"f","strength",o),O=new CGL.Uniform(m,"f","sharp",u),_=new CGL.Uniform(m,"3f","vcol",p,h,f);CGL.TextureEffect.setupBlending(e,m,r,a,i);d.onChange=A;A();function A(){m.toggleDefine("ALPHA",d.get());p.setUiAttribs({greyout:d.get()});h.setUiAttribs({greyout:d.get()});f.setUiAttribs({greyout:d.get()})}n.onTriggered=function(){if(!CGL.TextureEffect.checkOpInEffect(e,3))return;g.pushShader(m);g.currentTextureEffect.bind();g.setTexture(0,g.currentTextureEffect.getCurrentSourceTexture().tex);g.currentTextureEffect.finish();g.popShader();s.trigger()}};Ops.Gl.ImageCompose.Vignette_v3.prototype=new CABLES.Op;CABLES.OPS["588302cb-f5a7-4129-90d2-ba66212d69e5"]={f:Ops.Gl.ImageCompose.Vignette_v3,objName:"Ops.Gl.ImageCompose.Vignette_v3"};Ops.Gl.TextMeshMSDF_v2=function(){CABLES.Op.apply(this,arguments);const i=this;const y=i.attachments={textmeshsdf_frag:"\nUNI sampler2D tex0;\nUNI sampler2D tex1;\nUNI sampler2D tex2;\nUNI sampler2D tex3;\n\nIN vec2 texCoord;\nIN vec4 fragAttrColors;\n\nUNI vec4 color;\nUNI vec2 texSize;\n\n#ifdef BORDER\n    UNI float borderWidth;\n    UNI float borderSmooth;\n    UNI vec3 colorBorder;\n#endif\n\n#ifdef TEXTURE_COLOR\nUNI sampler2D texMulColor;\n#endif\n#ifdef TEXTURE_MASK\nUNI sampler2D texMulMask;\n#endif\n\nUNI float smoothing;\nIN float texIndex;\n\n#ifdef SHADOW\n    UNI float shadowWidth;\n#endif\n\n\nfloat median(float r, float g, float b)\n{\n    return max(min(r, g), min(max(r, g), b));\n}\n\nvoid main()\n{\n    vec4 bgColor=vec4(0.0,0.0,0.0,0.0);\n    vec4 fgColor=color;\n    float opacity=1.0;\n\n    #ifndef SDF\n        if(int(texIndex)==0) outColor = texture(tex0, texCoord);\n        if(int(texIndex)==1) outColor = texture(tex1, texCoord);\n        if(int(texIndex)==2) outColor = texture(tex2, texCoord);\n        if(int(texIndex)==3) outColor = texture(tex3, texCoord);\n\n        return;\n    #endif\n\n\n    #ifdef TEXTURE_COLOR\n        fgColor.rgb *= texture(texMulColor, vec2(0.0,0.0)).rgb; //todo texcoords from char positioning\n    #endif\n    #ifdef TEXTURE_MASK\n        opacity *= texture(texMulMask, vec2(0.0,0.0)).r; //todo texcoords from char positioning\n    #endif\n\n\n    #ifdef SHADOW\n        vec2 msdfUnit1 = texSize;\n        vec2 tcv=vec2(texCoord.x-0.002,texCoord.y-0.002);\n        vec3 smpl1;\n        if(int(texIndex)==0) smpl1 = texture(tex0, tcv).rgb;\n        if(int(texIndex)==1) smpl1 = texture(tex1, tcv).rgb;\n        if(int(texIndex)==2) smpl1 = texture(tex2, tcv).rgb;\n        if(int(texIndex)==3) smpl1 = texture(tex3, tcv).rgb;\n\n        float sigDist1 = median(smpl1.r, smpl1.g, smpl1.b) - 0.001;\n        float opacity1 = smoothstep(0.0,0.9,sigDist1*sigDist1);\n        outColor = mix(bgColor, vec4(0.0,0.0,0.0,1.0), opacity1);\n    #endif\n\n    vec2 msdfUnit = 8.0/texSize;\n    vec3 smpl;\n\n    if(int(texIndex)==0) smpl = texture(tex0, texCoord).rgb;\n    if(int(texIndex)==1) smpl = texture(tex1, texCoord).rgb;\n    if(int(texIndex)==2) smpl = texture(tex2, texCoord).rgb;\n    if(int(texIndex)==3) smpl = texture(tex3, texCoord).rgb;\n\n\n    float sigDist = median(smpl.r, smpl.g, smpl.b) - 0.5;\n    sigDist *= dot(msdfUnit, (0.5+(smoothing-0.5))/fwidth(texCoord));\n    opacity *= clamp(sigDist + 0.5, 0.0, 1.0);\n\n    #ifdef BORDER\n        float sigDist2 = median(smpl.r, smpl.g, smpl.b) - 0.01;\n        float bw=borderWidth*0.6+0.24;\n        float opacity2 = smoothstep(bw-borderSmooth,bw+borderSmooth,sigDist2*sigDist2);\n        fgColor=mix(fgColor,vec4(colorBorder,1.0),1.0-opacity2);\n    #endif\n\n    if(color.a==0.0)discard;\n\n    outColor = mix(outColor, fgColor, opacity*color.a);\n\n#ifdef HAS_ATTR_COLORS\n    outColor*=fragAttrColors;\n#endif\n}\n\n",textmeshsdf_vert:"UNI sampler2D tex1;\nUNI sampler2D tex2;\nUNI sampler2D tex3;\nUNI sampler2D tex4;\n\nUNI mat4 projMatrix;\nUNI mat4 modelMatrix;\nUNI mat4 viewMatrix;\n\nIN vec3 vPosition;\nIN vec2 attrTexCoord;\nIN mat4 instMat;\nIN vec2 attrTexOffsets;\nIN vec2 attrSize;\nIN vec2 attrTcSize;\nIN float attrPage;\nIN vec4 attrColors;\n\nOUT vec2 texCoord;\nOUT float texIndex;\nOUT vec4 fragAttrColors;\n\n\n\n\nconst float mulSize=0.01;\n\nvoid main()\n{\n    texCoord=(attrTexOffsets+attrTexCoord*attrTcSize);\n    texCoord.y=1.0-texCoord.y;\n\n    mat4 instMVMat=instMat;\n    vec4 vert=vec4( vPosition, 1. );\n    vert.x*=attrSize.x*mulSize;\n    vert.y*=attrSize.y*mulSize;\n\n    fragAttrColors=attrColors;\n\n    texIndex=attrPage+0.4; // strange ios rounding errors?!\n\n    mat4 mvMatrix=viewMatrix * modelMatrix * instMVMat;\n\n    gl_Position = projMatrix * mvMatrix * vert;\n}\n"};const x=i.inTrigger("Render"),F=i.inString("Text","cables"),a=i.inDropDown("Font",[],"",true),t=i.inFloat("Scale",.25),A=i.inFloat("Letter Spacing",0),C=i.inFloat("Line Height",1),T=i.inSwitch("Align",["Left","Center","Right"],"Center"),e=i.inSwitch("Vertical Align",["Zero","Top","Middle","Bottom"],"Middle"),n=i.inValueSlider("r",1),S=i.inValueSlider("g",1),O=i.inValueSlider("b",1),_=i.inValueSlider("a",1),r=i.inBool("SDF",true),j=i.inValueSlider("Smoothing",.3),s=i.inBool("Border",false),o=i.inFloatSlider("Border Width",.5),l=i.inFloatSlider("Smoothness",.25),u=i.inValueSlider("Border r",1),z=i.inValueSlider("Border g",1),H=i.inValueSlider("Border b",1),X=i.inBool("Shadow",false),c=i.inTexture("Texture Color"),p=i.inTexture("Texture Mask"),Y=i.inArray("Positions"),W=i.inArray("Scalings"),q=i.inArray("Rotations"),I=i.inArray("Colors"),Z=i.outTrigger("Next"),K=i.outArray("Positions Original",null,3),Q=i.outArray("Scales",null,2),J=i.outNumber("Num Lines"),$=i.outNumber("Width"),ee=i.outNumber("Height"),te=i.outNumber("Start Y"),ne=i.outNumber("Num Chars");i.setPortGroup("Size",[A,C,t]);i.setPortGroup("Character Transformations",[W,q,Y]);i.setPortGroup("Alignment",[T,e]);i.setPortGroup("Color",[n,S,O,_,r]);i.setPortGroup("Border",[u,z,H,l,o,s]);n.setUiAttribs({colorPick:true});u.setUiAttribs({colorPick:true});const E=i.patch.cgl;const re="font_data_";const ie=re.length;const ae=vec3.create();const se=vec3.create();const h=new CGL.Shader(E,"TextMeshSDF");let f=null;let L=null;let N=null;let d=true;let U=null;let R=null;let P=false;let g=1;let m=0,oe=0;let M=0;let k,w,B,G;let V=true;let D=null;let v=0;if(E.glVersion==1){E.gl.getExtension("OES_standard_derivatives");h.enableExtension("GL_OES_standard_derivatives")}h.setSource(y.textmeshsdf_vert,y.textmeshsdf_frag);const le=new CGL.Uniform(h,"t","tex0",0),ue=new CGL.Uniform(h,"t","tex1",1),ce=new CGL.Uniform(h,"t","tex2",2),pe=new CGL.Uniform(h,"t","tex3",3),he=new CGL.Uniform(h,"t","texMulColor",4),fe=new CGL.Uniform(h,"t","texMulMask",5),de=new CGL.Uniform(h,"4f","color",n,S,O,_),ge=new CGL.Uniform(h,"3f","colorBorder",u,z,H),me=new CGL.Uniform(h,"2f","texSize",0,0),ve=new CGL.Uniform(h,"f","smoothing",j),be=new CGL.Uniform(h,"f","borderSmooth",l),ye=new CGL.Uniform(h,"f","borderWidth",o);t.onChange=Oe;q.onChange=Y.onChange=W.onChange=function(){V=true};c.onChange=p.onChange=X.onChange=s.onChange=r.onChange=xe;I.onLinkChanged=()=>{xe();V=true;d=true};I.onChange=()=>{d=true;if(R&&I.get()&&I.isLinked())R.setAttribute("attrColors",new Float32Array(I.get()),4,{instanced:true})};T.onChange=F.onChange=A.onChange=C.onChange=function(){d=true};e.onChange=_e;i.patch.addEventListener("variablesChanged",b);i.patch.addEventListener("FontLoadedMSDF",b);a.onChange=Se;xe();Oe();b();function xe(){h.toggleDefine("SDF",r.get());h.toggleDefine("SHADOW",X.get());h.toggleDefine("BORDER",s.get());h.toggleDefine("TEXTURE_COLOR",c.isLinked());h.toggleDefine("TEXTURE_MASK",p.isLinked());h.toggleDefine("HAS_ATTR_COLORS",I.isLinked());u.setUiAttribs({greyout:!s.get()});z.setUiAttribs({greyout:!s.get()});H.setUiAttribs({greyout:!s.get()});l.setUiAttribs({greyout:!s.get()});o.setUiAttribs({greyout:!s.get()})}function Se(){b();const e=re+a.get();L=null;f=null;N={};const t=i.patch.getVar(e);if(!t||!t.getValue()){L=null;i.warn("no varname",e);return}L=t.getValue().data;if(!L){return}const n=t.getValue().basename;const r=i.patch.getVar("font_tex_"+n);if(!r){f=null;L=null;return}f=r.getValue();for(let e=0;e<L.chars.length;e++)N[L.chars[e].char]=L.chars[e];d=true}function b(){const e=i.patch.getVars();const t=["..."];for(const n in e)if(e[n].type=="fontData")t.push(n.substr(ie));a.uiAttribs.values=t}function Oe(){const e=t.get();vec3.set(se,e,e,e);vec3.set(ae,0,v*e,0);$.set(oe*e);ee.set(m*e);te.set((w+v)*e)}function _e(){if(B==undefined)return;if(e.get()=="Top")g=0;else if(e.get()=="Middle")g=1;else if(e.get()=="Bottom")g=2;else if(e.get()=="Zero")g=3;v=0;oe=Math.abs(B-G);m=Math.abs(k-w);if(g===1)v=m/2;else if(g===2)v=m;if(g!=0)v-=M;Oe()}function Ae(){V=false;const t=[];const n=Y.get()||K.get();const r=W.get();const i=q.get();for(let e=0;e<R.numInstances;e++){const a=mat4.create();mat4.translate(a,a,[n[e*3+0],n[e*3+1],n[e*3+2]]);if(r)mat4.scale(a,a,[r[e*3+0],r[e*3+1],r[e*3+2]]);if(i){mat4.rotateX(a,a,i[e*3+0]*CGL.DEG2RAD);mat4.rotateY(a,a,i[e*3+1]*CGL.DEG2RAD);mat4.rotateZ(a,a,i[e*3+2]*CGL.DEG2RAD)}t.push(Array.prototype.slice.call(a))}D=[].concat.apply([],t)}x.onTriggered=function(){if(!L){i.setUiError("nodata","No font data!");i.setUiError("msdfhint","Use the FontMSDF op to create font and texture.",0);Se();Z.trigger();return}if(!f){i.setUiError("nodata","No font texture");i.setUiError("msdfhint","Use the FontMSDF op to create font and texture.",0);Se();Z.trigger();return}i.setUiError("nodata",null);i.setUiError("msdfhint",null);if(d){Te();d=false}if(R&&R.numInstances>0){E.pushShader(h);if(f[0])me.setValue([f[0].width,f[0].height]);if(f[0])E.setTexture(0,f[0].tex);else E.setTexture(0,CGL.Texture.getEmptyTexture(E).tex);if(f[1])E.setTexture(1,f[1].tex);else E.setTexture(1,CGL.Texture.getEmptyTexture(E).tex);if(f[2])E.setTexture(2,f[2].tex);else E.setTexture(2,CGL.Texture.getEmptyTexture(E).tex);if(f[3])E.setTexture(3,f[3].tex);else E.setTexture(3,CGL.Texture.getEmptyTexture(E).tex);if(c.get())E.setTexture(4,c.get().tex);if(p.get())E.setTexture(5,p.get().tex);E.pushModelMatrix();mat4.translate(E.mMatrix,E.mMatrix,ae);if(V)Ae();if(D)R.setAttribute("instMat",new Float32Array(D),16,{instanced:true});if(E.getShader())E.getShader().define("INSTANCING");if(!P){mat4.scale(E.mMatrix,E.mMatrix,se);R.render(E.getShader())}E.popModelMatrix();E.setTexture(0,null);E.popShader()}Z.trigger()};function Ce(e){return N[String(e)]||N["?"]||N._||N.X}function Te(){if(!L||!N){ne.set(0);return}const e=String(F.get()+"");if(!U){U=new CGL.Geometry("textmesh");U.vertices=[.5,.5,0,-.5,.5,0,.5,-.5,0,-.5,-.5,0];U.normals=[0,0,0,0,0,0,0,0,0,0,0,0];U.texCoords=new Float32Array([1,0,0,0,1,1,0,1]);U.verticesIndices=[0,1,2,2,1,3]}if(R)R.dispose();R=new CGL.Mesh(E,U);const i=e.split("\n");const a=[];const s=[];const o=[];const t=[];const l=[];const u=[];let c=0;const p=[];const h=.01;J.set(i.length);k=99999;w=-99999;B=99999;G=-99999;M=0;for(let e=0;e<L.chars.length;e++){if(L.chars[e].height)M+=L.chars[e].height}M/=L.chars.length;M*=h;for(let r=0;r<i.length;r++){const f=i[r];const d=f.length;let t=0;for(let e=0;e<d;e++){const g=f.substring(e,e+1);const m=Ce(g);if(m)t+=m.xadvance*h+A.get()}let n=0;if(T.get()=="Right")n-=t;else if(T.get()=="Center")n-=t/2;for(let t=0;t<d;t++){const v=mat4.create();const g=f.substring(t,t+1);const m=Ce(g);if(!m)continue;u.push(m.page||0);o.push(m.width,m.height);s.push(m.x/L.common.scaleW,m.y/L.common.scaleH);const b=m.width/L.common.scaleW;const y=m.height/L.common.scaleH;const x=m.yoffset/L.common.scaleH;const S=m.xoffset/L.common.scaleW;if(g==" ")l.push(0,0);else l.push(b,y);mat4.identity(v);let e=m.xadvance/2*h;n+=e;const O=n+m.xoffset/2*h;const _=r*-C.get()+M-h*(m.yoffset+m.height/2);B=Math.min(O-b,B);G=Math.max(O+b,G);k=Math.min(_-y-M/2,k);w=Math.max(_+y+M/2,w);mat4.translate(v,v,[O,_,0]);p.push(O,_,0);e=m.xadvance/2*h+A.get();n+=e;B=Math.min(n-b,B);G=Math.max(n+b,G);a.push(Array.prototype.slice.call(v));c++}}D=[].concat.apply([],a);P=false;if(D.length==0)P=true;R.numInstances=D.length/16;ne.set(R.numInstances);if(R.numInstances==0){P=true;return}R.setAttribute("instMat",new Float32Array(D),16,{instanced:true});R.setAttribute("attrTexOffsets",new Float32Array(s),2,{instanced:true});R.setAttribute("attrTcSize",new Float32Array(l),2,{instanced:true});R.setAttribute("attrSize",new Float32Array(o),2,{instanced:true});R.setAttribute("attrPage",new Float32Array(u),1,{instanced:true});if(I.isLinked())R.setAttribute("attrColors",new Float32Array(I.get()),4,{instanced:true});Q.set(o);_e();V=true;K.setRef(p)}};Ops.Gl.TextMeshMSDF_v2.prototype=new CABLES.Op;CABLES.OPS["b5c99363-a749-4040-884b-66f91294bcad"]={f:Ops.Gl.TextMeshMSDF_v2,objName:"Ops.Gl.TextMeshMSDF_v2"};Ops.Math.Round=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValueFloat("number"),r=e.inInt("Decimal Places",0),i=e.outNumber("result");let a=0;n.onChange=o;r.onChange=s;s();function s(){a=Math.pow(10,r.get());o()}function o(){i.set(Math.round(n.get()*a)/a)}};Ops.Math.Round.prototype=new CABLES.Op;CABLES.OPS["1a1ef636-6d02-42ba-ae1e-627b917d0d2b"]={f:Ops.Math.Round,objName:"Ops.Math.Round"};Ops.String.NumberToString_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValue("Number"),r=e.outString("Result");n.onChange=i;i();function i(){r.set(String(n.get()||0))}};Ops.String.NumberToString_v2.prototype=new CABLES.Op;CABLES.OPS["5c6d375a-82db-4366-8013-93f56b4061a9"]={f:Ops.String.NumberToString_v2,objName:"Ops.String.NumberToString_v2"};Ops.Gl.FontMSDF_v2=function(){CABLES.Op.apply(this,arguments);const o=this;const e=o.attachments={};const l=o.inString("Font Name",CABLES.uuid()),u=o.inUrl("Font Data","/assets/library/fonts_msdf/worksans-regular_int.json"),c=o.inUrl("Font Image","/assets/library/fonts_msdf/worksans-regular_int.png"),p=o.inUrl("Font Image 1"),h=o.inUrl("Font Image 2"),f=o.inUrl("Font Image 3"),d=o.outBool("Loaded"),g=o.outNumber("Total Chars"),m=o.outString("Chars"),v=o.patch.cgl;let b=false,y=false,x=0;l.onChange=u.onChange=c.onChange=p.onChange=h.onChange=f.onChange=n;const S=[];function O(){const e=b&&y;if(!d.get()&&e)o.patch.emitEvent("FontLoadedMSDF");d.set(e)}o.onFileChanged=function(e){if(c.get()&&c.get().indexOf(e)>-1||p.get()&&p.get().indexOf(e)>-1||h.get()&&h.get().indexOf(e)>-1||f.get()&&f.get().indexOf(e)>-1){n()}};let t="";function n(){if(!u.get()||!c.get())return;S.length=0;o.patch.deleteVar("font_data_"+t);o.patch.deleteVar("font_tex_"+t);t=l.get();const i="font_data_"+l.get();const n="font_tex_"+l.get();o.patch.setVarValue(i,{});o.patch.setVarValue(n,S);o.patch.getVar(i).type="fontData";o.patch.getVar(n).type="fontTexture";b=y=false;O();o.patch.loading.finished(x);x=o.patch.loading.start("jsonFile",""+u.get(),o);o.setUiError("invaliddata",null);o.setUiError("jsonerr",null);o.setUiError("texurlerror",null);const e=o.patch.getFilePath(String(u.get()));v.patch.loading.addAssetLoadingTask(()=>{CABLES.ajax(e,(e,r,t)=>{if(e){o.logError(e);return}try{let t=r;if(typeof t==="string")t=JSON.parse(r);if(!t.chars||!t.info||!t.info.face){o.setUiError("invaliddata","data file is invalid");return}g.set(t.chars.length);let n="";for(let e=0;e<t.chars.length;e++)n+=t.chars[e].char;m.set(n);o.setUiAttrib({extendTitle:t.info.face});o.patch.setVarValue(i,null);o.patch.setVarValue(i,{name:CABLES.basename(u.get()),basename:l.get(),data:t});o.patch.loading.finished(x);b=true;O()}catch(e){o.patch.setVarValue(i,null);o.patch.setVarValue(n,null);o.logError(e);o.setUiError("jsonerr","Problem while loading json:<br/>"+e);o.patch.loading.finished(x);O();d.set(false)}})});for(let t=0;t<4;t++){const r=t;let e=c;if(t==1)e=p;if(t==2)e=h;if(t==3)e=f;if(!e.get())continue;const a=v.patch.loading.start("textureOp",e.get(),o);const s=o.patch.getFilePath(String(e.get()));CGL.Texture.load(v,s,function(e,t){if(e){o.setUiError("texurlerror","could not load texture");v.patch.loading.finished(a);y=false;return}S[r]=t;o.patch.setVarValue(n,null);o.patch.setVarValue(n,S);y=true;v.patch.loading.finished(a);O()},{filter:CGL.Texture.FILTER_LINEAR,flip:false})}}};Ops.Gl.FontMSDF_v2.prototype=new CABLES.Op;CABLES.OPS["6cbd5d67-25d5-4936-a2ad-3ee8ed478570"]={f:Ops.Gl.FontMSDF_v2,objName:"Ops.Gl.FontMSDF_v2"};Ops.Math.Incrementor=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTriggerButton("Increment"),r=e.inTriggerButton("Decrement"),i=e.inBool("Limit",false),a=e.inValueInt("Length"),s=e.inTriggerButton("Reset"),o=e.inSwitch("Mode",["Rewind","Stop at Max"],"Rewind"),l=e.inValueInt("Default",0),u=e.outTrigger("Changed"),c=e.outNumber("Value"),p=e.outTrigger("Restarted");const h=0;const f=1;c.ignoreValueSerialize=true;a.set(10);let d=0;let g=h;c.set(0);a.onTriggered=s;l.onChange=v;s.onTriggered=v;i.onChange=m;m();o.onChange=()=>{if(o.get()=="Rewind"){g=h}if(o.get()=="Stop at Max"){g=f}};function m(){a.setUiAttribs({greyout:!i.get()})}function v(){c.set(null);d=l.get();c.set(d);p.trigger()}r.onTriggered=function(){d--;if(i.get()){if(g==h&&d<0)d=a.get()-1;if(g==f&&d<0)d=0}c.set(d);u.trigger()};n.onTriggered=function(){d++;if(i.get()){if(g==h&&d>=a.get()){d=0;p.trigger()}if(g==f&&d>=a.get())d=a.get()-1}c.set(d);u.trigger()}};Ops.Math.Incrementor.prototype=new CABLES.Op;CABLES.OPS["45cc0011-ada8-4423-8f5b-39a3810b8389"]={f:Ops.Math.Incrementor,objName:"Ops.Math.Incrementor"};Ops.Math.SmootherStep=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValueFloat("val",0),r=e.inValueFloat("min",0),i=e.inValueFloat("max",1),a=e.outNumber("result");n.onChange=i.onChange=r.onChange=s;s();function s(){let e=Math.max(0,Math.min(1,(n.get()-r.get())/(i.get()-r.get())));a.set(e*e*e*(e*(e*6-15)+10)*(i.get()-r.get()))}};Ops.Math.SmootherStep.prototype=new CABLES.Op;CABLES.OPS["c66da84f-ff2f-45de-b3c2-557bdf1cb946"]={f:Ops.Math.SmootherStep,objName:"Ops.Math.SmootherStep"};Ops.String.StringCompose_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inString("Format","hello $a, $b $c und $d"),r=e.inString("String A","world"),i=e.inString("String B",1),a=e.inString("String C",2),s=e.inString("String D",3),o=e.inString("String E"),l=e.inString("String F"),u=e.outString("Result");n.onChange=r.onChange=i.onChange=a.onChange=s.onChange=o.onChange=l.onChange=c;c();function c(){var e=n.get()||"";if(typeof e!="string")e="";e=e.replace(/\$a/g,r.get());e=e.replace(/\$b/g,i.get());e=e.replace(/\$c/g,a.get());e=e.replace(/\$d/g,s.get());e=e.replace(/\$e/g,o.get());e=e.replace(/\$f/g,l.get());u.set(e)}};Ops.String.StringCompose_v3.prototype=new CABLES.Op;CABLES.OPS["6afea9f4-728d-4f3c-9e75-62ddc1448bf0"]={f:Ops.String.StringCompose_v3,objName:"Ops.String.StringCompose_v3"};Ops.Gl.Meshes.Circle_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("render"),N=e.inValue("radius",.5),U=e.inValueSlider("innerRadius",0),R=e.inValueInt("segments",40),P=e.inValueSlider("percent",1),M=e.inValue("steps",0),k=e.inValueBool("invertSteps",false),w=e.inSwitch("mapping",["flat","round"]),B=e.inValueBool("Spline",false),r=e.inValueBool("Draw",true),i=e.outTrigger("trigger"),G=e.outObject("geometry",null,"geometry");e.setPortGroup("Size",[N,U]);e.setPortGroup("Display",[P,M,k]);e.toWorkShouldNotBeChild("Ops.Gl.TextureEffects.ImageCompose",CABLES.OP_PORT_TYPE_FUNCTION);r.setUiAttribs({title:"Render mesh"});w.set("flat");w.onChange=R.onChange=N.onChange=U.onChange=P.onChange=M.onChange=k.onChange=B.onChange=p;G.ignoreValueSerialize=true;const a=e.patch.cgl;let V=new CGL.Geometry("circle");let D=null;const s=-1;let o=0;let l=null;let F=true;n.onTriggered=u;e.preRender=()=>{u()};n.onLinkChanged=function(){if(!n.isLinked())G.set(null);else G.setRef(V)};function u(){if(F)c();if(!CGL.TextureEffect.checkOpNotInTextureEffect(e))return;l=e.patch.cg.getShader();if(!l)return;o=l.glPrimitive;if(B.get())l.glPrimitive=a.gl.LINE_STRIP;if(r.get()&&D)D.render(l);i.trigger();l.glPrimitive=o}function c(){const n=Math.max(3,Math.floor(R.get()));V.clear();const t=[];const r=[];const i=[];const a=[];const s=[];let o=0,l=0;let u=0,c=0;let p=0,h=0;let f=0,d=0;let g=0,m=0;let v=0,b=0;let y=0,x=0;let S=0,O=0;const _=Math.max(0,P.get());const A=[];if(B.get()){let e=0;let t=0;const C=[];for(o=0;o<=n*_;o++){l=360/n*o*CGL.DEG2RAD;S=Math.cos(l)*N.get();O=Math.sin(l)*N.get();x=.5;if(o>0){A.push(e);A.push(t);A.push(0);y=1-(o-1)/n;C.push(y,x)}A.push(S);A.push(O);A.push(0);e=S;t=O}V.setPointVertices(A)}else if(U.get()<=0){for(o=0;o<=n*_;o++){l=360/n*o*CGL.DEG2RAD;S=Math.cos(l)*N.get();O=Math.sin(l)*N.get();if(w.get()=="flat"){y=(Math.cos(l)+1)/2;x=1-(Math.sin(l)+1)/2;v=.5;b=.5}else if(w.get()=="round"){y=1-o/n;x=0;v=y;b=1}t.push([0,0,0],[u,c,0],[S,O,0]);r.push(v,b,p,h,y,x);i.push(0,0,1,0,0,1,0,0,1);a.push(1,0,0,1,0,0,1,0,0);s.push(0,-1,0,0,-1,0,0,-1,0);p=y;h=x;u=S;c=O}V=CGL.Geometry.buildFromFaces(t,"circle");V.vertexNormals=i;V.tangents=a;V.biTangents=s;V.texCoords=r}else{let e=0;const T=n*_;const I=0;for(o=0;o<=T;o++){e++;l=360/n*o*CGL.DEG2RAD;S=Math.cos(l)*N.get();O=Math.sin(l)*N.get();const E=Math.cos(l)*U.get()*N.get();const L=Math.sin(l)*U.get()*N.get();if(w.get()=="round"){y=1-o/n;x=0;v=y;b=1}if(M.get()===0||e%parseInt(M.get(),10)===0&&!k.get()||e%parseInt(M.get(),10)!==0&&k.get()){t.push([E,L,0],[u,c,0],[S,O,0]);t.push([f,d,0],[u,c,0],[E,L,0]);r.push(y,0,p,0,v,1,y,1,p,0,g,1);i.push(0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1);a.push(1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,1,0,0);s.push(0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,-1)}g=v;m=b;p=y;h=x;u=S;c=O;f=E;d=L}V=CGL.Geometry.buildFromFaces(t,"circle");V.vertexNormals=i;V.tangents=a;V.biTangents=s;if(w.get()=="flat")V.mapTexCoords2d();else V.texCoords=r}G.setRef(V);if(V.vertices.length==0)return;if(D)D.dispose();D=null;D=e.patch.cg.createMesh(V,{opId:e.id});F=false}function p(){F=true}e.onDelete=function(){if(D)D.dispose()}};Ops.Gl.Meshes.Circle_v3.prototype=new CABLES.Op;CABLES.OPS["ae07830b-91c3-4cbe-a7d6-d3b737392c16"]={f:Ops.Gl.Meshes.Circle_v3,objName:"Ops.Gl.Meshes.Circle_v3"};Ops.Array.StringToArray_v2=function(){CABLES.Op.apply(this,arguments);const r=this;const e=r.attachments={};const i=r.inStringEditor("text","1,2,3"),a=r.inString("separator",","),s=r.inValueBool("Numbers",true),o=r.inValueBool("Trim",true),l=r.inBool("Split Lines",false),u=r.outArray("array"),c=r.outTrigger("Parsed"),p=r.outNumber("length");i.setUiAttribs({ignoreBigPort:true});i.onChange=a.onChange=s.onChange=o.onChange=t;l.onChange=()=>{a.setUiAttribs({greyout:l.get()});t()};t();function t(){if(!i.get()){u.set(null);u.set([]);p.set(0);return}let e=i.get();if(o.get()&&e){e=e.replace(/^\s+|\s+$/g,"");e=e.trim()}let n;let t=a.get();if(a.get()==="\\n")t="\n";if(l.get())n=e.split("\n");else n=e.split(t);if(n[n.length-1]==="")n.length-=1;p.set(n.length);if(o.get()){for(let e=0;e<n.length;e++){n[e]=n[e].replace(/^\s+|\s+$/g,"");n[e]=n[e].trim()}}r.setUiError("notnum",null);if(s.get()){let t=false;for(let e=0;e<n.length;e++){n[e]=Number(n[e]);if(!CABLES.UTILS.isNumeric(n[e])){t=true}}if(t){r.setUiError("notnum","Parse Error / Not all values numerical!",1)}}u.setRef(n);c.trigger()}};Ops.Array.StringToArray_v2.prototype=new CABLES.Op;CABLES.OPS["c974de41-4ce4-4432-b94d-724741109c71"]={f:Ops.Array.StringToArray_v2,objName:"Ops.Array.StringToArray_v2"};Ops.Array.ArrayGetString=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inArray("array"),r=e.inValueInt("index"),i=e.outString("result");n.ignoreValueSerialize=true;r.onChange=a;n.onChange=function(){a()};function a(){const e=n.get();if(e)i.set(e[r.get()])}};Ops.Array.ArrayGetString.prototype=new CABLES.Op;CABLES.OPS["be8f16c0-0c8a-48a2-a92b-45dbf88c76c1"]={f:Ops.Array.ArrayGetString,objName:"Ops.Array.ArrayGetString"};Ops.Ui.VizArrayTable=function(){CABLES.Op.apply(this,arguments);const d=this;const e=d.attachments={};const g=d.inArray("Array"),m=d.inInt("Start Row",0);d.setUiAttrib({height:200,width:400,resizable:true,vizLayerMaxZoom:2500});function v(t){let n="";if(typeof t=="string"){n='"'+t+'"'}else if(CABLES.UTILS.isNumeric(t))n=String(Math.round(t*1e4)/1e4);else if(Array.isArray(t)){let e="...";if(t.length==0)e="";n="["+e+"] ("+t.length+")"}else if(typeof t=="object"){try{n=JSON.stringify(t,true,1)}catch(e){n="{???}"}}else if(t!=t||t===undefined){n+=String(t)}else{n+=String(t)}return n}d.renderVizLayer=(r,i)=>{r.fillStyle="#222";r.fillRect(i.x,i.y,i.width,i.height);r.save();r.scale(i.scale,i.scale);r.font="normal 10px sourceCodePro";r.fillStyle="#ccc";const a=g.get()||[];let s=1;if(g.get()===null)d.setUiAttrib({extendTitle:"null"});else if(g.get()===undefined)d.setUiAttrib({extendTitle:"undefined"});else d.setUiAttrib({extendTitle:"length: "+a.length});if(g.links.length>0&&g.links[0].getOtherPort(g))s=g.links[0].getOtherPort(g).uiAttribs.stride||1;let e=Math.floor(i.height/i.scale/10-1);let o=4;let l=m.get()*s;let n=[];for(let e=0;e<s;e++)n[e]=0;for(let t=l;t<l+e*s;t+=s){for(let e=0;e<s;e++){const p=a[t+e];n[e]=Math.max(n[e],v(p).length)}}let u=[];let t=30;for(let e=0;e<s;e++){u[e]=t;t+=(n[e]+1)*7}for(let n=l;n<l+e*s;n+=s){if(n<0)continue;if(n+s>a.length)continue;r.fillStyle="#666";const h=n/s;if(h>=0)r.fillText(h,i.x/i.scale+o,i.y/i.scale+10+(n-l)/s*10+o);for(let t=0;t<s;t++){const p=a[n+t];let e=v(p);r.fillStyle="#ccc";if(typeof p=="string"){}else if(CABLES.UTILS.isNumeric(p))e=String(Math.round(p*1e4)/1e4);else if(Array.isArray(p)){}else if(typeof p=="object"){}else if(p!=p||p===undefined){r.fillStyle="#f00"}r.fillText(e,i.x/i.scale+u[t],i.y/i.scale+10+(n-l)/s*10+o)}}if(g.get()===null)r.fillText("null",i.x/i.scale+10,i.y/i.scale+10+o);else if(g.get()===undefined)r.fillText("undefined",i.x/i.scale+10,i.y/i.scale+10+o);const c=30;if(i.scale<=0)return;if(l>0){const f=r.createLinearGradient(0,i.y/i.scale+5,0,i.y/i.scale+c);f.addColorStop(0,"#222");f.addColorStop(1,"rgba(34,34,34,0.0)");r.fillStyle=f;r.fillRect(i.x/i.scale,i.y/i.scale,2e5,c)}if(l+e*s<a.length){const f=r.createLinearGradient(0,i.y/i.scale+i.height/i.scale-c+5,0,i.y/i.scale+i.height/i.scale-c+c);f.addColorStop(1,"#222");f.addColorStop(0,"rgba(34,34,34,0.0)");r.fillStyle=f;r.fillRect(i.x/i.scale,i.y/i.scale+i.height/i.scale-c,2e5,c)}r.restore()}};Ops.Ui.VizArrayTable.prototype=new CABLES.Op;CABLES.OPS["af2eeaaf-ff86-4bfb-9a27-42f05160a5d8"]={f:Ops.Ui.VizArrayTable,objName:"Ops.Ui.VizArrayTable"};Ops.Number.TriggerOnChangeNumber=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inFloat("Value"),r=e.outTrigger("Next"),i=e.outNumber("Number");n.onChange=function(){i.set(n.get());r.trigger()}};Ops.Number.TriggerOnChangeNumber.prototype=new CABLES.Op;CABLES.OPS["f5c8c433-ce13-49c4-9a33-74e98f110ed0"]={f:Ops.Number.TriggerOnChangeNumber,objName:"Ops.Number.TriggerOnChangeNumber"};Ops.Html.DivElement_v3=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inString("Text","Hello Div"),r=e.inString("Id"),i=e.inString("Class"),a=e.inStringEditor("Style","position:absolute;\nz-index:100;","inline-css"),s=e.inValueBool("Interactive",false),o=e.inValueBool("Visible",true),l=e.inValueBool("Convert Line Breaks",false),u=e.inValueBool("Propagate Click-Events",true),c=e.outObject("DOM Element",null,"element"),p=e.outBoolNum("Hover"),h=e.outTrigger("Clicked");let f=null;let d=null;let g="block";let m=null;const v=e.patch.cgl.canvas.parentElement;b();i.onChange=T;l.onChange=n.onChange=O;a.onChange=_;s.onChange=N;o.onChange=S;O();_();P();N();e.onDelete=y;c.onLinkChanged=_;function b(){m=e.patch.getDocument().createElement("div");m.dataset.op=e.id;m.classList.add("cablesEle");if(r.get())m.id=r.get();v.appendChild(m);c.set(m)}function y(){if(m)C();if(m&&m.parentNode)m.parentNode.removeChild(m);d=null;m=null}function x(e){if(!e){m.style.visibility="hidden";g=m.style.display||"inherit";m.style.display="none"}else{if(g=="none")g="inherit";m.style.visibility="visible";m.style.display=g}}function S(){x(o.get())}function O(){let e=n.get();if(d===e)return;d=e;if(e&&l.get())e=e.replace(/(?:\r\n|\r|\n)/g,"<br>");if(m.innerHTML!=e)m.innerHTML=e;c.set(null);c.set(m)}function _(){if(!m)return;m.setAttribute("style",a.get());S();c.set(null);c.set(m);if(!m.parentElement){v.appendChild(m)}P()}let A="";function C(){if(!m)return;const t=(i.get()||"").split(" ");for(let e=0;e<t.length;e++){if(t[e])m.classList.remove(t[e])}A=""}function T(){const t=(i.get()||"").split(" ");const n=(A||"").split(" ");let r=false;for(let e=0;e<n.length;e++){if(n[e]&&t.indexOf(n[e].trim())==-1){r=true;m.classList.remove(n[e])}}for(let e=0;e<t.length;e++){if(t[e]){m.classList.add(t[e].trim())}}A=i.get();P()}function I(e){p.set(true)}function E(e){p.set(false)}function L(e){if(!u.get()){e.stopPropagation()}h.trigger()}function N(){U();if(s.get())R()}r.onChange=function(){m.id=r.get()};function U(){if(f){f.removeEventListener("pointerdown",L);f.removeEventListener("pointerleave",E);f.removeEventListener("pointerenter",I);f=null}}function R(){if(f)U();f=m;if(f){f.addEventListener("pointerdown",L);f.addEventListener("pointerleave",E);f.addEventListener("pointerenter",I)}}e.addEventListener("onEnabledChange",function(e){y();if(e){b();_();T();O();N()}});function P(){if(i.get()&&a.get()){e.setUiError("error","Element uses external and inline CSS",1)}else{e.setUiError("error",null)}}};Ops.Html.DivElement_v3.prototype=new CABLES.Op;CABLES.OPS["d55d398c-e68e-486b-b0ce-d9c4bdf7df05"]={f:Ops.Html.DivElement_v3,objName:"Ops.Html.DivElement_v3"};Ops.String.StringEditor=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inStringEditor("value",""),r=e.inValueSelect("Syntax",["text","glsl","css","html","xml","json","javascript","inline-css","sql"],"text"),i=e.outString("Result");r.onChange=a;function a(){let e=r.get();if(e=="javascript")e="js";n.setUiAttribs({editorSyntax:e})}n.onChange=function(){i.set(n.get())}};Ops.String.StringEditor.prototype=new CABLES.Op;CABLES.OPS["6468b7c1-f63e-4db4-b809-4b203d27ead3"]={f:Ops.String.StringEditor,objName:"Ops.String.StringEditor"};Ops.Html.CSS_v2=function(){CABLES.Op.apply(this,arguments);const n=this;const e=n.attachments={};const r=n.inStringEditor("css code"),t=n.inBool("Active",true);r.setUiAttribs({editorSyntax:"css",ignoreBigPort:true});let i=null;const a="css_"+CABLES.uuid();r.onChange=o;o();t.onChange=()=>{if(!t.get())i.remove();else l()};function s(){let t=r.get();if(t){let e=null;if(n.storage&&n.storage.blueprint&&n.storage.blueprint.patchId){e=n.storage.blueprint.patchId}t=t.replace(new RegExp("{{ASSETPATH}}","g"),n.patch.getAssetPath(e))}return t}function o(){i=n.patch.getDocument().getElementById(a);if(i){i.textContent=s()}else{i=n.patch.getDocument().createElement("style");i.type="text/css";i.id=a;i.textContent=e.css_spinner;i.classList.add("cablesEle");l()}}function l(){const e=n.patch.getDocument().getElementsByTagName("body")[0];e.appendChild(i)}n.onDelete=function(){i=n.patch.getDocument().getElementById(a);if(i)i.remove()}};Ops.Html.CSS_v2.prototype=new CABLES.Op;CABLES.OPS["a56d3edd-06ad-44ed-9810-dbf714600c67"]={f:Ops.Html.CSS_v2,objName:"Ops.Html.CSS_v2"};Ops.Html.TransformCSS3DElement=function(){CABLES.Op.apply(this,arguments);const r=this;const e=r.attachments={};const i=r.patch.cgl,t=["top-left","top-middle","top-right","center-left","center-middle","center-right","bottom-left","bottom-middle","bottom-right"],n=r.inTrigger("trigger"),a=r.inObject("DOMElement"),s=r.inValueSelect("origin",t,"center-middle"),o=r.outTrigger("next"),l=mat4.create(),u=vec3.create();r.uuid=CABLES.uuid();let c=null;let p=i.canvas.parentElement.querySelector('[data-provide="css3d"]');if(!p){p=document.createElement("div");p.dataset.op=r.id;p.style.position="absolute";p.style.top=p.style.left=0;p.style.width=p.style.height="100%";p.dataset.provide="css3d";p.style.zIndex=1e3;p.style.pointerEvents="none";p.style.perspectiveOrigin="center center";i.canvas.parentElement.appendChild(p);let e=document.createElement("style");e.dataset.op=r.id;e.type="text/css";e.textContent=[".cables-loading .cables-css3dview {visibility:hidden;pointer-events:none;backface-visibility:hidden;}",".cables-css3dview {position:absolute;left:0;top:0;width:100%;height:100%;transform-style:preserve-3d;}",".cables-css3dview > * {pointer-events:auto;}",".cables-css3dview.origin-top-left > * {}",".cables-css3dview.origin-top-middle > * {transform:translate3d(-50%,0,0);}",".cables-css3dview.origin-top-right > * {transform:translate3d(-100%,0,0);}",".cables-css3dview.origin-center-left > * {transform:translate3d(0,-50%,0);}",".cables-css3dview.origin-center-middle > * {transform:translate3d(-50%,-50%,0);}",".cables-css3dview.origin-center-right > * {transform:translate3d(-100%,-50%,0);}",".cables-css3dview.origin-bottom-left > * {transform:translate3d(0,-100%,0);}",".cables-css3dview.origin-bottom-middle > * {transform:translate3d(-50%,-100%,0);}",".cables-css3dview.origin-bottom-right > * {transform:translate3d(-100%,-100%,0);}"].join("\n");p.appendChild(e)}r.onDelete=function(){let e=p.querySelector('[data-ccs3did="'+r.uuid+'"]');if(e&&e.parentElement)e.parentElement.removeChild(e)};function h(e){let t=document.createElement("div");t.classList.add("cables-css3dview");t.dataset.css3did=r.uuid;t.appendChild(e);return t}a.onChange=function(e,t){r.onDelete();if(!t)return;p.appendChild(h(t));s.onChange()};s.onChange=function(){let e=a.get();if(!e||!e.parentElement)return;DOMTokenList.prototype.remove.apply(e.parentElement.classList,t.map(function(e){return"origin-"+e}));e.parentElement.classList.add("origin-"+s.get())};n.onTriggered=function(){let e=.5/(1/i.pMatrix[5])*i.gl.drawingBufferHeight/r.patch.cgl.pixelDensity;p.style.perspective=e+"px";let t=-2*i.gl.drawingBufferWidth/i.gl.drawingBufferHeight;vec3.set(u,t/i.gl.drawingBufferWidth*r.patch.cgl.pixelDensity,-2/i.gl.drawingBufferHeight*r.patch.cgl.pixelDensity,1);let n=a.get();if(n){mat4.multiply(l,i.vMatrix,i.mMatrix);mat4.scale(l,l,u);if(n.parentElement)n.parentElement.style.transform="translateZ("+e+"px) matrix3d("+l[0]+","+-l[1]+","+l[2]+","+l[3]+","+l[4]+","+-l[5]+","+l[6]+","+l[7]+","+l[8]+","+-l[9]+","+l[10]+","+l[11]+","+l[12]+","+-l[13]+","+l[14]+","+l[15]+") scaleX(-1) translate3d("+i.gl.drawingBufferWidth/2/r.patch.cgl.pixelDensity+"px,"+i.gl.drawingBufferHeight/2/r.patch.cgl.pixelDensity+"px"+",0"+")"}o.trigger();c=n};s.onChange();function f(e){if(!e)e=a.get();if(e&&e.parentElement)e.parentElement.style.transform=""}r.onDelete=function(){f(c)};a.onLinkChanged=function(){if(!a.isLinked())f(c)};r.addEventListener("onEnabledChange",function(e){if(!e)f()})};Ops.Html.TransformCSS3DElement.prototype=new CABLES.Op;CABLES.OPS["7b81ed97-6fb9-4044-a731-962a2a11db27"]={f:Ops.Html.TransformCSS3DElement,objName:"Ops.Html.TransformCSS3DElement"};Ops.Gl.CanvasInfo_v2=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.outNumber("width"),r=t.outNumber("height"),i=t.outNumber("Pixel Ratio"),a=t.outNumber("Pixel Width"),s=t.outNumber("Pixel Height"),o=t.inSwitch("Pixel Unit",["Display","CSS"],"Display"),l=t.outNumber("Aspect Ratio"),u=t.outBool("Landscape"),c=t.outObject("Canvas","element"),p=t.outObject("Canvas Parent","element");let h=t.patch.cgl;c.set(t.patch.cgl.canvas);p.set(t.patch.cgl.canvas.parentElement);h.on("resize",f);o.onChange=f;f();function f(){let e=1;if(o.get()=="CSS")e=t.patch.cgl.pixelDensity;r.set(h.canvasHeight);n.set(h.canvasWidth);s.set(h.canvasHeight*t.patch.cgl.pixelDensity);a.set(h.canvasWidth*t.patch.cgl.pixelDensity);i.set(t.patch.cgl.pixelDensity);l.set(h.canvasWidth/h.canvasHeight);u.set(h.canvasWidth>h.canvasHeight?1:0)}};Ops.Gl.CanvasInfo_v2.prototype=new CABLES.Op;CABLES.OPS["a249e025-ae2c-4fb1-99f1-f86bfe7d5fc4"]={f:Ops.Gl.CanvasInfo_v2,objName:"Ops.Gl.CanvasInfo_v2"};Ops.Math.Divide=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inValueFloat("number1",1),r=e.inValueFloat("number2",2),i=e.outNumber("result");e.setUiAttribs({mathTitle:true});n.onChange=r.onChange=a;a();function a(){i.set(n.get()/r.get())}};Ops.Math.Divide.prototype=new CABLES.Op;CABLES.OPS["86fcfd8c-038d-4b91-9820-a08114f6b7eb"]={f:Ops.Math.Divide,objName:"Ops.Math.Divide"};Ops.Html.CSSProperty_v2=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inObject("Element"),r=t.inString("Property"),i=t.inFloat("Value"),a=t.inString("Value Suffix","px"),s=t.outObject("HTML Element");t.setPortGroup("Element",[n]);t.setPortGroup("Attributes",[r,i,a]);r.onChange=l;i.onChange=u;a.onChange=u;let o=null;n.onChange=n.onLinkChanged=function(){if(o&&o.style){o.style[r.get()]="initial"}u()};function l(){u();t.setUiAttrib({extendTitle:r.get()+""})}function u(){o=n.get();if(o&&o.style){const e=i.get()+a.get();try{if(o.style[r.get()]!=e)o.style[r.get()]=e}catch(e){t.logError(e)}}else{setTimeout(u,50)}s.set(n.get())}};Ops.Html.CSSProperty_v2.prototype=new CABLES.Op;CABLES.OPS["c179aa0e-b558-4130-8c2d-2deab2919a07"]={f:Ops.Html.CSSProperty_v2,objName:"Ops.Html.CSSProperty_v2"};Ops.Boolean.BoolToNumber_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inBool("Use Value 1",false),r=e.inFloat("Value 0",0),i=e.inFloat("Value 1",1),a=e.outNumber("Out Value",0);r.onChange=i.onChange=n.onChange=s;function s(){const e=n.get();if(e){a.set(i.get())}else{a.set(r.get())}}};Ops.Boolean.BoolToNumber_v2.prototype=new CABLES.Op;CABLES.OPS["400eea7d-5a68-4dda-a94d-2bb2ee7c2331"]={f:Ops.Boolean.BoolToNumber_v2,objName:"Ops.Boolean.BoolToNumber_v2"};Ops.Html.HyperLink_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTriggerButton("Open"),r=e.inString("URL","https://cables.gl"),i=e.inString("Target Name","_self"),a=e.inString("Specs","");n.onTriggered=function(){window.open(r.get(),i.get(),a.get())}};Ops.Html.HyperLink_v2.prototype=new CABLES.Op;CABLES.OPS["a669d4f7-1e35-463c-bf8b-08c9f1b68e04"]={f:Ops.Html.HyperLink_v2,objName:"Ops.Html.HyperLink_v2"};Ops.Extension.OpenType.OpentypeFont=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inUrl("Font File",[".otf",".ttf",".woff",".woff2"]),r=e.outObject("Opentype Font",null,"opentype");n.onChange=async function(){const e=await opentype.load(n.get());r.set(e)}};Ops.Extension.OpenType.OpentypeFont.prototype=new CABLES.Op;CABLES.OPS["f85574bb-3869-4a14-8dcc-70414bd8cfcd"]={f:Ops.Extension.OpenType.OpentypeFont,objName:"Ops.Extension.OpenType.OpentypeFont"};Ops.Extension.OpenType.OpentypeToSvgPath=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const a=e.inObject("Opentype Font"),s=e.inString("Text","cables"),o=e.inFloat("Letter Spacing",0),l=e.outString("Path String");s.onChange=o.onChange=a.onChange=async function(){const e=a.get();if(!e||!e.getPath){l.set("");return}const n=e.getPaths(s.get(),0,0,72);let r="";let i=o.get();for(let t=0;t<n.length;t++){for(let e=0;e<n[t].commands.length;e++){if(n[t].commands[e].hasOwnProperty("x"))n[t].commands[e].x+=t*i;if(n[t].commands[e].hasOwnProperty("x1"))n[t].commands[e].x1+=t*i}r+=n[t].toPathData()}l.set(r)}};Ops.Extension.OpenType.OpentypeToSvgPath.prototype=new CABLES.Op;CABLES.OPS["4d901c72-b8dc-45dc-ac2e-608e5da40677"]={f:Ops.Extension.OpenType.OpentypeToSvgPath,objName:"Ops.Extension.OpenType.OpentypeToSvgPath"};Ops.Graphics.Geometry.SvgPathToGeometry_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const d=e.inString("SVG Path"),n=e.inFloat("Bezier Stepsize",3),g=e.inFloat("Rescale",1),m=e.outObject("Geometry",null,"geometry");n.onChange=g.onChange=d.onChange=()=>{let e=d.get();if(!e||e.length<2){m.set(null);return}e=e.replace(/([A-Z,a-z])/g," $1 ");const t=v(e);const o=[];t.forEach(({type:e,x:t,y:n,x1:r,y1:i,x2:a,y2:s})=>{switch(e){case"M":o.push(new b);o[o.length-1].moveTo({x:t,y:n});break;case"L":o[o.length-1].moveTo({x:t,y:n});break;case"C":o[o.length-1].cubicTo({x:t,y:n},{x:r,y:i},{x:a,y:s});break;case"Q":o[o.length-1].conicTo({x:t,y:n},{x:r,y:i});break;case"Z":o[o.length-1].close();break}});o.sort((e,t)=>{return Math.abs(t.area)-Math.abs(e.area)});const r=[];for(let n=0;n<o.length;++n){let t=null;for(let e=n-1;e>=0;--e){if(o[e].inside(o[n].points[0])&&o[n].area*o[e].area<0){t=o[e];break}}if(t){t.children.push(o[n])}else{r.push(o[n])}}const n=o.reduce((e,t)=>{return e+t.points.length},0);const i=new Float32Array(n*2);let a=0;const s=[];function l(e){const n=[];const t=[];e.points.forEach(({x:e,y:t})=>{return n.push(e,t)});e.children.forEach(e=>{e.children.forEach(l);t.push(n.length/2);e.points.forEach(({x:e,y:t})=>{return n.push(e,t)})});i.set(n,a*2);earcut(n,t).forEach(e=>{return s.push(e+a)});a+=n.length/2}r.forEach(l);const u=new Float32Array(n*3);let c=-99999;for(let e=0;e<u.length/3;e++){u[e*3+0]=i[e*2+0];u[e*3+1]=i[e*2+1]*-1;c=Math.max(u[e*3+1],c);u[e*3+2]=0}let p=g.get();let h=new CGL.Geometry("circle");h.setVertices(u);h.verticesIndices=s;if(p!=0){const f=h.getBounds();for(let e=0;e<u.length/3;e++){u[e*3+0]=u[e*3+0]/(f.size[0]/2)*p;u[e*3+1]=u[e*3+1]/(f.size[0]/2)*p}h.setVertices(u)}h.mapTexCoords2d();h.flipVertDir();h.calculateNormals();h.calcTangentsBitangents();m.set(h)};const s={M:["x","y"],m:["dx","dy"],H:["x"],h:["dx"],V:["y"],v:["dy"],L:["x","y"],l:["dx","dy"],Z:[],C:["x1","y1","x2","y2","x","y"],c:["dx1","dy1","dx2","dy2","dx","dy"],S:["x2","y2","x","y"],s:["dx2","dy2","dx","dy"],Q:["x1","y1","x","y"],q:["dx1","dy1","dx","dy"],T:["x","y"],t:["dx","dy"],A:["rx","ry","rotation","large-arc","sweep","x","y"],a:["rx","ry","rotation","large-arc","sweep","dx","dy"]};function v(e){const n=e.replace(/[\n\r]/g,"").replace(/-/g," -").replace(/(\d*\.)(\d+)(?=\.)/g,"$1$2 ").trim().split(/\s*,|\s+/);const r=[];let i="";let a={};while(n.length>0){let t=n.shift();if(s.hasOwnProperty(t)){i=t}else{n.unshift(t)}a={type:i};s[i].forEach(e=>{t=n.shift();a[e]=parseFloat(t)});if(i==="M"){i="L"}else if(i==="m"){i="l"}r.push(a)}return r}const u=15;const o=1e-6;class b{constructor(){this.points=[];this.children=[];this.area=0;this.BEZIER_STEP_SIZE=n.get()}moveTo(e){this.points.push(e)}lineTo(e){this.points.push(e)}close(){let t=this.points[this.points.length-1];this.points.forEach(e=>{this.area+=.5*r(t,e);t=e})}conicTo(t,n){const r=this.points[this.points.length-1];const e=c(r,n)+c(n,t);const i=Math.max(2,Math.min(u,e/this.BEZIER_STEP_SIZE));for(let e=1;e<=i;++e){const a=e/i;this.points.push(p(p(r,n,a),p(n,t,a),a))}}cubicTo(t,n,r){const i=this.points[this.points.length-1];const e=c(i,n)+c(n,r)+c(r,t);const a=Math.max(2,Math.min(u,e/this.BEZIER_STEP_SIZE));for(let e=1;e<=a;++e){const s=e/a;const o=p(p(i,n,s),p(n,r,s),s);const l=p(p(n,r,s),p(r,t,s),s);this.points.push(p(o,l,s))}}inside(r){let i=0,a=this.points[this.points.length-1];this.points.forEach(e=>{const t=a.y<e.y?a:e;const n=a.y<e.y?e:a;if(t.y<r.y+o&&n.y>r.y+o){if((n.x-t.x)*(r.y-t.y)>(r.x-t.x)*(n.y-t.y)){i+=1}}a=e});return i%2!==0}}function c(e,t){const n=e.x-t.x,r=e.y-t.y;return Math.sqrt(n*n+r*r)}function p(e,t,n){return{x:(1-n)*e.x+n*t.x,y:(1-n)*e.y+n*t.y}}function r(e,t){return e.x*t.y-e.y*t.x}};Ops.Graphics.Geometry.SvgPathToGeometry_v2.prototype=new CABLES.Op;CABLES.OPS["4267b3e7-1285-4a3e-acc8-ea92a72a6bc0"]={f:Ops.Graphics.Geometry.SvgPathToGeometry_v2,objName:"Ops.Graphics.Geometry.SvgPathToGeometry_v2"};Ops.Gl.RenderGeometry_v2=function(){CABLES.Op.apply(this,arguments);const t=this;const e=t.attachments={};const n=t.inTrigger("render"),r=t.inObject("Geometry",null,"geometry"),i=t.inBool("Render Mesh",true),a=t.inBool("Add Vertex Numbers",true),s=t.outTrigger("trigger");t.toWorkPortsNeedToBeLinked(r,n);r.ignoreValueSerialize=true;let o=null;let l=true;r.onLinkChanged=a.onChange=r.onChange=()=>{l=true};n.onTriggered=function(){if(l)u();if(o&&i.get())o.render(t.patch.cgl.getShader());s.trigger()};function u(){l=false;const e=r.get();if(e&&e.isGeometry){if(o){o.dispose();o=null}if(!o){o=new CGL.Mesh(t.patch.cgl,e);o.addVertexNumbers=a.get();o.setGeom(e)}}else{o=null}}};Ops.Gl.RenderGeometry_v2.prototype=new CABLES.Op;CABLES.OPS["0a9bdb39-8250-460e-8d99-50fe6825d956"]={f:Ops.Gl.RenderGeometry_v2,objName:"Ops.Gl.RenderGeometry_v2"};Ops.Graphics.Geometry.GeometryExtrude=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const p=e.inObject("Geometry",null,"geometry"),h=e.inFloat("Height",.5),f=e.inBool("Smooth",true),d=e.inBool("Walls",true),g=e.inBool("Top",true),m=e.inBool("Bottom",true),v=e.outObject("Result Geometry",null,"geometry");function b(t){let n=0;for(let e=0;e<t.length-3;e+=3){n+=(t[e+3]-t[e])*(t[e+3+1]+t[e])}return n>0}f.onChange=d.onChange=g.onChange=m.onChange=h.onChange=p.onChange=()=>{const i=p.get();if(!i){v.set(null);return}function t(t,n){let r=0;for(let e=0;e<i.verticesIndices.length;e+=3){if((i.verticesIndices[e]==t||i.verticesIndices[e+1]==t||i.verticesIndices[e+2]==t)&&(i.verticesIndices[e]==n||i.verticesIndices[e+1]==n||i.verticesIndices[e+2]==n)){r++;if(r==2)return true}}return false}let n=[];const e=[];const r=h.get();if(d.get())for(let e=0;e<i.verticesIndices.length;e+=3){const s=i.verticesIndices[e];const o=i.verticesIndices[e+1];const l=i.verticesIndices[e+2];if(!t(s,o)){const u=[];u.push([i.vertices[s*3+0],i.vertices[s*3+1],i.vertices[s*3+2]]);u.push([i.vertices[s*3+0],i.vertices[s*3+1],i.vertices[s*3+2]+r]);u.push([i.vertices[o*3+0],i.vertices[o*3+1],i.vertices[o*3+2]]);if(!b(u))n=n.concat(u);else n=n.concat(u.reverse());u.length=0;u.push([i.vertices[o*3+0],i.vertices[o*3+1],i.vertices[o*3+2]+r]);u.push([i.vertices[o*3+0],i.vertices[o*3+1],i.vertices[o*3+2]]);u.push([i.vertices[s*3+0],i.vertices[s*3+1],i.vertices[s*3+2]+r]);if(!b(u))n=n.concat(u);else n=n.concat(u.reverse())}if(!t(l,o)){const u=[];u.push([i.vertices[l*3+0],i.vertices[l*3+1],i.vertices[l*3+2]]);u.push([i.vertices[l*3+0],i.vertices[l*3+1],i.vertices[l*3+2]+r]);u.push([i.vertices[o*3+0],i.vertices[o*3+1],i.vertices[o*3+2]]);if(b(u))n=n.concat(u);else n=n.concat(u.reverse());u.length=0;u.push([i.vertices[o*3+0],i.vertices[o*3+1],i.vertices[o*3+2]+r]);u.push([i.vertices[o*3+0],i.vertices[o*3+1],i.vertices[o*3+2]]);u.push([i.vertices[l*3+0],i.vertices[l*3+1],i.vertices[l*3+2]+r]);if(b(u))n=n.concat(u);else n=n.concat(u.reverse())}if(!t(l,s)){const u=[];u.push([i.vertices[l*3+0],i.vertices[l*3+1],i.vertices[l*3+2]]);u.push([i.vertices[l*3+0],i.vertices[l*3+1],i.vertices[l*3+2]+r]);u.push([i.vertices[s*3+0],i.vertices[s*3+1],i.vertices[s*3+2]]);if(!b(u))n=n.concat(u);else n=n.concat(u.reverse());u.length=0;u.push([i.vertices[s*3+0],i.vertices[s*3+1],i.vertices[s*3+2]+r]);u.push([i.vertices[s*3+0],i.vertices[s*3+1],i.vertices[s*3+2]]);u.push([i.vertices[l*3+0],i.vertices[l*3+1],i.vertices[l*3+2]+r]);if(!b(u))n=n.concat(u);else n=n.concat(u.reverse())}}const a=CGL.Geometry.buildFromFaces(n,"extrude",true);a.calculateNormals();a.calcTangentsBitangents();if(m.get()){a.merge(i)}if(g.get()){const c=i.copy();for(let e=0;e<c.vertices.length;e+=3)c.vertices[e+2]+=r;c.flipVertDir();c.flipNormals();a.merge(c)}a.flipVertDir();if(!f.get()){a.unIndex();a.calculateNormals({forceZUp:true});a.flipNormals()}v.set(null);v.set(a)}};Ops.Graphics.Geometry.GeometryExtrude.prototype=new CABLES.Op;CABLES.OPS["64a34a29-000d-4350-875f-5b72b97a314f"]={f:Ops.Graphics.Geometry.GeometryExtrude,objName:"Ops.Graphics.Geometry.GeometryExtrude"};Ops.Anim.Smooth=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inTrigger("Update"),r=e.inBool("Separate inc/dec",false),i=e.inValue("Value"),a=e.outTrigger("Next"),s=e.inValue("Inc factor",4),o=e.inValue("Dec factor",4),l=e.outNumber("Result",0);let u=0;let c=0;let p=0;let h=0;e.toWorkPortsNeedToBeLinked(n);let f;let d;let g=4;let m=true;let v=0;const b=0;const y=1;x();S();r.setUiAttribs({hidePort:true});s.onChange=o.onChange=S;r.onChange=x;O();function x(){const e=r.get();if(!e)v=b;else v=y;if(v==b){o.setUiAttribs({greyout:true});s.setUiAttribs({title:"Inc/Dec factor"})}else if(v==y){o.setUiAttribs({greyout:false});s.setUiAttribs({title:"Inc factor"})}S();O()}function S(){if(v==b){f=s.get();d=s.get()}else if(v==y){f=s.get();d=o.get()}if(f<=.2||f!=f)f=.2;if(d<=.2||d!=d)d=.2}i.onChange=function(){m=false;let e=c;c=i.get()};s.onChange=function(){S()};function O(){let e=1;if(performance.now()-h>500||h===0)u=i.get()||0;else e=(performance.now()-h)/(performance.now()-h);h=performance.now();if(u!=u)u=0;if(g<=0)g=1e-4;const t=c-u;if(t>=0)u+=t/(d*e);else u+=t/(f*e);if(Math.abs(t)<1e-5)u=c;if(g!=g)u=0;if(u!=u||u==-Infinity||u==Infinity)u=i.get();if(p!=u){l.set(u);p=u}if(u==c&&!m){m=true;l.set(u)}a.trigger()}n.onTriggered=function(){O()}};Ops.Anim.Smooth.prototype=new CABLES.Op;CABLES.OPS["5677b5b5-753a-4fbf-9e91-64c81ec68a2f"]={f:Ops.Anim.Smooth,objName:"Ops.Anim.Smooth"};Ops.Math.MathExpression=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inFloat("A",0);const r=e.inFloat("B",1);const i=e.inFloat("C",2);const a=e.inFloat("D",3);e.setPortGroup("Parameters",[n,r,i,a]);const s=e.inString("Expression","a*(b+c+d)");e.setPortGroup("Expression",[s]);const o=e.outNumber("Result");const l=e.outBool("Expression Valid");let u=s.get();let c=false;const p=()=>{try{u=new Function("m","a","b","c","d",`with(m) { return ${s.get()} }`);c=true;h();l.set(c)}catch(e){c=false;l.set(c);if(e instanceof ReferenceError||e instanceof SyntaxError)return}};const h=()=>{if(c){o.set(u(Math,n.get(),r.get(),i.get(),a.get()));if(!s.get())o.set(0)}l.set(c)};n.onChange=r.onChange=i.onChange=a.onChange=h;s.onChange=p;p()};Ops.Math.MathExpression.prototype=new CABLES.Op;CABLES.OPS["d2343a1e-64ea-45b2-99ed-46e167bbdcd3"]={f:Ops.Math.MathExpression,objName:"Ops.Math.MathExpression"};Ops.Array.GateArray_v2=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const n=e.inArray("Array in"),r=e.inValueBool("Pass Through",true),i=e.inSwitch("When False",["keep last array","null"],"keep last array"),a=e.outArray("Array Out");let s=null;function o(t){if(!t)return null;const n=[];n.length=t.length;for(let e=0;e<t.length;e++)n[e]=t[e];return n}i.onChange=n.onChange=r.onChange=function(){if(r.get()){s=o(n.get());a.setRef(s)}else{if(i.get()=="null")a.setRef(null)}}};Ops.Array.GateArray_v2.prototype=new CABLES.Op;CABLES.OPS["e28a489c-46b6-4279-928c-6b0cbaaaae2a"]={f:Ops.Array.GateArray_v2,objName:"Ops.Array.GateArray_v2"};Ops.Patch.PuvBp73.ArraySetNumberAtIndex_v4=function(){CABLES.Op.apply(this,arguments);const e=this;const t=e.attachments={};const r=e.inArray("Array"),i=e.inInt("Index",0),a=e.inFloat("Number",1),s=e.outArray("Result");e.toWorkPortsNeedToBeLinked(r);r.onChange=i.onChange=a.onChange=n;function n(){const t=r.get();if(!t){s.set(null);return}const n=i.get();for(let e=0;e<t.length;e++){if(n===e){t[e]=a.get()||t[e]}}s.setRef(t)}};Ops.Patch.PuvBp73.ArraySetNumberAtIndex_v4.prototype=new CABLES.Op;CABLES.OPS["da4ee427-598b-4502-aba4-8e8fb896d4c2"]={f:Ops.Patch.PuvBp73.ArraySetNumberAtIndex_v4,objName:"Ops.Patch.PuvBp73.ArraySetNumberAtIndex_v4"};window.addEventListener("load",function(e){CABLES.jsLoaded=new Event("CABLES.jsLoaded");document.dispatchEvent(CABLES.jsLoaded)});(function(e,t){typeof exports==="object"&&typeof module!=="undefined"?t(exports):typeof define==="function"&&define.amd?define(["exports"],t):(e=e||self,t(e.opentype={}))})(this,function(C){"use strict";if(!String.prototype.codePointAt){(function(){var e=function(){try{var e={};var t=Object.defineProperty;var n=t(e,e,e)&&t}catch(e){}return n}();var t=function(e){if(this==null){throw TypeError()}var t=String(this);var n=t.length;var r=e?Number(e):0;if(r!=r){r=0}if(r<0||r>=n){return undefined}var i=t.charCodeAt(r);var a;if(i>=55296&&i<=56319&&n>r+1){a=t.charCodeAt(r+1);if(a>=56320&&a<=57343){return(i-55296)*1024+a-56320+65536}}return i};if(e){e(String.prototype,"codePointAt",{value:t,configurable:true,writable:true})}else{String.prototype.codePointAt=t}})()}var P=0;var M=-3;function k(){this.table=new Uint16Array(16);this.trans=new Uint16Array(288)}function w(e,t){this.source=e;this.sourceIndex=0;this.tag=0;this.bitcount=0;this.dest=t;this.destLen=0;this.ltree=new k;this.dtree=new k}var B=new k;var F=new k;var j=new Uint8Array(30);var z=new Uint16Array(30);var H=new Uint8Array(30);var X=new Uint16Array(30);var Y=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);var W=new k;var h=new Uint8Array(288+32);function q(e,t,n,r){var i,a;for(i=0;i<n;++i){e[i]=0}for(i=0;i<30-n;++i){e[i+n]=i/n|0}for(a=r,i=0;i<30;++i){t[i]=a;a+=1<<e[i]}}function Z(e,t){var n;for(n=0;n<7;++n){e.table[n]=0}e.table[7]=24;e.table[8]=152;e.table[9]=112;for(n=0;n<24;++n){e.trans[n]=256+n}for(n=0;n<144;++n){e.trans[24+n]=n}for(n=0;n<8;++n){e.trans[24+144+n]=280+n}for(n=0;n<112;++n){e.trans[24+144+8+n]=144+n}for(n=0;n<5;++n){t.table[n]=0}t.table[5]=32;for(n=0;n<32;++n){t.trans[n]=n}}var K=new Uint16Array(16);function Q(e,t,n,r){var i,a;for(i=0;i<16;++i){e.table[i]=0}for(i=0;i<r;++i){e.table[t[n+i]]++}e.table[0]=0;for(a=0,i=0;i<16;++i){K[i]=a;a+=e.table[i]}for(i=0;i<r;++i){if(t[n+i]){e.trans[K[t[n+i]]++]=i}}}function J(e){if(!e.bitcount--){e.tag=e.source[e.sourceIndex++];e.bitcount=7}var t=e.tag&1;e.tag>>>=1;return t}function f(e,t,n){if(!t){return n}while(e.bitcount<24){e.tag|=e.source[e.sourceIndex++]<<e.bitcount;e.bitcount+=8}var r=e.tag&65535>>>16-t;e.tag>>>=t;e.bitcount-=t;return r+n}function $(e,t){while(e.bitcount<24){e.tag|=e.source[e.sourceIndex++]<<e.bitcount;e.bitcount+=8}var n=0,r=0,i=0;var a=e.tag;do{r=2*r+(a&1);a>>>=1;++i;n+=t.table[i];r-=t.table[i]}while(r>=0);e.tag=a;e.bitcount-=i;return t.trans[n+r]}function ee(e,t,n){var r,i,a;var s,o,l;r=f(e,5,257);i=f(e,5,1);a=f(e,4,4);for(s=0;s<19;++s){h[s]=0}for(s=0;s<a;++s){var u=f(e,3,0);h[Y[s]]=u}Q(W,h,0,19);for(o=0;o<r+i;){var c=$(e,W);switch(c){case 16:var p=h[o-1];for(l=f(e,2,3);l;--l){h[o++]=p}break;case 17:for(l=f(e,3,3);l;--l){h[o++]=0}break;case 18:for(l=f(e,7,11);l;--l){h[o++]=0}break;default:h[o++]=c;break}}Q(t,h,0,r);Q(n,h,r,i)}function te(e,t,n){while(1){var r=$(e,t);if(r===256){return P}if(r<256){e.dest[e.destLen++]=r}else{var i,a,s;var o;r-=257;i=f(e,j[r],z[r]);a=$(e,n);s=e.destLen-f(e,H[a],X[a]);for(o=s;o<s+i;++o){e.dest[e.destLen++]=e.dest[o]}}}}function ne(e){var t,n;var r;while(e.bitcount>8){e.sourceIndex--;e.bitcount-=8}t=e.source[e.sourceIndex+1];t=256*t+e.source[e.sourceIndex];n=e.source[e.sourceIndex+3];n=256*n+e.source[e.sourceIndex+2];if(t!==(~n&65535)){return M}e.sourceIndex+=4;for(r=t;r;--r){e.dest[e.destLen++]=e.source[e.sourceIndex++]}e.bitcount=0;return P}function re(e,t){var n=new w(e,t);var r,i,a;do{r=J(n);i=f(n,2,0);switch(i){case 0:a=ne(n);break;case 1:a=te(n,B,F);break;case 2:ee(n,n.ltree,n.dtree);a=te(n,n.ltree,n.dtree);break;default:a=M}if(a!==P){throw new Error("Data error")}}while(!r);if(n.destLen<n.dest.length){if(typeof n.dest.slice==="function"){return n.dest.slice(0,n.destLen)}else{return n.dest.subarray(0,n.destLen)}}return n.dest}Z(B,F);q(j,z,4,3);q(H,X,2,1);j[28]=0;z[28]=258;var ie=re;function ae(e,t,n,r,i){return Math.pow(1-i,3)*e+3*Math.pow(1-i,2)*i*t+3*(1-i)*Math.pow(i,2)*n+Math.pow(i,3)*r}function o(){this.x1=Number.NaN;this.y1=Number.NaN;this.x2=Number.NaN;this.y2=Number.NaN}o.prototype.isEmpty=function(){return isNaN(this.x1)||isNaN(this.y1)||isNaN(this.x2)||isNaN(this.y2)};o.prototype.addPoint=function(e,t){if(typeof e==="number"){if(isNaN(this.x1)||isNaN(this.x2)){this.x1=e;this.x2=e}if(e<this.x1){this.x1=e}if(e>this.x2){this.x2=e}}if(typeof t==="number"){if(isNaN(this.y1)||isNaN(this.y2)){this.y1=t;this.y2=t}if(t<this.y1){this.y1=t}if(t>this.y2){this.y2=t}}};o.prototype.addX=function(e){this.addPoint(e,null)};o.prototype.addY=function(e){this.addPoint(null,e)};o.prototype.addBezier=function(e,t,n,r,i,a,s,o){var l=[e,t];var u=[n,r];var c=[i,a];var p=[s,o];this.addPoint(e,t);this.addPoint(s,o);for(var h=0;h<=1;h++){var f=6*l[h]-12*u[h]+6*c[h];var d=-3*l[h]+9*u[h]-9*c[h]+3*p[h];var g=3*u[h]-3*l[h];if(d===0){if(f===0){continue}var m=-g/f;if(0<m&&m<1){if(h===0){this.addX(ae(l[h],u[h],c[h],p[h],m))}if(h===1){this.addY(ae(l[h],u[h],c[h],p[h],m))}}continue}var v=Math.pow(f,2)-4*g*d;if(v<0){continue}var b=(-f+Math.sqrt(v))/(2*d);if(0<b&&b<1){if(h===0){this.addX(ae(l[h],u[h],c[h],p[h],b))}if(h===1){this.addY(ae(l[h],u[h],c[h],p[h],b))}}var y=(-f-Math.sqrt(v))/(2*d);if(0<y&&y<1){if(h===0){this.addX(ae(l[h],u[h],c[h],p[h],y))}if(h===1){this.addY(ae(l[h],u[h],c[h],p[h],y))}}}};o.prototype.addQuad=function(e,t,n,r,i,a){var s=e+2/3*(n-e);var o=t+2/3*(r-t);var l=s+1/3*(i-e);var u=o+1/3*(a-t);this.addBezier(e,t,s,o,l,u,i,a)};function d(){this.commands=[];this.fill="black";this.stroke=null;this.strokeWidth=1}d.prototype.moveTo=function(e,t){this.commands.push({type:"M",x:e,y:t})};d.prototype.lineTo=function(e,t){this.commands.push({type:"L",x:e,y:t})};d.prototype.curveTo=d.prototype.bezierCurveTo=function(e,t,n,r,i,a){this.commands.push({type:"C",x1:e,y1:t,x2:n,y2:r,x:i,y:a})};d.prototype.quadTo=d.prototype.quadraticCurveTo=function(e,t,n,r){this.commands.push({type:"Q",x1:e,y1:t,x:n,y:r})};d.prototype.close=d.prototype.closePath=function(){this.commands.push({type:"Z"})};d.prototype.extend=function(e){if(e.commands){e=e.commands}else if(e instanceof o){var t=e;this.moveTo(t.x1,t.y1);this.lineTo(t.x2,t.y1);this.lineTo(t.x2,t.y2);this.lineTo(t.x1,t.y2);this.close();return}Array.prototype.push.apply(this.commands,e)};d.prototype.getBoundingBox=function(){var e=new o;var t=0;var n=0;var r=0;var i=0;for(var a=0;a<this.commands.length;a++){var s=this.commands[a];switch(s.type){case"M":e.addPoint(s.x,s.y);t=r=s.x;n=i=s.y;break;case"L":e.addPoint(s.x,s.y);r=s.x;i=s.y;break;case"Q":e.addQuad(r,i,s.x1,s.y1,s.x,s.y);r=s.x;i=s.y;break;case"C":e.addBezier(r,i,s.x1,s.y1,s.x2,s.y2,s.x,s.y);r=s.x;i=s.y;break;case"Z":r=t;i=n;break;default:throw new Error("Unexpected path command "+s.type)}}if(e.isEmpty()){e.addPoint(0,0)}return e};d.prototype.draw=function(e){e.beginPath();for(var t=0;t<this.commands.length;t+=1){var n=this.commands[t];if(n.type==="M"){e.moveTo(n.x,n.y)}else if(n.type==="L"){e.lineTo(n.x,n.y)}else if(n.type==="C"){e.bezierCurveTo(n.x1,n.y1,n.x2,n.y2,n.x,n.y)}else if(n.type==="Q"){e.quadraticCurveTo(n.x1,n.y1,n.x,n.y)}else if(n.type==="Z"){e.closePath()}}if(this.fill){e.fillStyle=this.fill;e.fill()}if(this.stroke){e.strokeStyle=this.stroke;e.lineWidth=this.strokeWidth;e.stroke()}};d.prototype.toPathData=function(t){t=t!==undefined?t:2;function i(e){if(Math.round(e)===e){return""+Math.round(e)}else{return e.toFixed(t)}}function e(){var e=arguments;var t="";for(var n=0;n<arguments.length;n+=1){var r=e[n];if(r>=0&&n>0){t+=" "}t+=i(r)}return t}var n="";for(var r=0;r<this.commands.length;r+=1){var a=this.commands[r];if(a.type==="M"){n+="M"+e(a.x,a.y)}else if(a.type==="L"){n+="L"+e(a.x,a.y)}else if(a.type==="C"){n+="C"+e(a.x1,a.y1,a.x2,a.y2,a.x,a.y)}else if(a.type==="Q"){n+="Q"+e(a.x1,a.y1,a.x,a.y)}else if(a.type==="Z"){n+="Z"}}return n};d.prototype.toSVG=function(e){var t='<path d="';t+=this.toPathData(e);t+='"';if(this.fill&&this.fill!=="black"){if(this.fill===null){t+=' fill="none"'}else{t+=' fill="'+this.fill+'"'}}if(this.stroke){t+=' stroke="'+this.stroke+'" stroke-width="'+this.strokeWidth+'"'}t+="/>";return t};d.prototype.toDOMElement=function(e){var t=this.toPathData(e);var n=document.createElementNS("http://www.w3.org/2000/svg","path");n.setAttribute("d",t);return n};function se(e){throw new Error(e)}function oe(e,t){if(!e){se(t)}}var _={fail:se,argument:oe,assert:oe};var le=32768;var ue=2147483648;var ce={};var I={};var l={};function e(e){return function(){return e}}I.BYTE=function(e){_.argument(e>=0&&e<=255,"Byte value should be between 0 and 255.");return[e]};l.BYTE=e(1);I.CHAR=function(e){return[e.charCodeAt(0)]};l.CHAR=e(1);I.CHARARRAY=function(e){if(typeof e==="undefined"){e="";console.warn("Undefined CHARARRAY encountered and treated as an empty string. This is probably caused by a missing glyph name.")}var t=[];for(var n=0;n<e.length;n+=1){t[n]=e.charCodeAt(n)}return t};l.CHARARRAY=function(e){if(typeof e==="undefined"){return 0}return e.length};I.USHORT=function(e){return[e>>8&255,e&255]};l.USHORT=e(2);I.SHORT=function(e){if(e>=le){e=-(2*le-e)}return[e>>8&255,e&255]};l.SHORT=e(2);I.UINT24=function(e){return[e>>16&255,e>>8&255,e&255]};l.UINT24=e(3);I.ULONG=function(e){return[e>>24&255,e>>16&255,e>>8&255,e&255]};l.ULONG=e(4);I.LONG=function(e){if(e>=ue){e=-(2*ue-e)}return[e>>24&255,e>>16&255,e>>8&255,e&255]};l.LONG=e(4);I.FIXED=I.ULONG;l.FIXED=l.ULONG;I.FWORD=I.SHORT;l.FWORD=l.SHORT;I.UFWORD=I.USHORT;l.UFWORD=l.USHORT;I.LONGDATETIME=function(e){return[0,0,0,0,e>>24&255,e>>16&255,e>>8&255,e&255]};l.LONGDATETIME=e(8);I.TAG=function(e){_.argument(e.length===4,"Tag should be exactly 4 ASCII characters.");return[e.charCodeAt(0),e.charCodeAt(1),e.charCodeAt(2),e.charCodeAt(3)]};l.TAG=e(4);I.Card8=I.BYTE;l.Card8=l.BYTE;I.Card16=I.USHORT;l.Card16=l.USHORT;I.OffSize=I.BYTE;l.OffSize=l.BYTE;I.SID=I.USHORT;l.SID=l.USHORT;I.NUMBER=function(e){if(e>=-107&&e<=107){return[e+139]}else if(e>=108&&e<=1131){e=e-108;return[(e>>8)+247,e&255]}else if(e>=-1131&&e<=-108){e=-e-108;return[(e>>8)+251,e&255]}else if(e>=-32768&&e<=32767){return I.NUMBER16(e)}else{return I.NUMBER32(e)}};l.NUMBER=function(e){return I.NUMBER(e).length};I.NUMBER16=function(e){return[28,e>>8&255,e&255]};l.NUMBER16=e(3);I.NUMBER32=function(e){return[29,e>>24&255,e>>16&255,e>>8&255,e&255]};l.NUMBER32=e(5);I.REAL=function(e){var t=e.toString();var n=/\.(\d*?)(?:9{5,20}|0{5,20})\d{0,2}(?:e(.+)|$)/.exec(t);if(n){var r=parseFloat("1e"+((n[2]?+n[2]:0)+n[1].length));t=(Math.round(e*r)/r).toString()}var i="";for(var a=0,s=t.length;a<s;a+=1){var o=t[a];if(o==="e"){i+=t[++a]==="-"?"c":"b"}else if(o==="."){i+="a"}else if(o==="-"){i+="e"}else{i+=o}}i+=i.length&1?"f":"ff";var l=[30];for(var u=0,c=i.length;u<c;u+=2){l.push(parseInt(i.substr(u,2),16))}return l};l.REAL=function(e){return I.REAL(e).length};I.NAME=I.CHARARRAY;l.NAME=l.CHARARRAY;I.STRING=I.CHARARRAY;l.STRING=l.CHARARRAY;ce.UTF8=function(e,t,n){var r=[];var i=n;for(var a=0;a<i;a++,t+=1){r[a]=e.getUint8(t)}return String.fromCharCode.apply(null,r)};ce.UTF16=function(e,t,n){var r=[];var i=n/2;for(var a=0;a<i;a++,t+=2){r[a]=e.getUint16(t)}return String.fromCharCode.apply(null,r)};I.UTF16=function(e){var t=[];for(var n=0;n<e.length;n+=1){var r=e.charCodeAt(n);t[t.length]=r>>8&255;t[t.length]=r&255}return t};l.UTF16=function(e){return e.length*2};var pe={"x-mac-croatian":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®Š™´¨≠ŽØ∞±≤≥∆µ∂∑∏š∫ªºΩžø"+"¿¡¬√ƒ≈Ć«Č… ÀÃÕŒœĐ—“”‘’÷◊©⁄€‹›Æ»–·‚„‰ÂćÁčÈÍÎÏÌÓÔđÒÚÛÙıˆ˜¯πË˚¸Êæˇ","x-mac-cyrillic":"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ†°Ґ£§•¶І®©™Ђђ≠Ѓѓ∞±≤≥іµґЈЄєЇїЉљЊњ"+"јЅ¬√ƒ≈∆«»… ЋћЌќѕ–—“”‘’÷„ЎўЏџ№Ёёяабвгдежзийклмнопрстуфхцчшщъыьэю","x-mac-gaelic":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØḂ±≤≥ḃĊċḊḋḞḟĠġṀæø"+"ṁṖṗɼƒſṠ«»… ÀÃÕŒœ–—“”‘’ṡẛÿŸṪ€‹›Ŷŷṫ·Ỳỳ⁊ÂÊÁËÈÍÎÏÌÓÔ♣ÒÚÛÙıÝýŴŵẄẅẀẁẂẃ","x-mac-greek":"Ĺ²É³ÖÜ΅àâä΄¨çéèê룙î‰ôö¦€ùûü†ΓΔΘΛΞΠß®©ΣΪ§≠°·Α±≤≥¥ΒΕΖΗΙΚΜΦΫΨΩ"+"άΝ¬ΟΡ≈Τ«»… ΥΧΆΈœ–―“”‘’÷ΉΊΌΎέήίόΏύαβψδεφγηιξκλμνοπώρστθωςχυζϊϋΐΰ­","x-mac-icelandic":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûüÝ°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø"+"¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€ÐðÞþý·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ","x-mac-inuit":"ᐃᐄᐅᐆᐊᐋᐱᐲᐳᐴᐸᐹᑉᑎᑏᑐᑑᑕᑖᑦᑭᑮᑯᑰᑲᑳᒃᒋᒌᒍᒎᒐᒑ°ᒡᒥᒦ•¶ᒧ®©™ᒨᒪᒫᒻᓂᓃᓄᓅᓇᓈᓐᓯᓰᓱᓲᓴᓵᔅᓕᓖᓗ"+"ᓘᓚᓛᓪᔨᔩᔪᔫᔭ… ᔮᔾᕕᕖᕗ–—“”‘’ᕘᕙᕚᕝᕆᕇᕈᕉᕋᕌᕐᕿᖀᖁᖂᖃᖄᖅᖏᖐᖑᖒᖓᖔᖕᙱᙲᙳᙴᙵᙶᖖᖠᖡᖢᖣᖤᖥᖦᕼŁł","x-mac-ce":"ÄĀāÉĄÖÜáąČäčĆć鏟ĎíďĒēĖóėôöõúĚěü†°Ę£§•¶ß®©™ę¨≠ģĮįĪ≤≥īĶ∂∑łĻļĽľĹĺŅ"+"ņѬ√ńŇ∆«»… ňŐÕőŌ–—“”‘’÷◊ōŔŕŘ‹›řŖŗŠ‚„šŚśÁŤťÍŽžŪÓÔūŮÚůŰűŲųÝýķŻŁżĢˇ",macintosh:"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø"+"¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›fifl‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ","x-mac-romanian":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ĂȘ∞±≤≥¥µ∂∑∏π∫ªºΩăș"+"¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸ⁄€‹›Țț‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙıˆ˜¯˘˙˚¸˝˛ˇ","x-mac-turkish":"ÄÅÇÉÑÖÜáàâäãåçéèêëíìîïñóòôöõúùûü†°¢£§•¶ß®©™´¨≠ÆØ∞±≤≥¥µ∂∑∏π∫ªºΩæø"+"¿¡¬√ƒ≈∆«»… ÀÃÕŒœ–—“”‘’÷◊ÿŸĞğİıŞş‡·‚„‰ÂÊÁËÈÍÎÏÌÓÔÒÚÛÙˆ˜¯˘˙˚¸˝˛ˇ"};ce.MACSTRING=function(e,t,n,r){var i=pe[r];if(i===undefined){return undefined}var a="";for(var s=0;s<n;s++){var o=e.getUint8(t+s);if(o<=127){a+=String.fromCharCode(o)}else{a+=i[o&127]}}return a};var he=typeof WeakMap==="function"&&new WeakMap;var fe;var de=function(e){if(!fe){fe={};for(var t in pe){fe[t]=new String(t)}}var n=fe[e];if(n===undefined){return undefined}if(he){var r=he.get(n);if(r!==undefined){return r}}var i=pe[e];if(i===undefined){return undefined}var a={};for(var s=0;s<i.length;s++){a[i.charCodeAt(s)]=s+128}if(he){he.set(n,a)}return a};I.MACSTRING=function(e,t){var n=de(t);if(n===undefined){return undefined}var r=[];for(var i=0;i<e.length;i++){var a=e.charCodeAt(i);if(a>=128){a=n[a];if(a===undefined){return undefined}}r[i]=a}return r};l.MACSTRING=function(e,t){var n=I.MACSTRING(e,t);if(n!==undefined){return n.length}else{return 0}};function ge(e){return e>=-128&&e<=127}function me(e,t,n){var r=0;var i=e.length;while(t<i&&r<64&&e[t]===0){++t;++r}n.push(128|r-1);return t}function ve(e,t,n){var r=0;var i=e.length;var a=t;while(a<i&&r<64){var s=e[a];if(!ge(s)){break}if(s===0&&a+1<i&&e[a+1]===0){break}++a;++r}n.push(r-1);for(var o=t;o<a;++o){n.push(e[o]+256&255)}return a}function be(e,t,n){var r=0;var i=e.length;var a=t;while(a<i&&r<64){var s=e[a];if(s===0){break}if(ge(s)&&a+1<i&&ge(e[a+1])){break}++a;++r}n.push(64|r-1);for(var o=t;o<a;++o){var l=e[o];n.push(l+65536>>8&255,l+256&255)}return a}I.VARDELTAS=function(e){var t=0;var n=[];while(t<e.length){var r=e[t];if(r===0){t=me(e,t,n)}else if(r>=-128&&r<=127){t=ve(e,t,n)}else{t=be(e,t,n)}}return n};I.INDEX=function(e){var t=1;var n=[t];var r=[];for(var i=0;i<e.length;i+=1){var a=I.OBJECT(e[i]);Array.prototype.push.apply(r,a);t+=a.length;n.push(t)}if(r.length===0){return[0,0]}var s=[];var o=1+Math.floor(Math.log(t)/Math.log(2))/8|0;var l=[undefined,I.BYTE,I.USHORT,I.UINT24,I.ULONG][o];for(var u=0;u<n.length;u+=1){var c=l(n[u]);Array.prototype.push.apply(s,c)}return Array.prototype.concat(I.Card16(e.length),I.OffSize(o),s,r)};l.INDEX=function(e){return I.INDEX(e).length};I.DICT=function(e){var t=[];var n=Object.keys(e);var r=n.length;for(var i=0;i<r;i+=1){var a=parseInt(n[i],0);var s=e[a];t=t.concat(I.OPERAND(s.value,s.type));t=t.concat(I.OPERATOR(a))}return t};l.DICT=function(e){return I.DICT(e).length};I.OPERATOR=function(e){if(e<1200){return[e]}else{return[12,e-1200]}};I.OPERAND=function(e,t){var n=[];if(Array.isArray(t)){for(var r=0;r<t.length;r+=1){_.argument(e.length===t.length,"Not enough arguments given for type"+t);n=n.concat(I.OPERAND(e[r],t[r]))}}else{if(t==="SID"){n=n.concat(I.NUMBER(e))}else if(t==="offset"){n=n.concat(I.NUMBER32(e))}else if(t==="number"){n=n.concat(I.NUMBER(e))}else if(t==="real"){n=n.concat(I.REAL(e))}else{throw new Error("Unknown operand type "+t)}}return n};I.OP=I.BYTE;l.OP=l.BYTE;var ye=typeof WeakMap==="function"&&new WeakMap;I.CHARSTRING=function(e){if(ye){var t=ye.get(e);if(t!==undefined){return t}}var n=[];var r=e.length;for(var i=0;i<r;i+=1){var a=e[i];n=n.concat(I[a.type](a.value))}if(ye){ye.set(e,n)}return n};l.CHARSTRING=function(e){return I.CHARSTRING(e).length};I.OBJECT=function(e){var t=I[e.type];_.argument(t!==undefined,"No encoding function for type "+e.type);return t(e.value)};l.OBJECT=function(e){var t=l[e.type];_.argument(t!==undefined,"No sizeOf function for type "+e.type);return t(e.value)};I.TABLE=function(e){var t=[];var n=e.fields.length;var r=[];var i=[];for(var a=0;a<n;a+=1){var s=e.fields[a];var o=I[s.type];_.argument(o!==undefined,"No encoding function for field type "+s.type+" ("+s.name+")");var l=e[s.name];if(l===undefined){l=s.value}var u=o(l);if(s.type==="TABLE"){i.push(t.length);t=t.concat([0,0]);r.push(u)}else{t=t.concat(u)}}for(var c=0;c<r.length;c+=1){var p=i[c];var h=t.length;_.argument(h<65536,"Table "+e.tableName+" too big.");t[p]=h>>8;t[p+1]=h&255;t=t.concat(r[c])}return t};l.TABLE=function(e){var t=0;var n=e.fields.length;for(var r=0;r<n;r+=1){var i=e.fields[r];var a=l[i.type];_.argument(a!==undefined,"No sizeOf function for field type "+i.type+" ("+i.name+")");var s=e[i.name];if(s===undefined){s=i.value}t+=a(s);if(i.type==="TABLE"){t+=2}}return t};I.RECORD=I.TABLE;l.RECORD=l.TABLE;I.LITERAL=function(e){return e};l.LITERAL=function(e){return e.length};function i(e,t,n){if(t.length&&(t[0].name!=="coverageFormat"||t[0].value===1)){for(var r=0;r<t.length;r+=1){var i=t[r];this[i.name]=i.value}}this.tableName=e;this.fields=t;if(n){var a=Object.keys(n);for(var s=0;s<a.length;s+=1){var o=a[s];var l=n[o];if(this[o]!==undefined){this[o]=l}}}}i.prototype.encode=function(){return I.TABLE(this)};i.prototype.sizeOf=function(){return l.TABLE(this)};function xe(e,t,n){if(n===undefined){n=t.length}var r=new Array(t.length+1);r[0]={name:e+"Count",type:"USHORT",value:n};for(var i=0;i<t.length;i++){r[i+1]={name:e+i,type:"USHORT",value:t[i]}}return r}function Se(e,t,n){var r=t.length;var i=new Array(r+1);i[0]={name:e+"Count",type:"USHORT",value:r};for(var a=0;a<r;a++){i[a+1]={name:e+a,type:"TABLE",value:n(t[a],a)}}return i}function Oe(e,t,n){var r=t.length;var i=[];i[0]={name:e+"Count",type:"USHORT",value:r};for(var a=0;a<r;a++){i=i.concat(n(t[a],a))}return i}function _e(e){if(e.format===1){i.call(this,"coverageTable",[{name:"coverageFormat",type:"USHORT",value:1}].concat(xe("glyph",e.glyphs)))}else if(e.format===2){i.call(this,"coverageTable",[{name:"coverageFormat",type:"USHORT",value:2}].concat(Oe("rangeRecord",e.ranges,function(e){return[{name:"startGlyphID",type:"USHORT",value:e.start},{name:"endGlyphID",type:"USHORT",value:e.end},{name:"startCoverageIndex",type:"USHORT",value:e.index}]})))}else{_.assert(false,"Coverage format must be 1 or 2.")}}_e.prototype=Object.create(i.prototype);_e.prototype.constructor=_e;function Ae(e){i.call(this,"scriptListTable",Oe("scriptRecord",e,function(e,t){var n=e.script;var r=n.defaultLangSys;_.assert(!!r,"Unable to write GSUB: script "+e.tag+" has no default language system.");return[{name:"scriptTag"+t,type:"TAG",value:e.tag},{name:"script"+t,type:"TABLE",value:new i("scriptTable",[{name:"defaultLangSys",type:"TABLE",value:new i("defaultLangSys",[{name:"lookupOrder",type:"USHORT",value:0},{name:"reqFeatureIndex",type:"USHORT",value:r.reqFeatureIndex}].concat(xe("featureIndex",r.featureIndexes)))}].concat(Oe("langSys",n.langSysRecords,function(e,t){var n=e.langSys;return[{name:"langSysTag"+t,type:"TAG",value:e.tag},{name:"langSys"+t,type:"TABLE",value:new i("langSys",[{name:"lookupOrder",type:"USHORT",value:0},{name:"reqFeatureIndex",type:"USHORT",value:n.reqFeatureIndex}].concat(xe("featureIndex",n.featureIndexes)))}]})))}]}))}Ae.prototype=Object.create(i.prototype);Ae.prototype.constructor=Ae;function Ce(e){i.call(this,"featureListTable",Oe("featureRecord",e,function(e,t){var n=e.feature;return[{name:"featureTag"+t,type:"TAG",value:e.tag},{name:"feature"+t,type:"TABLE",value:new i("featureTable",[{name:"featureParams",type:"USHORT",value:n.featureParams}].concat(xe("lookupListIndex",n.lookupListIndexes)))}]}))}Ce.prototype=Object.create(i.prototype);Ce.prototype.constructor=Ce;function Te(e,n){i.call(this,"lookupListTable",Se("lookup",e,function(e){var t=n[e.lookupType];_.assert(!!t,"Unable to write GSUB lookup type "+e.lookupType+" tables.");return new i("lookupTable",[{name:"lookupType",type:"USHORT",value:e.lookupType},{name:"lookupFlag",type:"USHORT",value:e.lookupFlag}].concat(Se("subtable",e.subtables,t)))}))}Te.prototype=Object.create(i.prototype);Te.prototype.constructor=Te;var E={Table:i,Record:i,Coverage:_e,ScriptList:Ae,FeatureList:Ce,LookupList:Te,ushortList:xe,tableList:Se,recordList:Oe};function Ie(e,t){return e.getUint8(t)}function Ee(e,t){return e.getUint16(t,false)}function Le(e,t){return e.getInt16(t,false)}function Ne(e,t){return e.getUint32(t,false)}function Ue(e,t){var n=e.getInt16(t,false);var r=e.getUint16(t+2,false);return n+r/65535}function Re(e,t){var n="";for(var r=t;r<t+4;r+=1){n+=String.fromCharCode(e.getInt8(r))}return n}function Pe(e,t,n){var r=0;for(var i=0;i<n;i+=1){r<<=8;r+=e.getUint8(t+i)}return r}function Me(e,t,n){var r=[];for(var i=t;i<n;i+=1){r.push(e.getUint8(i))}return r}function ke(e){var t="";for(var n=0;n<e.length;n+=1){t+=String.fromCharCode(e[n])}return t}var we={byte:1,uShort:2,short:2,uLong:4,fixed:4,longDateTime:8,tag:4};function c(e,t){this.data=e;this.offset=t;this.relativeOffset=0}c.prototype.parseByte=function(){var e=this.data.getUint8(this.offset+this.relativeOffset);this.relativeOffset+=1;return e};c.prototype.parseChar=function(){var e=this.data.getInt8(this.offset+this.relativeOffset);this.relativeOffset+=1;return e};c.prototype.parseCard8=c.prototype.parseByte;c.prototype.parseUShort=function(){var e=this.data.getUint16(this.offset+this.relativeOffset);this.relativeOffset+=2;return e};c.prototype.parseCard16=c.prototype.parseUShort;c.prototype.parseSID=c.prototype.parseUShort;c.prototype.parseOffset16=c.prototype.parseUShort;c.prototype.parseShort=function(){var e=this.data.getInt16(this.offset+this.relativeOffset);this.relativeOffset+=2;return e};c.prototype.parseF2Dot14=function(){var e=this.data.getInt16(this.offset+this.relativeOffset)/16384;this.relativeOffset+=2;return e};c.prototype.parseULong=function(){var e=Ne(this.data,this.offset+this.relativeOffset);this.relativeOffset+=4;return e};c.prototype.parseOffset32=c.prototype.parseULong;c.prototype.parseFixed=function(){var e=Ue(this.data,this.offset+this.relativeOffset);this.relativeOffset+=4;return e};c.prototype.parseString=function(e){var t=this.data;var n=this.offset+this.relativeOffset;var r="";this.relativeOffset+=e;for(var i=0;i<e;i++){r+=String.fromCharCode(t.getUint8(n+i))}return r};c.prototype.parseTag=function(){return this.parseString(4)};c.prototype.parseLongDateTime=function(){var e=Ne(this.data,this.offset+this.relativeOffset+4);e-=2082844800;this.relativeOffset+=8;return e};c.prototype.parseVersion=function(e){var t=Ee(this.data,this.offset+this.relativeOffset);var n=Ee(this.data,this.offset+this.relativeOffset+2);this.relativeOffset+=4;if(e===undefined){e=4096}return t+n/e/10};c.prototype.skip=function(e,t){if(t===undefined){t=1}this.relativeOffset+=we[e]*t};c.prototype.parseULongList=function(e){if(e===undefined){e=this.parseULong()}var t=new Array(e);var n=this.data;var r=this.offset+this.relativeOffset;for(var i=0;i<e;i++){t[i]=n.getUint32(r);r+=4}this.relativeOffset+=e*4;return t};c.prototype.parseOffset16List=c.prototype.parseUShortList=function(e){if(e===undefined){e=this.parseUShort()}var t=new Array(e);var n=this.data;var r=this.offset+this.relativeOffset;for(var i=0;i<e;i++){t[i]=n.getUint16(r);r+=2}this.relativeOffset+=e*2;return t};c.prototype.parseShortList=function(e){var t=new Array(e);var n=this.data;var r=this.offset+this.relativeOffset;for(var i=0;i<e;i++){t[i]=n.getInt16(r);r+=2}this.relativeOffset+=e*2;return t};c.prototype.parseByteList=function(e){var t=new Array(e);var n=this.data;var r=this.offset+this.relativeOffset;for(var i=0;i<e;i++){t[i]=n.getUint8(r++)}this.relativeOffset+=e;return t};c.prototype.parseList=function(e,t){if(!t){t=e;e=this.parseUShort()}var n=new Array(e);for(var r=0;r<e;r++){n[r]=t.call(this)}return n};c.prototype.parseList32=function(e,t){if(!t){t=e;e=this.parseULong()}var n=new Array(e);for(var r=0;r<e;r++){n[r]=t.call(this)}return n};c.prototype.parseRecordList=function(e,t){if(!t){t=e;e=this.parseUShort()}var n=new Array(e);var r=Object.keys(t);for(var i=0;i<e;i++){var a={};for(var s=0;s<r.length;s++){var o=r[s];var l=t[o];a[o]=l.call(this)}n[i]=a}return n};c.prototype.parseRecordList32=function(e,t){if(!t){t=e;e=this.parseULong()}var n=new Array(e);var r=Object.keys(t);for(var i=0;i<e;i++){var a={};for(var s=0;s<r.length;s++){var o=r[s];var l=t[o];a[o]=l.call(this)}n[i]=a}return n};c.prototype.parseStruct=function(e){if(typeof e==="function"){return e.call(this)}else{var t=Object.keys(e);var n={};for(var r=0;r<t.length;r++){var i=t[r];var a=e[i];n[i]=a.call(this)}return n}};c.prototype.parseValueRecord=function(e){if(e===undefined){e=this.parseUShort()}if(e===0){return}var t={};if(e&1){t.xPlacement=this.parseShort()}if(e&2){t.yPlacement=this.parseShort()}if(e&4){t.xAdvance=this.parseShort()}if(e&8){t.yAdvance=this.parseShort()}if(e&16){t.xPlaDevice=undefined;this.parseShort()}if(e&32){t.yPlaDevice=undefined;this.parseShort()}if(e&64){t.xAdvDevice=undefined;this.parseShort()}if(e&128){t.yAdvDevice=undefined;this.parseShort()}return t};c.prototype.parseValueRecordList=function(){var e=this.parseUShort();var t=this.parseUShort();var n=new Array(t);for(var r=0;r<t;r++){n[r]=this.parseValueRecord(e)}return n};c.prototype.parsePointer=function(e){var t=this.parseOffset16();if(t>0){return new c(this.data,this.offset+t).parseStruct(e)}return undefined};c.prototype.parsePointer32=function(e){var t=this.parseOffset32();if(t>0){return new c(this.data,this.offset+t).parseStruct(e)}return undefined};c.prototype.parseListOfLists=function(e){var t=this.parseOffset16List();var n=t.length;var r=this.relativeOffset;var i=new Array(n);for(var a=0;a<n;a++){var s=t[a];if(s===0){i[a]=undefined;continue}this.relativeOffset=s;if(e){var o=this.parseOffset16List();var l=new Array(o.length);for(var u=0;u<o.length;u++){this.relativeOffset=s+o[u];l[u]=e.call(this)}i[a]=l}else{i[a]=this.parseUShortList()}}this.relativeOffset=r;return i};c.prototype.parseCoverage=function(){var e=this.offset+this.relativeOffset;var t=this.parseUShort();var n=this.parseUShort();if(t===1){return{format:1,glyphs:this.parseUShortList(n)}}else if(t===2){var r=new Array(n);for(var i=0;i<n;i++){r[i]={start:this.parseUShort(),end:this.parseUShort(),index:this.parseUShort()}}return{format:2,ranges:r}}throw new Error("0x"+e.toString(16)+": Coverage format must be 1 or 2.")};c.prototype.parseClassDef=function(){var e=this.offset+this.relativeOffset;var t=this.parseUShort();if(t===1){return{format:1,startGlyph:this.parseUShort(),classes:this.parseUShortList()}}else if(t===2){return{format:2,ranges:this.parseRecordList({start:c.uShort,end:c.uShort,classId:c.uShort})}}throw new Error("0x"+e.toString(16)+": ClassDef format must be 1 or 2.")};c.list=function(e,t){return function(){return this.parseList(e,t)}};c.list32=function(e,t){return function(){return this.parseList32(e,t)}};c.recordList=function(e,t){return function(){return this.parseRecordList(e,t)}};c.recordList32=function(e,t){return function(){return this.parseRecordList32(e,t)}};c.pointer=function(e){return function(){return this.parsePointer(e)}};c.pointer32=function(e){return function(){return this.parsePointer32(e)}};c.tag=c.prototype.parseTag;c.byte=c.prototype.parseByte;c.uShort=c.offset16=c.prototype.parseUShort;c.uShortList=c.prototype.parseUShortList;c.uLong=c.offset32=c.prototype.parseULong;c.uLongList=c.prototype.parseULongList;c.struct=c.prototype.parseStruct;c.coverage=c.prototype.parseCoverage;c.classDef=c.prototype.parseClassDef;var Be={reserved:c.uShort,reqFeatureIndex:c.uShort,featureIndexes:c.uShortList};c.prototype.parseScriptList=function(){return this.parsePointer(c.recordList({tag:c.tag,script:c.pointer({defaultLangSys:c.pointer(Be),langSysRecords:c.recordList({tag:c.tag,langSys:c.pointer(Be)})})}))||[]};c.prototype.parseFeatureList=function(){return this.parsePointer(c.recordList({tag:c.tag,feature:c.pointer({featureParams:c.offset16,lookupListIndexes:c.uShortList})}))||[]};c.prototype.parseLookupList=function(r){return this.parsePointer(c.list(c.pointer(function(){var e=this.parseUShort();_.argument(1<=e&&e<=9,"GPOS/GSUB lookup type "+e+" unknown.");var t=this.parseUShort();var n=t&16;return{lookupType:e,lookupFlag:t,subtables:this.parseList(c.pointer(r[e])),markFilteringSet:n?this.parseUShort():undefined}})))||[]};c.prototype.parseFeatureVariationsList=function(){return this.parsePointer32(function(){var e=this.parseUShort();var t=this.parseUShort();_.argument(e===1&&t<1,"GPOS/GSUB feature variations table unknown.");var n=this.parseRecordList32({conditionSetOffset:c.offset32,featureTableSubstitutionOffset:c.offset32});return n})||[]};var G={getByte:Ie,getCard8:Ie,getUShort:Ee,getCard16:Ee,getShort:Le,getULong:Ne,getFixed:Ue,getTag:Re,getOffset:Pe,getBytes:Me,bytesToString:ke,Parser:c};function Ge(e,t){t.parseUShort();e.length=t.parseULong();e.language=t.parseULong();var n;e.groupCount=n=t.parseULong();e.glyphIndexMap={};for(var r=0;r<n;r+=1){var i=t.parseULong();var a=t.parseULong();var s=t.parseULong();for(var o=i;o<=a;o+=1){e.glyphIndexMap[o]=s;s++}}}function Ve(e,t,n,r,i){e.length=t.parseUShort();e.language=t.parseUShort();var a;e.segCount=a=t.parseUShort()>>1;t.skip("uShort",3);e.glyphIndexMap={};var s=new G.Parser(n,r+i+14);var o=new G.Parser(n,r+i+16+a*2);var l=new G.Parser(n,r+i+16+a*4);var u=new G.Parser(n,r+i+16+a*6);var c=r+i+16+a*8;for(var p=0;p<a-1;p+=1){var h=void 0;var f=s.parseUShort();var d=o.parseUShort();var g=l.parseShort();var m=u.parseUShort();for(var v=d;v<=f;v+=1){if(m!==0){c=u.offset+u.relativeOffset-2;c+=m;c+=(v-d)*2;h=G.getUShort(n,c);if(h!==0){h=h+g&65535}}else{h=v+g&65535}e.glyphIndexMap[v]=h}}}function De(e,t){var n={};n.version=G.getUShort(e,t);_.argument(n.version===0,"cmap table version should be 0.");n.numTables=G.getUShort(e,t+2);var r=-1;for(var i=n.numTables-1;i>=0;i-=1){var a=G.getUShort(e,t+4+i*8);var s=G.getUShort(e,t+4+i*8+2);if(a===3&&(s===0||s===1||s===10)||a===0&&(s===0||s===1||s===2||s===3||s===4)){r=G.getULong(e,t+4+i*8+4);break}}if(r===-1){throw new Error("No valid cmap sub-tables found.")}var o=new G.Parser(e,t+r);n.format=o.parseUShort();if(n.format===12){Ge(n,o)}else if(n.format===4){Ve(n,o,e,t,r)}else{throw new Error("Only format 4 and 12 cmap tables are supported (found format "+n.format+").")}return n}function Fe(e,t,n){e.segments.push({end:t,start:t,delta:-(t-n),offset:0,glyphIndex:n})}function je(e){e.segments.push({end:65535,start:65535,delta:1,offset:0})}function ze(e){var t=true;var n;for(n=e.length-1;n>0;n-=1){var r=e.get(n);if(r.unicode>65535){console.log("Adding CMAP format 12 (needed!)");t=false;break}}var i=[{name:"version",type:"USHORT",value:0},{name:"numTables",type:"USHORT",value:t?1:2},{name:"platformID",type:"USHORT",value:3},{name:"encodingID",type:"USHORT",value:1},{name:"offset",type:"ULONG",value:t?12:12+8}];if(!t){i=i.concat([{name:"cmap12PlatformID",type:"USHORT",value:3},{name:"cmap12EncodingID",type:"USHORT",value:10},{name:"cmap12Offset",type:"ULONG",value:0}])}i=i.concat([{name:"format",type:"USHORT",value:4},{name:"cmap4Length",type:"USHORT",value:0},{name:"language",type:"USHORT",value:0},{name:"segCountX2",type:"USHORT",value:0},{name:"searchRange",type:"USHORT",value:0},{name:"entrySelector",type:"USHORT",value:0},{name:"rangeShift",type:"USHORT",value:0}]);var a=new E.Table("cmap",i);a.segments=[];for(n=0;n<e.length;n+=1){var s=e.get(n);for(var o=0;o<s.unicodes.length;o+=1){Fe(a,s.unicodes[o],n)}a.segments=a.segments.sort(function(e,t){return e.start-t.start})}je(a);var l=a.segments.length;var u=0;var c=[];var p=[];var h=[];var f=[];var d=[];var g=[];for(n=0;n<l;n+=1){var m=a.segments[n];if(m.end<=65535&&m.start<=65535){c=c.concat({name:"end_"+n,type:"USHORT",value:m.end});p=p.concat({name:"start_"+n,type:"USHORT",value:m.start});h=h.concat({name:"idDelta_"+n,type:"SHORT",value:m.delta});f=f.concat({name:"idRangeOffset_"+n,type:"USHORT",value:m.offset});if(m.glyphId!==undefined){d=d.concat({name:"glyph_"+n,type:"USHORT",value:m.glyphId})}}else{u+=1}if(!t&&m.glyphIndex!==undefined){g=g.concat({name:"cmap12Start_"+n,type:"ULONG",value:m.start});g=g.concat({name:"cmap12End_"+n,type:"ULONG",value:m.end});g=g.concat({name:"cmap12Glyph_"+n,type:"ULONG",value:m.glyphIndex})}}a.segCountX2=(l-u)*2;a.searchRange=Math.pow(2,Math.floor(Math.log(l-u)/Math.log(2)))*2;a.entrySelector=Math.log(a.searchRange/2)/Math.log(2);a.rangeShift=a.segCountX2-a.searchRange;a.fields=a.fields.concat(c);a.fields.push({name:"reservedPad",type:"USHORT",value:0});a.fields=a.fields.concat(p);a.fields=a.fields.concat(h);a.fields=a.fields.concat(f);a.fields=a.fields.concat(d);a.cmap4Length=14+c.length*2+2+p.length*2+h.length*2+f.length*2+d.length*2;if(!t){var v=16+g.length*4;a.cmap12Offset=12+2*2+4+a.cmap4Length;a.fields=a.fields.concat([{name:"cmap12Format",type:"USHORT",value:12},{name:"cmap12Reserved",type:"USHORT",value:0},{name:"cmap12Length",type:"ULONG",value:v},{name:"cmap12Language",type:"ULONG",value:0},{name:"cmap12nGroups",type:"ULONG",value:g.length/3}]);a.fields=a.fields.concat(g)}return a}var He={parse:De,make:ze};var Xe=[".notdef","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","endash","dagger","daggerdbl","periodcentered","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","questiondown","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","ring","cedilla","hungarumlaut","ogonek","caron","emdash","AE","ordfeminine","Lslash","Oslash","OE","ordmasculine","ae","dotlessi","lslash","oslash","oe","germandbls","onesuperior","logicalnot","mu","trademark","Eth","onehalf","plusminus","Thorn","onequarter","divide","brokenbar","degree","thorn","threequarters","twosuperior","registered","minus","eth","multiply","threesuperior","copyright","Aacute","Acircumflex","Adieresis","Agrave","Aring","Atilde","Ccedilla","Eacute","Ecircumflex","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Ntilde","Oacute","Ocircumflex","Odieresis","Ograve","Otilde","Scaron","Uacute","Ucircumflex","Udieresis","Ugrave","Yacute","Ydieresis","Zcaron","aacute","acircumflex","adieresis","agrave","aring","atilde","ccedilla","eacute","ecircumflex","edieresis","egrave","iacute","icircumflex","idieresis","igrave","ntilde","oacute","ocircumflex","odieresis","ograve","otilde","scaron","uacute","ucircumflex","udieresis","ugrave","yacute","ydieresis","zcaron","exclamsmall","Hungarumlautsmall","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","266 ff","onedotenleader","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","commasuperior","threequartersemdash","periodsuperior","questionsmall","asuperior","bsuperior","centsuperior","dsuperior","esuperior","isuperior","lsuperior","msuperior","nsuperior","osuperior","rsuperior","ssuperior","tsuperior","ff","ffi","ffl","parenleftinferior","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","exclamdownsmall","centoldstyle","Lslashsmall","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","Dotaccentsmall","Macronsmall","figuredash","hypheninferior","Ogoneksmall","Ringsmall","Cedillasmall","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","zerosuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall","001.000","001.001","001.002","001.003","Black","Bold","Book","Light","Medium","Regular","Roman","Semibold"];var Ye=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft","guillemotleft","guilsinglleft","guilsinglright","fi","fl","","endash","dagger","daggerdbl","periodcentered","","paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand","","questiondown","","grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis","","ring","cedilla","","hungarumlaut","ogonek","caron","emdash","","","","","","","","","","","","","","","","","AE","","ordfeminine","","","","","Lslash","Oslash","OE","ordmasculine","","","","","","ae","","","","dotlessi","","","lslash","oslash","oe","germandbls"];var We=["","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","space","exclamsmall","Hungarumlautsmall","","dollaroldstyle","dollarsuperior","ampersandsmall","Acutesmall","parenleftsuperior","parenrightsuperior","twodotenleader","onedotenleader","comma","hyphen","period","fraction","zerooldstyle","oneoldstyle","twooldstyle","threeoldstyle","fouroldstyle","fiveoldstyle","sixoldstyle","sevenoldstyle","eightoldstyle","nineoldstyle","colon","semicolon","commasuperior","threequartersemdash","periodsuperior","questionsmall","","asuperior","bsuperior","centsuperior","dsuperior","esuperior","","","isuperior","","","lsuperior","msuperior","nsuperior","osuperior","","","rsuperior","ssuperior","tsuperior","","ff","fi","fl","ffi","ffl","parenleftinferior","","parenrightinferior","Circumflexsmall","hyphensuperior","Gravesmall","Asmall","Bsmall","Csmall","Dsmall","Esmall","Fsmall","Gsmall","Hsmall","Ismall","Jsmall","Ksmall","Lsmall","Msmall","Nsmall","Osmall","Psmall","Qsmall","Rsmall","Ssmall","Tsmall","Usmall","Vsmall","Wsmall","Xsmall","Ysmall","Zsmall","colonmonetary","onefitted","rupiah","Tildesmall","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","exclamdownsmall","centoldstyle","Lslashsmall","","","Scaronsmall","Zcaronsmall","Dieresissmall","Brevesmall","Caronsmall","","Dotaccentsmall","","","Macronsmall","","","figuredash","hypheninferior","","","Ogoneksmall","Ringsmall","Cedillasmall","","","","onequarter","onehalf","threequarters","questiondownsmall","oneeighth","threeeighths","fiveeighths","seveneighths","onethird","twothirds","","","zerosuperior","onesuperior","twosuperior","threesuperior","foursuperior","fivesuperior","sixsuperior","sevensuperior","eightsuperior","ninesuperior","zeroinferior","oneinferior","twoinferior","threeinferior","fourinferior","fiveinferior","sixinferior","seveninferior","eightinferior","nineinferior","centinferior","dollarinferior","periodinferior","commainferior","Agravesmall","Aacutesmall","Acircumflexsmall","Atildesmall","Adieresissmall","Aringsmall","AEsmall","Ccedillasmall","Egravesmall","Eacutesmall","Ecircumflexsmall","Edieresissmall","Igravesmall","Iacutesmall","Icircumflexsmall","Idieresissmall","Ethsmall","Ntildesmall","Ogravesmall","Oacutesmall","Ocircumflexsmall","Otildesmall","Odieresissmall","OEsmall","Oslashsmall","Ugravesmall","Uacutesmall","Ucircumflexsmall","Udieresissmall","Yacutesmall","Thornsmall","Ydieresissmall"];var u=[".notdef",".null","nonmarkingreturn","space","exclam","quotedbl","numbersign","dollar","percent","ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright","asciitilde","Adieresis","Aring","Ccedilla","Eacute","Ntilde","Odieresis","Udieresis","aacute","agrave","acircumflex","adieresis","atilde","aring","ccedilla","eacute","egrave","ecircumflex","edieresis","iacute","igrave","icircumflex","idieresis","ntilde","oacute","ograve","ocircumflex","odieresis","otilde","uacute","ugrave","ucircumflex","udieresis","dagger","degree","cent","sterling","section","bullet","paragraph","germandbls","registered","copyright","trademark","acute","dieresis","notequal","AE","Oslash","infinity","plusminus","lessequal","greaterequal","yen","mu","partialdiff","summation","product","pi","integral","ordfeminine","ordmasculine","Omega","ae","oslash","questiondown","exclamdown","logicalnot","radical","florin","approxequal","Delta","guillemotleft","guillemotright","ellipsis","nonbreakingspace","Agrave","Atilde","Otilde","OE","oe","endash","emdash","quotedblleft","quotedblright","quoteleft","quoteright","divide","lozenge","ydieresis","Ydieresis","fraction","currency","guilsinglleft","guilsinglright","fi","fl","daggerdbl","periodcentered","quotesinglbase","quotedblbase","perthousand","Acircumflex","Ecircumflex","Aacute","Edieresis","Egrave","Iacute","Icircumflex","Idieresis","Igrave","Oacute","Ocircumflex","apple","Ograve","Uacute","Ucircumflex","Ugrave","dotlessi","circumflex","tilde","macron","breve","dotaccent","ring","cedilla","hungarumlaut","ogonek","caron","Lslash","lslash","Scaron","scaron","Zcaron","zcaron","brokenbar","Eth","eth","Yacute","yacute","Thorn","thorn","minus","multiply","onesuperior","twosuperior","threesuperior","onehalf","onequarter","threequarters","franc","Gbreve","gbreve","Idotaccent","Scedilla","scedilla","Cacute","cacute","Ccaron","ccaron","dcroat"];function qe(e){this.font=e}qe.prototype.charToGlyphIndex=function(e){var t=e.codePointAt(0);var n=this.font.glyphs;if(n){for(var r=0;r<n.length;r+=1){var i=n.get(r);for(var a=0;a<i.unicodes.length;a+=1){if(i.unicodes[a]===t){return r}}}}return null};function Ze(e){this.cmap=e}Ze.prototype.charToGlyphIndex=function(e){return this.cmap.glyphIndexMap[e.codePointAt(0)]||0};function Ke(e,t){this.encoding=e;this.charset=t}Ke.prototype.charToGlyphIndex=function(e){var t=e.codePointAt(0);var n=this.encoding[t];return this.charset.indexOf(n)};function Qe(e){switch(e.version){case 1:this.names=u.slice();break;case 2:this.names=new Array(e.numberOfGlyphs);for(var t=0;t<e.numberOfGlyphs;t++){if(e.glyphNameIndex[t]<u.length){this.names[t]=u[e.glyphNameIndex[t]]}else{this.names[t]=e.names[e.glyphNameIndex[t]-u.length]}}break;case 2.5:this.names=new Array(e.numberOfGlyphs);for(var n=0;n<e.numberOfGlyphs;n++){this.names[n]=u[n+e.glyphNameIndex[n]]}break;case 3:this.names=[];break;default:this.names=[];break}}Qe.prototype.nameToGlyphIndex=function(e){return this.names.indexOf(e)};Qe.prototype.glyphIndexToName=function(e){return this.names[e]};function Je(e){var t;var n=e.tables.cmap.glyphIndexMap;var r=Object.keys(n);for(var i=0;i<r.length;i+=1){var a=r[i];var s=n[a];t=e.glyphs.get(s);t.addUnicode(parseInt(a))}for(var o=0;o<e.glyphs.length;o+=1){t=e.glyphs.get(o);if(e.cffEncoding){if(e.isCIDFont){t.name="gid"+o}else{t.name=e.cffEncoding.charset[o]}}else if(e.glyphNames.names){t.name=e.glyphNames.glyphIndexToName(o)}}}function $e(e){e._IndexToUnicodeMap={};var t=e.tables.cmap.glyphIndexMap;var n=Object.keys(t);for(var r=0;r<n.length;r+=1){var i=n[r];var a=t[i];if(e._IndexToUnicodeMap[a]===undefined){e._IndexToUnicodeMap[a]={unicodes:[parseInt(i)]}}else{e._IndexToUnicodeMap[a].unicodes.push(parseInt(i))}}}function et(e,t){if(t.lowMemory){$e(e)}else{Je(e)}}function tt(e,t,n,r,i){e.beginPath();e.moveTo(t,n);e.lineTo(r,i);e.stroke()}var p={line:tt};function nt(e,t){var n=t||new d;return{configurable:true,get:function(){if(typeof n==="function"){n=n()}return n},set:function(e){n=e}}}function g(e){this.bindConstructorValues(e)}g.prototype.bindConstructorValues=function(e){this.index=e.index||0;this.name=e.name||null;this.unicode=e.unicode||undefined;this.unicodes=e.unicodes||e.unicode!==undefined?[e.unicode]:[];if("xMin"in e){this.xMin=e.xMin}if("yMin"in e){this.yMin=e.yMin}if("xMax"in e){this.xMax=e.xMax}if("yMax"in e){this.yMax=e.yMax}if("advanceWidth"in e){this.advanceWidth=e.advanceWidth}Object.defineProperty(this,"path",nt(this,e.path))};g.prototype.addUnicode=function(e){if(this.unicodes.length===0){this.unicode=e}this.unicodes.push(e)};g.prototype.getBoundingBox=function(){return this.path.getBoundingBox()};g.prototype.getPath=function(e,t,n,r,i){e=e!==undefined?e:0;t=t!==undefined?t:0;n=n!==undefined?n:72;var a;var s;if(!r){r={}}var o=r.xScale;var l=r.yScale;if(r.hinting&&i&&i.hinting){s=this.path&&i.hinting.exec(this,n)}if(s){a=i.hinting.getCommands(s);e=Math.round(e);t=Math.round(t);o=l=1}else{a=this.path.commands;var u=1/(this.path.unitsPerEm||1e3)*n;if(o===undefined){o=u}if(l===undefined){l=u}}var c=new d;for(var p=0;p<a.length;p+=1){var h=a[p];if(h.type==="M"){c.moveTo(e+h.x*o,t+-h.y*l)}else if(h.type==="L"){c.lineTo(e+h.x*o,t+-h.y*l)}else if(h.type==="Q"){c.quadraticCurveTo(e+h.x1*o,t+-h.y1*l,e+h.x*o,t+-h.y*l)}else if(h.type==="C"){c.curveTo(e+h.x1*o,t+-h.y1*l,e+h.x2*o,t+-h.y2*l,e+h.x*o,t+-h.y*l)}else if(h.type==="Z"){c.closePath()}}return c};g.prototype.getContours=function(){if(this.points===undefined){return[]}var e=[];var t=[];for(var n=0;n<this.points.length;n+=1){var r=this.points[n];t.push(r);if(r.lastPointOfContour){e.push(t);t=[]}}_.argument(t.length===0,"There are still points left in the current contour.");return e};g.prototype.getMetrics=function(){var e=this.path.commands;var t=[];var n=[];for(var r=0;r<e.length;r+=1){var i=e[r];if(i.type!=="Z"){t.push(i.x);n.push(i.y)}if(i.type==="Q"||i.type==="C"){t.push(i.x1);n.push(i.y1)}if(i.type==="C"){t.push(i.x2);n.push(i.y2)}}var a={xMin:Math.min.apply(null,t),yMin:Math.min.apply(null,n),xMax:Math.max.apply(null,t),yMax:Math.max.apply(null,n),leftSideBearing:this.leftSideBearing};if(!isFinite(a.xMin)){a.xMin=0}if(!isFinite(a.xMax)){a.xMax=this.advanceWidth}if(!isFinite(a.yMin)){a.yMin=0}if(!isFinite(a.yMax)){a.yMax=0}a.rightSideBearing=this.advanceWidth-a.leftSideBearing-(a.xMax-a.xMin);return a};g.prototype.draw=function(e,t,n,r,i){this.getPath(t,n,r,i).draw(e)};g.prototype.drawPoints=function(a,e,t,n){function r(e,t,n,r){a.beginPath();for(var i=0;i<e.length;i+=1){a.moveTo(t+e[i].x*r,n+e[i].y*r);a.arc(t+e[i].x*r,n+e[i].y*r,2,0,Math.PI*2,false)}a.closePath();a.fill()}e=e!==undefined?e:0;t=t!==undefined?t:0;n=n!==undefined?n:24;var i=1/this.path.unitsPerEm*n;var s=[];var o=[];var l=this.path;for(var u=0;u<l.commands.length;u+=1){var c=l.commands[u];if(c.x!==undefined){s.push({x:c.x,y:-c.y})}if(c.x1!==undefined){o.push({x:c.x1,y:-c.y1})}if(c.x2!==undefined){o.push({x:c.x2,y:-c.y2})}}a.fillStyle="blue";r(s,e,t,i);a.fillStyle="red";r(o,e,t,i)};g.prototype.drawMetrics=function(e,t,n,r){var i;t=t!==undefined?t:0;n=n!==undefined?n:0;r=r!==undefined?r:24;i=1/this.path.unitsPerEm*r;e.lineWidth=1;e.strokeStyle="black";p.line(e,t,-1e4,t,1e4);p.line(e,-1e4,n,1e4,n);var a=this.xMin||0;var s=this.yMin||0;var o=this.xMax||0;var l=this.yMax||0;var u=this.advanceWidth||0;e.strokeStyle="blue";p.line(e,t+a*i,-1e4,t+a*i,1e4);p.line(e,t+o*i,-1e4,t+o*i,1e4);p.line(e,-1e4,n+-s*i,1e4,n+-s*i);p.line(e,-1e4,n+-l*i,1e4,n+-l*i);e.strokeStyle="green";p.line(e,t+u*i,-1e4,t+u*i,1e4)};function rt(t,e,n){Object.defineProperty(t,e,{get:function(){t.path;return t[n]},set:function(e){t[n]=e},enumerable:true,configurable:true})}function it(e,t){this.font=e;this.glyphs={};if(Array.isArray(t)){for(var n=0;n<t.length;n++){var r=t[n];r.path.unitsPerEm=e.unitsPerEm;this.glyphs[n]=r}}this.length=t&&t.length||0}it.prototype.get=function(e){if(this.glyphs[e]===undefined){this.font._push(e);if(typeof this.glyphs[e]==="function"){this.glyphs[e]=this.glyphs[e]()}var t=this.glyphs[e];var n=this.font._IndexToUnicodeMap[e];if(n){for(var r=0;r<n.unicodes.length;r++){t.addUnicode(n.unicodes[r])}}if(this.font.cffEncoding){if(this.font.isCIDFont){t.name="gid"+e}else{t.name=this.font.cffEncoding.charset[e]}}else if(this.font.glyphNames.names){t.name=this.font.glyphNames.glyphIndexToName(e)}this.glyphs[e].advanceWidth=this.font._hmtxTableData[e].advanceWidth;this.glyphs[e].leftSideBearing=this.font._hmtxTableData[e].leftSideBearing}else{if(typeof this.glyphs[e]==="function"){this.glyphs[e]=this.glyphs[e]()}}return this.glyphs[e]};it.prototype.push=function(e,t){this.glyphs[e]=t;this.length++};function at(e,t){return new g({index:t,font:e})}function st(n,e,r,i,a,s){return function(){var t=new g({index:e,font:n});t.path=function(){r(t,i,a);var e=s(n.glyphs,t);e.unitsPerEm=n.unitsPerEm;return e};rt(t,"xMin","_xMin");rt(t,"xMax","_xMax");rt(t,"yMin","_yMin");rt(t,"yMax","_yMax");return t}}function ot(n,e,r,i){return function(){var t=new g({index:e,font:n});t.path=function(){var e=r(n,t,i);e.unitsPerEm=n.unitsPerEm;return e};return t}}var A={GlyphSet:it,glyphLoader:at,ttfGlyphLoader:st,cffGlyphLoader:ot};function lt(e,t){if(e===t){return true}else if(Array.isArray(e)&&Array.isArray(t)){if(e.length!==t.length){return false}for(var n=0;n<e.length;n+=1){if(!lt(e[n],t[n])){return false}}return true}else{return false}}function ut(e){var t;if(e.length<1240){t=107}else if(e.length<33900){t=1131}else{t=32768}return t}function T(e,t,n){var r=[];var i=[];var a=G.getCard16(e,t);var s;var o;if(a!==0){var l=G.getByte(e,t+2);s=t+(a+1)*l+2;var u=t+3;for(var c=0;c<a+1;c+=1){r.push(G.getOffset(e,u,l));u+=l}o=s+r[a]}else{o=t+2}for(var p=0;p<r.length-1;p+=1){var h=G.getBytes(e,s+r[p],s+r[p+1]);if(n){h=n(h)}i.push(h)}return{objects:i,startOffset:t,endOffset:o}}function ct(e,t){var n=[];var r=G.getCard16(e,t);var i;var a;if(r!==0){var s=G.getByte(e,t+2);i=t+(r+1)*s+2;var o=t+3;for(var l=0;l<r+1;l+=1){n.push(G.getOffset(e,o,s));o+=s}a=i+n[r]}else{a=t+2}return{offsets:n,startOffset:t,endOffset:a}}function pt(e,t,n,r,i){var a=G.getCard16(n,r);var s=0;if(a!==0){var o=G.getByte(n,r+2);s=r+(a+1)*o+2}var l=G.getBytes(n,s+t[e],s+t[e+1]);if(i){l=i(l)}return l}function ht(e){var t="";var n=15;var r=["0","1","2","3","4","5","6","7","8","9",".","E","E-",null,"-"];while(true){var i=e.parseByte();var a=i>>4;var s=i&15;if(a===n){break}t+=r[a];if(s===n){break}t+=r[s]}return parseFloat(t)}function ft(e,t){var n;var r;var i;var a;if(t===28){n=e.parseByte();r=e.parseByte();return n<<8|r}if(t===29){n=e.parseByte();r=e.parseByte();i=e.parseByte();a=e.parseByte();return n<<24|r<<16|i<<8|a}if(t===30){return ht(e)}if(t>=32&&t<=246){return t-139}if(t>=247&&t<=250){n=e.parseByte();return(t-247)*256+n+108}if(t>=251&&t<=254){n=e.parseByte();return-(t-251)*256-n-108}throw new Error("Invalid b0 "+t)}function dt(e){var t={};for(var n=0;n<e.length;n+=1){var r=e[n][0];var i=e[n][1];var a=void 0;if(i.length===1){a=i[0]}else{a=i}if(t.hasOwnProperty(r)&&!isNaN(t[r])){throw new Error("Object "+t+" already has key "+r)}t[r]=a}return t}function gt(e,t,n){t=t!==undefined?t:0;var r=new G.Parser(e,t);var i=[];var a=[];n=n!==undefined?n:e.length;while(r.relativeOffset<n){var s=r.parseByte();if(s<=21){if(s===12){s=1200+r.parseByte()}i.push([s,a]);a=[]}else{a.push(ft(r,s))}}return dt(i)}function mt(e,t){if(t<=390){t=Xe[t]}else{t=e[t-391]}return t}function vt(e,t,n){var r={};var i;for(var a=0;a<t.length;a+=1){var s=t[a];if(Array.isArray(s.type)){var o=[];o.length=s.type.length;for(var l=0;l<s.type.length;l++){i=e[s.op]!==undefined?e[s.op][l]:undefined;if(i===undefined){i=s.value!==undefined&&s.value[l]!==undefined?s.value[l]:null}if(s.type[l]==="SID"){i=mt(n,i)}o[l]=i}r[s.name]=o}else{i=e[s.op];if(i===undefined){i=s.value!==undefined?s.value:null}if(s.type==="SID"){i=mt(n,i)}r[s.name]=i}}return r}function bt(e,t){var n={};n.formatMajor=G.getCard8(e,t);n.formatMinor=G.getCard8(e,t+1);n.size=G.getCard8(e,t+2);n.offsetSize=G.getCard8(e,t+3);n.startOffset=t;n.endOffset=t+4;return n}var yt=[{name:"version",op:0,type:"SID"},{name:"notice",op:1,type:"SID"},{name:"copyright",op:1200,type:"SID"},{name:"fullName",op:2,type:"SID"},{name:"familyName",op:3,type:"SID"},{name:"weight",op:4,type:"SID"},{name:"isFixedPitch",op:1201,type:"number",value:0},{name:"italicAngle",op:1202,type:"number",value:0},{name:"underlinePosition",op:1203,type:"number",value:-100},{name:"underlineThickness",op:1204,type:"number",value:50},{name:"paintType",op:1205,type:"number",value:0},{name:"charstringType",op:1206,type:"number",value:2},{name:"fontMatrix",op:1207,type:["real","real","real","real","real","real"],value:[.001,0,0,.001,0,0]},{name:"uniqueId",op:13,type:"number"},{name:"fontBBox",op:5,type:["number","number","number","number"],value:[0,0,0,0]},{name:"strokeWidth",op:1208,type:"number",value:0},{name:"xuid",op:14,type:[],value:null},{name:"charset",op:15,type:"offset",value:0},{name:"encoding",op:16,type:"offset",value:0},{name:"charStrings",op:17,type:"offset",value:0},{name:"private",op:18,type:["number","offset"],value:[0,0]},{name:"ros",op:1230,type:["SID","SID","number"]},{name:"cidFontVersion",op:1231,type:"number",value:0},{name:"cidFontRevision",op:1232,type:"number",value:0},{name:"cidFontType",op:1233,type:"number",value:0},{name:"cidCount",op:1234,type:"number",value:8720},{name:"uidBase",op:1235,type:"number"},{name:"fdArray",op:1236,type:"offset"},{name:"fdSelect",op:1237,type:"offset"},{name:"fontName",op:1238,type:"SID"}];var xt=[{name:"subrs",op:19,type:"offset",value:0},{name:"defaultWidthX",op:20,type:"number",value:0},{name:"nominalWidthX",op:21,type:"number",value:0}];function St(e,t){var n=gt(e,0,e.byteLength);return vt(n,yt,t)}function Ot(e,t,n,r){var i=gt(e,t,n);return vt(i,xt,r)}function _t(e,t,n,r){var i=[];for(var a=0;a<n.length;a+=1){var s=new DataView(new Uint8Array(n[a]).buffer);var o=St(s,r);o._subrs=[];o._subrsBias=0;o._defaultWidthX=0;o._nominalWidthX=0;var l=o.private[0];var u=o.private[1];if(l!==0&&u!==0){var c=Ot(e,u+t,l,r);o._defaultWidthX=c.defaultWidthX;o._nominalWidthX=c.nominalWidthX;if(c.subrs!==0){var p=u+c.subrs;var h=T(e,p+t);o._subrs=h.objects;o._subrsBias=ut(o._subrs)}o._privateDict=c}i.push(o)}return i}function At(e,t,n,r){var i;var a;var s=new G.Parser(e,t);n-=1;var o=[".notdef"];var l=s.parseCard8();if(l===0){for(var u=0;u<n;u+=1){i=s.parseSID();o.push(mt(r,i))}}else if(l===1){while(o.length<=n){i=s.parseSID();a=s.parseCard8();for(var c=0;c<=a;c+=1){o.push(mt(r,i));i+=1}}}else if(l===2){while(o.length<=n){i=s.parseSID();a=s.parseCard16();for(var p=0;p<=a;p+=1){o.push(mt(r,i));i+=1}}}else{throw new Error("Unknown charset format "+l)}return o}function Ct(e,t,n){var r;var i={};var a=new G.Parser(e,t);var s=a.parseCard8();if(s===0){var o=a.parseCard8();for(var l=0;l<o;l+=1){r=a.parseCard8();i[r]=l}}else if(s===1){var u=a.parseCard8();r=1;for(var c=0;c<u;c+=1){var p=a.parseCard8();var h=a.parseCard8();for(var f=p;f<=p+h;f+=1){i[f]=r;r+=1}}}else{throw new Error("Unknown encoding format "+s)}return new Ke(i,n)}function Tt(g,m,e){var v;var b;var y;var x;var S=new d;var O=[];var _=0;var A=false;var C=false;var T=0;var I=0;var E;var L;var t;var N;if(g.isCIDFont){var n=g.tables.cff.topDict._fdSelect[m.index];var r=g.tables.cff.topDict._fdArray[n];E=r._subrs;L=r._subrsBias;t=r._defaultWidthX;N=r._nominalWidthX}else{E=g.tables.cff.topDict._subrs;L=g.tables.cff.topDict._subrsBias;t=g.tables.cff.topDict._defaultWidthX;N=g.tables.cff.topDict._nominalWidthX}var U=t;function R(e,t){if(C){S.closePath()}S.moveTo(e,t);C=true}function P(){var e;e=O.length%2!==0;if(e&&!A){U=O.shift()+N}_+=O.length>>1;O.length=0;A=true}function M(e){var t;var n;var r;var i;var a;var s;var o;var l;var u;var c;var p;var h;var f=0;while(f<e.length){var d=e[f];f+=1;switch(d){case 1:P();break;case 3:P();break;case 4:if(O.length>1&&!A){U=O.shift()+N;A=true}I+=O.pop();R(T,I);break;case 5:while(O.length>0){T+=O.shift();I+=O.shift();S.lineTo(T,I)}break;case 6:while(O.length>0){T+=O.shift();S.lineTo(T,I);if(O.length===0){break}I+=O.shift();S.lineTo(T,I)}break;case 7:while(O.length>0){I+=O.shift();S.lineTo(T,I);if(O.length===0){break}T+=O.shift();S.lineTo(T,I)}break;case 8:while(O.length>0){v=T+O.shift();b=I+O.shift();y=v+O.shift();x=b+O.shift();T=y+O.shift();I=x+O.shift();S.curveTo(v,b,y,x,T,I)}break;case 10:a=O.pop()+L;s=E[a];if(s){M(s)}break;case 11:return;case 12:d=e[f];f+=1;switch(d){case 35:v=T+O.shift();b=I+O.shift();y=v+O.shift();x=b+O.shift();o=y+O.shift();l=x+O.shift();u=o+O.shift();c=l+O.shift();p=u+O.shift();h=c+O.shift();T=p+O.shift();I=h+O.shift();O.shift();S.curveTo(v,b,y,x,o,l);S.curveTo(u,c,p,h,T,I);break;case 34:v=T+O.shift();b=I;y=v+O.shift();x=b+O.shift();o=y+O.shift();l=x;u=o+O.shift();c=x;p=u+O.shift();h=I;T=p+O.shift();S.curveTo(v,b,y,x,o,l);S.curveTo(u,c,p,h,T,I);break;case 36:v=T+O.shift();b=I+O.shift();y=v+O.shift();x=b+O.shift();o=y+O.shift();l=x;u=o+O.shift();c=x;p=u+O.shift();h=c+O.shift();T=p+O.shift();S.curveTo(v,b,y,x,o,l);S.curveTo(u,c,p,h,T,I);break;case 37:v=T+O.shift();b=I+O.shift();y=v+O.shift();x=b+O.shift();o=y+O.shift();l=x+O.shift();u=o+O.shift();c=l+O.shift();p=u+O.shift();h=c+O.shift();if(Math.abs(p-T)>Math.abs(h-I)){T=p+O.shift()}else{I=h+O.shift()}S.curveTo(v,b,y,x,o,l);S.curveTo(u,c,p,h,T,I);break;default:console.log("Glyph "+m.index+": unknown operator "+1200+d);O.length=0}break;case 14:if(O.length>0&&!A){U=O.shift()+N;A=true}if(C){S.closePath();C=false}break;case 18:P();break;case 19:case 20:P();f+=_+7>>3;break;case 21:if(O.length>2&&!A){U=O.shift()+N;A=true}I+=O.pop();T+=O.pop();R(T,I);break;case 22:if(O.length>1&&!A){U=O.shift()+N;A=true}T+=O.pop();R(T,I);break;case 23:P();break;case 24:while(O.length>2){v=T+O.shift();b=I+O.shift();y=v+O.shift();x=b+O.shift();T=y+O.shift();I=x+O.shift();S.curveTo(v,b,y,x,T,I)}T+=O.shift();I+=O.shift();S.lineTo(T,I);break;case 25:while(O.length>6){T+=O.shift();I+=O.shift();S.lineTo(T,I)}v=T+O.shift();b=I+O.shift();y=v+O.shift();x=b+O.shift();T=y+O.shift();I=x+O.shift();S.curveTo(v,b,y,x,T,I);break;case 26:if(O.length%2){T+=O.shift()}while(O.length>0){v=T;b=I+O.shift();y=v+O.shift();x=b+O.shift();T=y;I=x+O.shift();S.curveTo(v,b,y,x,T,I)}break;case 27:if(O.length%2){I+=O.shift()}while(O.length>0){v=T+O.shift();b=I;y=v+O.shift();x=b+O.shift();T=y+O.shift();I=x;S.curveTo(v,b,y,x,T,I)}break;case 28:t=e[f];n=e[f+1];O.push((t<<24|n<<16)>>16);f+=2;break;case 29:a=O.pop()+g.gsubrsBias;s=g.gsubrs[a];if(s){M(s)}break;case 30:while(O.length>0){v=T;b=I+O.shift();y=v+O.shift();x=b+O.shift();T=y+O.shift();I=x+(O.length===1?O.shift():0);S.curveTo(v,b,y,x,T,I);if(O.length===0){break}v=T+O.shift();b=I;y=v+O.shift();x=b+O.shift();I=x+O.shift();T=y+(O.length===1?O.shift():0);S.curveTo(v,b,y,x,T,I)}break;case 31:while(O.length>0){v=T+O.shift();b=I;y=v+O.shift();x=b+O.shift();I=x+O.shift();T=y+(O.length===1?O.shift():0);S.curveTo(v,b,y,x,T,I);if(O.length===0){break}v=T;b=I+O.shift();y=v+O.shift();x=b+O.shift();T=y+O.shift();I=x+(O.length===1?O.shift():0);S.curveTo(v,b,y,x,T,I)}break;default:if(d<32){console.log("Glyph "+m.index+": unknown operator "+d)}else if(d<247){O.push(d-139)}else if(d<251){t=e[f];f+=1;O.push((d-247)*256+t+108)}else if(d<255){t=e[f];f+=1;O.push(-(d-251)*256-t-108)}else{t=e[f];n=e[f+1];r=e[f+2];i=e[f+3];f+=4;O.push((t<<24|n<<16|r<<8|i)/65536)}}}}M(e);m.advanceWidth=U;return S}function It(e,t,n,r){var i=[];var a;var s=new G.Parser(e,t);var o=s.parseCard8();if(o===0){for(var l=0;l<n;l++){a=s.parseCard8();if(a>=r){throw new Error("CFF table CID Font FDSelect has bad FD index value "+a+" (FD count "+r+")")}i.push(a)}}else if(o===3){var u=s.parseCard16();var c=s.parseCard16();if(c!==0){throw new Error("CFF Table CID Font FDSelect format 3 range has bad initial GID "+c)}var p;for(var h=0;h<u;h++){a=s.parseCard8();p=s.parseCard16();if(a>=r){throw new Error("CFF table CID Font FDSelect has bad FD index value "+a+" (FD count "+r+")")}if(p>n){throw new Error("CFF Table CID Font FDSelect format 3 range has bad GID "+p)}for(;c<p;c++){i.push(a)}c=p}if(p!==n){throw new Error("CFF Table CID Font FDSelect format 3 range has bad final GID "+p)}}else{throw new Error("CFF Table CID Font FDSelect table has unsupported format "+o)}return i}function Et(n,r,i,e){i.tables.cff={};var t=bt(n,r);var a=T(n,t.endOffset,G.bytesToString);var s=T(n,a.endOffset);var o=T(n,s.endOffset,G.bytesToString);var l=T(n,o.endOffset);i.gsubrs=l.objects;i.gsubrsBias=ut(i.gsubrs);var u=_t(n,r,s.objects,o.objects);if(u.length!==1){throw new Error("CFF table has too many fonts in 'FontSet' - count of fonts NameIndex.length = "+u.length)}var c=u[0];i.tables.cff.topDict=c;if(c._privateDict){i.defaultWidthX=c._privateDict.defaultWidthX;i.nominalWidthX=c._privateDict.nominalWidthX}if(c.ros[0]!==undefined&&c.ros[1]!==undefined){i.isCIDFont=true}if(i.isCIDFont){var p=c.fdArray;var h=c.fdSelect;if(p===0||h===0){throw new Error("Font is marked as a CID font, but FDArray and/or FDSelect information is missing")}p+=r;var f=T(n,p);var d=_t(n,r,f.objects,o.objects);c._fdArray=d;h+=r;c._fdSelect=It(n,h,i.numGlyphs,d.length)}var g=r+c.private[1];var m=Ot(n,g,c.private[0],o.objects);i.defaultWidthX=m.defaultWidthX;i.nominalWidthX=m.nominalWidthX;if(m.subrs!==0){var v=g+m.subrs;var b=T(n,v);i.subrs=b.objects;i.subrsBias=ut(i.subrs)}else{i.subrs=[];i.subrsBias=0}var y;if(e.lowMemory){y=ct(n,r+c.charStrings);i.nGlyphs=y.offsets.length}else{y=T(n,r+c.charStrings);i.nGlyphs=y.objects.length}var x=At(n,r+c.charset,i.nGlyphs,o.objects);if(c.encoding===0){i.cffEncoding=new Ke(Ye,x)}else if(c.encoding===1){i.cffEncoding=new Ke(We,x)}else{i.cffEncoding=Ct(n,r+c.encoding,x)}i.encoding=i.encoding||i.cffEncoding;i.glyphs=new A.GlyphSet(i);if(e.lowMemory){i._push=function(e){var t=pt(e,y.offsets,n,r+c.charStrings);i.glyphs.push(e,A.cffGlyphLoader(i,e,Tt,t))}}else{for(var S=0;S<i.nGlyphs;S+=1){var O=y.objects[S];i.glyphs.push(S,A.cffGlyphLoader(i,S,Tt,O))}}}function Lt(e,t){var n;var r=Xe.indexOf(e);if(r>=0){n=r}r=t.indexOf(e);if(r>=0){n=r+Xe.length}else{n=Xe.length+t.length;t.push(e)}return n}function Nt(){return new E.Record("Header",[{name:"major",type:"Card8",value:1},{name:"minor",type:"Card8",value:0},{name:"hdrSize",type:"Card8",value:4},{name:"major",type:"Card8",value:1}])}function Ut(e){var t=new E.Record("Name INDEX",[{name:"names",type:"INDEX",value:[]}]);t.names=[];for(var n=0;n<e.length;n+=1){t.names.push({name:"name_"+n,type:"NAME",value:e[n]})}return t}function Rt(e,t,n){var r={};for(var i=0;i<e.length;i+=1){var a=e[i];var s=t[a.name];if(s!==undefined&&!lt(s,a.value)){if(a.type==="SID"){s=Lt(s,n)}r[a.op]={name:a.name,type:a.type,value:s}}}return r}function Pt(e,t){var n=new E.Record("Top DICT",[{name:"dict",type:"DICT",value:{}}]);n.dict=Rt(yt,e,t);return n}function Mt(e){var t=new E.Record("Top DICT INDEX",[{name:"topDicts",type:"INDEX",value:[]}]);t.topDicts=[{name:"topDict_0",type:"TABLE",value:e}];return t}function kt(e){var t=new E.Record("String INDEX",[{name:"strings",type:"INDEX",value:[]}]);t.strings=[];for(var n=0;n<e.length;n+=1){t.strings.push({name:"string_"+n,type:"STRING",value:e[n]})}return t}function wt(){return new E.Record("Global Subr INDEX",[{name:"subrs",type:"INDEX",value:[]}])}function Bt(e,t){var n=new E.Record("Charsets",[{name:"format",type:"Card8",value:0}]);for(var r=0;r<e.length;r+=1){var i=e[r];var a=Lt(i,t);n.fields.push({name:"glyph_"+r,type:"SID",value:a})}return n}function Gt(e){var t=[];var n=e.path;t.push({name:"width",type:"NUMBER",value:e.advanceWidth});var r=0;var i=0;for(var a=0;a<n.commands.length;a+=1){var s=void 0;var o=void 0;var l=n.commands[a];if(l.type==="Q"){var u=1/3;var c=2/3;l={type:"C",x:l.x,y:l.y,x1:Math.round(u*r+c*l.x1),y1:Math.round(u*i+c*l.y1),x2:Math.round(u*l.x+c*l.x1),y2:Math.round(u*l.y+c*l.y1)}}if(l.type==="M"){s=Math.round(l.x-r);o=Math.round(l.y-i);t.push({name:"dx",type:"NUMBER",value:s});t.push({name:"dy",type:"NUMBER",value:o});t.push({name:"rmoveto",type:"OP",value:21});r=Math.round(l.x);i=Math.round(l.y)}else if(l.type==="L"){s=Math.round(l.x-r);o=Math.round(l.y-i);t.push({name:"dx",type:"NUMBER",value:s});t.push({name:"dy",type:"NUMBER",value:o});t.push({name:"rlineto",type:"OP",value:5});r=Math.round(l.x);i=Math.round(l.y)}else if(l.type==="C"){var p=Math.round(l.x1-r);var h=Math.round(l.y1-i);var f=Math.round(l.x2-l.x1);var d=Math.round(l.y2-l.y1);s=Math.round(l.x-l.x2);o=Math.round(l.y-l.y2);t.push({name:"dx1",type:"NUMBER",value:p});t.push({name:"dy1",type:"NUMBER",value:h});t.push({name:"dx2",type:"NUMBER",value:f});t.push({name:"dy2",type:"NUMBER",value:d});t.push({name:"dx",type:"NUMBER",value:s});t.push({name:"dy",type:"NUMBER",value:o});t.push({name:"rrcurveto",type:"OP",value:8});r=Math.round(l.x);i=Math.round(l.y)}}t.push({name:"endchar",type:"OP",value:14});return t}function Vt(e){var t=new E.Record("CharStrings INDEX",[{name:"charStrings",type:"INDEX",value:[]}]);for(var n=0;n<e.length;n+=1){var r=e.get(n);var i=Gt(r);t.charStrings.push({name:r.name,type:"CHARSTRING",value:i})}return t}function Dt(e,t){var n=new E.Record("Private DICT",[{name:"dict",type:"DICT",value:{}}]);n.dict=Rt(xt,e,t);return n}function Ft(e,t){var n=new E.Table("CFF ",[{name:"header",type:"RECORD"},{name:"nameIndex",type:"RECORD"},{name:"topDictIndex",type:"RECORD"},{name:"stringIndex",type:"RECORD"},{name:"globalSubrIndex",type:"RECORD"},{name:"charsets",type:"RECORD"},{name:"charStringsIndex",type:"RECORD"},{name:"privateDict",type:"RECORD"}]);var r=1/t.unitsPerEm;var i={version:t.version,fullName:t.fullName,familyName:t.familyName,weight:t.weightName,fontBBox:t.fontBBox||[0,0,0,0],fontMatrix:[r,0,0,r,0,0],charset:999,encoding:0,charStrings:999,private:[0,999]};var a={};var s=[];var o;for(var l=1;l<e.length;l+=1){o=e.get(l);s.push(o.name)}var u=[];n.header=Nt();n.nameIndex=Ut([t.postScriptName]);var c=Pt(i,u);n.topDictIndex=Mt(c);n.globalSubrIndex=wt();n.charsets=Bt(s,u);n.charStringsIndex=Vt(e);n.privateDict=Dt(a,u);n.stringIndex=kt(u);var p=n.header.sizeOf()+n.nameIndex.sizeOf()+n.topDictIndex.sizeOf()+n.stringIndex.sizeOf()+n.globalSubrIndex.sizeOf();i.charset=p;i.encoding=0;i.charStrings=i.charset+n.charsets.sizeOf();i.private[1]=i.charStrings+n.charStringsIndex.sizeOf();c=Pt(i,u);n.topDictIndex=Mt(c);return n}var jt={parse:Et,make:Ft};function zt(e,t){var n={};var r=new G.Parser(e,t);n.version=r.parseVersion();n.fontRevision=Math.round(r.parseFixed()*1e3)/1e3;n.checkSumAdjustment=r.parseULong();n.magicNumber=r.parseULong();_.argument(n.magicNumber===1594834165,"Font header has wrong magic number.");n.flags=r.parseUShort();n.unitsPerEm=r.parseUShort();n.created=r.parseLongDateTime();n.modified=r.parseLongDateTime();n.xMin=r.parseShort();n.yMin=r.parseShort();n.xMax=r.parseShort();n.yMax=r.parseShort();n.macStyle=r.parseUShort();n.lowestRecPPEM=r.parseUShort();n.fontDirectionHint=r.parseShort();n.indexToLocFormat=r.parseShort();n.glyphDataFormat=r.parseShort();return n}function Ht(e){var t=Math.round((new Date).getTime()/1e3)+2082844800;var n=t;if(e.createdTimestamp){n=e.createdTimestamp+2082844800}return new E.Table("head",[{name:"version",type:"FIXED",value:65536},{name:"fontRevision",type:"FIXED",value:65536},{name:"checkSumAdjustment",type:"ULONG",value:0},{name:"magicNumber",type:"ULONG",value:1594834165},{name:"flags",type:"USHORT",value:0},{name:"unitsPerEm",type:"USHORT",value:1e3},{name:"created",type:"LONGDATETIME",value:n},{name:"modified",type:"LONGDATETIME",value:t},{name:"xMin",type:"SHORT",value:0},{name:"yMin",type:"SHORT",value:0},{name:"xMax",type:"SHORT",value:0},{name:"yMax",type:"SHORT",value:0},{name:"macStyle",type:"USHORT",value:0},{name:"lowestRecPPEM",type:"USHORT",value:0},{name:"fontDirectionHint",type:"SHORT",value:2},{name:"indexToLocFormat",type:"SHORT",value:0},{name:"glyphDataFormat",type:"SHORT",value:0}],e)}var Xt={parse:zt,make:Ht};function Yt(e,t){var n={};var r=new G.Parser(e,t);n.version=r.parseVersion();n.ascender=r.parseShort();n.descender=r.parseShort();n.lineGap=r.parseShort();n.advanceWidthMax=r.parseUShort();n.minLeftSideBearing=r.parseShort();n.minRightSideBearing=r.parseShort();n.xMaxExtent=r.parseShort();n.caretSlopeRise=r.parseShort();n.caretSlopeRun=r.parseShort();n.caretOffset=r.parseShort();r.relativeOffset+=8;n.metricDataFormat=r.parseShort();n.numberOfHMetrics=r.parseUShort();return n}function Wt(e){return new E.Table("hhea",[{name:"version",type:"FIXED",value:65536},{name:"ascender",type:"FWORD",value:0},{name:"descender",type:"FWORD",value:0},{name:"lineGap",type:"FWORD",value:0},{name:"advanceWidthMax",type:"UFWORD",value:0},{name:"minLeftSideBearing",type:"FWORD",value:0},{name:"minRightSideBearing",type:"FWORD",value:0},{name:"xMaxExtent",type:"FWORD",value:0},{name:"caretSlopeRise",type:"SHORT",value:1},{name:"caretSlopeRun",type:"SHORT",value:0},{name:"caretOffset",type:"SHORT",value:0},{name:"reserved1",type:"SHORT",value:0},{name:"reserved2",type:"SHORT",value:0},{name:"reserved3",type:"SHORT",value:0},{name:"reserved4",type:"SHORT",value:0},{name:"metricDataFormat",type:"SHORT",value:0},{name:"numberOfHMetrics",type:"USHORT",value:0}],e)}var qt={parse:Yt,make:Wt};function Zt(e,t,n,r,i){var a;var s;var o=new G.Parser(e,t);for(var l=0;l<r;l+=1){if(l<n){a=o.parseUShort();s=o.parseShort()}var u=i.get(l);u.advanceWidth=a;u.leftSideBearing=s}}function Kt(e,t,n,r,i){e._hmtxTableData={};var a;var s;var o=new G.Parser(t,n);for(var l=0;l<i;l+=1){if(l<r){a=o.parseUShort();s=o.parseShort()}e._hmtxTableData[l]={advanceWidth:a,leftSideBearing:s}}}function Qt(e,t,n,r,i,a,s){if(s.lowMemory){Kt(e,t,n,r,i)}else{Zt(t,n,r,i,a)}}function Jt(e){var t=new E.Table("hmtx",[]);for(var n=0;n<e.length;n+=1){var r=e.get(n);var i=r.advanceWidth||0;var a=r.leftSideBearing||0;t.fields.push({name:"advanceWidth_"+n,type:"USHORT",value:i});t.fields.push({name:"leftSideBearing_"+n,type:"SHORT",value:a})}return t}var $t={parse:Qt,make:Jt};function en(e){var t=new E.Table("ltag",[{name:"version",type:"ULONG",value:1},{name:"flags",type:"ULONG",value:0},{name:"numTags",type:"ULONG",value:e.length}]);var n="";var r=12+e.length*4;for(var i=0;i<e.length;++i){var a=n.indexOf(e[i]);if(a<0){a=n.length;n+=e[i]}t.fields.push({name:"offset "+i,type:"USHORT",value:r+a});t.fields.push({name:"length "+i,type:"USHORT",value:e[i].length})}t.fields.push({name:"stringPool",type:"CHARARRAY",value:n});return t}function tn(e,t){var n=new G.Parser(e,t);var r=n.parseULong();_.argument(r===1,"Unsupported ltag table version.");n.skip("uLong",1);var i=n.parseULong();var a=[];for(var s=0;s<i;s++){var o="";var l=t+n.parseUShort();var u=n.parseUShort();for(var c=l;c<l+u;++c){o+=String.fromCharCode(e.getInt8(c))}a.push(o)}return a}var nn={make:en,parse:tn};function rn(e,t){var n={};var r=new G.Parser(e,t);n.version=r.parseVersion();n.numGlyphs=r.parseUShort();if(n.version===1){n.maxPoints=r.parseUShort();n.maxContours=r.parseUShort();n.maxCompositePoints=r.parseUShort();n.maxCompositeContours=r.parseUShort();n.maxZones=r.parseUShort();n.maxTwilightPoints=r.parseUShort();n.maxStorage=r.parseUShort();n.maxFunctionDefs=r.parseUShort();n.maxInstructionDefs=r.parseUShort();n.maxStackElements=r.parseUShort();n.maxSizeOfInstructions=r.parseUShort();n.maxComponentElements=r.parseUShort();n.maxComponentDepth=r.parseUShort()}return n}function an(e){return new E.Table("maxp",[{name:"version",type:"FIXED",value:20480},{name:"numGlyphs",type:"USHORT",value:e}])}var sn={parse:rn,make:an};var on=["copyright","fontFamily","fontSubfamily","uniqueID","fullName","version","postScriptName","trademark","manufacturer","designer","description","manufacturerURL","designerURL","license","licenseURL","reserved","preferredFamily","preferredSubfamily","compatibleFullName","sampleText","postScriptFindFontName","wwsFamily","wwsSubfamily"];var ln={0:"en",1:"fr",2:"de",3:"it",4:"nl",5:"sv",6:"es",7:"da",8:"pt",9:"no",10:"he",11:"ja",12:"ar",13:"fi",14:"el",15:"is",16:"mt",17:"tr",18:"hr",19:"zh-Hant",20:"ur",21:"hi",22:"th",23:"ko",24:"lt",25:"pl",26:"hu",27:"es",28:"lv",29:"se",30:"fo",31:"fa",32:"ru",33:"zh",34:"nl-BE",35:"ga",36:"sq",37:"ro",38:"cz",39:"sk",40:"si",41:"yi",42:"sr",43:"mk",44:"bg",45:"uk",46:"be",47:"uz",48:"kk",49:"az-Cyrl",50:"az-Arab",51:"hy",52:"ka",53:"mo",54:"ky",55:"tg",56:"tk",57:"mn-CN",58:"mn",59:"ps",60:"ks",61:"ku",62:"sd",63:"bo",64:"ne",65:"sa",66:"mr",67:"bn",68:"as",69:"gu",70:"pa",71:"or",72:"ml",73:"kn",74:"ta",75:"te",76:"si",77:"my",78:"km",79:"lo",80:"vi",81:"id",82:"tl",83:"ms",84:"ms-Arab",85:"am",86:"ti",87:"om",88:"so",89:"sw",90:"rw",91:"rn",92:"ny",93:"mg",94:"eo",128:"cy",129:"eu",130:"ca",131:"la",132:"qu",133:"gn",134:"ay",135:"tt",136:"ug",137:"dz",138:"jv",139:"su",140:"gl",141:"af",142:"br",143:"iu",144:"gd",145:"gv",146:"ga",147:"to",148:"el-polyton",149:"kl",150:"az",151:"nn"};var un={0:0,1:0,2:0,3:0,4:0,5:0,6:0,7:0,8:0,9:0,10:5,11:1,12:4,13:0,14:6,15:0,16:0,17:0,18:0,19:2,20:4,21:9,22:21,23:3,24:29,25:29,26:29,27:29,28:29,29:0,30:0,31:4,32:7,33:25,34:0,35:0,36:0,37:0,38:29,39:29,40:0,41:5,42:7,43:7,44:7,45:7,46:7,47:7,48:7,49:7,50:4,51:24,52:23,53:7,54:7,55:7,56:7,57:27,58:7,59:4,60:4,61:4,62:4,63:26,64:9,65:9,66:9,67:13,68:13,69:11,70:10,71:12,72:17,73:16,74:14,75:15,76:18,77:19,78:20,79:22,80:30,81:0,82:0,83:0,84:4,85:28,86:28,87:28,88:0,89:0,90:0,91:0,92:0,93:0,94:0,128:0,129:0,130:0,131:0,132:0,133:0,134:0,135:7,136:4,137:26,138:0,139:0,140:0,141:0,142:0,143:28,144:0,145:0,146:0,147:0,148:6,149:0,150:0,151:0};var cn={1078:"af",1052:"sq",1156:"gsw",1118:"am",5121:"ar-DZ",15361:"ar-BH",3073:"ar",2049:"ar-IQ",11265:"ar-JO",13313:"ar-KW",12289:"ar-LB",4097:"ar-LY",6145:"ary",8193:"ar-OM",16385:"ar-QA",1025:"ar-SA",10241:"ar-SY",7169:"aeb",14337:"ar-AE",9217:"ar-YE",1067:"hy",1101:"as",2092:"az-Cyrl",1068:"az",1133:"ba",1069:"eu",1059:"be",2117:"bn",1093:"bn-IN",8218:"bs-Cyrl",5146:"bs",1150:"br",1026:"bg",1027:"ca",3076:"zh-HK",5124:"zh-MO",2052:"zh",4100:"zh-SG",1028:"zh-TW",1155:"co",1050:"hr",4122:"hr-BA",1029:"cs",1030:"da",1164:"prs",1125:"dv",2067:"nl-BE",1043:"nl",3081:"en-AU",10249:"en-BZ",4105:"en-CA",9225:"en-029",16393:"en-IN",6153:"en-IE",8201:"en-JM",17417:"en-MY",5129:"en-NZ",13321:"en-PH",18441:"en-SG",7177:"en-ZA",11273:"en-TT",2057:"en-GB",1033:"en",12297:"en-ZW",1061:"et",1080:"fo",1124:"fil",1035:"fi",2060:"fr-BE",3084:"fr-CA",1036:"fr",5132:"fr-LU",6156:"fr-MC",4108:"fr-CH",1122:"fy",1110:"gl",1079:"ka",3079:"de-AT",1031:"de",5127:"de-LI",4103:"de-LU",2055:"de-CH",1032:"el",1135:"kl",1095:"gu",1128:"ha",1037:"he",1081:"hi",1038:"hu",1039:"is",1136:"ig",1057:"id",1117:"iu",2141:"iu-Latn",2108:"ga",1076:"xh",1077:"zu",1040:"it",2064:"it-CH",1041:"ja",1099:"kn",1087:"kk",1107:"km",1158:"quc",1159:"rw",1089:"sw",1111:"kok",1042:"ko",1088:"ky",1108:"lo",1062:"lv",1063:"lt",2094:"dsb",1134:"lb",1071:"mk",2110:"ms-BN",1086:"ms",1100:"ml",1082:"mt",1153:"mi",1146:"arn",1102:"mr",1148:"moh",1104:"mn",2128:"mn-CN",1121:"ne",1044:"nb",2068:"nn",1154:"oc",1096:"or",1123:"ps",1045:"pl",1046:"pt",2070:"pt-PT",1094:"pa",1131:"qu-BO",2155:"qu-EC",3179:"qu",1048:"ro",1047:"rm",1049:"ru",9275:"smn",4155:"smj-NO",5179:"smj",3131:"se-FI",1083:"se",2107:"se-SE",8251:"sms",6203:"sma-NO",7227:"sms",1103:"sa",7194:"sr-Cyrl-BA",3098:"sr",6170:"sr-Latn-BA",2074:"sr-Latn",1132:"nso",1074:"tn",1115:"si",1051:"sk",1060:"sl",11274:"es-AR",16394:"es-BO",13322:"es-CL",9226:"es-CO",5130:"es-CR",7178:"es-DO",12298:"es-EC",17418:"es-SV",4106:"es-GT",18442:"es-HN",2058:"es-MX",19466:"es-NI",6154:"es-PA",15370:"es-PY",10250:"es-PE",20490:"es-PR",3082:"es",1034:"es",21514:"es-US",14346:"es-UY",8202:"es-VE",2077:"sv-FI",1053:"sv",1114:"syr",1064:"tg",2143:"tzm",1097:"ta",1092:"tt",1098:"te",1054:"th",1105:"bo",1055:"tr",1090:"tk",1152:"ug",1058:"uk",1070:"hsb",1056:"ur",2115:"uz-Cyrl",1091:"uz",1066:"vi",1106:"cy",1160:"wo",1157:"sah",1144:"ii",1130:"yo"};function pn(e,t,n){switch(e){case 0:if(t===65535){return"und"}else if(n){return n[t]}break;case 1:return ln[t];case 3:return cn[t]}return undefined}var hn="utf-16";var fn={0:"macintosh",1:"x-mac-japanese",2:"x-mac-chinesetrad",3:"x-mac-korean",6:"x-mac-greek",7:"x-mac-cyrillic",9:"x-mac-devanagai",10:"x-mac-gurmukhi",11:"x-mac-gujarati",12:"x-mac-oriya",13:"x-mac-bengali",14:"x-mac-tamil",15:"x-mac-telugu",16:"x-mac-kannada",17:"x-mac-malayalam",18:"x-mac-sinhalese",19:"x-mac-burmese",20:"x-mac-khmer",21:"x-mac-thai",22:"x-mac-lao",23:"x-mac-georgian",24:"x-mac-armenian",25:"x-mac-chinesesimp",26:"x-mac-tibetan",27:"x-mac-mongolian",28:"x-mac-ethiopic",29:"x-mac-ce",30:"x-mac-vietnamese",31:"x-mac-extarabic"};var dn={15:"x-mac-icelandic",17:"x-mac-turkish",18:"x-mac-croatian",24:"x-mac-ce",25:"x-mac-ce",26:"x-mac-ce",27:"x-mac-ce",28:"x-mac-ce",30:"x-mac-icelandic",37:"x-mac-romanian",38:"x-mac-ce",39:"x-mac-ce",40:"x-mac-ce",143:"x-mac-inuit",146:"x-mac-gaelic"};function gn(e,t,n){switch(e){case 0:return hn;case 1:return dn[n]||fn[t];case 3:if(t===1||t===10){return hn}break}return undefined}function mn(e,t,n){var r={};var i=new G.Parser(e,t);var a=i.parseUShort();var s=i.parseUShort();var o=i.offset+i.parseUShort();for(var l=0;l<s;l++){var u=i.parseUShort();var c=i.parseUShort();var p=i.parseUShort();var h=i.parseUShort();var f=on[h]||h;var d=i.parseUShort();var g=i.parseUShort();var m=pn(u,p,n);var v=gn(u,c,p);if(v!==undefined&&m!==undefined){var b=void 0;if(v===hn){b=ce.UTF16(e,o+g,d)}else{b=ce.MACSTRING(e,o+g,d,v)}if(b){var y=r[f];if(y===undefined){y=r[f]={}}y[m]=b}}}var x=0;if(a===1){x=i.parseUShort()}return r}function vn(e){var t={};for(var n in e){t[e[n]]=parseInt(n)}return t}function bn(e,t,n,r,i,a){return new E.Record("NameRecord",[{name:"platformID",type:"USHORT",value:e},{name:"encodingID",type:"USHORT",value:t},{name:"languageID",type:"USHORT",value:n},{name:"nameID",type:"USHORT",value:r},{name:"length",type:"USHORT",value:i},{name:"offset",type:"USHORT",value:a}])}function yn(e,t){var n=e.length;var r=t.length-n+1;e:for(var i=0;i<r;i++){for(;i<r;i++){for(var a=0;a<n;a++){if(t[i+a]!==e[a]){continue e}}return i}}return-1}function xn(e,t){var n=yn(e,t);if(n<0){n=t.length;var r=0;var i=e.length;for(;r<i;++r){t.push(e[r])}}return n}function Sn(e,t){var n;var r=[];var i={};var a=vn(on);for(var s in e){var o=a[s];if(o===undefined){o=s}n=parseInt(o);if(isNaN(n)){throw new Error('Name table entry "'+s+'" does not exist, see nameTableNames for complete list.')}i[n]=e[s];r.push(n)}var l=vn(ln);var u=vn(cn);var c=[];var p=[];for(var h=0;h<r.length;h++){n=r[h];var f=i[n];for(var d in f){var g=f[d];var m=1;var v=l[d];var b=un[v];var y=gn(m,b,v);var x=I.MACSTRING(g,y);if(x===undefined){m=0;v=t.indexOf(d);if(v<0){v=t.length;t.push(d)}b=4;x=I.UTF16(g)}var S=xn(x,p);c.push(bn(m,b,v,n,x.length,S));var O=u[d];if(O!==undefined){var _=I.UTF16(g);var A=xn(_,p);c.push(bn(3,1,O,n,_.length,A))}}}c.sort(function(e,t){return e.platformID-t.platformID||e.encodingID-t.encodingID||e.languageID-t.languageID||e.nameID-t.nameID});var C=new E.Table("name",[{name:"format",type:"USHORT",value:0},{name:"count",type:"USHORT",value:c.length},{name:"stringOffset",type:"USHORT",value:6+c.length*12}]);for(var T=0;T<c.length;T++){C.fields.push({name:"record_"+T,type:"RECORD",value:c[T]})}C.fields.push({name:"strings",type:"LITERAL",value:p});return C}var On={parse:mn,make:Sn};var _n=[{begin:0,end:127},{begin:128,end:255},{begin:256,end:383},{begin:384,end:591},{begin:592,end:687},{begin:688,end:767},{begin:768,end:879},{begin:880,end:1023},{begin:11392,end:11519},{begin:1024,end:1279},{begin:1328,end:1423},{begin:1424,end:1535},{begin:42240,end:42559},{begin:1536,end:1791},{begin:1984,end:2047},{begin:2304,end:2431},{begin:2432,end:2559},{begin:2560,end:2687},{begin:2688,end:2815},{begin:2816,end:2943},{begin:2944,end:3071},{begin:3072,end:3199},{begin:3200,end:3327},{begin:3328,end:3455},{begin:3584,end:3711},{begin:3712,end:3839},{begin:4256,end:4351},{begin:6912,end:7039},{begin:4352,end:4607},{begin:7680,end:7935},{begin:7936,end:8191},{begin:8192,end:8303},{begin:8304,end:8351},{begin:8352,end:8399},{begin:8400,end:8447},{begin:8448,end:8527},{begin:8528,end:8591},{begin:8592,end:8703},{begin:8704,end:8959},{begin:8960,end:9215},{begin:9216,end:9279},{begin:9280,end:9311},{begin:9312,end:9471},{begin:9472,end:9599},{begin:9600,end:9631},{begin:9632,end:9727},{begin:9728,end:9983},{begin:9984,end:10175},{begin:12288,end:12351},{begin:12352,end:12447},{begin:12448,end:12543},{begin:12544,end:12591},{begin:12592,end:12687},{begin:43072,end:43135},{begin:12800,end:13055},{begin:13056,end:13311},{begin:44032,end:55215},{begin:55296,end:57343},{begin:67840,end:67871},{begin:19968,end:40959},{begin:57344,end:63743},{begin:12736,end:12783},{begin:64256,end:64335},{begin:64336,end:65023},{begin:65056,end:65071},{begin:65040,end:65055},{begin:65104,end:65135},{begin:65136,end:65279},{begin:65280,end:65519},{begin:65520,end:65535},{begin:3840,end:4095},{begin:1792,end:1871},{begin:1920,end:1983},{begin:3456,end:3583},{begin:4096,end:4255},{begin:4608,end:4991},{begin:5024,end:5119},{begin:5120,end:5759},{begin:5760,end:5791},{begin:5792,end:5887},{begin:6016,end:6143},{begin:6144,end:6319},{begin:10240,end:10495},{begin:40960,end:42127},{begin:5888,end:5919},{begin:66304,end:66351},{begin:66352,end:66383},{begin:66560,end:66639},{begin:118784,end:119039},{begin:119808,end:120831},{begin:1044480,end:1048573},{begin:65024,end:65039},{begin:917504,end:917631},{begin:6400,end:6479},{begin:6480,end:6527},{begin:6528,end:6623},{begin:6656,end:6687},{begin:11264,end:11359},{begin:11568,end:11647},{begin:19904,end:19967},{begin:43008,end:43055},{begin:65536,end:65663},{begin:65856,end:65935},{begin:66432,end:66463},{begin:66464,end:66527},{begin:66640,end:66687},{begin:66688,end:66735},{begin:67584,end:67647},{begin:68096,end:68191},{begin:119552,end:119647},{begin:73728,end:74751},{begin:119648,end:119679},{begin:7040,end:7103},{begin:7168,end:7247},{begin:7248,end:7295},{begin:43136,end:43231},{begin:43264,end:43311},{begin:43312,end:43359},{begin:43520,end:43615},{begin:65936,end:65999},{begin:66e3,end:66047},{begin:66208,end:66271},{begin:127024,end:127135}];function An(e){for(var t=0;t<_n.length;t+=1){var n=_n[t];if(e>=n.begin&&e<n.end){return t}}return-1}function Cn(e,t){var n={};var r=new G.Parser(e,t);n.version=r.parseUShort();n.xAvgCharWidth=r.parseShort();n.usWeightClass=r.parseUShort();n.usWidthClass=r.parseUShort();n.fsType=r.parseUShort();n.ySubscriptXSize=r.parseShort();n.ySubscriptYSize=r.parseShort();n.ySubscriptXOffset=r.parseShort();n.ySubscriptYOffset=r.parseShort();n.ySuperscriptXSize=r.parseShort();n.ySuperscriptYSize=r.parseShort();n.ySuperscriptXOffset=r.parseShort();n.ySuperscriptYOffset=r.parseShort();n.yStrikeoutSize=r.parseShort();n.yStrikeoutPosition=r.parseShort();n.sFamilyClass=r.parseShort();n.panose=[];for(var i=0;i<10;i++){n.panose[i]=r.parseByte()}n.ulUnicodeRange1=r.parseULong();n.ulUnicodeRange2=r.parseULong();n.ulUnicodeRange3=r.parseULong();n.ulUnicodeRange4=r.parseULong();n.achVendID=String.fromCharCode(r.parseByte(),r.parseByte(),r.parseByte(),r.parseByte());n.fsSelection=r.parseUShort();n.usFirstCharIndex=r.parseUShort();n.usLastCharIndex=r.parseUShort();n.sTypoAscender=r.parseShort();n.sTypoDescender=r.parseShort();n.sTypoLineGap=r.parseShort();n.usWinAscent=r.parseUShort();n.usWinDescent=r.parseUShort();if(n.version>=1){n.ulCodePageRange1=r.parseULong();n.ulCodePageRange2=r.parseULong()}if(n.version>=2){n.sxHeight=r.parseShort();n.sCapHeight=r.parseShort();n.usDefaultChar=r.parseUShort();n.usBreakChar=r.parseUShort();n.usMaxContent=r.parseUShort()}return n}function Tn(e){return new E.Table("OS/2",[{name:"version",type:"USHORT",value:3},{name:"xAvgCharWidth",type:"SHORT",value:0},{name:"usWeightClass",type:"USHORT",value:0},{name:"usWidthClass",type:"USHORT",value:0},{name:"fsType",type:"USHORT",value:0},{name:"ySubscriptXSize",type:"SHORT",value:650},{name:"ySubscriptYSize",type:"SHORT",value:699},{name:"ySubscriptXOffset",type:"SHORT",value:0},{name:"ySubscriptYOffset",type:"SHORT",value:140},{name:"ySuperscriptXSize",type:"SHORT",value:650},{name:"ySuperscriptYSize",type:"SHORT",value:699},{name:"ySuperscriptXOffset",type:"SHORT",value:0},{name:"ySuperscriptYOffset",type:"SHORT",value:479},{name:"yStrikeoutSize",type:"SHORT",value:49},{name:"yStrikeoutPosition",type:"SHORT",value:258},{name:"sFamilyClass",type:"SHORT",value:0},{name:"bFamilyType",type:"BYTE",value:0},{name:"bSerifStyle",type:"BYTE",value:0},{name:"bWeight",type:"BYTE",value:0},{name:"bProportion",type:"BYTE",value:0},{name:"bContrast",type:"BYTE",value:0},{name:"bStrokeVariation",type:"BYTE",value:0},{name:"bArmStyle",type:"BYTE",value:0},{name:"bLetterform",type:"BYTE",value:0},{name:"bMidline",type:"BYTE",value:0},{name:"bXHeight",type:"BYTE",value:0},{name:"ulUnicodeRange1",type:"ULONG",value:0},{name:"ulUnicodeRange2",type:"ULONG",value:0},{name:"ulUnicodeRange3",type:"ULONG",value:0},{name:"ulUnicodeRange4",type:"ULONG",value:0},{name:"achVendID",type:"CHARARRAY",value:"XXXX"},{name:"fsSelection",type:"USHORT",value:0},{name:"usFirstCharIndex",type:"USHORT",value:0},{name:"usLastCharIndex",type:"USHORT",value:0},{name:"sTypoAscender",type:"SHORT",value:0},{name:"sTypoDescender",type:"SHORT",value:0},{name:"sTypoLineGap",type:"SHORT",value:0},{name:"usWinAscent",type:"USHORT",value:0},{name:"usWinDescent",type:"USHORT",value:0},{name:"ulCodePageRange1",type:"ULONG",value:0},{name:"ulCodePageRange2",type:"ULONG",value:0},{name:"sxHeight",type:"SHORT",value:0},{name:"sCapHeight",type:"SHORT",value:0},{name:"usDefaultChar",type:"USHORT",value:0},{name:"usBreakChar",type:"USHORT",value:0},{name:"usMaxContext",type:"USHORT",value:0}],e)}var In={parse:Cn,make:Tn,unicodeRanges:_n,getUnicodeRange:An};function En(e,t){var n={};var r=new G.Parser(e,t);n.version=r.parseVersion();n.italicAngle=r.parseFixed();n.underlinePosition=r.parseShort();n.underlineThickness=r.parseShort();n.isFixedPitch=r.parseULong();n.minMemType42=r.parseULong();n.maxMemType42=r.parseULong();n.minMemType1=r.parseULong();n.maxMemType1=r.parseULong();switch(n.version){case 1:n.names=u.slice();break;case 2:n.numberOfGlyphs=r.parseUShort();n.glyphNameIndex=new Array(n.numberOfGlyphs);for(var i=0;i<n.numberOfGlyphs;i++){n.glyphNameIndex[i]=r.parseUShort()}n.names=[];for(var a=0;a<n.numberOfGlyphs;a++){if(n.glyphNameIndex[a]>=u.length){var s=r.parseChar();n.names.push(r.parseString(s))}}break;case 2.5:n.numberOfGlyphs=r.parseUShort();n.offset=new Array(n.numberOfGlyphs);for(var o=0;o<n.numberOfGlyphs;o++){n.offset[o]=r.parseChar()}break}return n}function Ln(){return new E.Table("post",[{name:"version",type:"FIXED",value:196608},{name:"italicAngle",type:"FIXED",value:0},{name:"underlinePosition",type:"FWORD",value:0},{name:"underlineThickness",type:"FWORD",value:0},{name:"isFixedPitch",type:"ULONG",value:0},{name:"minMemType42",type:"ULONG",value:0},{name:"maxMemType42",type:"ULONG",value:0},{name:"minMemType1",type:"ULONG",value:0},{name:"maxMemType1",type:"ULONG",value:0}])}var Nn={parse:En,make:Ln};var a=new Array(9);a[1]=function e(){var t=this.offset+this.relativeOffset;var n=this.parseUShort();if(n===1){return{substFormat:1,coverage:this.parsePointer(c.coverage),deltaGlyphId:this.parseUShort()}}else if(n===2){return{substFormat:2,coverage:this.parsePointer(c.coverage),substitute:this.parseOffset16List()}}_.assert(false,"0x"+t.toString(16)+": lookup type 1 format must be 1 or 2.")};a[2]=function e(){var t=this.parseUShort();_.argument(t===1,"GSUB Multiple Substitution Subtable identifier-format must be 1");return{substFormat:t,coverage:this.parsePointer(c.coverage),sequences:this.parseListOfLists()}};a[3]=function e(){var t=this.parseUShort();_.argument(t===1,"GSUB Alternate Substitution Subtable identifier-format must be 1");return{substFormat:t,coverage:this.parsePointer(c.coverage),alternateSets:this.parseListOfLists()}};a[4]=function e(){var t=this.parseUShort();_.argument(t===1,"GSUB ligature table identifier-format must be 1");return{substFormat:t,coverage:this.parsePointer(c.coverage),ligatureSets:this.parseListOfLists(function(){return{ligGlyph:this.parseUShort(),components:this.parseUShortList(this.parseUShort()-1)}})}};var Un={sequenceIndex:c.uShort,lookupListIndex:c.uShort};a[5]=function e(){var t=this.offset+this.relativeOffset;var n=this.parseUShort();if(n===1){return{substFormat:n,coverage:this.parsePointer(c.coverage),ruleSets:this.parseListOfLists(function(){var e=this.parseUShort();var t=this.parseUShort();return{input:this.parseUShortList(e-1),lookupRecords:this.parseRecordList(t,Un)}})}}else if(n===2){return{substFormat:n,coverage:this.parsePointer(c.coverage),classDef:this.parsePointer(c.classDef),classSets:this.parseListOfLists(function(){var e=this.parseUShort();var t=this.parseUShort();return{classes:this.parseUShortList(e-1),lookupRecords:this.parseRecordList(t,Un)}})}}else if(n===3){var r=this.parseUShort();var i=this.parseUShort();return{substFormat:n,coverages:this.parseList(r,c.pointer(c.coverage)),lookupRecords:this.parseRecordList(i,Un)}}_.assert(false,"0x"+t.toString(16)+": lookup type 5 format must be 1, 2 or 3.")};a[6]=function e(){var t=this.offset+this.relativeOffset;var n=this.parseUShort();if(n===1){return{substFormat:1,coverage:this.parsePointer(c.coverage),chainRuleSets:this.parseListOfLists(function(){return{backtrack:this.parseUShortList(),input:this.parseUShortList(this.parseShort()-1),lookahead:this.parseUShortList(),lookupRecords:this.parseRecordList(Un)}})}}else if(n===2){return{substFormat:2,coverage:this.parsePointer(c.coverage),backtrackClassDef:this.parsePointer(c.classDef),inputClassDef:this.parsePointer(c.classDef),lookaheadClassDef:this.parsePointer(c.classDef),chainClassSet:this.parseListOfLists(function(){return{backtrack:this.parseUShortList(),input:this.parseUShortList(this.parseShort()-1),lookahead:this.parseUShortList(),lookupRecords:this.parseRecordList(Un)}})}}else if(n===3){return{substFormat:3,backtrackCoverage:this.parseList(c.pointer(c.coverage)),inputCoverage:this.parseList(c.pointer(c.coverage)),lookaheadCoverage:this.parseList(c.pointer(c.coverage)),lookupRecords:this.parseRecordList(Un)}}_.assert(false,"0x"+t.toString(16)+": lookup type 6 format must be 1, 2 or 3.")};a[7]=function e(){var t=this.parseUShort();_.argument(t===1,"GSUB Extension Substitution subtable identifier-format must be 1");var n=this.parseUShort();var r=new c(this.data,this.offset+this.parseULong());return{substFormat:1,lookupType:n,extension:a[n].call(r)}};a[8]=function e(){var t=this.parseUShort();_.argument(t===1,"GSUB Reverse Chaining Contextual Single Substitution Subtable identifier-format must be 1");return{substFormat:t,coverage:this.parsePointer(c.coverage),backtrackCoverage:this.parseList(c.pointer(c.coverage)),lookaheadCoverage:this.parseList(c.pointer(c.coverage)),substitutes:this.parseUShortList()}};function Rn(e,t){t=t||0;var n=new c(e,t);var r=n.parseVersion(1);_.argument(r===1||r===1.1,"Unsupported GSUB table version.");if(r===1){return{version:r,scripts:n.parseScriptList(),features:n.parseFeatureList(),lookups:n.parseLookupList(a)}}else{return{version:r,scripts:n.parseScriptList(),features:n.parseFeatureList(),lookups:n.parseLookupList(a),variations:n.parseFeatureVariationsList()}}}var Pn=new Array(9);Pn[1]=function e(t){if(t.substFormat===1){return new E.Table("substitutionTable",[{name:"substFormat",type:"USHORT",value:1},{name:"coverage",type:"TABLE",value:new E.Coverage(t.coverage)},{name:"deltaGlyphID",type:"USHORT",value:t.deltaGlyphId}])}else{return new E.Table("substitutionTable",[{name:"substFormat",type:"USHORT",value:2},{name:"coverage",type:"TABLE",value:new E.Coverage(t.coverage)}].concat(E.ushortList("substitute",t.substitute)))}};Pn[2]=function e(t){_.assert(t.substFormat===1,"Lookup type 2 substFormat must be 1.");return new E.Table("substitutionTable",[{name:"substFormat",type:"USHORT",value:1},{name:"coverage",type:"TABLE",value:new E.Coverage(t.coverage)}].concat(E.tableList("seqSet",t.sequences,function(e){return new E.Table("sequenceSetTable",E.ushortList("sequence",e))})))};Pn[3]=function e(t){_.assert(t.substFormat===1,"Lookup type 3 substFormat must be 1.");return new E.Table("substitutionTable",[{name:"substFormat",type:"USHORT",value:1},{name:"coverage",type:"TABLE",value:new E.Coverage(t.coverage)}].concat(E.tableList("altSet",t.alternateSets,function(e){return new E.Table("alternateSetTable",E.ushortList("alternate",e))})))};Pn[4]=function e(t){_.assert(t.substFormat===1,"Lookup type 4 substFormat must be 1.");return new E.Table("substitutionTable",[{name:"substFormat",type:"USHORT",value:1},{name:"coverage",type:"TABLE",value:new E.Coverage(t.coverage)}].concat(E.tableList("ligSet",t.ligatureSets,function(e){return new E.Table("ligatureSetTable",E.tableList("ligature",e,function(e){return new E.Table("ligatureTable",[{name:"ligGlyph",type:"USHORT",value:e.ligGlyph}].concat(E.ushortList("component",e.components,e.components.length+1)))}))})))};Pn[6]=function e(t){if(t.substFormat===1){var n=new E.Table("chainContextTable",[{name:"substFormat",type:"USHORT",value:t.substFormat},{name:"coverage",type:"TABLE",value:new E.Coverage(t.coverage)}].concat(E.tableList("chainRuleSet",t.chainRuleSets,function(e){return new E.Table("chainRuleSetTable",E.tableList("chainRule",e,function(e){var n=E.ushortList("backtrackGlyph",e.backtrack,e.backtrack.length).concat(E.ushortList("inputGlyph",e.input,e.input.length+1)).concat(E.ushortList("lookaheadGlyph",e.lookahead,e.lookahead.length)).concat(E.ushortList("substitution",[],e.lookupRecords.length));e.lookupRecords.forEach(function(e,t){n=n.concat({name:"sequenceIndex"+t,type:"USHORT",value:e.sequenceIndex}).concat({name:"lookupListIndex"+t,type:"USHORT",value:e.lookupListIndex})});return new E.Table("chainRuleTable",n)}))})));return n}else if(t.substFormat===2){_.assert(false,"lookup type 6 format 2 is not yet supported.")}else if(t.substFormat===3){var r=[{name:"substFormat",type:"USHORT",value:t.substFormat}];r.push({name:"backtrackGlyphCount",type:"USHORT",value:t.backtrackCoverage.length});t.backtrackCoverage.forEach(function(e,t){r.push({name:"backtrackCoverage"+t,type:"TABLE",value:new E.Coverage(e)})});r.push({name:"inputGlyphCount",type:"USHORT",value:t.inputCoverage.length});t.inputCoverage.forEach(function(e,t){r.push({name:"inputCoverage"+t,type:"TABLE",value:new E.Coverage(e)})});r.push({name:"lookaheadGlyphCount",type:"USHORT",value:t.lookaheadCoverage.length});t.lookaheadCoverage.forEach(function(e,t){r.push({name:"lookaheadCoverage"+t,type:"TABLE",value:new E.Coverage(e)})});r.push({name:"substitutionCount",type:"USHORT",value:t.lookupRecords.length});t.lookupRecords.forEach(function(e,t){r=r.concat({name:"sequenceIndex"+t,type:"USHORT",value:e.sequenceIndex}).concat({name:"lookupListIndex"+t,type:"USHORT",value:e.lookupListIndex})});var i=new E.Table("chainContextTable",r);return i}_.assert(false,"lookup type 6 format must be 1, 2 or 3.")};function Mn(e){return new E.Table("GSUB",[{name:"version",type:"ULONG",value:65536},{name:"scripts",type:"TABLE",value:new E.ScriptList(e.scripts)},{name:"features",type:"TABLE",value:new E.FeatureList(e.features)},{name:"lookups",type:"TABLE",value:new E.LookupList(e.lookups,Pn)}])}var kn={parse:Rn,make:Mn};function wn(e,t){var n=new G.Parser(e,t);var r=n.parseULong();_.argument(r===1,"Unsupported META table version.");n.parseULong();n.parseULong();var i=n.parseULong();var a={};for(var s=0;s<i;s++){var o=n.parseTag();var l=n.parseULong();var u=n.parseULong();var c=ce.UTF8(e,t+l,u);a[o]=c}return a}function Bn(e){var t=Object.keys(e).length;var n="";var r=16+t*12;var i=new E.Table("meta",[{name:"version",type:"ULONG",value:1},{name:"flags",type:"ULONG",value:0},{name:"offset",type:"ULONG",value:r},{name:"numTags",type:"ULONG",value:t}]);for(var a in e){var s=n.length;n+=e[a];i.fields.push({name:"tag "+a,type:"TAG",value:a});i.fields.push({name:"offset "+a,type:"ULONG",value:r+s});i.fields.push({name:"length "+a,type:"ULONG",value:e[a].length})}i.fields.push({name:"stringPool",type:"CHARARRAY",value:n});return i}var Gn={parse:wn,make:Bn};function Vn(e){return Math.log(e)/Math.log(2)|0}function Dn(e){while(e.length%4!==0){e.push(0)}var t=0;for(var n=0;n<e.length;n+=4){t+=(e[n]<<24)+(e[n+1]<<16)+(e[n+2]<<8)+e[n+3]}t%=Math.pow(2,32);return t}function Fn(e,t,n,r){return new E.Record("Table Record",[{name:"tag",type:"TAG",value:e!==undefined?e:""},{name:"checkSum",type:"ULONG",value:t!==undefined?t:0},{name:"offset",type:"ULONG",value:n!==undefined?n:0},{name:"length",type:"ULONG",value:r!==undefined?r:0}])}function jn(e){var t=new E.Table("sfnt",[{name:"version",type:"TAG",value:"OTTO"},{name:"numTables",type:"USHORT",value:0},{name:"searchRange",type:"USHORT",value:0},{name:"entrySelector",type:"USHORT",value:0},{name:"rangeShift",type:"USHORT",value:0}]);t.tables=e;t.numTables=e.length;var n=Math.pow(2,Vn(t.numTables));t.searchRange=16*n;t.entrySelector=Vn(n);t.rangeShift=t.numTables*16-t.searchRange;var r=[];var i=[];var a=t.sizeOf()+Fn().sizeOf()*t.numTables;while(a%4!==0){a+=1;i.push({name:"padding",type:"BYTE",value:0})}for(var s=0;s<e.length;s+=1){var o=e[s];_.argument(o.tableName.length===4,"Table name"+o.tableName+" is invalid.");var l=o.sizeOf();var u=Fn(o.tableName,Dn(o.encode()),a,l);r.push({name:u.tag+" Table Record",type:"RECORD",value:u});i.push({name:o.tableName+" table",type:"RECORD",value:o});a+=l;_.argument(!isNaN(a),"Something went wrong calculating the offset.");while(a%4!==0){a+=1;i.push({name:"padding",type:"BYTE",value:0})}}r.sort(function(e,t){if(e.value.tag>t.value.tag){return 1}else{return-1}});t.fields=t.fields.concat(r);t.fields=t.fields.concat(i);return t}function zn(e,t,n){for(var r=0;r<t.length;r+=1){var i=e.charToGlyphIndex(t[r]);if(i>0){var a=e.glyphs.get(i);return a.getMetrics()}}return n}function Hn(e){var t=0;for(var n=0;n<e.length;n+=1){t+=e[n]}return t/e.length}function Xn(e){var t=[];var n=[];var r=[];var i=[];var a=[];var s=[];var o=[];var l;var u=0;var c=0;var p=0;var h=0;var f=0;for(var d=0;d<e.glyphs.length;d+=1){var g=e.glyphs.get(d);var m=g.unicode|0;if(isNaN(g.advanceWidth)){throw new Error("Glyph "+g.name+" ("+d+"): advanceWidth is not a number.")}if(l>m||l===undefined){if(m>0){l=m}}if(u<m){u=m}var v=In.getUnicodeRange(m);if(v<32){c|=1<<v}else if(v<64){p|=1<<v-32}else if(v<96){h|=1<<v-64}else if(v<123){f|=1<<v-96}else{throw new Error("Unicode ranges bits > 123 are reserved for internal usage")}if(g.name===".notdef"){continue}var b=g.getMetrics();t.push(b.xMin);n.push(b.yMin);r.push(b.xMax);i.push(b.yMax);s.push(b.leftSideBearing);o.push(b.rightSideBearing);a.push(g.advanceWidth)}var y={xMin:Math.min.apply(null,t),yMin:Math.min.apply(null,n),xMax:Math.max.apply(null,r),yMax:Math.max.apply(null,i),advanceWidthMax:Math.max.apply(null,a),advanceWidthAvg:Hn(a),minLeftSideBearing:Math.min.apply(null,s),maxLeftSideBearing:Math.max.apply(null,s),minRightSideBearing:Math.min.apply(null,o)};y.ascender=e.ascender;y.descender=e.descender;var x=Xt.make({flags:3,unitsPerEm:e.unitsPerEm,xMin:y.xMin,yMin:y.yMin,xMax:y.xMax,yMax:y.yMax,lowestRecPPEM:3,createdTimestamp:e.createdTimestamp});var S=qt.make({ascender:y.ascender,descender:y.descender,advanceWidthMax:y.advanceWidthMax,minLeftSideBearing:y.minLeftSideBearing,minRightSideBearing:y.minRightSideBearing,xMaxExtent:y.maxLeftSideBearing+(y.xMax-y.xMin),numberOfHMetrics:e.glyphs.length});var w=sn.make(e.glyphs.length);var B=In.make(Object.assign({xAvgCharWidth:Math.round(y.advanceWidthAvg),usFirstCharIndex:l,usLastCharIndex:u,ulUnicodeRange1:c,ulUnicodeRange2:p,ulUnicodeRange3:h,ulUnicodeRange4:f,sTypoAscender:y.ascender,sTypoDescender:y.descender,sTypoLineGap:0,usWinAscent:y.yMax,usWinDescent:Math.abs(y.yMin),ulCodePageRange1:1,sxHeight:zn(e,"xyvw",{yMax:Math.round(y.ascender/2)}).yMax,sCapHeight:zn(e,"HIKLEFJMNTZBDPRAGOQSUVWXY",y).yMax,usDefaultChar:e.hasChar(" ")?32:0,usBreakChar:e.hasChar(" ")?32:0},e.tables.os2));var G=$t.make(e.glyphs);var V=He.make(e.glyphs);var O=e.getEnglishName("fontFamily");var _=e.getEnglishName("fontSubfamily");var A=O+" "+_;var C=e.getEnglishName("postScriptName");if(!C){C=O.replace(/\s/g,"")+"-"+_}var T={};for(var I in e.names){T[I]=e.names[I]}if(!T.uniqueID){T.uniqueID={en:e.getEnglishName("manufacturer")+":"+A}}if(!T.postScriptName){T.postScriptName={en:C}}if(!T.preferredFamily){T.preferredFamily=e.names.fontFamily}if(!T.preferredSubfamily){T.preferredSubfamily=e.names.fontSubfamily}var E=[];var D=On.make(T,E);var L=E.length>0?nn.make(E):undefined;var F=Nn.make();var j=jt.make(e.glyphs,{version:e.getEnglishName("version"),fullName:A,familyName:O,weightName:_,postScriptName:C,unitsPerEm:e.unitsPerEm,fontBBox:[0,y.yMin,y.ascender,y.advanceWidthMax]});var N=e.metas&&Object.keys(e.metas).length>0?Gn.make(e.metas):undefined;var U=[x,S,w,B,D,V,F,j,G];if(L){U.push(L)}if(e.tables.gsub){U.push(kn.make(e.tables.gsub))}if(N){U.push(N)}var R=jn(U);var z=R.encode();var H=Dn(z);var P=R.fields;var M=false;for(var k=0;k<P.length;k+=1){if(P[k].name==="head table"){P[k].value.checkSumAdjustment=2981146554-H;M=true;break}}if(!M){throw new Error("Could not find head table with checkSum to adjust.")}return R}var Yn={make:jn,fontToTable:Xn,computeCheckSum:Dn};function Wn(e,t){var n=0;var r=e.length-1;while(n<=r){var i=n+r>>>1;var a=e[i].tag;if(a===t){return i}else if(a<t){n=i+1}else{r=i-1}}return-n-1}function qn(e,t){var n=0;var r=e.length-1;while(n<=r){var i=n+r>>>1;var a=e[i];if(a===t){return i}else if(a<t){n=i+1}else{r=i-1}}return-n-1}function Zn(e,t){var n;var r=0;var i=e.length-1;while(r<=i){var a=r+i>>>1;n=e[a];var s=n.start;if(s===t){return n}else if(s<t){r=a+1}else{i=a-1}}if(r>0){n=e[r-1];if(t>n.end){return 0}return n}}function Kn(e,t){this.font=e;this.tableName=t}Kn.prototype={searchTag:Wn,binSearch:qn,getTable:function(e){var t=this.font.tables[this.tableName];if(!t&&e){t=this.font.tables[this.tableName]=this.createDefaultTable()}return t},getScriptNames:function(){var e=this.getTable();if(!e){return[]}return e.scripts.map(function(e){return e.tag})},getDefaultScriptName:function(){var e=this.getTable();if(!e){return}var t=false;for(var n=0;n<e.scripts.length;n++){var r=e.scripts[n].tag;if(r==="DFLT"){return r}if(r==="latn"){t=true}}if(t){return"latn"}},getScriptTable:function(e,t){var n=this.getTable(t);if(n){e=e||"DFLT";var r=n.scripts;var i=Wn(n.scripts,e);if(i>=0){return r[i].script}else if(t){var a={tag:e,script:{defaultLangSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]},langSysRecords:[]}};r.splice(-1-i,0,a);return a.script}}},getLangSysTable:function(e,t,n){var r=this.getScriptTable(e,n);if(r){if(!t||t==="dflt"||t==="DFLT"){return r.defaultLangSys}var i=Wn(r.langSysRecords,t);if(i>=0){return r.langSysRecords[i].langSys}else if(n){var a={tag:t,langSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]}};r.langSysRecords.splice(-1-i,0,a);return a.langSys}}},getFeatureTable:function(e,t,n,r){var i=this.getLangSysTable(e,t,r);if(i){var a;var s=i.featureIndexes;var o=this.font.tables[this.tableName].features;for(var l=0;l<s.length;l++){a=o[s[l]];if(a.tag===n){return a.feature}}if(r){var u=o.length;_.assert(u===0||n>=o[u-1].tag,"Features must be added in alphabetical order.");a={tag:n,feature:{params:0,lookupListIndexes:[]}};o.push(a);s.push(u);return a.feature}}},getLookupTables:function(e,t,n,r,i){var a=this.getFeatureTable(e,t,n,i);var s=[];if(a){var o;var l=a.lookupListIndexes;var u=this.font.tables[this.tableName].lookups;for(var c=0;c<l.length;c++){o=u[l[c]];if(o.lookupType===r){s.push(o)}}if(s.length===0&&i){o={lookupType:r,lookupFlag:0,subtables:[],markFilteringSet:undefined};var p=u.length;u.push(o);l.push(p);return[o]}}return s},getGlyphClass:function(e,t){switch(e.format){case 1:if(e.startGlyph<=t&&t<e.startGlyph+e.classes.length){return e.classes[t-e.startGlyph]}return 0;case 2:var n=Zn(e.ranges,t);return n?n.classId:0}},getCoverageIndex:function(e,t){switch(e.format){case 1:var n=qn(e.glyphs,t);return n>=0?n:-1;case 2:var r=Zn(e.ranges,t);return r?r.index+t-r.start:-1}},expandCoverage:function(e){if(e.format===1){return e.glyphs}else{var t=[];var n=e.ranges;for(var r=0;r<n.length;r++){var i=n[r];var a=i.start;var s=i.end;for(var o=a;o<=s;o++){t.push(o)}}return t}}};function Qn(e){Kn.call(this,e,"gpos")}Qn.prototype=Kn.prototype;Qn.prototype.init=function(){var e=this.getDefaultScriptName();this.defaultKerningTables=this.getKerningTables(e)};Qn.prototype.getKerningValue=function(e,t,n){for(var r=0;r<e.length;r++){var i=e[r].subtables;for(var a=0;a<i.length;a++){var s=i[a];var o=this.getCoverageIndex(s.coverage,t);if(o<0){continue}switch(s.posFormat){case 1:var l=s.pairSets[o];for(var u=0;u<l.length;u++){var c=l[u];if(c.secondGlyph===n){return c.value1&&c.value1.xAdvance||0}}break;case 2:var p=this.getGlyphClass(s.classDef1,t);var h=this.getGlyphClass(s.classDef2,n);var f=s.classRecords[p][h];return f.value1&&f.value1.xAdvance||0}}}return 0};Qn.prototype.getKerningTables=function(e,t){if(this.font.tables.gpos){return this.getLookupTables(e,t,"kern",2)}};function t(e){Kn.call(this,e,"gsub")}function Jn(e,t){var n=e.length;if(n!==t.length){return false}for(var r=0;r<n;r++){if(e[r]!==t[r]){return false}}return true}function $n(e,t,n){var r=e.subtables;for(var i=0;i<r.length;i++){var a=r[i];if(a.substFormat===t){return a}}if(n){r.push(n);return n}return undefined}t.prototype=Kn.prototype;t.prototype.createDefaultTable=function(){return{version:1,scripts:[{tag:"DFLT",script:{defaultLangSys:{reserved:0,reqFeatureIndex:65535,featureIndexes:[]},langSysRecords:[]}}],features:[],lookups:[]}};t.prototype.getSingle=function(e,t,n){var r=[];var i=this.getLookupTables(t,n,e,1);for(var a=0;a<i.length;a++){var s=i[a].subtables;for(var o=0;o<s.length;o++){var l=s[o];var u=this.expandCoverage(l.coverage);var c=void 0;if(l.substFormat===1){var p=l.deltaGlyphId;for(c=0;c<u.length;c++){var h=u[c];r.push({sub:h,by:h+p})}}else{var f=l.substitute;for(c=0;c<u.length;c++){r.push({sub:u[c],by:f[c]})}}}}return r};t.prototype.getMultiple=function(e,t,n){var r=[];var i=this.getLookupTables(t,n,e,2);for(var a=0;a<i.length;a++){var s=i[a].subtables;for(var o=0;o<s.length;o++){var l=s[o];var u=this.expandCoverage(l.coverage);var c=void 0;for(c=0;c<u.length;c++){var p=u[c];var h=l.sequences[c];r.push({sub:p,by:h})}}}return r};t.prototype.getAlternates=function(e,t,n){var r=[];var i=this.getLookupTables(t,n,e,3);for(var a=0;a<i.length;a++){var s=i[a].subtables;for(var o=0;o<s.length;o++){var l=s[o];var u=this.expandCoverage(l.coverage);var c=l.alternateSets;for(var p=0;p<u.length;p++){r.push({sub:u[p],by:c[p]})}}}return r};t.prototype.getLigatures=function(e,t,n){var r=[];var i=this.getLookupTables(t,n,e,4);for(var a=0;a<i.length;a++){var s=i[a].subtables;for(var o=0;o<s.length;o++){var l=s[o];var u=this.expandCoverage(l.coverage);var c=l.ligatureSets;for(var p=0;p<u.length;p++){var h=u[p];var f=c[p];for(var d=0;d<f.length;d++){var g=f[d];r.push({sub:[h].concat(g.components),by:g.ligGlyph})}}}}return r};t.prototype.addSingle=function(e,t,n,r){var i=this.getLookupTables(n,r,e,1,true)[0];var a=$n(i,2,{substFormat:2,coverage:{format:1,glyphs:[]},substitute:[]});_.assert(a.coverage.format===1,"Single: unable to modify coverage table format "+a.coverage.format);var s=t.sub;var o=this.binSearch(a.coverage.glyphs,s);if(o<0){o=-1-o;a.coverage.glyphs.splice(o,0,s);a.substitute.splice(o,0,0)}a.substitute[o]=t.by};t.prototype.addMultiple=function(e,t,n,r){_.assert(t.by instanceof Array&&t.by.length>1,'Multiple: "by" must be an array of two or more ids');var i=this.getLookupTables(n,r,e,2,true)[0];var a=$n(i,1,{substFormat:1,coverage:{format:1,glyphs:[]},sequences:[]});_.assert(a.coverage.format===1,"Multiple: unable to modify coverage table format "+a.coverage.format);var s=t.sub;var o=this.binSearch(a.coverage.glyphs,s);if(o<0){o=-1-o;a.coverage.glyphs.splice(o,0,s);a.sequences.splice(o,0,0)}a.sequences[o]=t.by};t.prototype.addAlternate=function(e,t,n,r){var i=this.getLookupTables(n,r,e,3,true)[0];var a=$n(i,1,{substFormat:1,coverage:{format:1,glyphs:[]},alternateSets:[]});_.assert(a.coverage.format===1,"Alternate: unable to modify coverage table format "+a.coverage.format);var s=t.sub;var o=this.binSearch(a.coverage.glyphs,s);if(o<0){o=-1-o;a.coverage.glyphs.splice(o,0,s);a.alternateSets.splice(o,0,0)}a.alternateSets[o]=t.by};t.prototype.addLigature=function(e,t,n,r){var i=this.getLookupTables(n,r,e,4,true)[0];var a=i.subtables[0];if(!a){a={substFormat:1,coverage:{format:1,glyphs:[]},ligatureSets:[]};i.subtables[0]=a}_.assert(a.coverage.format===1,"Ligature: unable to modify coverage table format "+a.coverage.format);var s=t.sub[0];var o=t.sub.slice(1);var l={ligGlyph:t.by,components:o};var u=this.binSearch(a.coverage.glyphs,s);if(u>=0){var c=a.ligatureSets[u];for(var p=0;p<c.length;p++){if(Jn(c[p].components,o)){return}}c.push(l)}else{u=-1-u;a.coverage.glyphs.splice(u,0,s);a.ligatureSets.splice(u,0,[l])}};t.prototype.getFeature=function(e,t,n){if(/ss\d\d/.test(e)){return this.getSingle(e,t,n)}switch(e){case"aalt":case"salt":return this.getSingle(e,t,n).concat(this.getAlternates(e,t,n));case"dlig":case"liga":case"rlig":return this.getLigatures(e,t,n);case"ccmp":return this.getMultiple(e,t,n).concat(this.getLigatures(e,t,n));case"stch":return this.getMultiple(e,t,n)}return undefined};t.prototype.add=function(e,t,n,r){if(/ss\d\d/.test(e)){return this.addSingle(e,t,n,r)}switch(e){case"aalt":case"salt":if(typeof t.by==="number"){return this.addSingle(e,t,n,r)}return this.addAlternate(e,t,n,r);case"dlig":case"liga":case"rlig":return this.addLigature(e,t,n,r);case"ccmp":if(t.by instanceof Array){return this.addMultiple(e,t,n,r)}return this.addLigature(e,t,n,r)}return undefined};function er(){return typeof window!=="undefined"}function tr(e){var t=new ArrayBuffer(e.length);var n=new Uint8Array(t);for(var r=0;r<e.length;++r){n[r]=e[r]}return t}function nr(e){var t=new Buffer(e.byteLength);var n=new Uint8Array(e);for(var r=0;r<t.length;++r){t[r]=n[r]}return t}function rr(e,t){if(!e){throw t}}function ir(e,t,n,r,i){var a;if((t&r)>0){a=e.parseByte();if((t&i)===0){a=-a}a=n+a}else{if((t&i)>0){a=n}else{a=n+e.parseShort()}}return a}function ar(e,t,n){var r=new G.Parser(t,n);e.numberOfContours=r.parseShort();e._xMin=r.parseShort();e._yMin=r.parseShort();e._xMax=r.parseShort();e._yMax=r.parseShort();var i;var a;if(e.numberOfContours>0){var s=e.endPointIndices=[];for(var o=0;o<e.numberOfContours;o+=1){s.push(r.parseUShort())}e.instructionLength=r.parseUShort();e.instructions=[];for(var l=0;l<e.instructionLength;l+=1){e.instructions.push(r.parseByte())}var u=s[s.length-1]+1;i=[];for(var c=0;c<u;c+=1){a=r.parseByte();i.push(a);if((a&8)>0){var p=r.parseByte();for(var h=0;h<p;h+=1){i.push(a);c+=1}}}_.argument(i.length===u,"Bad flags.");if(s.length>0){var f=[];var d;if(u>0){for(var g=0;g<u;g+=1){a=i[g];d={};d.onCurve=!!(a&1);d.lastPointOfContour=s.indexOf(g)>=0;f.push(d)}var m=0;for(var v=0;v<u;v+=1){a=i[v];d=f[v];d.x=ir(r,a,m,2,16);m=d.x}var b=0;for(var y=0;y<u;y+=1){a=i[y];d=f[y];d.y=ir(r,a,b,4,32);b=d.y}}e.points=f}else{e.points=[]}}else if(e.numberOfContours===0){e.points=[]}else{e.isComposite=true;e.points=[];e.components=[];var x=true;while(x){i=r.parseUShort();var S={glyphIndex:r.parseUShort(),xScale:1,scale01:0,scale10:0,yScale:1,dx:0,dy:0};if((i&1)>0){if((i&2)>0){S.dx=r.parseShort();S.dy=r.parseShort()}else{S.matchedPoints=[r.parseUShort(),r.parseUShort()]}}else{if((i&2)>0){S.dx=r.parseChar();S.dy=r.parseChar()}else{S.matchedPoints=[r.parseByte(),r.parseByte()]}}if((i&8)>0){S.xScale=S.yScale=r.parseF2Dot14()}else if((i&64)>0){S.xScale=r.parseF2Dot14();S.yScale=r.parseF2Dot14()}else if((i&128)>0){S.xScale=r.parseF2Dot14();S.scale01=r.parseF2Dot14();S.scale10=r.parseF2Dot14();S.yScale=r.parseF2Dot14()}e.components.push(S);x=!!(i&32)}if(i&256){e.instructionLength=r.parseUShort();e.instructions=[];for(var O=0;O<e.instructionLength;O+=1){e.instructions.push(r.parseByte())}}}}function sr(e,t){var n=[];for(var r=0;r<e.length;r+=1){var i=e[r];var a={x:t.xScale*i.x+t.scale01*i.y+t.dx,y:t.scale10*i.x+t.yScale*i.y+t.dy,onCurve:i.onCurve,lastPointOfContour:i.lastPointOfContour};n.push(a)}return n}function or(e){var t=[];var n=[];for(var r=0;r<e.length;r+=1){var i=e[r];n.push(i);if(i.lastPointOfContour){t.push(n);n=[]}}_.argument(n.length===0,"There are still points left in the current contour.");return t}function lr(e){var t=new d;if(!e){return t}var n=or(e);for(var r=0;r<n.length;++r){var i=n[r];var a=null;var s=i[i.length-1];var o=i[0];if(s.onCurve){t.moveTo(s.x,s.y)}else{if(o.onCurve){t.moveTo(o.x,o.y)}else{var l={x:(s.x+o.x)*.5,y:(s.y+o.y)*.5};t.moveTo(l.x,l.y)}}for(var u=0;u<i.length;++u){a=s;s=o;o=i[(u+1)%i.length];if(s.onCurve){t.lineTo(s.x,s.y)}else{var c=a;var p=o;if(!a.onCurve){c={x:(s.x+a.x)*.5,y:(s.y+a.y)*.5}}if(!o.onCurve){p={x:(s.x+o.x)*.5,y:(s.y+o.y)*.5}}t.quadraticCurveTo(s.x,s.y,p.x,p.y)}}t.closePath()}return t}function ur(e,t){if(t.isComposite){for(var n=0;n<t.components.length;n+=1){var r=t.components[n];var i=e.get(r.glyphIndex);i.getPath();if(i.points){var a=void 0;if(r.matchedPoints===undefined){a=sr(i.points,r)}else{if(r.matchedPoints[0]>t.points.length-1||r.matchedPoints[1]>i.points.length-1){throw Error("Matched points out of range in "+t.name)}var s=t.points[r.matchedPoints[0]];var o=i.points[r.matchedPoints[1]];var l={xScale:r.xScale,scale01:r.scale01,scale10:r.scale10,yScale:r.yScale,dx:0,dy:0};o=sr([o],l)[0];l.dx=s.x-o.x;l.dy=s.y-o.y;a=sr(i.points,l)}t.points=t.points.concat(a)}}}return lr(t.points)}function cr(e,t,n,r){var i=new A.GlyphSet(r);for(var a=0;a<n.length-1;a+=1){var s=n[a];var o=n[a+1];if(s!==o){i.push(a,A.ttfGlyphLoader(r,a,ar,e,t+s,ur))}else{i.push(a,A.glyphLoader(r,a))}}return i}function pr(r,i,a,s){var o=new A.GlyphSet(s);s._push=function(e){var t=a[e];var n=a[e+1];if(t!==n){o.push(e,A.ttfGlyphLoader(s,e,ar,r,i+t,ur))}else{o.push(e,A.glyphLoader(s,e))}};return o}function hr(e,t,n,r,i){if(i.lowMemory){return pr(e,t,n,r)}else{return cr(e,t,n,r)}}var fr={getPath:lr,parse:hr};var dr;var gr;var mr;var vr;function br(e){this.font=e;this.getCommands=function(e){return fr.getPath(e).commands};this._fpgmState=this._prepState=undefined;this._errorState=0}function yr(e){return e}function xr(e){return Math.sign(e)*Math.round(Math.abs(e))}function Sr(e){return Math.sign(e)*Math.round(Math.abs(e*2))/2}function Or(e){return Math.sign(e)*(Math.round(Math.abs(e)+.5)-.5)}function _r(e){return Math.sign(e)*Math.ceil(Math.abs(e))}function Ar(e){return Math.sign(e)*Math.floor(Math.abs(e))}var Cr=function(e){var t=this.srPeriod;var n=this.srPhase;var r=this.srThreshold;var i=1;if(e<0){e=-e;i=-1}e+=r-n;e=Math.trunc(e/t)*t;e+=n;if(e<0){return n*i}return e*i};var m={x:1,y:0,axis:"x",distance:function(e,t,n,r){return(n?e.xo:e.x)-(r?t.xo:t.x)},interpolate:function(e,t,n,r){var i;var a;var s;var o;var l;var u;var c;if(!r||r===this){i=e.xo-t.xo;a=e.xo-n.xo;l=t.x-t.xo;u=n.x-n.xo;s=Math.abs(i);o=Math.abs(a);c=s+o;if(c===0){e.x=e.xo+(l+u)/2;return}e.x=e.xo+(l*o+u*s)/c;return}i=r.distance(e,t,true,true);a=r.distance(e,n,true,true);l=r.distance(t,t,false,true);u=r.distance(n,n,false,true);s=Math.abs(i);o=Math.abs(a);c=s+o;if(c===0){m.setRelative(e,e,(l+u)/2,r,true);return}m.setRelative(e,e,(l*o+u*s)/c,r,true)},normalSlope:Number.NEGATIVE_INFINITY,setRelative:function(e,t,n,r,i){if(!r||r===this){e.x=(i?t.xo:t.x)+n;return}var a=i?t.xo:t.x;var s=i?t.yo:t.y;var o=a+n*r.x;var l=s+n*r.y;e.x=o+(e.y-l)/r.normalSlope},slope:0,touch:function(e){e.xTouched=true},touched:function(e){return e.xTouched},untouch:function(e){e.xTouched=false}};var v={x:0,y:1,axis:"y",distance:function(e,t,n,r){return(n?e.yo:e.y)-(r?t.yo:t.y)},interpolate:function(e,t,n,r){var i;var a;var s;var o;var l;var u;var c;if(!r||r===this){i=e.yo-t.yo;a=e.yo-n.yo;l=t.y-t.yo;u=n.y-n.yo;s=Math.abs(i);o=Math.abs(a);c=s+o;if(c===0){e.y=e.yo+(l+u)/2;return}e.y=e.yo+(l*o+u*s)/c;return}i=r.distance(e,t,true,true);a=r.distance(e,n,true,true);l=r.distance(t,t,false,true);u=r.distance(n,n,false,true);s=Math.abs(i);o=Math.abs(a);c=s+o;if(c===0){v.setRelative(e,e,(l+u)/2,r,true);return}v.setRelative(e,e,(l*o+u*s)/c,r,true)},normalSlope:0,setRelative:function(e,t,n,r,i){if(!r||r===this){e.y=(i?t.yo:t.y)+n;return}var a=i?t.xo:t.x;var s=i?t.yo:t.y;var o=a+n*r.x;var l=s+n*r.y;e.y=l+r.normalSlope*(e.x-o)},slope:Number.POSITIVE_INFINITY,touch:function(e){e.yTouched=true},touched:function(e){return e.yTouched},untouch:function(e){e.yTouched=false}};Object.freeze(m);Object.freeze(v);function Tr(e,t){this.x=e;this.y=t;this.axis=undefined;this.slope=t/e;this.normalSlope=-e/t;Object.freeze(this)}Tr.prototype.distance=function(e,t,n,r){return this.x*m.distance(e,t,n,r)+this.y*v.distance(e,t,n,r)};Tr.prototype.interpolate=function(e,t,n,r){var i;var a;var s;var o;var l;var u;var c;s=r.distance(e,t,true,true);o=r.distance(e,n,true,true);i=r.distance(t,t,false,true);a=r.distance(n,n,false,true);l=Math.abs(s);u=Math.abs(o);c=l+u;if(c===0){this.setRelative(e,e,(i+a)/2,r,true);return}this.setRelative(e,e,(i*u+a*l)/c,r,true)};Tr.prototype.setRelative=function(e,t,n,r,i){r=r||this;var a=i?t.xo:t.x;var s=i?t.yo:t.y;var o=a+n*r.x;var l=s+n*r.y;var u=r.normalSlope;var c=this.slope;var p=e.x;var h=e.y;e.x=(c*p-u*o+l-h)/(c-u);e.y=c*(e.x-p)+h};Tr.prototype.touch=function(e){e.xTouched=true;e.yTouched=true};function Ir(e,t){var n=Math.sqrt(e*e+t*t);e/=n;t/=n;if(e===1&&t===0){return m}else if(e===0&&t===1){return v}else{return new Tr(e,t)}}function x(e,t,n,r){this.x=this.xo=Math.round(e*64)/64;this.y=this.yo=Math.round(t*64)/64;this.lastPointOfContour=n;this.onCurve=r;this.prevPointOnContour=undefined;this.nextPointOnContour=undefined;this.xTouched=false;this.yTouched=false;Object.preventExtensions(this)}x.prototype.nextTouched=function(e){var t=this.nextPointOnContour;while(!e.touched(t)&&t!==this){t=t.nextPointOnContour}return t};x.prototype.prevTouched=function(e){var t=this.prevPointOnContour;while(!e.touched(t)&&t!==this){t=t.prevPointOnContour}return t};var Er=Object.freeze(new x(0,0));var Lr={cvCutIn:17/16,deltaBase:9,deltaShift:.125,loop:1,minDis:1,autoFlip:true};function S(e,t){this.env=e;this.stack=[];this.prog=t;switch(e){case"glyf":this.zp0=this.zp1=this.zp2=1;this.rp0=this.rp1=this.rp2=0;case"prep":this.fv=this.pv=this.dpv=m;this.round=xr}}br.prototype.exec=function(e,t){if(typeof t!=="number"){throw new Error("Point size is not a number!")}if(this._errorState>2){return}var n=this.font;var r=this._prepState;if(!r||r.ppem!==t){var i=this._fpgmState;if(!i){S.prototype=Lr;i=this._fpgmState=new S("fpgm",n.tables.fpgm);i.funcs=[];i.font=n;if(C.DEBUG){console.log("---EXEC FPGM---");i.step=-1}try{gr(i)}catch(e){console.log("Hinting error in FPGM:"+e);this._errorState=3;return}}S.prototype=i;r=this._prepState=new S("prep",n.tables.prep);r.ppem=t;var a=n.tables.cvt;if(a){var s=r.cvt=new Array(a.length);var o=t/n.unitsPerEm;for(var l=0;l<a.length;l++){s[l]=a[l]*o}}else{r.cvt=[]}if(C.DEBUG){console.log("---EXEC PREP---");r.step=-1}try{gr(r)}catch(e){if(this._errorState<2){console.log("Hinting error in PREP:"+e)}this._errorState=2}}if(this._errorState>1){return}try{return mr(e,r)}catch(e){if(this._errorState<1){console.log("Hinting error:"+e);console.log("Note: further hinting errors are silenced")}this._errorState=1;return undefined}};mr=function(e,t){var n=t.ppem/t.font.unitsPerEm;var r=n;var i=e.components;var a;var s;var o;S.prototype=t;if(!i){o=new S("glyf",e.instructions);if(C.DEBUG){console.log("---EXEC GLYPH---");o.step=-1}vr(e,o,n,r);s=o.gZone}else{var l=t.font;s=[];a=[];for(var u=0;u<i.length;u++){var c=i[u];var p=l.glyphs.get(c.glyphIndex);o=new S("glyf",p.instructions);if(C.DEBUG){console.log("---EXEC COMP "+u+"---");o.step=-1}vr(p,o,n,r);var h=Math.round(c.dx*n);var f=Math.round(c.dy*r);var d=o.gZone;var g=o.contours;for(var m=0;m<d.length;m++){var v=d[m];v.xTouched=v.yTouched=false;v.xo=v.x=v.x+h;v.yo=v.y=v.y+f}var b=s.length;s.push.apply(s,d);for(var y=0;y<g.length;y++){a.push(g[y]+b)}}if(e.instructions&&!o.inhibitGridFit){o=new S("glyf",e.instructions);o.gZone=o.z0=o.z1=o.z2=s;o.contours=a;s.push(new x(0,0),new x(Math.round(e.advanceWidth*n),0));if(C.DEBUG){console.log("---EXEC COMPOSITE---");o.step=-1}gr(o);s.length-=2}}return s};vr=function(e,t,n,r){var i=e.points||[];var a=i.length;var s=t.gZone=t.z0=t.z1=t.z2=[];var o=t.contours=[];var l;for(var u=0;u<a;u++){l=i[u];s[u]=new x(l.x*n,l.y*r,l.lastPointOfContour,l.onCurve)}var c;var p;for(var h=0;h<a;h++){l=s[h];if(!c){c=l;o.push(h)}if(l.lastPointOfContour){l.nextPointOnContour=c;c.prevPointOnContour=l;c=undefined}else{p=s[h+1];l.nextPointOnContour=p;p.prevPointOnContour=l}}if(t.inhibitGridFit){return}if(C.DEBUG){console.log("PROCESSING GLYPH",t.stack);for(var f=0;f<a;f++){console.log(f,s[f].x,s[f].y)}}s.push(new x(0,0),new x(Math.round(e.advanceWidth*n),0));gr(t);s.length-=2;if(C.DEBUG){console.log("FINISHED GLYPH",t.stack);for(var d=0;d<a;d++){console.log(d,s[d].x,s[d].y)}}};gr=function(e){var t=e.prog;if(!t){return}var n=t.length;var r;for(e.ip=0;e.ip<n;e.ip++){if(C.DEBUG){e.step++}r=dr[t[e.ip]];if(!r){throw new Error("unknown instruction: 0x"+Number(t[e.ip]).toString(16))}r(e)}};function Nr(e){var t=e.tZone=new Array(e.gZone.length);for(var n=0;n<t.length;n++){t[n]=new x(0,0)}}function Ur(e,t){var n=e.prog;var r=e.ip;var i=1;var a;do{a=n[++r];if(a===88){i++}else if(a===89){i--}else if(a===64){r+=n[r+1]+1}else if(a===65){r+=2*n[r+1]+1}else if(a>=176&&a<=183){r+=a-176+1}else if(a>=184&&a<=191){r+=(a-184+1)*2}else if(t&&i===1&&a===27){break}}while(i>0);e.ip=r}function Rr(e,t){if(C.DEBUG){console.log(t.step,"SVTCA["+e.axis+"]")}t.fv=t.pv=t.dpv=e}function Pr(e,t){if(C.DEBUG){console.log(t.step,"SPVTCA["+e.axis+"]")}t.pv=t.dpv=e}function Mr(e,t){if(C.DEBUG){console.log(t.step,"SFVTCA["+e.axis+"]")}t.fv=e}function kr(e,t){var n=t.stack;var r=n.pop();var i=n.pop();var a=t.z2[r];var s=t.z1[i];if(C.DEBUG){console.log("SPVTL["+e+"]",r,i)}var o;var l;if(!e){o=s.x-a.x;l=s.y-a.y}else{o=a.y-s.y;l=s.x-a.x}t.pv=t.dpv=Ir(o,l)}function wr(e,t){var n=t.stack;var r=n.pop();var i=n.pop();var a=t.z2[r];var s=t.z1[i];if(C.DEBUG){console.log("SFVTL["+e+"]",r,i)}var o;var l;if(!e){o=s.x-a.x;l=s.y-a.y}else{o=a.y-s.y;l=s.x-a.x}t.fv=Ir(o,l)}function Br(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"SPVFS[]",n,r)}e.pv=e.dpv=Ir(r,n)}function Gr(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"SPVFS[]",n,r)}e.fv=Ir(r,n)}function Vr(e){var t=e.stack;var n=e.pv;if(C.DEBUG){console.log(e.step,"GPV[]")}t.push(n.x*16384);t.push(n.y*16384)}function Dr(e){var t=e.stack;var n=e.fv;if(C.DEBUG){console.log(e.step,"GFV[]")}t.push(n.x*16384);t.push(n.y*16384)}function Fr(e){e.fv=e.pv;if(C.DEBUG){console.log(e.step,"SFVTPV[]")}}function jr(e){var t=e.stack;var n=t.pop();var r=t.pop();var i=t.pop();var a=t.pop();var s=t.pop();var o=e.z0;var l=e.z1;var u=o[n];var c=o[r];var p=l[i];var h=l[a];var f=e.z2[s];if(C.DEBUG){console.log("ISECT[], ",n,r,i,a,s)}var d=u.x;var g=u.y;var m=c.x;var v=c.y;var b=p.x;var y=p.y;var x=h.x;var S=h.y;var O=(d-m)*(y-S)-(g-v)*(b-x);var _=d*v-g*m;var A=b*S-y*x;f.x=(_*(b-x)-A*(d-m))/O;f.y=(_*(y-S)-A*(g-v))/O}function zr(e){e.rp0=e.stack.pop();if(C.DEBUG){console.log(e.step,"SRP0[]",e.rp0)}}function Hr(e){e.rp1=e.stack.pop();if(C.DEBUG){console.log(e.step,"SRP1[]",e.rp1)}}function Xr(e){e.rp2=e.stack.pop();if(C.DEBUG){console.log(e.step,"SRP2[]",e.rp2)}}function Yr(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SZP0[]",t)}e.zp0=t;switch(t){case 0:if(!e.tZone){Nr(e)}e.z0=e.tZone;break;case 1:e.z0=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function Wr(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SZP1[]",t)}e.zp1=t;switch(t){case 0:if(!e.tZone){Nr(e)}e.z1=e.tZone;break;case 1:e.z1=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function qr(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SZP2[]",t)}e.zp2=t;switch(t){case 0:if(!e.tZone){Nr(e)}e.z2=e.tZone;break;case 1:e.z2=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function Zr(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SZPS[]",t)}e.zp0=e.zp1=e.zp2=t;switch(t){case 0:if(!e.tZone){Nr(e)}e.z0=e.z1=e.z2=e.tZone;break;case 1:e.z0=e.z1=e.z2=e.gZone;break;default:throw new Error("Invalid zone pointer")}}function Kr(e){e.loop=e.stack.pop();if(C.DEBUG){console.log(e.step,"SLOOP[]",e.loop)}}function Qr(e){if(C.DEBUG){console.log(e.step,"RTG[]")}e.round=xr}function Jr(e){if(C.DEBUG){console.log(e.step,"RTHG[]")}e.round=Or}function $r(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SMD[]",t)}e.minDis=t/64}function ei(e){if(C.DEBUG){console.log(e.step,"ELSE[]")}Ur(e,false)}function ti(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"JMPR[]",t)}e.ip+=t-1}function ni(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SCVTCI[]",t)}e.cvCutIn=t/64}function ri(e){var t=e.stack;if(C.DEBUG){console.log(e.step,"DUP[]")}t.push(t[t.length-1])}function ii(e){if(C.DEBUG){console.log(e.step,"POP[]")}e.stack.pop()}function ai(e){if(C.DEBUG){console.log(e.step,"CLEAR[]")}e.stack.length=0}function si(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"SWAP[]")}t.push(n);t.push(r)}function oi(e){var t=e.stack;if(C.DEBUG){console.log(e.step,"DEPTH[]")}t.push(t.length)}function li(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"LOOPCALL[]",n,r)}var i=e.ip;var a=e.prog;e.prog=e.funcs[n];for(var s=0;s<r;s++){gr(e);if(C.DEBUG){console.log(++e.step,s+1<r?"next loopcall":"done loopcall",s)}}e.ip=i;e.prog=a}function ui(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"CALL[]",t)}var n=e.ip;var r=e.prog;e.prog=e.funcs[t];gr(e);e.ip=n;e.prog=r;if(C.DEBUG){console.log(++e.step,"returning from",t)}}function ci(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"CINDEX[]",n)}t.push(t[t.length-n])}function pi(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"MINDEX[]",n)}t.push(t.splice(t.length-n,1)[0])}function hi(e){if(e.env!=="fpgm"){throw new Error("FDEF not allowed here")}var t=e.stack;var n=e.prog;var r=e.ip;var i=t.pop();var a=r;if(C.DEBUG){console.log(e.step,"FDEF[]",i)}while(n[++r]!==45){}e.ip=r;e.funcs[i]=n.slice(a+1,r)}function fi(e,t){var n=t.stack.pop();var r=t.z0[n];var i=t.fv;var a=t.pv;if(C.DEBUG){console.log(t.step,"MDAP["+e+"]",n)}var s=a.distance(r,Er);if(e){s=t.round(s)}i.setRelative(r,Er,s,a);i.touch(r);t.rp0=t.rp1=n}function di(e,t){var n=t.z2;var r=n.length-2;var i;var a;var s;if(C.DEBUG){console.log(t.step,"IUP["+e.axis+"]")}for(var o=0;o<r;o++){i=n[o];if(e.touched(i)){continue}a=i.prevTouched(e);if(a===i){continue}s=i.nextTouched(e);if(a===s){e.setRelative(i,i,e.distance(a,a,false,true),e,true)}e.interpolate(i,a,s,e)}}function gi(e,t){var n=t.stack;var r=e?t.rp1:t.rp2;var i=(e?t.z0:t.z1)[r];var a=t.fv;var s=t.pv;var o=t.loop;var l=t.z2;while(o--){var u=n.pop();var c=l[u];var p=s.distance(i,i,false,true);a.setRelative(c,c,p,s);a.touch(c);if(C.DEBUG){console.log(t.step,(t.loop>1?"loop "+(t.loop-o)+": ":"")+"SHP["+(e?"rp1":"rp2")+"]",u)}}t.loop=1}function mi(e,t){var n=t.stack;var r=e?t.rp1:t.rp2;var i=(e?t.z0:t.z1)[r];var a=t.fv;var s=t.pv;var o=n.pop();var l=t.z2[t.contours[o]];var u=l;if(C.DEBUG){console.log(t.step,"SHC["+e+"]",o)}var c=s.distance(i,i,false,true);do{if(u!==i){a.setRelative(u,u,c,s)}u=u.nextPointOnContour}while(u!==l)}function vi(e,t){var n=t.stack;var r=e?t.rp1:t.rp2;var i=(e?t.z0:t.z1)[r];var a=t.fv;var s=t.pv;var o=n.pop();if(C.DEBUG){console.log(t.step,"SHZ["+e+"]",o)}var l;switch(o){case 0:l=t.tZone;break;case 1:l=t.gZone;break;default:throw new Error("Invalid zone")}var u;var c=s.distance(i,i,false,true);var p=l.length-2;for(var h=0;h<p;h++){u=l[h];a.setRelative(u,u,c,s)}}function bi(e){var t=e.stack;var n=e.loop;var r=e.fv;var i=t.pop()/64;var a=e.z2;while(n--){var s=t.pop();var o=a[s];if(C.DEBUG){console.log(e.step,(e.loop>1?"loop "+(e.loop-n)+": ":"")+"SHPIX[]",s,i)}r.setRelative(o,o,i);r.touch(o)}e.loop=1}function yi(e){var t=e.stack;var n=e.rp1;var r=e.rp2;var i=e.loop;var a=e.z0[n];var s=e.z1[r];var o=e.fv;var l=e.dpv;var u=e.z2;while(i--){var c=t.pop();var p=u[c];if(C.DEBUG){console.log(e.step,(e.loop>1?"loop "+(e.loop-i)+": ":"")+"IP[]",c,n,"<->",r)}o.interpolate(p,a,s,l);o.touch(p)}e.loop=1}function xi(e,t){var n=t.stack;var r=n.pop()/64;var i=n.pop();var a=t.z1[i];var s=t.z0[t.rp0];var o=t.fv;var l=t.pv;o.setRelative(a,s,r,l);o.touch(a);if(C.DEBUG){console.log(t.step,"MSIRP["+e+"]",r,i)}t.rp1=t.rp0;t.rp2=i;if(e){t.rp0=i}}function Si(e){var t=e.stack;var n=e.rp0;var r=e.z0[n];var i=e.loop;var a=e.fv;var s=e.pv;var o=e.z1;while(i--){var l=t.pop();var u=o[l];if(C.DEBUG){console.log(e.step,(e.loop>1?"loop "+(e.loop-i)+": ":"")+"ALIGNRP[]",l)}a.setRelative(u,r,0,s);a.touch(u)}e.loop=1}function Oi(e){if(C.DEBUG){console.log(e.step,"RTDG[]")}e.round=Sr}function _i(e,t){var n=t.stack;var r=n.pop();var i=n.pop();var a=t.z0[i];var s=t.fv;var o=t.pv;var l=t.cvt[r];if(C.DEBUG){console.log(t.step,"MIAP["+e+"]",r,"(",l,")",i)}var u=o.distance(a,Er);if(e){if(Math.abs(u-l)<t.cvCutIn){u=l}u=t.round(u)}s.setRelative(a,Er,u,o);if(t.zp0===0){a.xo=a.x;a.yo=a.y}s.touch(a);t.rp0=t.rp1=i}function Ai(e){var t=e.prog;var n=e.ip;var r=e.stack;var i=t[++n];if(C.DEBUG){console.log(e.step,"NPUSHB[]",i)}for(var a=0;a<i;a++){r.push(t[++n])}e.ip=n}function Ci(e){var t=e.ip;var n=e.prog;var r=e.stack;var i=n[++t];if(C.DEBUG){console.log(e.step,"NPUSHW[]",i)}for(var a=0;a<i;a++){var s=n[++t]<<8|n[++t];if(s&32768){s=-((s^65535)+1)}r.push(s)}e.ip=t}function Ti(e){var t=e.stack;var n=e.store;if(!n){n=e.store=[]}var r=t.pop();var i=t.pop();if(C.DEBUG){console.log(e.step,"WS",r,i)}n[i]=r}function Ii(e){var t=e.stack;var n=e.store;var r=t.pop();if(C.DEBUG){console.log(e.step,"RS",r)}var i=n&&n[r]||0;t.push(i)}function Ei(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"WCVTP",n,r)}e.cvt[r]=n/64}function Li(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"RCVT",n)}t.push(e.cvt[n]*64)}function Ni(e,t){var n=t.stack;var r=n.pop();var i=t.z2[r];if(C.DEBUG){console.log(t.step,"GC["+e+"]",r)}n.push(t.dpv.distance(i,Er,e,false)*64)}function Ui(e,t){var n=t.stack;var r=n.pop();var i=n.pop();var a=t.z1[r];var s=t.z0[i];var o=t.dpv.distance(s,a,e,e);if(C.DEBUG){console.log(t.step,"MD["+e+"]",r,i,"->",o)}t.stack.push(Math.round(o*64))}function Ri(e){if(C.DEBUG){console.log(e.step,"MPPEM[]")}e.stack.push(e.ppem)}function Pi(e){if(C.DEBUG){console.log(e.step,"FLIPON[]")}e.autoFlip=true}function Mi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"LT[]",n,r)}t.push(r<n?1:0)}function ki(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"LTEQ[]",n,r)}t.push(r<=n?1:0)}function wi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"GT[]",n,r)}t.push(r>n?1:0)}function Bi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"GTEQ[]",n,r)}t.push(r>=n?1:0)}function Gi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"EQ[]",n,r)}t.push(n===r?1:0)}function Vi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"NEQ[]",n,r)}t.push(n!==r?1:0)}function Di(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"ODD[]",n)}t.push(Math.trunc(n)%2?1:0)}function Fi(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"EVEN[]",n)}t.push(Math.trunc(n)%2?0:1)}function ji(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"IF[]",t)}if(!t){Ur(e,true);if(C.DEBUG){console.log(e.step,"EIF[]")}}}function zi(e){if(C.DEBUG){console.log(e.step,"EIF[]")}}function Hi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"AND[]",n,r)}t.push(n&&r?1:0)}function Xi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"OR[]",n,r)}t.push(n||r?1:0)}function Yi(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"NOT[]",n)}t.push(n?0:1)}function Wi(e,t){var n=t.stack;var r=n.pop();var i=t.fv;var a=t.pv;var s=t.ppem;var o=t.deltaBase+(e-1)*16;var l=t.deltaShift;var u=t.z0;if(C.DEBUG){console.log(t.step,"DELTAP["+e+"]",r,n)}for(var c=0;c<r;c++){var p=n.pop();var h=n.pop();var f=o+((h&240)>>4);if(f!==s){continue}var d=(h&15)-8;if(d>=0){d++}if(C.DEBUG){console.log(t.step,"DELTAPFIX",p,"by",d*l)}var g=u[p];i.setRelative(g,g,d*l,a)}}function qi(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"SDB[]",n)}e.deltaBase=n}function Zi(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"SDS[]",n)}e.deltaShift=Math.pow(.5,n)}function Ki(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"ADD[]",n,r)}t.push(r+n)}function Qi(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"SUB[]",n,r)}t.push(r-n)}function Ji(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"DIV[]",n,r)}t.push(r*64/n)}function $i(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"MUL[]",n,r)}t.push(r*n/64)}function ea(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"ABS[]",n)}t.push(Math.abs(n))}function ta(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"NEG[]",n)}t.push(-n)}function na(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"FLOOR[]",n)}t.push(Math.floor(n/64)*64)}function ra(e){var t=e.stack;var n=t.pop();if(C.DEBUG){console.log(e.step,"CEILING[]",n)}t.push(Math.ceil(n/64)*64)}function ia(e,t){var n=t.stack;var r=n.pop();if(C.DEBUG){console.log(t.step,"ROUND[]")}n.push(t.round(r/64)*64)}function aa(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"WCVTF[]",n,r)}e.cvt[r]=n*e.ppem/e.font.unitsPerEm}function sa(e,t){var n=t.stack;var r=n.pop();var i=t.ppem;var a=t.deltaBase+(e-1)*16;var s=t.deltaShift;if(C.DEBUG){console.log(t.step,"DELTAC["+e+"]",r,n)}for(var o=0;o<r;o++){var l=n.pop();var u=n.pop();var c=a+((u&240)>>4);if(c!==i){continue}var p=(u&15)-8;if(p>=0){p++}var h=p*s;if(C.DEBUG){console.log(t.step,"DELTACFIX",l,"by",h)}t.cvt[l]+=h}}function oa(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SROUND[]",t)}e.round=Cr;var n;switch(t&192){case 0:n=.5;break;case 64:n=1;break;case 128:n=2;break;default:throw new Error("invalid SROUND value")}e.srPeriod=n;switch(t&48){case 0:e.srPhase=0;break;case 16:e.srPhase=.25*n;break;case 32:e.srPhase=.5*n;break;case 48:e.srPhase=.75*n;break;default:throw new Error("invalid SROUND value")}t&=15;if(t===0){e.srThreshold=0}else{e.srThreshold=(t/8-.5)*n}}function la(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"S45ROUND[]",t)}e.round=Cr;var n;switch(t&192){case 0:n=Math.sqrt(2)/2;break;case 64:n=Math.sqrt(2);break;case 128:n=2*Math.sqrt(2);break;default:throw new Error("invalid S45ROUND value")}e.srPeriod=n;switch(t&48){case 0:e.srPhase=0;break;case 16:e.srPhase=.25*n;break;case 32:e.srPhase=.5*n;break;case 48:e.srPhase=.75*n;break;default:throw new Error("invalid S45ROUND value")}t&=15;if(t===0){e.srThreshold=0}else{e.srThreshold=(t/8-.5)*n}}function ua(e){if(C.DEBUG){console.log(e.step,"ROFF[]")}e.round=yr}function ca(e){if(C.DEBUG){console.log(e.step,"RUTG[]")}e.round=_r}function pa(e){if(C.DEBUG){console.log(e.step,"RDTG[]")}e.round=Ar}function ha(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SCANCTRL[]",t)}}function fa(e,t){var n=t.stack;var r=n.pop();var i=n.pop();var a=t.z2[r];var s=t.z1[i];if(C.DEBUG){console.log(t.step,"SDPVTL["+e+"]",r,i)}var o;var l;if(!e){o=s.x-a.x;l=s.y-a.y}else{o=a.y-s.y;l=s.x-a.x}t.dpv=Ir(o,l)}function da(e){var t=e.stack;var n=t.pop();var r=0;if(C.DEBUG){console.log(e.step,"GETINFO[]",n)}if(n&1){r=35}if(n&32){r|=4096}t.push(r)}function ga(e){var t=e.stack;var n=t.pop();var r=t.pop();var i=t.pop();if(C.DEBUG){console.log(e.step,"ROLL[]")}t.push(r);t.push(n);t.push(i)}function ma(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"MAX[]",n,r)}t.push(Math.max(r,n))}function va(e){var t=e.stack;var n=t.pop();var r=t.pop();if(C.DEBUG){console.log(e.step,"MIN[]",n,r)}t.push(Math.min(r,n))}function ba(e){var t=e.stack.pop();if(C.DEBUG){console.log(e.step,"SCANTYPE[]",t)}}function ya(e){var t=e.stack.pop();var n=e.stack.pop();if(C.DEBUG){console.log(e.step,"INSTCTRL[]",t,n)}switch(t){case 1:e.inhibitGridFit=!!n;return;case 2:e.ignoreCvt=!!n;return;default:throw new Error("invalid INSTCTRL[] selector")}}function n(e,t){var n=t.stack;var r=t.prog;var i=t.ip;if(C.DEBUG){console.log(t.step,"PUSHB["+e+"]")}for(var a=0;a<e;a++){n.push(r[++i])}t.ip=i}function r(e,t){var n=t.ip;var r=t.prog;var i=t.stack;if(C.DEBUG){console.log(t.ip,"PUSHW["+e+"]")}for(var a=0;a<e;a++){var s=r[++n]<<8|r[++n];if(s&32768){s=-((s^65535)+1)}i.push(s)}t.ip=n}function s(e,t,n,r,i,a){var s=a.stack;var o=e&&s.pop();var l=s.pop();var u=a.rp0;var c=a.z0[u];var p=a.z1[l];var h=a.minDis;var f=a.fv;var d=a.dpv;var g;var m;var v;var b;m=g=d.distance(p,c,true,true);v=m>=0?1:-1;m=Math.abs(m);if(e){b=a.cvt[o];if(r&&Math.abs(m-b)<a.cvCutIn){m=b}}if(n&&m<h){m=h}if(r){m=a.round(m)}f.setRelative(p,c,v*m,d);f.touch(p);if(C.DEBUG){console.log(a.step,(e?"MIRP[":"MDRP[")+(t?"M":"m")+(n?">":"_")+(r?"R":"_")+(i===0?"Gr":i===1?"Bl":i===2?"Wh":"")+"]",e?o+"("+a.cvt[o]+","+b+")":"",l,"(d =",g,"->",v*m,")")}a.rp1=a.rp0;a.rp2=l;if(t){a.rp0=l}}dr=[Rr.bind(undefined,v),Rr.bind(undefined,m),Pr.bind(undefined,v),Pr.bind(undefined,m),Mr.bind(undefined,v),Mr.bind(undefined,m),kr.bind(undefined,0),kr.bind(undefined,1),wr.bind(undefined,0),wr.bind(undefined,1),Br,Gr,Vr,Dr,Fr,jr,zr,Hr,Xr,Yr,Wr,qr,Zr,Kr,Qr,Jr,$r,ei,ti,ni,undefined,undefined,ri,ii,ai,si,oi,ci,pi,undefined,undefined,undefined,li,ui,hi,undefined,fi.bind(undefined,0),fi.bind(undefined,1),di.bind(undefined,v),di.bind(undefined,m),gi.bind(undefined,0),gi.bind(undefined,1),mi.bind(undefined,0),mi.bind(undefined,1),vi.bind(undefined,0),vi.bind(undefined,1),bi,yi,xi.bind(undefined,0),xi.bind(undefined,1),Si,Oi,_i.bind(undefined,0),_i.bind(undefined,1),Ai,Ci,Ti,Ii,Ei,Li,Ni.bind(undefined,0),Ni.bind(undefined,1),undefined,Ui.bind(undefined,0),Ui.bind(undefined,1),Ri,undefined,Pi,undefined,undefined,Mi,ki,wi,Bi,Gi,Vi,Di,Fi,ji,zi,Hi,Xi,Yi,Wi.bind(undefined,1),qi,Zi,Ki,Qi,Ji,$i,ea,ta,na,ra,ia.bind(undefined,0),ia.bind(undefined,1),ia.bind(undefined,2),ia.bind(undefined,3),undefined,undefined,undefined,undefined,aa,Wi.bind(undefined,2),Wi.bind(undefined,3),sa.bind(undefined,1),sa.bind(undefined,2),sa.bind(undefined,3),oa,la,undefined,undefined,ua,undefined,ca,pa,ii,ii,undefined,undefined,undefined,undefined,undefined,ha,fa.bind(undefined,0),fa.bind(undefined,1),da,undefined,ga,ma,va,ba,ya,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,undefined,n.bind(undefined,1),n.bind(undefined,2),n.bind(undefined,3),n.bind(undefined,4),n.bind(undefined,5),n.bind(undefined,6),n.bind(undefined,7),n.bind(undefined,8),r.bind(undefined,1),r.bind(undefined,2),r.bind(undefined,3),r.bind(undefined,4),r.bind(undefined,5),r.bind(undefined,6),r.bind(undefined,7),r.bind(undefined,8),s.bind(undefined,0,0,0,0,0),s.bind(undefined,0,0,0,0,1),s.bind(undefined,0,0,0,0,2),s.bind(undefined,0,0,0,0,3),s.bind(undefined,0,0,0,1,0),s.bind(undefined,0,0,0,1,1),s.bind(undefined,0,0,0,1,2),s.bind(undefined,0,0,0,1,3),s.bind(undefined,0,0,1,0,0),s.bind(undefined,0,0,1,0,1),s.bind(undefined,0,0,1,0,2),s.bind(undefined,0,0,1,0,3),s.bind(undefined,0,0,1,1,0),s.bind(undefined,0,0,1,1,1),s.bind(undefined,0,0,1,1,2),s.bind(undefined,0,0,1,1,3),s.bind(undefined,0,1,0,0,0),s.bind(undefined,0,1,0,0,1),s.bind(undefined,0,1,0,0,2),s.bind(undefined,0,1,0,0,3),s.bind(undefined,0,1,0,1,0),s.bind(undefined,0,1,0,1,1),s.bind(undefined,0,1,0,1,2),s.bind(undefined,0,1,0,1,3),s.bind(undefined,0,1,1,0,0),s.bind(undefined,0,1,1,0,1),s.bind(undefined,0,1,1,0,2),s.bind(undefined,0,1,1,0,3),s.bind(undefined,0,1,1,1,0),s.bind(undefined,0,1,1,1,1),s.bind(undefined,0,1,1,1,2),s.bind(undefined,0,1,1,1,3),s.bind(undefined,1,0,0,0,0),s.bind(undefined,1,0,0,0,1),s.bind(undefined,1,0,0,0,2),s.bind(undefined,1,0,0,0,3),s.bind(undefined,1,0,0,1,0),s.bind(undefined,1,0,0,1,1),s.bind(undefined,1,0,0,1,2),s.bind(undefined,1,0,0,1,3),s.bind(undefined,1,0,1,0,0),s.bind(undefined,1,0,1,0,1),s.bind(undefined,1,0,1,0,2),s.bind(undefined,1,0,1,0,3),s.bind(undefined,1,0,1,1,0),s.bind(undefined,1,0,1,1,1),s.bind(undefined,1,0,1,1,2),s.bind(undefined,1,0,1,1,3),s.bind(undefined,1,1,0,0,0),s.bind(undefined,1,1,0,0,1),s.bind(undefined,1,1,0,0,2),s.bind(undefined,1,1,0,0,3),s.bind(undefined,1,1,0,1,0),s.bind(undefined,1,1,0,1,1),s.bind(undefined,1,1,0,1,2),s.bind(undefined,1,1,0,1,3),s.bind(undefined,1,1,1,0,0),s.bind(undefined,1,1,1,0,1),s.bind(undefined,1,1,1,0,2),s.bind(undefined,1,1,1,0,3),s.bind(undefined,1,1,1,1,0),s.bind(undefined,1,1,1,1,1),s.bind(undefined,1,1,1,1,2),s.bind(undefined,1,1,1,1,3)];function xa(e){this.char=e;this.state={};this.activeState=null}function Sa(e,t,n){this.contextName=n;this.startIndex=e;this.endOffset=t}function Oa(e,t,n){this.contextName=e;this.openRange=null;this.ranges=[];this.checkStart=t;this.checkEnd=n}function L(e,t){this.context=e;this.index=t;this.length=e.length;this.current=e[t];this.backtrack=e.slice(0,t);this.lookahead=e.slice(t+1)}function _a(e){this.eventId=e;this.subscribers=[]}function Aa(n){var r=this;var e=["start","end","next","newToken","contextStart","contextEnd","insertToken","removeToken","removeRange","replaceToken","replaceRange","composeRUD","updateContextsRanges"];e.forEach(function(e){Object.defineProperty(r.events,e,{value:new _a(e)})});if(!!n){e.forEach(function(e){var t=n[e];if(typeof t==="function"){r.events[e].subscribe(t)}})}var t=["insertToken","removeToken","removeRange","replaceToken","replaceRange","composeRUD"];t.forEach(function(e){r.events[e].subscribe(r.updateContextsRanges)})}function b(e){this.tokens=[];this.registeredContexts={};this.contextCheckers=[];this.events={};this.registeredModifiers=[];Aa.call(this,e)}xa.prototype.setState=function(e,t){this.state[e]=t;this.activeState={key:e,value:this.state[e]};return this.activeState};xa.prototype.getState=function(e){return this.state[e]||null};b.prototype.inboundIndex=function(e){return e>=0&&e<this.tokens.length};b.prototype.composeRUD=function(e){var t=this;var n=true;var r=e.map(function(e){return t[e[0]].apply(t,e.slice(1).concat(n))});var i=function(e){return typeof e==="object"&&e.hasOwnProperty("FAIL")};if(r.every(i)){return{FAIL:"composeRUD: one or more operations hasn't completed successfully",report:r.filter(i)}}this.dispatch("composeRUD",[r.filter(function(e){return!i(e)})])};b.prototype.replaceRange=function(e,t,n,r){t=t!==null?t:this.tokens.length;var i=n.every(function(e){return e instanceof xa});if(!isNaN(e)&&this.inboundIndex(e)&&i){var a=this.tokens.splice.apply(this.tokens,[e,t].concat(n));if(!r){this.dispatch("replaceToken",[e,t,n])}return[a,n]}else{return{FAIL:"replaceRange: invalid tokens or startIndex."}}};b.prototype.replaceToken=function(e,t,n){if(!isNaN(e)&&this.inboundIndex(e)&&t instanceof xa){var r=this.tokens.splice(e,1,t);if(!n){this.dispatch("replaceToken",[e,t])}return[r[0],t]}else{return{FAIL:"replaceToken: invalid token or index."}}};b.prototype.removeRange=function(e,t,n){t=!isNaN(t)?t:this.tokens.length;var r=this.tokens.splice(e,t);if(!n){this.dispatch("removeRange",[r,e,t])}return r};b.prototype.removeToken=function(e,t){if(!isNaN(e)&&this.inboundIndex(e)){var n=this.tokens.splice(e,1);if(!t){this.dispatch("removeToken",[n,e])}return n}else{return{FAIL:"removeToken: invalid token index."}}};b.prototype.insertToken=function(e,t,n){var r=e.every(function(e){return e instanceof xa});if(r){this.tokens.splice.apply(this.tokens,[t,0].concat(e));if(!n){this.dispatch("insertToken",[e,t])}return e}else{return{FAIL:"insertToken: invalid token(s)."}}};b.prototype.registerModifier=function(s,o,l){this.events.newToken.subscribe(function(e,t){var n=[e,t];var r=o===null||o.apply(this,n)===true;var i=[e,t];if(r){var a=l.apply(this,i);e.setState(s,a)}});this.registeredModifiers.push(s)};_a.prototype.subscribe=function(e){if(typeof e==="function"){return this.subscribers.push(e)-1}else{return{FAIL:"invalid '"+this.eventId+"' event handler"}}};_a.prototype.unsubscribe=function(e){this.subscribers.splice(e,1)};L.prototype.setCurrentIndex=function(e){this.index=e;this.current=this.context[e];this.backtrack=this.context.slice(0,e);this.lookahead=this.context.slice(e+1)};L.prototype.get=function(e){switch(true){case e===0:return this.current;case e<0&&Math.abs(e)<=this.backtrack.length:return this.backtrack.slice(e)[0];case e>0&&e<=this.lookahead.length:return this.lookahead[e-1];default:return null}};b.prototype.rangeToText=function(e){if(e instanceof Sa){return this.getRangeTokens(e).map(function(e){return e.char}).join("")}};b.prototype.getText=function(){return this.tokens.map(function(e){return e.char}).join("")};b.prototype.getContext=function(e){var t=this.registeredContexts[e];return!!t?t:null};b.prototype.on=function(e,t){var n=this.events[e];if(!!n){return n.subscribe(t)}else{return null}};b.prototype.dispatch=function(e,t){var n=this;var r=this.events[e];if(r instanceof _a){r.subscribers.forEach(function(e){e.apply(n,t||[])})}};b.prototype.registerContextChecker=function(e,t,n){if(!!this.getContext(e)){return{FAIL:"context name '"+e+"' is already registered."}}if(typeof t!=="function"){return{FAIL:"missing context start check."}}if(typeof n!=="function"){return{FAIL:"missing context end check."}}var r=new Oa(e,t,n);this.registeredContexts[e]=r;this.contextCheckers.push(r);return r};b.prototype.getRangeTokens=function(e){var t=e.startIndex+e.endOffset;return[].concat(this.tokens.slice(e.startIndex,t))};b.prototype.getContextRanges=function(e){var t=this.getContext(e);if(!!t){return t.ranges}else{return{FAIL:"context checker '"+e+"' is not registered."}}};b.prototype.resetContextsRanges=function(){var e=this.registeredContexts;for(var t in e){if(e.hasOwnProperty(t)){var n=e[t];n.ranges=[]}}};b.prototype.updateContextsRanges=function(){this.resetContextsRanges();var e=this.tokens.map(function(e){return e.char});for(var t=0;t<e.length;t++){var n=new L(e,t);this.runContextCheck(n)}this.dispatch("updateContextsRanges",[this.registeredContexts])};b.prototype.setEndOffset=function(e,t){var n=this.getContext(t).openRange.startIndex;var r=new Sa(n,e,t);var i=this.getContext(t).ranges;r.rangeId=t+"."+i.length;i.push(r);this.getContext(t).openRange=null;return r};b.prototype.runContextCheck=function(a){var s=this;var o=a.index;this.contextCheckers.forEach(function(e){var t=e.contextName;var n=s.getContext(t).openRange;if(!n&&e.checkStart(a)){n=new Sa(o,null,t);s.getContext(t).openRange=n;s.dispatch("contextStart",[t,o])}if(!!n&&e.checkEnd(a)){var r=o-n.startIndex+1;var i=s.setEndOffset(r,t);s.dispatch("contextEnd",[t,i])}})};b.prototype.tokenize=function(e){this.tokens=[];this.resetContextsRanges();var t=Array.from(e);this.dispatch("start");for(var n=0;n<t.length;n++){var r=t[n];var i=new L(t,n);this.dispatch("next",[i]);this.runContextCheck(i);var a=new xa(r);this.tokens.push(a);this.dispatch("newToken",[a,i])}this.dispatch("end",[this.tokens]);return this.tokens};function y(e){return/[\u0600-\u065F\u066A-\u06D2\u06FA-\u06FF]/.test(e)}function Ca(e){return/[\u0630\u0690\u0621\u0631\u0661\u0671\u0622\u0632\u0672\u0692\u06C2\u0623\u0673\u0693\u06C3\u0624\u0694\u06C4\u0625\u0675\u0695\u06C5\u06E5\u0676\u0696\u06C6\u0627\u0677\u0697\u06C7\u0648\u0688\u0698\u06C8\u0689\u0699\u06C9\u068A\u06CA\u066B\u068B\u06CB\u068C\u068D\u06CD\u06FD\u068E\u06EE\u06FE\u062F\u068F\u06CF\u06EF]/.test(e)}function N(e){return/[\u0600-\u0605\u060C-\u060E\u0610-\u061B\u061E\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/.test(e)}function Ta(e){return/[A-z]/.test(e)}function Ia(e){return/\s/.test(e)}function O(e){this.font=e;this.features={}}function Ea(e){this.id=e.id;this.tag=e.tag;this.substitution=e.substitution}function La(e,t){if(!e){return-1}switch(t.format){case 1:return t.glyphs.indexOf(e);case 2:var n=t.ranges;for(var r=0;r<n.length;r++){var i=n[r];if(e>=i.start&&e<=i.end){var a=e-i.start;return i.index+a}}break;default:return-1}return-1}function Na(e,t){var n=La(e,t.coverage);if(n===-1){return null}return e+t.deltaGlyphId}function Ua(e,t){var n=La(e,t.coverage);if(n===-1){return null}return t.substitute[n]}function Ra(e,t){var n=[];for(var r=0;r<e.length;r++){var i=e[r];var a=t.current;a=Array.isArray(a)?a[0]:a;var s=La(a,i);if(s!==-1){n.push(s)}}if(n.length!==e.length){return-1}return n}function Pa(e,t){var n=t.inputCoverage.length+t.lookaheadCoverage.length+t.backtrackCoverage.length;if(e.context.length<n){return[]}var r=Ra(t.inputCoverage,e);if(r===-1){return[]}var i=t.inputCoverage.length-1;if(e.lookahead.length<t.lookaheadCoverage.length){return[]}var a=e.lookahead.slice(i);while(a.length&&N(a[0].char)){a.shift()}var s=new L(a,0);var o=Ra(t.lookaheadCoverage,s);var l=[].concat(e.backtrack);l.reverse();while(l.length&&N(l[0].char)){l.shift()}if(l.length<t.backtrackCoverage.length){return[]}var u=new L(l,0);var c=Ra(t.backtrackCoverage,u);var p=r.length===t.inputCoverage.length&&o.length===t.lookaheadCoverage.length&&c.length===t.backtrackCoverage.length;var h=[];if(p){for(var f=0;f<t.lookupRecords.length;f++){var d=t.lookupRecords[f];var g=d.lookupListIndex;var m=this.getLookupByIndex(g);for(var v=0;v<m.subtables.length;v++){var b=m.subtables[v];var y=this.getLookupMethod(m,b);var x=this.getSubstitutionType(m,b);if(x==="12"){for(var S=0;S<r.length;S++){var O=e.get(S);var _=y(O);if(_){h.push(_)}}}}}}return h}function Ma(e,t){var n=e.current;var r=La(n,t.coverage);if(r===-1){return null}var i;var a=t.ligatureSets[r];for(var s=0;s<a.length;s++){i=a[s];for(var o=0;o<i.components.length;o++){var l=e.lookahead[o];var u=i.components[o];if(l!==u){break}if(o===i.components.length-1){return i}}}return null}function ka(e,t){var n=La(e,t.coverage);if(n===-1){return null}return t.sequences[n]}O.prototype.getDefaultScriptFeaturesIndexes=function(){var e=this.font.tables.gsub.scripts;for(var t=0;t<e.length;t++){var n=e[t];if(n.tag==="DFLT"){return n.script.defaultLangSys.featureIndexes}}return[]};O.prototype.getScriptFeaturesIndexes=function(e){var t=this.font.tables;if(!t.gsub){return[]}if(!e){return this.getDefaultScriptFeaturesIndexes()}var n=this.font.tables.gsub.scripts;for(var r=0;r<n.length;r++){var i=n[r];if(i.tag===e&&i.script.defaultLangSys){return i.script.defaultLangSys.featureIndexes}else{var a=i.langSysRecords;if(!!a){for(var s=0;s<a.length;s++){var o=a[s];if(o.tag===e){var l=o.langSys;return l.featureIndexes}}}}}return this.getDefaultScriptFeaturesIndexes()};O.prototype.mapTagsToFeatures=function(e,t){var n={};for(var r=0;r<e.length;r++){var i=e[r].tag;var a=e[r].feature;n[i]=a}this.features[t].tags=n};O.prototype.getScriptFeatures=function(e){var t=this.features[e];if(this.features.hasOwnProperty(e)){return t}var n=this.getScriptFeaturesIndexes(e);if(!n){return null}var r=this.font.tables.gsub;t=n.map(function(e){return r.features[e]});this.features[e]=t;this.mapTagsToFeatures(t,e);return t};O.prototype.getSubstitutionType=function(e,t){var n=e.lookupType.toString();var r=t.substFormat.toString();return n+r};O.prototype.getLookupMethod=function(e,t){var n=this;var r=this.getSubstitutionType(e,t);switch(r){case"11":return function(e){return Na.apply(n,[e,t])};case"12":return function(e){return Ua.apply(n,[e,t])};case"63":return function(e){return Pa.apply(n,[e,t])};case"41":return function(e){return Ma.apply(n,[e,t])};case"21":return function(e){return ka.apply(n,[e,t])};default:throw new Error("lookupType: "+e.lookupType+" - "+"substFormat: "+t.substFormat+" "+"is not yet supported")}};O.prototype.lookupFeature=function(e){var t=e.contextParams;var n=t.index;var r=this.getFeature({tag:e.tag,script:e.script});if(!r){return new Error("font '"+this.font.names.fullName.en+"' "+"doesn't support feature '"+e.tag+"' "+"for script '"+e.script+"'.")}var i=this.getFeatureLookups(r);var a=[].concat(t.context);for(var s=0;s<i.length;s++){var o=i[s];var l=this.getLookupSubtables(o);for(var u=0;u<l.length;u++){var c=l[u];var p=this.getSubstitutionType(o,c);var h=this.getLookupMethod(o,c);var f=void 0;switch(p){case"11":f=h(t.current);if(f){a.splice(n,1,new Ea({id:11,tag:e.tag,substitution:f}))}break;case"12":f=h(t.current);if(f){a.splice(n,1,new Ea({id:12,tag:e.tag,substitution:f}))}break;case"63":f=h(t);if(Array.isArray(f)&&f.length){a.splice(n,1,new Ea({id:63,tag:e.tag,substitution:f}))}break;case"41":f=h(t);if(f){a.splice(n,1,new Ea({id:41,tag:e.tag,substitution:f}))}break;case"21":f=h(t.current);if(f){a.splice(n,1,new Ea({id:21,tag:e.tag,substitution:f}))}break}t=new L(a,n);if(Array.isArray(f)&&!f.length){continue}f=null}}return a.length?a:null};O.prototype.supports=function(t){if(!t.script){return false}this.getScriptFeatures(t.script);var e=this.features.hasOwnProperty(t.script);if(!t.tag){return e}var n=this.features[t.script].some(function(e){return e.tag===t.tag});return e&&n};O.prototype.getLookupSubtables=function(e){return e.subtables||null};O.prototype.getLookupByIndex=function(e){var t=this.font.tables.gsub.lookups;return t[e]||null};O.prototype.getFeatureLookups=function(e){return e.lookupListIndexes.map(this.getLookupByIndex.bind(this))};O.prototype.getFeature=function e(t){if(!this.font){return{FAIL:"No font was found"}}if(!this.features.hasOwnProperty(t.script)){this.getScriptFeatures(t.script)}var n=this.features[t.script];if(!n){return{FAIL:"No feature for script "+t.script}}if(!n.tags[t.tag]){return null}return this.features[t.script].tags[t.tag]};function wa(e){var t=e.current;var n=e.get(-1);return n===null&&y(t)||!y(n)&&y(t)}function Ba(e){var t=e.get(1);return t===null||!y(t)}var Ga={startCheck:wa,endCheck:Ba};function Va(e){var t=e.current;var n=e.get(-1);return(y(t)||N(t))&&!y(n)}function Da(e){var t=e.get(1);switch(true){case t===null:return true;case!y(t)&&!N(t):var n=Ia(t);if(!n){return true}if(n){var r=false;r=e.lookahead.some(function(e){return y(e)||N(e)});if(!r){return true}}break;default:return false}}var Fa={startCheck:Va,endCheck:Da};function ja(e,t,n){t[n].setState(e.tag,e.substitution)}function za(e,t,n){t[n].setState(e.tag,e.substitution)}function Ha(r,i,a){r.substitution.forEach(function(e,t){var n=i[a+t];n.setState(r.tag,e)})}function Xa(e,t,n){var r=t[n];r.setState(e.tag,e.substitution.ligGlyph);var i=e.substitution.components.length;for(var a=0;a<i;a++){r=t[n+a+1];r.setState("deleted",true)}}var Ya={11:ja,12:za,63:Ha,41:Xa};function Wa(e,t,n){if(e instanceof Ea&&Ya[e.id]){Ya[e.id](e,t,n)}}function qa(e){var t=[].concat(e.backtrack);for(var n=t.length-1;n>=0;n--){var r=t[n];var i=Ca(r);var a=N(r);if(!i&&!a){return true}if(i){return false}}return false}function Za(e){if(Ca(e.current)){return false}for(var t=0;t<e.lookahead.length;t++){var n=e.lookahead[t];var r=N(n);if(!r){return true}}return false}function Ka(e){var a=this;var s="arab";var o=this.featuresTags[s];var l=this.tokenizer.getRangeTokens(e);if(l.length===1){return}var u=new L(l.map(function(e){return e.getState("glyphIndex")}),0);var c=new L(l.map(function(e){return e.char}),0);l.forEach(function(e,t){if(N(e.char)){return}u.setCurrentIndex(t);c.setCurrentIndex(t);var n=0;if(qa(c)){n|=1}if(Za(c)){n|=2}var r;switch(n){case 1:r="fina";break;case 2:r="init";break;case 3:r="medi";break}if(o.indexOf(r)===-1){return}var i=a.query.lookupFeature({tag:r,script:s,contextParams:u});if(i instanceof Error){return console.info(i.message)}i.forEach(function(e,t){if(e instanceof Ea){Wa(e,l,t);u.context[t]=e.substitution}})})}function Qa(e,t){var n=e.map(function(e){return e.activeState.value});return new L(n,t||0)}function Ja(e){var r=this;var i="arab";var a=this.tokenizer.getRangeTokens(e);var s=Qa(a);s.context.forEach(function(e,t){s.setCurrentIndex(t);var n=r.query.lookupFeature({tag:"rlig",script:i,contextParams:s});if(n.length){n.forEach(function(e){return Wa(e,a,t)});s=Qa(a)}})}function $a(e){var t=e.current;var n=e.get(-1);return n===null&&Ta(t)||!Ta(n)&&Ta(t)}function es(e){var t=e.get(1);return t===null||!Ta(t)}var ts={startCheck:$a,endCheck:es};function ns(e,t){var n=e.map(function(e){return e.activeState.value});return new L(n,t||0)}function rs(e){var r=this;var i="latn";var a=this.tokenizer.getRangeTokens(e);var s=ns(a);s.context.forEach(function(e,t){s.setCurrentIndex(t);var n=r.query.lookupFeature({tag:"liga",script:i,contextParams:s});if(n.length){n.forEach(function(e){return Wa(e,a,t)});s=ns(a)}})}function U(e){this.baseDir=e||"ltr";this.tokenizer=new b;this.featuresTags={}}U.prototype.setText=function(e){this.text=e};U.prototype.contextChecks={latinWordCheck:ts,arabicWordCheck:Ga,arabicSentenceCheck:Fa};function is(e){var t=this.contextChecks[e+"Check"];return this.tokenizer.registerContextChecker(e,t.startCheck,t.endCheck)}function as(){is.call(this,"latinWord");is.call(this,"arabicWord");is.call(this,"arabicSentence");return this.tokenizer.tokenize(this.text)}function ss(){var n=this;var e=this.tokenizer.getContextRanges("arabicSentence");e.forEach(function(e){var t=n.tokenizer.getRangeTokens(e);n.tokenizer.replaceRange(e.startIndex,e.endOffset,t.reverse())})}U.prototype.registerFeatures=function(t,e){var n=this;var r=e.filter(function(e){return n.query.supports({script:t,tag:e})});if(!this.featuresTags.hasOwnProperty(t)){this.featuresTags[t]=r}else{this.featuresTags[t]=this.featuresTags[t].concat(r)}};U.prototype.applyFeatures=function(e,t){if(!e){throw new Error("No valid font was provided to apply features")}if(!this.query){this.query=new O(e)}for(var n=0;n<t.length;n++){var r=t[n];if(!this.query.supports({script:r.script})){continue}this.registerFeatures(r.script,r.tags)}};U.prototype.registerModifier=function(e,t,n){this.tokenizer.registerModifier(e,t,n)};function os(){if(this.tokenizer.registeredModifiers.indexOf("glyphIndex")===-1){throw new Error("glyphIndex modifier is required to apply "+"arabic presentation features.")}}function ls(){var t=this;var e="arab";if(!this.featuresTags.hasOwnProperty(e)){return}os.call(this);var n=this.tokenizer.getContextRanges("arabicWord");n.forEach(function(e){Ka.call(t,e)})}function us(){var t=this;var e="arab";if(!this.featuresTags.hasOwnProperty(e)){return}var n=this.featuresTags[e];if(n.indexOf("rlig")===-1){return}os.call(this);var r=this.tokenizer.getContextRanges("arabicWord");r.forEach(function(e){Ja.call(t,e)})}function cs(){var t=this;var e="latn";if(!this.featuresTags.hasOwnProperty(e)){return}var n=this.featuresTags[e];if(n.indexOf("liga")===-1){return}os.call(this);var r=this.tokenizer.getContextRanges("latinWord");r.forEach(function(e){rs.call(t,e)})}U.prototype.checkContextReady=function(e){return!!this.tokenizer.getContext(e)};U.prototype.applyFeaturesToContexts=function(){if(this.checkContextReady("arabicWord")){ls.call(this);us.call(this)}if(this.checkContextReady("latinWord")){cs.call(this)}if(this.checkContextReady("arabicSentence")){ss.call(this)}};U.prototype.processText=function(e){if(!this.text||this.text!==e){this.setText(e);as.call(this);this.applyFeaturesToContexts()}};U.prototype.getBidiText=function(e){this.processText(e);return this.tokenizer.getText()};U.prototype.getTextGlyphs=function(e){this.processText(e);var t=[];for(var n=0;n<this.tokenizer.tokens.length;n++){var r=this.tokenizer.tokens[n];if(r.state.deleted){continue}var i=r.activeState.value;t.push(Array.isArray(i)?i[0]:i)}return t};function V(e){e=e||{};e.tables=e.tables||{};if(!e.empty){rr(e.familyName,"When creating a new Font object, familyName is required.");rr(e.styleName,"When creating a new Font object, styleName is required.");rr(e.unitsPerEm,"When creating a new Font object, unitsPerEm is required.");rr(e.ascender,"When creating a new Font object, ascender is required.");rr(e.descender<=0,"When creating a new Font object, negative descender value is required.");this.names={fontFamily:{en:e.familyName||" "},fontSubfamily:{en:e.styleName||" "},fullName:{en:e.fullName||e.familyName+" "+e.styleName},postScriptName:{en:e.postScriptName||(e.familyName+e.styleName).replace(/\s/g,"")},designer:{en:e.designer||" "},designerURL:{en:e.designerURL||" "},manufacturer:{en:e.manufacturer||" "},manufacturerURL:{en:e.manufacturerURL||" "},license:{en:e.license||" "},licenseURL:{en:e.licenseURL||" "},version:{en:e.version||"Version 0.1"},description:{en:e.description||" "},copyright:{en:e.copyright||" "},trademark:{en:e.trademark||" "}};this.unitsPerEm=e.unitsPerEm||1e3;this.ascender=e.ascender;this.descender=e.descender;this.createdTimestamp=e.createdTimestamp;this.tables=Object.assign(e.tables,{os2:Object.assign({usWeightClass:e.weightClass||this.usWeightClasses.MEDIUM,usWidthClass:e.widthClass||this.usWidthClasses.MEDIUM,fsSelection:e.fsSelection||this.fsSelectionValues.REGULAR},e.tables.os2)})}this.supported=true;this.glyphs=new A.GlyphSet(this,e.glyphs||[]);this.encoding=new qe(this);this.position=new Qn(this);this.substitution=new t(this);this.tables=this.tables||{};this._push=null;this._hmtxTableData={};Object.defineProperty(this,"hinting",{get:function(){if(this._hinting){return this._hinting}if(this.outlinesFormat==="truetype"){return this._hinting=new br(this)}}})}V.prototype.hasChar=function(e){return this.encoding.charToGlyphIndex(e)!==null};V.prototype.charToGlyphIndex=function(e){return this.encoding.charToGlyphIndex(e)};V.prototype.charToGlyph=function(e){var t=this.charToGlyphIndex(e);var n=this.glyphs.get(t);if(!n){n=this.glyphs.get(0)}return n};V.prototype.updateFeatures=function(t){return this.defaultRenderOptions.features.map(function(e){if(e.script==="latn"){return{script:"latn",tags:e.tags.filter(function(e){return t[e]})}}else{return e}})};V.prototype.stringToGlyphs=function(e,t){var n=this;var r=new U;var i=function(e){return n.charToGlyphIndex(e.char)};r.registerModifier("glyphIndex",null,i);var a=t?this.updateFeatures(t.features):this.defaultRenderOptions.features;r.applyFeatures(this,a);var s=r.getTextGlyphs(e);var o=s.length;var l=new Array(o);var u=this.glyphs.get(0);for(var c=0;c<o;c+=1){l[c]=this.glyphs.get(s[c])||u}return l};V.prototype.nameToGlyphIndex=function(e){return this.glyphNames.nameToGlyphIndex(e)};V.prototype.nameToGlyph=function(e){var t=this.nameToGlyphIndex(e);var n=this.glyphs.get(t);if(!n){n=this.glyphs.get(0)}return n};V.prototype.glyphIndexToName=function(e){if(!this.glyphNames.glyphIndexToName){return""}return this.glyphNames.glyphIndexToName(e)};V.prototype.getKerningValue=function(e,t){e=e.index||e;t=t.index||t;var n=this.position.defaultKerningTables;if(n){return this.position.getKerningValue(n,e,t)}return this.kerningPairs[e+","+t]||0};V.prototype.defaultRenderOptions={kerning:true,features:[{script:"arab",tags:["init","medi","fina","rlig"]},{script:"latn",tags:["liga","rlig"]}]};V.prototype.forEachGlyph=function(e,t,n,r,i,a){t=t!==undefined?t:0;n=n!==undefined?n:0;r=r!==undefined?r:72;i=Object.assign({},this.defaultRenderOptions,i);var s=1/this.unitsPerEm*r;var o=this.stringToGlyphs(e,i);var l;if(i.kerning){var u=i.script||this.position.getDefaultScriptName();l=this.position.getKerningTables(u,i.language)}for(var c=0;c<o.length;c+=1){var p=o[c];a.call(this,p,t,n,r,i);if(p.advanceWidth){t+=p.advanceWidth*s}if(i.kerning&&c<o.length-1){var h=l?this.position.getKerningValue(l,p.index,o[c+1].index):this.getKerningValue(p,o[c+1]);t+=h*s}if(i.letterSpacing){t+=i.letterSpacing*r}else if(i.tracking){t+=i.tracking/1e3*r}}return t};V.prototype.getPath=function(e,t,n,r,a){var s=new d;this.forEachGlyph(e,t,n,r,a,function(e,t,n,r){var i=e.getPath(t,n,r,a,this);s.extend(i)});return s};V.prototype.getPaths=function(e,t,n,r,a){var s=[];this.forEachGlyph(e,t,n,r,a,function(e,t,n,r){var i=e.getPath(t,n,r,a,this);s.push(i)});return s};V.prototype.getAdvanceWidth=function(e,t,n){return this.forEachGlyph(e,0,0,t,n,function(){})};V.prototype.draw=function(e,t,n,r,i,a){this.getPath(t,n,r,i,a).draw(e)};V.prototype.drawPoints=function(i,e,t,n,r,a){this.forEachGlyph(e,t,n,r,a,function(e,t,n,r){e.drawPoints(i,t,n,r)})};V.prototype.drawMetrics=function(i,e,t,n,r,a){this.forEachGlyph(e,t,n,r,a,function(e,t,n,r){e.drawMetrics(i,t,n,r)})};V.prototype.getEnglishName=function(e){var t=this.names[e];if(t){return t.en}};V.prototype.validate=function(){var n=this;function r(e,t){}function e(e){var t=n.getEnglishName(e);r(t&&t.trim().length>0)}e("fontFamily");e("weightName");e("manufacturer");e("copyright");e("version");r(this.unitsPerEm>0)};V.prototype.toTables=function(){return Yn.fontToTable(this)};V.prototype.toBuffer=function(){console.warn("Font.toBuffer is deprecated. Use Font.toArrayBuffer instead.");return this.toArrayBuffer()};V.prototype.toArrayBuffer=function(){var e=this.toTables();var t=e.encode();var n=new ArrayBuffer(t.length);var r=new Uint8Array(n);for(var i=0;i<t.length;i++){r[i]=t[i]}return n};V.prototype.download=function(e){var t=this.getEnglishName("fontFamily");var n=this.getEnglishName("fontSubfamily");e=e||t.replace(/\s/g,"")+"-"+n+".otf";var r=this.toArrayBuffer();if(er()){window.URL=window.URL||window.webkitURL;if(window.URL){var i=new DataView(r);var a=new Blob([i],{type:"font/opentype"});var s=document.createElement("a");s.href=window.URL.createObjectURL(a);s.download=e;var o=document.createEvent("MouseEvents");o.initEvent("click",true,false);s.dispatchEvent(o)}else{console.warn("Font file could not be downloaded. Try using a different browser.")}}else{var l=require("fs");var u=nr(r);l.writeFileSync(e,u)}};V.prototype.fsSelectionValues={ITALIC:1,UNDERSCORE:2,NEGATIVE:4,OUTLINED:8,STRIKEOUT:16,BOLD:32,REGULAR:64,USER_TYPO_METRICS:128,WWS:256,OBLIQUE:512};V.prototype.usWidthClasses={ULTRA_CONDENSED:1,EXTRA_CONDENSED:2,CONDENSED:3,SEMI_CONDENSED:4,MEDIUM:5,SEMI_EXPANDED:6,EXPANDED:7,EXTRA_EXPANDED:8,ULTRA_EXPANDED:9};V.prototype.usWeightClasses={THIN:100,EXTRA_LIGHT:200,LIGHT:300,NORMAL:400,MEDIUM:500,SEMI_BOLD:600,BOLD:700,EXTRA_BOLD:800,BLACK:900};function ps(e,t){var n=JSON.stringify(e);var r=256;for(var i in t){var a=parseInt(i);if(!a||a<256){continue}if(JSON.stringify(t[i])===n){return a}if(r<=a){r=a+1}}t[r]=e;return r}function hs(e,t,n){var r=ps(t.name,n);return[{name:"tag_"+e,type:"TAG",value:t.tag},{name:"minValue_"+e,type:"FIXED",value:t.minValue<<16},{name:"defaultValue_"+e,type:"FIXED",value:t.defaultValue<<16},{name:"maxValue_"+e,type:"FIXED",value:t.maxValue<<16},{name:"flags_"+e,type:"USHORT",value:0},{name:"nameID_"+e,type:"USHORT",value:r}]}function fs(e,t,n){var r={};var i=new G.Parser(e,t);r.tag=i.parseTag();r.minValue=i.parseFixed();r.defaultValue=i.parseFixed();r.maxValue=i.parseFixed();i.skip("uShort",1);r.name=n[i.parseUShort()]||{};return r}function ds(e,t,n,r){var i=ps(t.name,r);var a=[{name:"nameID_"+e,type:"USHORT",value:i},{name:"flags_"+e,type:"USHORT",value:0}];for(var s=0;s<n.length;++s){var o=n[s].tag;a.push({name:"axis_"+e+" "+o,type:"FIXED",value:t.coordinates[o]<<16})}return a}function gs(e,t,n,r){var i={};var a=new G.Parser(e,t);i.name=r[a.parseUShort()]||{};a.skip("uShort",1);i.coordinates={};for(var s=0;s<n.length;++s){i.coordinates[n[s].tag]=a.parseFixed()}return i}function ms(e,t){var n=new E.Table("fvar",[{name:"version",type:"ULONG",value:65536},{name:"offsetToData",type:"USHORT",value:0},{name:"countSizePairs",type:"USHORT",value:2},{name:"axisCount",type:"USHORT",value:e.axes.length},{name:"axisSize",type:"USHORT",value:20},{name:"instanceCount",type:"USHORT",value:e.instances.length},{name:"instanceSize",type:"USHORT",value:4+e.axes.length*4}]);n.offsetToData=n.sizeOf();for(var r=0;r<e.axes.length;r++){n.fields=n.fields.concat(hs(r,e.axes[r],t))}for(var i=0;i<e.instances.length;i++){n.fields=n.fields.concat(ds(i,e.instances[i],e.axes,t))}return n}function vs(e,t,n){var r=new G.Parser(e,t);var i=r.parseULong();_.argument(i===65536,"Unsupported fvar table version.");var a=r.parseOffset16();r.skip("uShort",1);var s=r.parseUShort();var o=r.parseUShort();var l=r.parseUShort();var u=r.parseUShort();var c=[];for(var p=0;p<s;p++){c.push(fs(e,t+a+p*o,n))}var h=[];var f=t+a+s*o;for(var d=0;d<l;d++){h.push(gs(e,f+d*u,c,n))}return{axes:c,instances:h}}var bs={make:ms,parse:vs};var ys=function(){return{coverage:this.parsePointer(c.coverage),attachPoints:this.parseList(c.pointer(c.uShortList))}};var xs=function(){var e=this.parseUShort();_.argument(e===1||e===2||e===3,"Unsupported CaretValue table version.");if(e===1){return{coordinate:this.parseShort()}}else if(e===2){return{pointindex:this.parseShort()}}else if(e===3){return{coordinate:this.parseShort()}}};var Ss=function(){return this.parseList(c.pointer(xs))};var Os=function(){return{coverage:this.parsePointer(c.coverage),ligGlyphs:this.parseList(c.pointer(Ss))}};var _s=function(){this.parseUShort();return this.parseList(c.pointer(c.coverage))};function As(e,t){t=t||0;var n=new c(e,t);var r=n.parseVersion(1);_.argument(r===1||r===1.2||r===1.3,"Unsupported GDEF table version.");var i={version:r,classDef:n.parsePointer(c.classDef),attachList:n.parsePointer(ys),ligCaretList:n.parsePointer(Os),markAttachClassDef:n.parsePointer(c.classDef)};if(r>=1.2){i.markGlyphSets=n.parsePointer(_s)}return i}var Cs={parse:As};var R=new Array(10);R[1]=function e(){var t=this.offset+this.relativeOffset;var n=this.parseUShort();if(n===1){return{posFormat:1,coverage:this.parsePointer(c.coverage),value:this.parseValueRecord()}}else if(n===2){return{posFormat:2,coverage:this.parsePointer(c.coverage),values:this.parseValueRecordList()}}_.assert(false,"0x"+t.toString(16)+": GPOS lookup type 1 format must be 1 or 2.")};R[2]=function e(){var t=this.offset+this.relativeOffset;var n=this.parseUShort();_.assert(n===1||n===2,"0x"+t.toString(16)+": GPOS lookup type 2 format must be 1 or 2.");var r=this.parsePointer(c.coverage);var i=this.parseUShort();var a=this.parseUShort();if(n===1){return{posFormat:n,coverage:r,valueFormat1:i,valueFormat2:a,pairSets:this.parseList(c.pointer(c.list(function(){return{secondGlyph:this.parseUShort(),value1:this.parseValueRecord(i),value2:this.parseValueRecord(a)}})))}}else if(n===2){var s=this.parsePointer(c.classDef);var o=this.parsePointer(c.classDef);var l=this.parseUShort();var u=this.parseUShort();return{posFormat:n,coverage:r,valueFormat1:i,valueFormat2:a,classDef1:s,classDef2:o,class1Count:l,class2Count:u,classRecords:this.parseList(l,c.list(u,function(){return{value1:this.parseValueRecord(i),value2:this.parseValueRecord(a)}}))}}};R[3]=function e(){return{error:"GPOS Lookup 3 not supported"}};R[4]=function e(){return{error:"GPOS Lookup 4 not supported"}};R[5]=function e(){return{error:"GPOS Lookup 5 not supported"}};R[6]=function e(){return{error:"GPOS Lookup 6 not supported"}};R[7]=function e(){return{error:"GPOS Lookup 7 not supported"}};R[8]=function e(){return{error:"GPOS Lookup 8 not supported"}};R[9]=function e(){return{error:"GPOS Lookup 9 not supported"}};function Ts(e,t){t=t||0;var n=new c(e,t);var r=n.parseVersion(1);_.argument(r===1||r===1.1,"Unsupported GPOS table version "+r);if(r===1){return{version:r,scripts:n.parseScriptList(),features:n.parseFeatureList(),lookups:n.parseLookupList(R)}}else{return{version:r,scripts:n.parseScriptList(),features:n.parseFeatureList(),lookups:n.parseLookupList(R),variations:n.parseFeatureVariationsList()}}}var Is=new Array(10);function Es(e){return new E.Table("GPOS",[{name:"version",type:"ULONG",value:65536},{name:"scripts",type:"TABLE",value:new E.ScriptList(e.scripts)},{name:"features",type:"TABLE",value:new E.FeatureList(e.features)},{name:"lookups",type:"TABLE",value:new E.LookupList(e.lookups,Is)}])}var Ls={parse:Ts,make:Es};function Ns(e){var t={};e.skip("uShort");var n=e.parseUShort();_.argument(n===0,"Unsupported kern sub-table version.");e.skip("uShort",2);var r=e.parseUShort();e.skip("uShort",3);for(var i=0;i<r;i+=1){var a=e.parseUShort();var s=e.parseUShort();var o=e.parseShort();t[a+","+s]=o}return t}function Us(e){var t={};e.skip("uShort");var n=e.parseULong();if(n>1){console.warn("Only the first kern subtable is supported.")}e.skip("uLong");var r=e.parseUShort();var i=r&255;e.skip("uShort");if(i===0){var a=e.parseUShort();e.skip("uShort",3);for(var s=0;s<a;s+=1){var o=e.parseUShort();var l=e.parseUShort();var u=e.parseShort();t[o+","+l]=u}}return t}function Rs(e,t){var n=new G.Parser(e,t);var r=n.parseUShort();if(r===0){return Ns(n)}else if(r===1){return Us(n)}else{throw new Error("Unsupported kern table version ("+r+").")}}var Ps={parse:Rs};function Ms(e,t,n,r){var i=new G.Parser(e,t);var a=r?i.parseUShort:i.parseULong;var s=[];for(var o=0;o<n+1;o+=1){var l=a.call(i);if(r){l*=2}s.push(l)}return s}var ks={parse:Ms};function ws(e,n){var t=require("fs");t.readFile(e,function(e,t){if(e){return n(e.message)}n(null,tr(t))})}function Bs(e,t){var n=new XMLHttpRequest;n.open("get",e,true);n.responseType="arraybuffer";n.onload=function(){if(n.response){return t(null,n.response)}else{return t("Font could not be loaded: "+n.statusText)}};n.onerror=function(){t("Font could not be loaded")};n.send()}function Gs(e,t){var n=[];var r=12;for(var i=0;i<t;i+=1){var a=G.getTag(e,r);var s=G.getULong(e,r+4);var o=G.getULong(e,r+8);var l=G.getULong(e,r+12);n.push({tag:a,checksum:s,offset:o,length:l,compression:false});r+=16}return n}function Vs(e,t){var n=[];var r=44;for(var i=0;i<t;i+=1){var a=G.getTag(e,r);var s=G.getULong(e,r+4);var o=G.getULong(e,r+8);var l=G.getULong(e,r+12);var u=void 0;if(o<l){u="WOFF"}else{u=false}n.push({tag:a,offset:s,compression:u,compressedLength:o,length:l});r+=20}return n}function D(e,t){if(t.compression==="WOFF"){var n=new Uint8Array(e.buffer,t.offset+2,t.compressedLength-2);var r=new Uint8Array(t.length);ie(n,r);if(r.byteLength!==t.length){throw new Error("Decompression error: "+t.tag+" decompressed length doesn't match recorded length")}var i=new DataView(r.buffer,0);return{data:i,offset:0}}else{return{data:e,offset:t.offset}}}function Ds(e,t){t=t===undefined||t===null?{}:t;var n;var r;var i=new V({empty:true});var a=new DataView(e,0);var s;var o=[];var l=G.getTag(a,0);if(l===String.fromCharCode(0,1,0,0)||l==="true"||l==="typ1"){i.outlinesFormat="truetype";s=G.getUShort(a,4);o=Gs(a,s)}else if(l==="OTTO"){i.outlinesFormat="cff";s=G.getUShort(a,4);o=Gs(a,s)}else if(l==="wOFF"){var u=G.getTag(a,4);if(u===String.fromCharCode(0,1,0,0)){i.outlinesFormat="truetype"}else if(u==="OTTO"){i.outlinesFormat="cff"}else{throw new Error("Unsupported OpenType flavor "+l)}s=G.getUShort(a,12);o=Vs(a,s)}else{throw new Error("Unsupported OpenType signature "+l)}var c;var p;var h;var f;var d;var g;var m;var v;var b;var y;var x;var S;for(var O=0;O<s;O+=1){var _=o[O];var A=void 0;switch(_.tag){case"cmap":A=D(a,_);i.tables.cmap=He.parse(A.data,A.offset);i.encoding=new Ze(i.tables.cmap);break;case"cvt ":A=D(a,_);S=new G.Parser(A.data,A.offset);i.tables.cvt=S.parseShortList(_.length/2);break;case"fvar":p=_;break;case"fpgm":A=D(a,_);S=new G.Parser(A.data,A.offset);i.tables.fpgm=S.parseByteList(_.length);break;case"head":A=D(a,_);i.tables.head=Xt.parse(A.data,A.offset);i.unitsPerEm=i.tables.head.unitsPerEm;n=i.tables.head.indexToLocFormat;break;case"hhea":A=D(a,_);i.tables.hhea=qt.parse(A.data,A.offset);i.ascender=i.tables.hhea.ascender;i.descender=i.tables.hhea.descender;i.numberOfHMetrics=i.tables.hhea.numberOfHMetrics;break;case"hmtx":m=_;break;case"ltag":A=D(a,_);r=nn.parse(A.data,A.offset);break;case"maxp":A=D(a,_);i.tables.maxp=sn.parse(A.data,A.offset);i.numGlyphs=i.tables.maxp.numGlyphs;break;case"name":y=_;break;case"OS/2":A=D(a,_);i.tables.os2=In.parse(A.data,A.offset);break;case"post":A=D(a,_);i.tables.post=Nn.parse(A.data,A.offset);i.glyphNames=new Qe(i.tables.post);break;case"prep":A=D(a,_);S=new G.Parser(A.data,A.offset);i.tables.prep=S.parseByteList(_.length);break;case"glyf":h=_;break;case"loca":b=_;break;case"CFF ":c=_;break;case"kern":v=_;break;case"GDEF":f=_;break;case"GPOS":d=_;break;case"GSUB":g=_;break;case"meta":x=_;break}}var C=D(a,y);i.tables.name=On.parse(C.data,C.offset,r);i.names=i.tables.name;if(h&&b){var w=n===0;var T=D(a,b);var B=ks.parse(T.data,T.offset,i.numGlyphs,w);var I=D(a,h);i.glyphs=fr.parse(I.data,I.offset,B,i,t)}else if(c){var E=D(a,c);jt.parse(E.data,E.offset,i,t)}else{throw new Error("Font doesn't contain TrueType or CFF outlines.")}var L=D(a,m);$t.parse(i,L.data,L.offset,i.numberOfHMetrics,i.numGlyphs,i.glyphs,t);et(i,t);if(v){var N=D(a,v);i.kerningPairs=Ps.parse(N.data,N.offset)}else{i.kerningPairs={}}if(f){var U=D(a,f);i.tables.gdef=Cs.parse(U.data,U.offset)}if(d){var R=D(a,d);i.tables.gpos=Ls.parse(R.data,R.offset);i.position.init()}if(g){var P=D(a,g);i.tables.gsub=kn.parse(P.data,P.offset)}if(p){var M=D(a,p);i.tables.fvar=bs.parse(M.data,M.offset,i.names)}if(x){var k=D(a,x);i.tables.meta=Gn.parse(k.data,k.offset);i.metas=i.tables.meta}return i}function Fs(e,a,s){s=s===undefined||s===null?{}:s;var t=typeof window==="undefined";var n=t&&!s.isUrl?ws:Bs;return new Promise(function(r,i){n(e,function(e,t){if(e){if(a){return a(e)}else{i(e)}}var n;try{n=Ds(t,s)}catch(e){if(a){return a(e,null)}else{i(e)}}if(a){return a(null,n)}else{r(n)}})})}function js(e,t){var n=require("fs");var r=n.readFileSync(e);return Ds(tr(r),t)}var zs=Object.freeze({__proto__:null,Font:V,Glyph:g,Path:d,BoundingBox:o,_parse:G,parse:Ds,load:Fs,loadSync:js});C.BoundingBox=o;C.Font=V;C.Glyph=g;C.Path=d;C._parse=G;C.default=zs;C.load=Fs;C.loadSync=js;C.parse=Ds;Object.defineProperty(C,"__esModule",{value:true})});(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.earcut=e()}})(function(){var e,t,n;return function(){function c(a,s,o){function l(n,e){if(!s[n]){if(!a[n]){var t="function"==typeof require&&require;if(!e&&t)return t(n,!0);if(u)return u(n,!0);var r=new Error("Cannot find module '"+n+"'");throw r.code="MODULE_NOT_FOUND",r}var i=s[n]={exports:{}};a[n][0].call(i.exports,function(e){var t=a[n][1][e];return l(t||e)},i,i.exports,c,a,s,o)}return s[n].exports}for(var u="function"==typeof require&&require,e=0;e<o.length;e++)l(o[e]);return l}return c}()({1:[function(e,t,n){"use strict";t.exports=r;t.exports.default=r;function r(e,t,n){n=n||2;var r=t&&t.length,i=r?t[0]*n:e.length,a=g(e,0,i,n,true),s=[];if(!a||a.next===a.prev)return s;var o,l,u,c,p,h,f;if(r)a=v(e,t,a,n);if(e.length>80*n){o=u=e[0];l=c=e[1];for(var d=n;d<i;d+=n){p=e[d];h=e[d+1];if(p<o)o=p;if(h<l)l=h;if(p>u)u=p;if(h>c)c=h}f=Math.max(u-o,c-l);f=f!==0?1/f:0}m(a,s,n,o,l,f);return s}function g(e,t,n,r,i){var a,s;if(i===M(e,t,n,r)>0){for(a=t;a<n;a+=r)s=U(a,e[a],e[a+1],s)}else{for(a=n-r;a>=t;a-=r)s=U(a,e[a],e[a+1],s)}if(s&&o(s,s.next)){R(s);s=s.next}return s}function c(e,t){if(!e)return e;if(!t)t=e;var n=e,r;do{r=false;if(!n.steiner&&(o(n,n.next)||C(n.prev,n,n.next)===0)){R(n);n=t=n.prev;if(n===n.next)break;r=true}else{n=n.next}}while(r||n!==t);return t}function m(e,t,n,r,i,a,s){if(!e)return;if(!s&&a)S(e,r,i,a);var o=e,l,u;while(e.prev!==e.next){l=e.prev;u=e.next;if(a?h(e,r,i,a):p(e)){t.push(l.i/n);t.push(e.i/n);t.push(u.i/n);R(e);e=u.next;o=u.next;continue}e=u;if(e===o){if(!s){m(c(e),t,n,r,i,a,1)}else if(s===1){e=f(c(e),t,n);m(e,t,n,r,i,a,2)}else if(s===2){d(e,t,n,r,i,a)}break}}}function p(e){var t=e.prev,n=e,r=e.next;if(C(t,n,r)>=0)return false;var i=e.next.next;while(i!==e.prev){if(A(t.x,t.y,n.x,n.y,r.x,r.y,i.x,i.y)&&C(i.prev,i,i.next)>=0)return false;i=i.next}return true}function h(e,t,n,r){var i=e.prev,a=e,s=e.next;if(C(i,a,s)>=0)return false;var o=i.x<a.x?i.x<s.x?i.x:s.x:a.x<s.x?a.x:s.x,l=i.y<a.y?i.y<s.y?i.y:s.y:a.y<s.y?a.y:s.y,u=i.x>a.x?i.x>s.x?i.x:s.x:a.x>s.x?a.x:s.x,c=i.y>a.y?i.y>s.y?i.y:s.y:a.y>s.y?a.y:s.y;var p=O(o,l,t,n,r),h=O(u,c,t,n,r);var f=e.prevZ,d=e.nextZ;while(f&&f.z>=p&&d&&d.z<=h){if(f!==e.prev&&f!==e.next&&A(i.x,i.y,a.x,a.y,s.x,s.y,f.x,f.y)&&C(f.prev,f,f.next)>=0)return false;f=f.prevZ;if(d!==e.prev&&d!==e.next&&A(i.x,i.y,a.x,a.y,s.x,s.y,d.x,d.y)&&C(d.prev,d,d.next)>=0)return false;d=d.nextZ}while(f&&f.z>=p){if(f!==e.prev&&f!==e.next&&A(i.x,i.y,a.x,a.y,s.x,s.y,f.x,f.y)&&C(f.prev,f,f.next)>=0)return false;f=f.prevZ}while(d&&d.z<=h){if(d!==e.prev&&d!==e.next&&A(i.x,i.y,a.x,a.y,s.x,s.y,d.x,d.y)&&C(d.prev,d,d.next)>=0)return false;d=d.nextZ}return true}function f(e,t,n){var r=e;do{var i=r.prev,a=r.next.next;if(!o(i,a)&&l(i,r,r.next,a)&&E(i,a)&&E(a,i)){t.push(i.i/n);t.push(r.i/n);t.push(a.i/n);R(r);R(r.next);r=e=a}r=r.next}while(r!==e);return c(r)}function d(e,t,n,r,i,a){var s=e;do{var o=s.next.next;while(o!==s.prev){if(s.i!==o.i&&u(s,o)){var l=N(s,o);s=c(s,s.next);l=c(l,l.next);m(s,t,n,r,i,a);m(l,t,n,r,i,a);return}o=o.next}s=s.next}while(s!==e)}function v(e,t,n,r){var i=[],a,s,o,l,u;for(a=0,s=t.length;a<s;a++){o=t[a]*r;l=a<s-1?t[a+1]*r:e.length;u=g(e,o,l,r,false);if(u===u.next)u.steiner=true;i.push(_(u))}i.sort(b);for(a=0;a<i.length;a++){n=y(i[a],n);n=c(n,n.next)}return n}function b(e,t){return e.x-t.x}function y(e,t){var n=a(e,t);if(!n){return t}var r=N(n,e);var i=c(n,n.next);c(r,r.next);return t===n?i:t}function a(e,t){var n=t,r=e.x,i=e.y,a=-Infinity,s;do{if(i<=n.y&&i>=n.next.y&&n.next.y!==n.y){var o=n.x+(i-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(o<=r&&o>a){a=o;if(o===r){if(i===n.y)return n;if(i===n.next.y)return n.next}s=n.x<n.next.x?n:n.next}}n=n.next}while(n!==t);if(!s)return null;if(r===a)return s;var l=s,u=s.x,c=s.y,p=Infinity,h;n=s;do{if(r>=n.x&&n.x>=u&&r!==n.x&&A(i<c?r:a,i,u,c,i<c?a:r,i,n.x,n.y)){h=Math.abs(i-n.y)/(r-n.x);if(E(n,e)&&(h<p||h===p&&(n.x>s.x||n.x===s.x&&x(s,n)))){s=n;p=h}}n=n.next}while(n!==l);return s}function x(e,t){return C(e.prev,e,t.prev)<0&&C(t.next,e,e.next)<0}function S(e,t,n,r){var i=e;do{if(i.z===null)i.z=O(i.x,i.y,t,n,r);i.prevZ=i.prev;i.nextZ=i.next;i=i.next}while(i!==e);i.prevZ.nextZ=null;i.prevZ=null;s(i)}function s(e){var t,n,r,i,a,s,o,l,u=1;do{n=e;e=null;a=null;s=0;while(n){s++;r=n;o=0;for(t=0;t<u;t++){o++;r=r.nextZ;if(!r)break}l=u;while(o>0||l>0&&r){if(o!==0&&(l===0||!r||n.z<=r.z)){i=n;n=n.nextZ;o--}else{i=r;r=r.nextZ;l--}if(a)a.nextZ=i;else e=i;i.prevZ=a;a=i}n=r}a.nextZ=null;u*=2}while(s>1);return e}function O(e,t,n,r,i){e=32767*(e-n)*i;t=32767*(t-r)*i;e=(e|e<<8)&16711935;e=(e|e<<4)&252645135;e=(e|e<<2)&858993459;e=(e|e<<1)&1431655765;t=(t|t<<8)&16711935;t=(t|t<<4)&252645135;t=(t|t<<2)&858993459;t=(t|t<<1)&1431655765;return e|t<<1}function _(e){var t=e,n=e;do{if(t.x<n.x||t.x===n.x&&t.y<n.y)n=t;t=t.next}while(t!==e);return n}function A(e,t,n,r,i,a,s,o){return(i-s)*(t-o)-(e-s)*(a-o)>=0&&(e-s)*(r-o)-(n-s)*(t-o)>=0&&(n-s)*(a-o)-(i-s)*(r-o)>=0}function u(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!i(e,t)&&(E(e,t)&&E(t,e)&&L(e,t)&&(C(e.prev,e,t.prev)||C(e,t.prev,t))||o(e,t)&&C(e.prev,e,e.next)>0&&C(t.prev,t,t.next)>0)}function C(e,t,n){return(t.y-e.y)*(n.x-t.x)-(t.x-e.x)*(n.y-t.y)}function o(e,t){return e.x===t.x&&e.y===t.y}function l(e,t,n,r){var i=I(C(e,t,n));var a=I(C(e,t,r));var s=I(C(n,r,e));var o=I(C(n,r,t));if(i!==a&&s!==o)return true;if(i===0&&T(e,n,t))return true;if(a===0&&T(e,r,t))return true;if(s===0&&T(n,e,r))return true;if(o===0&&T(n,t,r))return true;return false}function T(e,t,n){return t.x<=Math.max(e.x,n.x)&&t.x>=Math.min(e.x,n.x)&&t.y<=Math.max(e.y,n.y)&&t.y>=Math.min(e.y,n.y)}function I(e){return e>0?1:e<0?-1:0}function i(e,t){var n=e;do{if(n.i!==e.i&&n.next.i!==e.i&&n.i!==t.i&&n.next.i!==t.i&&l(n,n.next,e,t))return true;n=n.next}while(n!==e);return false}function E(e,t){return C(e.prev,e,e.next)<0?C(e,t,e.next)>=0&&C(e,e.prev,t)>=0:C(e,t,e.prev)<0||C(e,e.next,t)<0}function L(e,t){var n=e,r=false,i=(e.x+t.x)/2,a=(e.y+t.y)/2;do{if(n.y>a!==n.next.y>a&&n.next.y!==n.y&&i<(n.next.x-n.x)*(a-n.y)/(n.next.y-n.y)+n.x)r=!r;n=n.next}while(n!==e);return r}function N(e,t){var n=new P(e.i,e.x,e.y),r=new P(t.i,t.x,t.y),i=e.next,a=t.prev;e.next=t;t.prev=e;n.next=i;i.prev=n;r.next=n;n.prev=r;a.next=r;r.prev=a;return r}function U(e,t,n,r){var i=new P(e,t,n);if(!r){i.prev=i;i.next=i}else{i.next=r.next;i.prev=r;r.next.prev=i;r.next=i}return i}function R(e){e.next.prev=e.prev;e.prev.next=e.next;if(e.prevZ)e.prevZ.nextZ=e.nextZ;if(e.nextZ)e.nextZ.prevZ=e.prevZ}function P(e,t,n){this.i=e;this.x=t;this.y=n;this.prev=null;this.next=null;this.z=null;this.prevZ=null;this.nextZ=null;this.steiner=false}r.deviation=function(e,t,n,r){var i=t&&t.length;var a=i?t[0]*n:e.length;var s=Math.abs(M(e,0,a,n));if(i){for(var o=0,l=t.length;o<l;o++){var u=t[o]*n;var c=o<l-1?t[o+1]*n:e.length;s-=Math.abs(M(e,u,c,n))}}var p=0;for(o=0;o<r.length;o+=3){var h=r[o]*n;var f=r[o+1]*n;var d=r[o+2]*n;p+=Math.abs((e[h]-e[d])*(e[f+1]-e[h+1])-(e[h]-e[f])*(e[d+1]-e[h+1]))}return s===0&&p===0?0:Math.abs((p-s)/s)};function M(e,t,n,r){var i=0;for(var a=t,s=n-r;a<n;a+=r){i+=(e[s]-e[a])*(e[a+1]+e[s+1]);s=a}return i}r.flatten=function(e){var t=e[0][0].length,n={vertices:[],holes:[],dimensions:t},r=0;for(var i=0;i<e.length;i++){for(var a=0;a<e[i].length;a++){for(var s=0;s<t;s++)n.vertices.push(e[i][a][s])}if(i>0){r+=e[i-1].length;n.holes.push(r)}}return n}},{}]},{},[1])(1)});(()=>{"use strict";var e={};const s={ANIM:{EASINGS:["linear","absolute","smoothstep","smootherstep","Cubic In","Cubic Out","Cubic In Out","Expo In","Expo Out","Expo In Out","Sin In","Sin Out","Sin In Out","Quart In","Quart Out","Quart In Out","Quint In","Quint Out","Quint In Out","Back In","Back Out","Back In Out","Elastic In","Elastic Out","Bounce In","Bounce Out"],EASING_LINEAR:0,EASING_ABSOLUTE:1,EASING_SMOOTHSTEP:2,EASING_SMOOTHERSTEP:3,EASING_CUBICSPLINE:4,EASING_CUBIC_IN:5,EASING_CUBIC_OUT:6,EASING_CUBIC_INOUT:7,EASING_EXPO_IN:8,EASING_EXPO_OUT:9,EASING_EXPO_INOUT:10,EASING_SIN_IN:11,EASING_SIN_OUT:12,EASING_SIN_INOUT:13,EASING_BACK_IN:14,EASING_BACK_OUT:15,EASING_BACK_INOUT:16,EASING_ELASTIC_IN:17,EASING_ELASTIC_OUT:18,EASING_BOUNCE_IN:19,EASING_BOUNCE_OUT:21,EASING_QUART_IN:22,EASING_QUART_OUT:23,EASING_QUART_INOUT:24,EASING_QUINT_IN:25,EASING_QUINT_OUT:26,EASING_QUINT_INOUT:27},OP:{OP_PORT_TYPE_VALUE:0,OP_PORT_TYPE_NUMBER:0,OP_PORT_TYPE_FUNCTION:1,OP_PORT_TYPE_TRIGGER:1,OP_PORT_TYPE_OBJECT:2,OP_PORT_TYPE_TEXTURE:2,OP_PORT_TYPE_ARRAY:3,OP_PORT_TYPE_DYNAMIC:4,OP_PORT_TYPE_STRING:5,OP_VERSION_PREFIX:"_v"},PORT:{PORT_DIR_IN:0,PORT_DIR_OUT:1},PACO:{PACO_CLEAR:0,PACO_VALUECHANGE:1,PACO_OP_DELETE:2,PACO_UNLINK:3,PACO_LINK:4,PACO_LOAD:5,PACO_OP_CREATE:6,PACO_OP_ENABLE:7,PACO_OP_DISABLE:8,PACO_UIATTRIBS:9,PACO_VARIABLES:10,PACO_TRIGGERS:11,PACO_PORT_SETVARIABLE:12,PACO_PORT_SETANIMATED:13,PACO_PORT_ANIM_UPDATED:14,PACO_DESERIALIZE:15}};const t=class{constructor(t,e,n,r,i,a){this._valuePort=n;this._varNamePort=r;this._op=t;this._type=e;this._typeId=-1;this._triggerPort=i;this._nextPort=a;this._btnCreate=t.inTriggerButton("Create new variable");this._btnCreate.setUiAttribs({hidePort:true});this._btnCreate.onTriggered=this._createVar.bind(this);this._helper=t.inUiTriggerButtons("",["Rename"]);this._helper.setUiAttribs({hidePort:true});this._helper.onTriggered=e=>{if(e=="Rename")CABLES.CMD.PATCH.renameVariable(t.varName.get())};this._op.setPortGroup("Variable",[this._helper,this._varNamePort,this._btnCreate]);this._op.on("uiParamPanel",this._updateVarNamesDropdown.bind(this));this._op.patch.addEventListener("variablesChanged",this._updateName.bind(this));this._op.patch.addEventListener("variableRename",this._renameVar.bind(this));this._varNamePort.onChange=this._updateName.bind(this);this._isTexture=this._valuePort.uiAttribs.objType==="texture";this._valuePort.changeAlways=true;if(this._triggerPort){this._triggerPort.onTriggered=()=>{this._setVarValue(true)}}else{this._valuePort.onChange=this._setVarValue.bind(this)}this._op.init=()=>{this._updateName();if(!this._triggerPort)this._setVarValue();this._updateErrorUi()};if(e=="array")this._typeId=s.OP.OP_PORT_TYPE_ARRAY;else if(e=="object")this._typeId=s.OP.OP_PORT_TYPE_OBJECT;else if(e=="string")this._typeId=s.OP.OP_PORT_TYPE_STRING;else if(e=="texture")this._typeId=s.OP.OP_PORT_TYPE_TEXTURE;else this._typeId=s.OP.OP_PORT_TYPE_VALUE}_updateErrorUi(){if(CABLES.UI){if(!this._varNamePort.get())this._op.setUiError("novarname","no variable selected");else{if(this._op.hasUiErrors){this._op.setUiError("novarname",null)}}}}_updateName(){const e=this._varNamePort.get();this._op.setTitle("var set");this._op.setUiAttrib({extendTitle:"#"+e});this._updateErrorUi();const t=this._op.patch.getVar(e);if(t&&!t.type)t.type=this._type;if(!this._op.patch.hasVar(e)&&e!=0&&!this._triggerPort){this._setVarValue()}if(!this._op.patch.hasVar(e)&&e!=0&&this._triggerPort){if(this._type=="string")this._op.patch.setVarValue(e,"");else if(this._type=="number")this._op.patch.setVarValue(e,"");else this._op.patch.setVarValue(e,null)}if(this._op.isCurrentUiOp()){this._updateVarNamesDropdown();this._op.refreshParams()}this._updateDisplay();this._op.patch.emitEvent("opVariableNameChanged",this._op,this._varNamePort.get())}_createVar(){CABLES.CMD.PATCH.createVariable(this._op,this._type,()=>{this._updateName()})}_updateDisplay(){this._valuePort.setUiAttribs({greyout:!this._varNamePort.get()})}_updateVarNamesDropdown(){if(CABLES.UI&&CABLES.UI.loaded&&CABLES.UI.loaded){const e=CABLES.UI.uiProfiler.start("[vars] _updateVarNamesDropdown");const t=[];const n=this._op.patch.getVars();for(const r in n)if(n[r].type==this._type&&r!="0")t.push(r);this._varNamePort.uiAttribs.values=t;e.finish()}}_renameVar(e,t){if(e!=this._varNamePort.get())return;this._varNamePort.set(t);this._updateName()}_setVarValue(e){const t=this._varNamePort.get();if(!t)return;const n=this._valuePort.get();if(this._typeId==s.OP.OP_PORT_TYPE_VALUE||this._typeId==s.OP.OP_PORT_TYPE_STRING){this._op.patch.setVarValue(t,n)}else if(this._typeId==s.OP.OP_PORT_TYPE_ARRAY){this._arr=[];CABLES.copyArray(n,this._arr);this._op.patch.setVarValue(t,this._arr)}else{if(this._typeId==s.OP.OP_PORT_TYPE_OBJECT){if(this._isTexture)this._op.patch.setVarValue(t,CGL.Texture.getEmptyTexture(this._op.patch.cgl));else this._op.patch.setVarValue(t,null);if(n&&n.tex&&n._cgl&&!this._isTexture)this._op.setUiError("texobj","Dont use object variables for textures, use varSetTexture");else this._op.setUiError("texobj",null)}this._op.patch.setVarValue(t,n)}if(e&&this._nextPort)this._nextPort.trigger()}};const n=class{constructor(e,t,n,r){this._op=e;this._type=t;this._varnamePort=n;this._variable=null;this._valueOutPort=r;this._listenerId=null;this._op.on("uiParamPanel",this._updateVarNamesDropdown.bind(this));this._op.on("uiErrorChange",this._updateTitle.bind(this));this._op.patch.on("variableRename",this._renameVar.bind(this));this._op.patch.on("variableDeleted",e=>{if(this._op.isCurrentUiOp())this._op.refreshParams()});this._varnamePort.onChange=this._changeVar.bind(this);this._op.patch.addEventListener("variablesChanged",this._init.bind(this));this._op.onDelete=()=>{if(this._variable&&this._listenerId)this._variable.off(this._listenerId)};this._op.init=()=>{this._init()}}get variable(){return this._variable}_changeVar(){if(this._variable&&this._listenerId){this._variable.off(this._listenerId)}this._init()}_renameVar(e,t){if(e!=this._varnamePort.get())return;this._varnamePort.set(t);this._updateVarNamesDropdown();this._updateTitle();this._listenerId=this._variable.on("change",this._setValueOut.bind(this))}_updateVarNamesDropdown(){if(CABLES.UI&&CABLES.UI.loaded){const e=[];const t=this._op.patch.getVars();for(const n in t)if(t[n].type==this._type&&n!="0")e.push(n);this._op.varName.uiAttribs.values=e}}_setValueOut(e){if(this._valueOutPort)this._valueOutPort.set(e)}_updateTitle(){if(this._variable){this._op.setUiError("unknownvar",null);this._op.setTitle("var get");this._op.setUiAttrib({extendTitle:"#"+this._varnamePort.get()});if(this._valueOutPort)this._valueOutPort.set(this._variable.getValue())}else{this._op.setUiError("unknownvar","unknown variable! - there is no setVariable with this name ("+this._varnamePort.get()+")");this._op.setUiAttrib({extendTitle:"#invalid"});if(this._valueOutPort)this._valueOutPort.set(0)}}_init(){this._updateVarNamesDropdown();if(this._variable&&this._listenerId)this._variable.off(this._listenerId);this._variable=this._op.patch.getVar(this._op.varName.get());if(this._variable)this._listenerId=this._variable.on("change",this._setValueOut.bind(this));this._updateTitle();this._op.patch.emitEvent("opVariableNameChanged",this._op,this._varnamePort.get())}};CABLES.VarSetOpWrapper=t;CABLES.VarGetOpWrapper=n;((this.CABLES=this.CABLES||{}).COREMODULES=this.CABLES.COREMODULES||{}).Vargetset=e.Cables})();(()=>{"use strict";var e={};const n="Ops.Ui.SubPatchInput";const r="Ops.Ui.SubPatchOutput";const t=class{constructor(n,e){e=e||{};this._op=n;n.patchId=n.addInPort(new CABLES.Port(n,"patchId",CABLES.OP_PORT_TYPE_STRING,{display:"readonly",hidePort:true}));n.setUiAttribs({subPatchOp:{version:2}});if(n.uiAttribs.parentOfSubpatch){n.patchId.set(n.uiAttribs.parentOfSubpatch)}else{if(e.subId)n.patchId.set(e.subId);else n.patchId.set(CABLES.generateUUID())}n.patchId.onChange=()=>{if(e.subId)n.patchId.value=e.subId};n.patch.on("subpatchCreated",()=>{this.createInOutOps()});n.on("loadedValueSet",()=>{this.createInOutOps()});n.init=()=>{n.setStorage({subPatchVer:2})};n.loadDependencies=(e,t)=>{if(CABLES.UI){gui.serverOps.loadProjectDependencies(e,()=>{if(t)t()})}else if(t)t()};n.on("delete",()=>{if(n.patch.clearSubPatchCache)n.patch.clearSubPatchCache(this.patchId);const t=n.patch.ops;for(let e=t.length-1;e>=0;e--)if(t[e]&&t[e].uiAttribs&&t[e].uiAttribs.subPatch==n.patchId.get())n.patch.deleteOp(t[e].id)});this._op.isExposableSubpatchOp=()=>{return true}}get patchId(){return this._op.patchId.get()}createInOutOps(){if(this._op.patch.clearSubPatchCache)this._op.patch.clearSubPatchCache(this.patchId);let e=this._op.patch.getSubPatchOp(this.patchId,n);let t=this._op.patch.getSubPatchOp(this.patchId,r);if(!e)this._op.patch.addOp(n,{subPatch:this.patchId,translate:{x:0,y:0}});if(!t)this._op.patch.addOp(r,{subPatch:this.patchId,translate:{x:0,y:0}})}};CABLES.SubPatchOp=t;((this.CABLES=this.CABLES||{}).COREMODULES=this.CABLES.COREMODULES||{}).Subpatchop=e.Cables})();(()=>{"use strict";var e={};class c{constructor(e){this._logs=[];this.initiator=e}stack(e){console.info("["+this.initiator+"] ",e);console.log((new Error).stack)}groupCollapsed(e){console.groupCollapsed("["+this.initiator+"] "+e)}table(e){console.table(e)}groupEnd(){console.groupEnd()}error(e){console.error("["+this.initiator+"]",...arguments);if(window.gui)window.gui.emitEvent("coreLogEvent",this.initiator,"error",arguments)}info(e){console.error("["+this.initiator+"]",...arguments);if(window.gui)window.gui.emitEvent("coreLogEvent",this.initiator,"info",arguments)}warn(e){console.warn("["+this.initiator+"]",...arguments);if(window.gui)window.gui.emitEvent("coreLogEvent",this.initiator,"warn",arguments)}verbose(){if(CABLES.UI&&CABLES.UI.logFilter.shouldPrint(this.initiator,...arguments)||!CABLES.logSilent)console.log("["+this.initiator+"]",...arguments);if(window.gui)window.gui.emitEvent("coreLogEvent",this.initiator,"verbose",arguments)}log(e){if(CABLES.UI&&CABLES.UI.logFilter.shouldPrint(this.initiator,...arguments)||!CABLES.logSilent)console.log("["+this.initiator+"]",...arguments);if(window.gui)window.gui.emitEvent("coreLogEvent",this.initiator,"log",arguments)}userInteraction(e){}}const i={};i.float32Concat=function(e,t){if(!(e instanceof Float32Array))e=new Float32Array(e);if(!(t instanceof Float32Array))t=new Float32Array(t);const n=new Float32Array(e.length+t.length);n.set(e);n.set(t,e.length);return n};const w=function(e){let t=e.split(".")[e.split(".").length-1];if(t.contains(CONSTANTS.OP.OP_VERSION_PREFIX)){const n=t.split(CONSTANTS.OP.OP_VERSION_PREFIX)[1];t=t.substring(0,t.length-(CONSTANTS.OP.OP_VERSION_PREFIX+n).length)}return t};const B=function(t){for(let e=t.length-1;e>0;e--){const n=Math.floor(Math.seededRandom()*(e+1));const r=t[e];t[e]=t[n];t[n]=r}return t};const t={};const n=function(){let e=Math.random().toString(36).substr(2,9);if(t.hasOwnProperty(e))e=n();t[e]=true;return e};const G=null&&n;const r=function(){let n=(new Date).getTime();const e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=(n+Math.random()*16)%16|0;n=Math.floor(n/16);return(e=="x"?t:t&3|8).toString(16)});return e};const V=null&&r;const D=null&&r;function a(e){for(const t in e){if(e[t]&&typeof objValue==="object"&&e[t].constructor===Object)e[t]=a(e[t]);if(e[t]===null||e[t]===undefined)delete e[t];else if(Array.isArray(e[t])&&e[t].length==0)delete e[t]}return e}const s=function(n,e="id"){let r=0;if(Array.prototype.reduce){r=n.split("").reduce((e,t)=>{e=(e<<5)-e+t.charCodeAt(0);return e&e},0)}else{if(n.length>0){for(let t=0;t<n.length;t++){let e=n.charCodeAt(t);r=(r<<5)-r+e;r&=r}}}return e+""+r};const F=null&&s;let o=0;const j=function(){o++;return o};const z=function(e){const t=Math.max(0,Math.min(1,(e-0)/(1-0)));e=t*t*(3-2*t);return e};const H=function(e){const t=Math.max(0,Math.min(1,(e-0)/(1-0)));e=t*t*t*(t*(t*6-15)+10);return e};const X=function(e,t,n){return Math.min(Math.max(e,t),n)};const Y=function(e,t,n,r,i,a){if(e>=n)return i;if(e<=t)return r;let s=false;const o=Math.min(t,n);const l=Math.max(t,n);if(o!=t)s=true;let u=false;const c=Math.min(r,i);const p=Math.max(r,i);if(c!=r)u=true;let h=0;let f=0;if(s)h=(l-e)*(p-c)/(l-o);else h=(e-o)*(p-c)/(l-o);if(u)f=p-h;else f=h+c;if(!a)return f;if(a==1){e=Math.max(0,Math.min(1,(f-r)/(i-r)));return r+e*e*(3-2*e)*(i-r)}if(a==2){e=Math.max(0,Math.min(1,(f-r)/(i-r)));return r+e*e*e*(e*(e*6-15)+10)*(i-r)}return f};Math.randomSeed=1;Math.setRandomSeed=function(e){Math.randomSeed=e*50728129;if(e!=0){Math.randomSeed=Math.seededRandom()*17624813;Math.randomSeed=Math.seededRandom()*9737333}};Math.seededRandom=function(e,t){if(Math.randomSeed===0)Math.randomSeed=Math.random()*999;e=e||1;t=t||0;Math.randomSeed=(Math.randomSeed*9301+49297)%233280;const n=Math.randomSeed/233280;return t+n*(e-t)};i.isNumeric=function(e){return!isNaN(parseFloat(e))&&isFinite(e)};i.isArray=function(e){return Object.prototype.toString.call(e)==="[object Array]"};String.prototype.endl=function(){return this+"\n"};String.prototype.startsWith=function(e){return this.indexOf(e)===0};String.prototype.endsWith=String.prototype.endsWith||function(e){return this.match(e+"$")==e};String.prototype.contains=String.prototype.contains||function(e){return this.indexOf(e)>-1};const W=function(e){if(e.contains("?"))e+="&";else e+="?";return e+"cache="+CABLES.uuid()};const q=function(t,n){if(!t)return null;n=n||[];n.length=t.length;for(let e=0;e<t.length;e++){n[e]=t[e]}return n};const Z=function(e){let t=CABLES.filename(e);const n=t.split(".");t=n[0];return t};const K=function(){console.log("logstack",(new Error).stack)};const Q=function(e){let t="";if(!e)return"";if(e.startsWith("data:")&&e.contains(":")){const n=e.split(",");return n[0]}const n=(e+"").split("/");if(n.length>0){const r=n[n.length-1];let e=r.split("?");t=e[0]}return t||""};const J=function(e,t,n,r,i){u({url:e,cb:t,method:n,data:r,contenttype:i,sync:true})};const $=function(e,t,n,r,i,a,s={},o={}){const l={url:e,cb:t,method:n,data:r,contenttype:i,sync:false,jsonP:a,headers:s};if(o&&o.credentials)l.credentials=o.credentials;u(l)};const u=function(t){if(!t.hasOwnProperty("asynch"))t.asynch=true;let n;try{n=new XMLHttpRequest}catch(e){}n.onreadystatechange=function(){if(n.readyState!=4)return;if(t.cb){if(n.status==200||n.status==0)t.cb(false,n.responseText,n);else t.cb(true,n.responseText,n)}};try{n.open(t.method?t.method.toUpperCase():"GET",t.url,!t.sync)}catch(e){if(t.cb&&e)t.cb(true,e.msg,n)}if(typeof t.headers==="object"){const r=Object.keys(t.headers);for(let e=0;e<r.length;e++){const i=r[e];const a=t.headers[i];n.setRequestHeader(i,a)}}if(t.credentials&&t.credentials!=="omit"){n.withCredentials=true}try{if(!t.post&&!t.data){n.send()}else{n.setRequestHeader("Content-type",t.contenttype?t.contenttype:"application/x-www-form-urlencoded");n.send(t.data||t.post)}}catch(e){if(t.cb)t.cb(true,e.msg,n)}};const ee=function(e){if(!e&&e!==0)return"Unidentified";const t={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};if(t[e]){return t[e]}else{return String.fromCharCode(e)}};window.performance=window.performance||{offset:Date.now(),now:function e(){return Date.now()-this.offset}};const l="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";const p=new Uint8Array(256);for(let e=0;e<l.length;e++)p[l.charCodeAt(e)]=e;const h=p;const te=function(e){if(e.buffer)e=e.buffer;let t=new Uint8Array(e),n,r=t.length,i="";for(n=0;n<r;n+=3){i+=l[t[n]>>2];i+=l[(t[n]&3)<<4|t[n+1]>>4];i+=l[(t[n+1]&15)<<2|t[n+2]>>6];i+=l[t[n+2]&63]}if(r%3===2)i=i.substring(0,i.length-1)+"=";else if(r%3===1)i=i.substring(0,i.length-2)+"==";return i};const f=function(e){let t=e.length*.75,n=e.length,r,i=0,a,s,o,l;if(e[e.length-1]==="="){t--;if(e[e.length-2]==="=")t--}let u=new ArrayBuffer(t),c=new Uint8Array(u);for(r=0;r<n;r+=4){a=h[e.charCodeAt(r)];s=h[e.charCodeAt(r+1)];o=h[e.charCodeAt(r+2)];l=h[e.charCodeAt(r+3)];c[i++]=a<<2|s>>4;c[i++]=(s&15)<<4|o>>2;c[i++]=(o&3)<<6|l&63}return u};class d{constructor(e){this._init();this._first=true;this._wireMesh=null;if(e)this.apply(e)}_init(){this._max=[-Number.MAX_VALUE,-Number.MAX_VALUE,-Number.MAX_VALUE];this._min=[Number.MAX_VALUE,Number.MAX_VALUE,Number.MAX_VALUE];this._center=[0,0,0];this._size=[0,0,0];this._maxAxis=0;this._first=true}get maxAxis(){return this._maxAxis||1}get size(){return this._size}get center(){return this._center}get x(){return this._center[0]}get y(){return this._center[1]}get z(){return this._center[2]}get minX(){return this._min[0]}get minY(){return this._min[1]}get minZ(){return this._min[2]}get maxX(){return this._max[0]}get maxY(){return this._max[1]}get maxZ(){return this._max[2]}apply(t,e){if(!t){return}if(t instanceof d){const n=t;this.applyPos(n.maxX,n.maxY,n.maxZ);this.applyPos(n.minX,n.minY,n.minZ)}else{for(let e=0;e<t.vertices.length;e+=3)this.applyPos(t.vertices[e],t.vertices[e+1],t.vertices[e+2])}this.calcCenterSize()}copy(){return new d(this)}get changed(){return!(this._max[0]==-Number.MAX_VALUE&&this._max[1]==-Number.MAX_VALUE&&this._max[2]==-Number.MAX_VALUE)}applyPos(e,t,n){if(e==Number.MAX_VALUE||e==-Number.MAX_VALUE||t==Number.MAX_VALUE||t==-Number.MAX_VALUE||n==Number.MAX_VALUE||n==-Number.MAX_VALUE)return;if(!CABLES.UTILS.isNumeric(e)||!CABLES.UTILS.isNumeric(t)||!CABLES.UTILS.isNumeric(n))return;if(this._first){this._max[0]=e;this._max[1]=t;this._max[2]=n;this._min[0]=e;this._min[1]=t;this._min[2]=n;this._first=false;return}this._max[0]=Math.max(this._max[0],e);this._max[1]=Math.max(this._max[1],t);this._max[2]=Math.max(this._max[2],n);this._min[0]=Math.min(this._min[0],e);this._min[1]=Math.min(this._min[1],t);this._min[2]=Math.min(this._min[2],n)}calcCenterSize(){if(this._first)return;this._size[0]=this._max[0]-this._min[0];this._size[1]=this._max[1]-this._min[1];this._size[2]=this._max[2]-this._min[2];this._center[0]=(this._min[0]+this._max[0])/2;this._center[1]=(this._min[1]+this._max[1])/2;this._center[2]=(this._min[2]+this._max[2])/2;this._maxAxis=Math.max(this._size[2],Math.max(this._size[0],this._size[1]))}mulMat4(e){if(this._first){this._max[0]=0;this._max[1]=0;this._max[2]=0;this._min[0]=0;this._min[1]=0;this._min[2]=0;this._first=false}vec3.transformMat4(this._max,this._max,e);vec3.transformMat4(this._min,this._min,e);this.calcCenterSize()}render(e,t,n){if(!this._wireMesh)this._wireMesh=new CGL.WireCube(e);e.pushModelMatrix();mat4.translate(e.mMatrix,e.mMatrix,this._center);if(CABLES.UI&&n){CABLES.UI.OverlayMeshes.drawCube(n,this._size[0]/2,this._size[1]/2,this._size[2]/2)}e.popModelMatrix()}}const g=function(e){this.name=e||"unknown";this._log=new c("cgl_geometry");this.faceVertCount=3;this.glPrimitive=null;this._attributes={};this._vertices=[];this.verticesIndices=[];this.isGeometry=true;this.morphTargets=[];Object.defineProperty(this,"vertices",{get(){return this._vertices},set(e){this.setVertices(e)}});Object.defineProperty(this,"texCoords",{get(){const e=this.getAttribute("texCoords");if(!e)return[];return e.data},set(e){this.setAttribute("texCoords",e,2)}});Object.defineProperty(this,"vertexNormals",{get(){const e=this.getAttribute("vertexNormals");if(!e)return[];return e.data},set(e){this.setAttribute("vertexNormals",e,3)}});Object.defineProperty(this,"tangents",{get(){const e=this.getAttribute("tangents");if(!e)return[];return e.data},set(e){this.setAttribute("tangents",e,3)}});Object.defineProperty(this,"biTangents",{get(){const e=this.getAttribute("biTangents");if(!e)return[];return e.data},set(e){this.setAttribute("biTangents",e,3)}});Object.defineProperty(this,"vertexColors",{get(){const e=this.getAttribute("vertexColors");if(!e)return[];return e.data},set(e){this.setAttribute("vertexColors",e,4)}})};g.prototype.clear=function(){this._vertices=new Float32Array([]);this.verticesIndices=[];this.texCoords=new Float32Array([]);this.vertexNormals=new Float32Array([]);this.tangents=[];this.biTangents=[];this._attributes={}};g.prototype.getAttributes=function(){return this._attributes};g.prototype.getAttribute=function(e){for(const t in this._attributes){if(this._attributes[t].name==e)return this._attributes[t]}return null};g.prototype.setAttribute=function(e,t,n){let r="";if(!n||n>4){console.log("itemsize wrong?",n,e);this._log.stack("itemsize");n=3}if(n==1)r="float";else if(n==2)r="vec2";else if(n==3)r="vec3";else if(n==4)r="vec4";const i={name:e,data:t,itemSize:n,type:r};this._attributes[e]=i};g.prototype.copyAttribute=function(e,t){const n=this.getAttribute(e);t.setAttribute(e,new Float32Array(n.data),n.itemSize)};g.prototype.setVertices=function(e){if(e instanceof Float32Array)this._vertices=e;else this._vertices=new Float32Array(e)};g.prototype.setTexCoords=function(e){if(e instanceof Float32Array)this.texCoords=e;else this.texCoords=new Float32Array(e)};g.prototype.calcNormals=function(e){const t={smooth:e};this.calculateNormals(t)};g.prototype.flipNormals=function(t,n,r){let i=vec3.create();if(t==undefined)t=1;if(n==undefined)n=1;if(r==undefined)r=1;for(let e=0;e<this.vertexNormals.length;e+=3){vec3.set(i,this.vertexNormals[e+0],this.vertexNormals[e+1],this.vertexNormals[e+2]);i[0]*=-t;i[1]*=-n;i[2]*=-r;vec3.normalize(i,i);this.vertexNormals[e+0]=i[0];this.vertexNormals[e+1]=i[1];this.vertexNormals[e+2]=i[2]}};g.prototype.getNumTriangles=function(){if(this.verticesIndices&&this.verticesIndices.length)return this.verticesIndices.length/3;return this.vertices.length/3};g.prototype.flipVertDir=function(){const t=[];t.length=this.verticesIndices.length;for(let e=0;e<this.verticesIndices.length;e+=3){t[e]=this.verticesIndices[e+2];t[e+1]=this.verticesIndices[e+1];t[e+2]=this.verticesIndices[e]}this.verticesIndices=t};g.prototype.setPointVertices=function(t){if(t.length%3!==0){this._log.error("SetPointVertices: Array must be multiple of three.");return}if(!(t instanceof Float32Array))this.vertices=new Float32Array(t);else this.vertices=t;if(!(this.texCoords instanceof Float32Array))this.texCoords=new Float32Array(t.length/3*2);this.verticesIndices.length=t.length/3;for(let e=0;e<t.length/3;e++){this.verticesIndices[e]=e;this.texCoords[e*2]=0;this.texCoords[e*2+1]=0}};g.prototype.merge=function(t){if(!t)return;if(this.isIndexed()!=t.isIndexed()){if(this.isIndexed()){this.unIndex(false,true)}if(t.isIndexed()){const e=t.copy();e.unIndex(false,true);t=e}}const n=this.verticesIndices.length;const r=this._vertices.length/3;this.verticesIndices.length+=t.verticesIndices.length;for(let e=0;e<t.verticesIndices.length;e++)this.verticesIndices[n+e]=t.verticesIndices[e]+r;this.vertices=i.float32Concat(this._vertices,t.vertices);this.texCoords=i.float32Concat(this.texCoords,t.texCoords);this.vertexNormals=i.float32Concat(this.vertexNormals,t.vertexNormals);this.tangents=i.float32Concat(this.tangents,t.tangents);this.biTangents=i.float32Concat(this.biTangents,t.biTangents)};g.prototype.copy=function(){const t=new g(this.name+" copy");t.faceVertCount=this.faceVertCount;t.glPrimitive=this.glPrimitive;t.setVertices(this._vertices.slice(0));if(this.verticesIndices){t.verticesIndices.length=this.verticesIndices.length;for(let e=0;e<this.verticesIndices.length;e++)t.verticesIndices[e]=this.verticesIndices[e]}for(let e in this._attributes)this.copyAttribute(e,t);t.morphTargets.length=this.morphTargets.length;for(let e=0;e<this.morphTargets.length;e++)t.morphTargets[e]=this.morphTargets[e];return t};g.prototype.calculateNormals=function(t){t=t||{};if(t.smooth===false)this.unIndex();const n=vec3.create();const r=vec3.create();const i=vec3.create();function a(e){vec3.subtract(n,e[0],e[1]);vec3.subtract(r,e[0],e[2]);vec3.cross(i,n,r);vec3.normalize(i,i);if(t&&t.forceZUp){if(i[2]<0){i[0]*=-1;i[1]*=-1;i[2]*=-1}}return i}this.getVertexVec=function(e){const t=[0,0,0];t[0]=this.vertices[e*3+0];t[1]=this.vertices[e*3+1];t[2]=this.vertices[e*3+2];return t};if(!(this.vertexNormals instanceof Float32Array)||this.vertexNormals.length!=this.vertices.length)this.vertexNormals=new Float32Array(this.vertices.length);for(let e=0;e<this.vertices.length;e++){this.vertexNormals[e]=0}if(!this.isIndexed()){const s=[];for(let e=0;e<this.vertices.length;e+=9){const o=[[this.vertices[e+0],this.vertices[e+1],this.vertices[e+2]],[this.vertices[e+3],this.vertices[e+4],this.vertices[e+5]],[this.vertices[e+6],this.vertices[e+7],this.vertices[e+8]]];const l=a(o);s.push(l[0],l[1],l[2],l[0],l[1],l[2],l[0],l[1],l[2])}this.vertexNormals=s}else{const u=[];u.length=Math.floor(this.verticesIndices.length/3);for(let e=0;e<this.verticesIndices.length;e+=3){const o=[this.getVertexVec(this.verticesIndices[e+0]),this.getVertexVec(this.verticesIndices[e+1]),this.getVertexVec(this.verticesIndices[e+2])];u[e/3]=a(o);this.vertexNormals[this.verticesIndices[e+0]*3+0]+=u[e/3][0];this.vertexNormals[this.verticesIndices[e+0]*3+1]+=u[e/3][1];this.vertexNormals[this.verticesIndices[e+0]*3+2]+=u[e/3][2];this.vertexNormals[this.verticesIndices[e+1]*3+0]+=u[e/3][0];this.vertexNormals[this.verticesIndices[e+1]*3+1]+=u[e/3][1];this.vertexNormals[this.verticesIndices[e+1]*3+2]+=u[e/3][2];this.vertexNormals[this.verticesIndices[e+2]*3+0]+=u[e/3][0];this.vertexNormals[this.verticesIndices[e+2]*3+1]+=u[e/3][1];this.vertexNormals[this.verticesIndices[e+2]*3+2]+=u[e/3][2]}for(let t=0;t<this.verticesIndices.length;t+=3){for(let e=0;e<3;e++){const c=[this.vertexNormals[this.verticesIndices[t+e]*3+0],this.vertexNormals[this.verticesIndices[t+e]*3+1],this.vertexNormals[this.verticesIndices[t+e]*3+2]];vec3.normalize(c,c);this.vertexNormals[this.verticesIndices[t+e]*3+0]=c[0];this.vertexNormals[this.verticesIndices[t+e]*3+1]=c[1];this.vertexNormals[this.verticesIndices[t+e]*3+2]=c[2]}}}};g.prototype.calcTangentsBitangents=function(){if(!this.vertices.length){return}if(!this.vertexNormals.length){return}if(!this.texCoords.length){const x=this.vertices.length/3*2;this.texCoords=new Float32Array(x);for(let e=0;e<x;e+=1)this.texCoords[e]=0}if(!this.verticesIndices||!this.verticesIndices.length){return}if(this.verticesIndices.length%3!==0){this._log.error("Vertex indices mismatch!");return}const t=this.verticesIndices.length/3;const n=this.vertices.length/3;this.tangents=new Float32Array(this.vertexNormals.length);this.biTangents=new Float32Array(this.vertexNormals.length);const r=[];r.length=n*2;const i=vec3.create();const a=vec3.create();const s=vec3.create();const o=vec2.create();const l=vec2.create();const u=vec2.create();const c=vec3.create();const p=vec3.create();for(let e=0;e<t;e+=1){const S=this.verticesIndices[e*3];const O=this.verticesIndices[e*3+1];const _=this.verticesIndices[e*3+2];vec3.set(i,this.vertices[S*3],this.vertices[S*3+1],this.vertices[S*3+2]);vec3.set(a,this.vertices[O*3],this.vertices[O*3+1],this.vertices[O*3+2]);vec3.set(s,this.vertices[_*3],this.vertices[_*3+1],this.vertices[_*3+2]);vec2.set(o,this.texCoords[S*2],this.texCoords[S*2+1]);vec2.set(l,this.texCoords[O*2],this.texCoords[O*2+1]);vec2.set(u,this.texCoords[_*2],this.texCoords[_*2+1]);const A=a[0]-i[0];const C=s[0]-i[0];const T=a[1]-i[1];const I=s[1]-i[1];const E=a[2]-i[2];const L=s[2]-i[2];const N=l[0]-o[0];const U=u[0]-o[0];const R=l[1]-o[1];const P=u[1]-o[1];const M=1/(N*P-U*R);vec3.set(c,(P*A-R*C)*M,(P*T-R*I)*M,(P*E-R*L)*M);vec3.set(p,(N*C-U*A)*M,(N*I-U*T)*M,(N*L-U*E)*M);r[S]=c;r[O]=c;r[_]=c;r[S+n]=p;r[O+n]=p;r[_+n]=p}const h=vec3.create();const f=vec3.create();const d=vec3.create();const g=vec3.create();const m=vec3.create();const v=vec3.create();const b=vec3.create();const y=vec3.create();for(let e=0;e<n;e+=1){if(!r[e])continue;vec3.set(h,this.vertexNormals[e*3],this.vertexNormals[e*3+1],this.vertexNormals[e*3+2]);vec3.set(f,r[e][0],r[e][1],r[e][2]);const k=vec3.dot(h,f);vec3.scale(m,h,k);vec3.subtract(v,f,m);vec3.normalize(y,v);vec3.cross(b,h,f);const w=1;vec3.scale(d,y,1/w);vec3.cross(g,h,d);this.tangents[e*3+0]=d[0];this.tangents[e*3+1]=d[1];this.tangents[e*3+2]=d[2];this.biTangents[e*3+0]=g[0];this.biTangents[e*3+1]=g[1];this.biTangents[e*3+2]=g[2]}};g.prototype.isIndexed=function(){if(this._vertices.length==0)return true;return this.verticesIndices.length!=0};g.prototype.unIndex=function(e,t){const n=[];const r=[];let i=0;for(let e in this._attributes){const a=this._attributes[e];let n=[];for(let t=0;t<this.verticesIndices.length;t+=3){for(let e=0;e<3;e++){if(a.itemSize==3)n.push(a.data[this.verticesIndices[t+e]*3+0],a.data[this.verticesIndices[t+e]*3+1],a.data[this.verticesIndices[t+e]*3+2]);else if(a.itemSize==4)n.push(a.data[this.verticesIndices[t+e]*4+0],a.data[this.verticesIndices[t+e]*4+1],a.data[this.verticesIndices[t+e]*4+2],a.data[this.verticesIndices[t+e]*4+3]);else if(a.itemSize==2)n.push(a.data[this.verticesIndices[t+e]*2+0],a.data[this.verticesIndices[t+e]*2+1]);else if(a.itemSize==1)n.push(a.data[this.verticesIndices[t+e]]);else console.log("unknown attr",a)}}this.setAttribute(a.name,n,a.itemSize)}for(let e=0;e<this.verticesIndices.length;e+=3){n.push(this.vertices[this.verticesIndices[e+0]*3+0],this.vertices[this.verticesIndices[e+0]*3+1],this.vertices[this.verticesIndices[e+0]*3+2]);r.push(i);i++;n.push(this.vertices[this.verticesIndices[e+1]*3+0],this.vertices[this.verticesIndices[e+1]*3+1],this.vertices[this.verticesIndices[e+1]*3+2]);r.push(i);i++;n.push(this.vertices[this.verticesIndices[e+2]*3+0],this.vertices[this.verticesIndices[e+2]*3+1],this.vertices[this.verticesIndices[e+2]*3+2]);r.push(i);i++}this.vertices=n;this.verticesIndices=[];if(e)this.verticesIndices=r;if(!t)this.calculateNormals()};g.prototype.calcBarycentric=function(){let t=[];t.length=this.vertices.length;for(let e=0;e<this.vertices.length;e++)t[e]=0;let n=0;for(let e=0;e<this.vertices.length;e+=3){t[e+n]=1;n++;if(n==3)n=0}this.setAttribute("attrBarycentric",t,3)};g.prototype.getBounds=function(){return new d(this)};g.prototype.center=function(e,t,n){if(e===undefined){e=true;t=true;n=true}let r=0;const i=this.getBounds();const a=[i.minX+(i.maxX-i.minX)/2,i.minY+(i.maxY-i.minY)/2,i.minZ+(i.maxZ-i.minZ)/2];for(r=0;r<this.vertices.length;r+=3){if(this.vertices[r+0]==this.vertices[r+0]){if(e)this.vertices[r+0]-=a[0];if(t)this.vertices[r+1]-=a[1];if(n)this.vertices[r+2]-=a[2]}}return a};g.prototype.mapTexCoords2d=function(){const t=this.getBounds();const n=this.vertices.length/3;this.texCoords=new Float32Array(n*2);for(let e=0;e<n;e++){const r=this.vertices[e*3+0];const i=this.vertices[e*3+1];this.texCoords[e*2+0]=r/(t.maxX-t.minX)+.5;this.texCoords[e*2+1]=1-i/(t.maxY-t.minY)+.5}};g.prototype.getInfoOneLine=function(){let e="";if(this.faceVertCount==3&&this.verticesIndices)e+=this.verticesIndices.length/3;else e+=0;e+=" tris ";if(this.vertices)e+=this.vertices.length/3;else e+=0;e+=" verts";return e};g.prototype.getInfo=function(){const e={};if(this.faceVertCount==3&&this.verticesIndices)e.numFaces=this.verticesIndices.length/3;else e.numFaces=0;if(this.verticesIndices&&this.verticesIndices.length)e.indices=this.verticesIndices.length;if(this.vertices)e.numVerts=this.vertices.length/3;else e.numVerts=0;if(this.vertexNormals)e.numNormals=this.vertexNormals.length/3;else e.numNormals=0;if(this.texCoords)e.numTexCoords=this.texCoords.length/2;else e.numTexCoords=0;if(this.tangents)e.numTangents=this.tangents.length/3;else e.numTangents=0;if(this.biTangents)e.numBiTangents=this.biTangents.length/3;else e.numBiTangents=0;if(this.biTangents)e.numBiTangents=this.biTangents.length/3;else e.numBiTangents=0;if(this.vertexColors)e.numVertexColors=this.vertexColors.length/4;else e.numVertexColors=0;if(this.getAttributes())e.numAttribs=Object.keys(this.getAttributes()).length;else e.numAttribs=0;e.isIndexed=this.isIndexed();return e};g.buildFromFaces=function(t,e,n){const r=[];const i=[];for(let e=0;e<t.length;e+=3){const s=t[e+0];const o=t[e+1];const l=t[e+2];const u=[-1,-1,-1];if(n)for(let e=0;e<r.length;e+=3){if(r[e+0]==s[0]&&r[e+1]==s[1]&&r[e+2]==s[2])u[0]=e/3;if(r[e+0]==o[0]&&r[e+1]==o[1]&&r[e+2]==o[2])u[1]=e/3;if(r[e+0]==l[0]&&r[e+1]==l[1]&&r[e+2]==l[2])u[2]=e/3}if(u[0]==-1){r.push(s[0],s[1],s[2]);u[0]=(r.length-1)/3}if(u[1]==-1){r.push(o[0],o[1],o[2]);u[1]=(r.length-1)/3}if(u[2]==-1){r.push(l[0],l[1],l[2]);u[2]=(r.length-1)/3}i.push(parseInt(u[0],10));i.push(parseInt(u[1],10));i.push(parseInt(u[2],10))}const a=new g(e);a.name=e;a.vertices=r;a.verticesIndices=i;return a};g.json2geom=function(t){const n=new g("jsonMeshGeom");n.verticesIndices=[];n.vertices=t.vertices||[];n.vertexNormals=t.normals||[];n.vertexColors=t.colors||[];n.tangents=t.tangents||[];n.biTangents=t.bitangents||[];if(t.texturecoords)n.setTexCoords(t.texturecoords[0]);if(t.vertices_b64)n.vertices=new Float32Array(f(t.vertices_b64));if(t.normals_b64)n.vertexNormals=new Float32Array(f(t.normals_b64));if(t.tangents_b64)n.tangents=new Float32Array(f(t.tangents_b64));if(t.bitangents_b64)n.biTangents=new Float32Array(f(t.bitangents_b64));if(t.texturecoords_b64)n.setTexCoords(new Float32Array(f(t.texturecoords_b64[0])));if(t.faces_b64){n.verticesIndices=new Uint32Array(f(t.faces_b64))}else{n.verticesIndices.length=t.faces.length*3;for(let e=0;e<t.faces.length;e++){n.verticesIndices[e*3]=t.faces[e][0];n.verticesIndices[e*3+1]=t.faces[e][1];n.verticesIndices[e*3+2]=t.faces[e][2]}}return n};const m=function(){this._log=new c("eventtarget");this._eventCallbacks={};this._logName="";this._logEvents=false;this._listeners={};this.addEventListener=this.on=function(e,t,n){const r={id:(n||"")+CABLES.simpleId(),name:e,cb:t};if(!this._eventCallbacks[e])this._eventCallbacks[e]=[r];else this._eventCallbacks[e].push(r);this._listeners[r.id]=r;return r.id};this.hasEventListener=function(e,t){if(e&&!t){if(this._listeners[e])return true;else return false}else{this._log.warn("old eventtarget function haseventlistener!");if(e&&t){if(this._eventCallbacks[e]){const n=this._eventCallbacks[e].indexOf(t);if(n==-1)return false;return true}}}};this.hasListenerForEventName=function(e){return this._eventCallbacks[e]&&this._eventCallbacks[e].length>0};this.removeEventListener=this.off=function(r,t){if(r===null||r===undefined)return;if(!t){const i=this._listeners[r];if(!i){this._log.log("could not find event...");return}let n=true;while(n){n=false;let t=-1;for(let e=0;e<this._eventCallbacks[i.name].length;e++){if(this._eventCallbacks[i.name][e].id.startsWith(r)){n=true;t=e}}if(t!==-1){this._eventCallbacks[i.name].splice(t,1);delete this._listeners[r]}}return}this._log.info("[eventtaget] ","old function signature: removeEventListener! use listener id");this._log.log((new Error).stack);let n=null;for(let e=0;e<this._eventCallbacks[r].length;e++)if(this._eventCallbacks[r][e].cb==t)n=e;if(n!==null){delete this._eventCallbacks[n]}else this._log.warn("removeEventListener not found "+r)};this.logEvents=function(e,t){this._logEvents=e;this._logName=t};this.emitEvent=function(t,n,r,i,a,s,o){if(this._logEvents)this._log.log("[event] ",this._logName,t,this._eventCallbacks);if(this._eventCallbacks[t]){for(let e=0;e<this._eventCallbacks[t].length;e++){if(this._eventCallbacks[t][e]){this._eventCallbacks[t][e].cb(n,r,i,a,s,o)}}}else{if(this._logEvents)this._log.log("[event] has no event callback",t,this._eventCallbacks)}}};const v={ANIM:{EASINGS:["linear","absolute","smoothstep","smootherstep","Cubic In","Cubic Out","Cubic In Out","Expo In","Expo Out","Expo In Out","Sin In","Sin Out","Sin In Out","Quart In","Quart Out","Quart In Out","Quint In","Quint Out","Quint In Out","Back In","Back Out","Back In Out","Elastic In","Elastic Out","Bounce In","Bounce Out"],EASING_LINEAR:0,EASING_ABSOLUTE:1,EASING_SMOOTHSTEP:2,EASING_SMOOTHERSTEP:3,EASING_CUBICSPLINE:4,EASING_CUBIC_IN:5,EASING_CUBIC_OUT:6,EASING_CUBIC_INOUT:7,EASING_EXPO_IN:8,EASING_EXPO_OUT:9,EASING_EXPO_INOUT:10,EASING_SIN_IN:11,EASING_SIN_OUT:12,EASING_SIN_INOUT:13,EASING_BACK_IN:14,EASING_BACK_OUT:15,EASING_BACK_INOUT:16,EASING_ELASTIC_IN:17,EASING_ELASTIC_OUT:18,EASING_BOUNCE_IN:19,EASING_BOUNCE_OUT:21,EASING_QUART_IN:22,EASING_QUART_OUT:23,EASING_QUART_INOUT:24,EASING_QUINT_IN:25,EASING_QUINT_OUT:26,EASING_QUINT_INOUT:27},OP:{OP_PORT_TYPE_VALUE:0,OP_PORT_TYPE_NUMBER:0,OP_PORT_TYPE_FUNCTION:1,OP_PORT_TYPE_TRIGGER:1,OP_PORT_TYPE_OBJECT:2,OP_PORT_TYPE_TEXTURE:2,OP_PORT_TYPE_ARRAY:3,OP_PORT_TYPE_DYNAMIC:4,OP_PORT_TYPE_STRING:5,OP_VERSION_PREFIX:"_v"},PORT:{PORT_DIR_IN:0,PORT_DIR_OUT:1},PACO:{PACO_CLEAR:0,PACO_VALUECHANGE:1,PACO_OP_DELETE:2,PACO_UNLINK:3,PACO_LINK:4,PACO_LOAD:5,PACO_OP_CREATE:6,PACO_OP_ENABLE:7,PACO_OP_DISABLE:8,PACO_UIATTRIBS:9,PACO_VARIABLES:10,PACO_TRIGGERS:11,PACO_PORT_SETVARIABLE:12,PACO_PORT_SETANIMATED:13,PACO_PORT_ANIM_UPDATED:14,PACO_DESERIALIZE:15}};const b=function(e){this.time=0;this.value=0;this.onChange=null;this._easing=0;this.cb=null;this.cbTriggered=false;this.setEasing(v.ANIM.EASING_LINEAR);this.set(e)};b.cubicSpline=function(e,t,n){let r=t.value,i=t.bezTangOut,a=n.value,s=n.bezTangIn;let o=e;let l=o*o;let u=l*o;return(2*u-3*l+1)*r+(u-2*l+o)*i+(-2*u+3*l)*a+(u-l)*s};b.easeCubicSpline=function(e,t){return b.cubicSpline(e,this,t)};b.linear=function(e,t,n){return parseFloat(t.value)+parseFloat(n.value-t.value)*e};b.easeLinear=function(e,t){return b.linear(e,this,t)};b.easeAbsolute=function(e,t){return this.value};const y=function(e){return e=2**(10*(e-1))};b.easeExpoIn=function(e,t){e=y(e);return b.linear(e,this,t)};const x=function(e){e=-(2**(-10*e))+1;return e};b.easeExpoOut=function(e,t){e=x(e);return b.linear(e,this,t)};const S=function(e){e*=2;if(e<1){e=.5*2**(10*(e-1))}else{e--;e=.5*(-(2**(-10*e))+2)}return e};b.easeExpoInOut=function(e,t){e=S(e);return b.linear(e,this,t)};b.easeSinIn=function(e,t){e=-1*Math.cos(e*Math.PI/2)+1;return b.linear(e,this,t)};b.easeSinOut=function(e,t){e=Math.sin(e*Math.PI/2);return b.linear(e,this,t)};b.easeSinInOut=function(e,t){e=-.5*(Math.cos(Math.PI*e)-1);return b.linear(e,this,t)};const O=function(e){e=e*e*e;return e};b.easeCubicIn=function(e,t){e=O(e);return b.linear(e,this,t)};b.easeInQuint=function(e,t){e=e*e*e*e*e;return b.linear(e,this,t)};b.easeOutQuint=function(e,t){e=(e-=1)*e*e*e*e+1;return b.linear(e,this,t)};b.easeInOutQuint=function(e,t){if((e/=.5)<1)e=.5*e*e*e*e*e;else e=.5*((e-=2)*e*e*e*e+2);return b.linear(e,this,t)};b.easeInQuart=function(e,t){e=e*e*e*e;return b.linear(e,this,t)};b.easeOutQuart=function(e,t){e=-1*((e-=1)*e*e*e-1);return b.linear(e,this,t)};b.easeInOutQuart=function(e,t){if((e/=.5)<1)e=.5*e*e*e*e;else e=-.5*((e-=2)*e*e*e-2);return b.linear(e,this,t)};b.bounce=function(e){if((e/=1)<1/2.75)e=7.5625*e*e;else if(e<2/2.75)e=7.5625*(e-=1.5/2.75)*e+.75;else if(e<2.5/2.75)e=7.5625*(e-=2.25/2.75)*e+.9375;else e=7.5625*(e-=2.625/2.75)*e+.984375;return e};b.easeInBounce=function(e,t){return b.linear(b.bounce(e),this,t)};b.easeOutBounce=function(e,t){return b.linear(b.bounce(e),this,t)};b.easeInElastic=function(e,t){let n=1.70158;let r=0;let i=1;const a=0;const s=1;const o=1;if(e===0)e=a;else if((e/=s)==1)e=a+o;else{if(!r)r=s*.3;if(i<Math.abs(o)){i=o;n=r/4}else n=r/(2*Math.PI)*Math.asin(o/i);e=-(i*2**(10*(e-=1))*Math.sin((e*s-n)*(2*Math.PI)/r))+a}return b.linear(e,this,t)};b.easeOutElastic=function(e,t){let n=1.70158;let r=0;let i=1;const a=0;const s=1;const o=1;if(e===0)e=a;else if((e/=s)==1)e=a+o;else{if(!r)r=s*.3;if(i<Math.abs(o)){i=o;n=r/4}else n=r/(2*Math.PI)*Math.asin(o/i);e=i*2**(-10*e)*Math.sin((e*s-n)*(2*Math.PI)/r)+o+a}return b.linear(e,this,t)};b.easeInBack=function(e,t){const n=1.70158;e=e*e*((n+1)*e-n);return b.linear(e,this,t)};b.easeOutBack=function(e,t){const n=1.70158;e=(e=e/1-1)*e*((n+1)*e+n)+1;return b.linear(e,this,t)};b.easeInOutBack=function(e,t){let n=1.70158;const r=1/2;if((e/=1/2)<1)e=r*(e*e*(((n*=1.525)+1)*e-n));else e=r*((e-=2)*e*(((n*=1.525)+1)*e+n)+2);return b.linear(e,this,t)};const _=function(e){e--;e=e*e*e+1;return e};b.easeCubicOut=function(e,t){e=_(e);return b.linear(e,this,t)};const A=function(e){e*=2;if(e<1)e=.5*e*e*e;else{e-=2;e=.5*(e*e*e+2)}return e};b.easeCubicInOut=function(e,t){e=A(e);return b.linear(e,this,t)};b.easeSmoothStep=function(e,t){const n=Math.max(0,Math.min(1,e));e=n*n*(3-2*n);return b.linear(e,this,t)};b.easeSmootherStep=function(e,t){const n=Math.max(0,Math.min(1,(e-0)/(1-0)));e=n*n*n*(n*(n*6-15)+10);return b.linear(e,this,t)};b.prototype.setEasing=function(e){this._easing=e;if(this._easing==v.ANIM.EASING_LINEAR)this.ease=b.easeLinear;else if(this._easing==v.ANIM.EASING_ABSOLUTE)this.ease=b.easeAbsolute;else if(this._easing==v.ANIM.EASING_SMOOTHSTEP)this.ease=b.easeSmoothStep;else if(this._easing==v.ANIM.EASING_SMOOTHERSTEP)this.ease=b.easeSmootherStep;else if(this._easing==v.ANIM.EASING_CUBIC_IN)this.ease=b.easeCubicIn;else if(this._easing==v.ANIM.EASING_CUBIC_OUT)this.ease=b.easeCubicOut;else if(this._easing==v.ANIM.EASING_CUBIC_INOUT)this.ease=b.easeCubicInOut;else if(this._easing==v.ANIM.EASING_EXPO_IN)this.ease=b.easeExpoIn;else if(this._easing==v.ANIM.EASING_EXPO_OUT)this.ease=b.easeExpoOut;else if(this._easing==v.ANIM.EASING_EXPO_INOUT)this.ease=b.easeExpoInOut;else if(this._easing==v.ANIM.EASING_SIN_IN)this.ease=b.easeSinIn;else if(this._easing==v.ANIM.EASING_SIN_OUT)this.ease=b.easeSinOut;else if(this._easing==v.ANIM.EASING_SIN_INOUT)this.ease=b.easeSinInOut;else if(this._easing==v.ANIM.EASING_BACK_OUT)this.ease=b.easeOutBack;else if(this._easing==v.ANIM.EASING_BACK_IN)this.ease=b.easeInBack;else if(this._easing==v.ANIM.EASING_BACK_INOUT)this.ease=b.easeInOutBack;else if(this._easing==v.ANIM.EASING_ELASTIC_IN)this.ease=b.easeInElastic;else if(this._easing==v.ANIM.EASING_ELASTIC_OUT)this.ease=b.easeOutElastic;else if(this._easing==v.ANIM.EASING_ELASTIC_INOUT)this.ease=b.easeElasticInOut;else if(this._easing==v.ANIM.EASING_BOUNCE_IN)this.ease=b.easeInBounce;else if(this._easing==v.ANIM.EASING_BOUNCE_OUT)this.ease=b.easeOutBounce;else if(this._easing==v.ANIM.EASING_QUART_OUT)this.ease=b.easeOutQuart;else if(this._easing==v.ANIM.EASING_QUART_IN)this.ease=b.easeInQuart;else if(this._easing==v.ANIM.EASING_QUART_INOUT)this.ease=b.easeInOutQuart;else if(this._easing==v.ANIM.EASING_QUINT_OUT)this.ease=b.easeOutQuint;else if(this._easing==v.ANIM.EASING_QUINT_IN)this.ease=b.easeInQuint;else if(this._easing==v.ANIM.EASING_QUINT_INOUT)this.ease=b.easeInOutQuint;else if(this._easing==v.ANIM.EASING_CUBICSPLINE){this.ease=b.easeCubicSpline}else{this._easing=v.ANIM.EASING_LINEAR;this.ease=b.easeLinear}};b.prototype.trigger=function(){this.cb();this.cbTriggered=true};b.prototype.setValue=function(e){this.value=e;if(this.onChange!==null)this.onChange()};b.prototype.set=function(e){if(e){if(e.e)this.setEasing(e.e);if(e.cb){this.cb=e.cb;this.cbTriggered=false}if(e.b){}if(e.hasOwnProperty("t"))this.time=e.t;if(e.hasOwnProperty("time"))this.time=e.time;if(e.hasOwnProperty("v"))this.value=e.v;else if(e.hasOwnProperty("value"))this.value=e.value}if(this.onChange!==null)this.onChange()};b.prototype.getSerialized=function(){const e={};e.t=this.time;e.v=this.value;e.e=this._easing;return e};b.prototype.getEasing=function(){return this._easing};const C=function(e){m.apply(this);e=e||{};this.keys=[];this.onChange=null;this.stayInTimeline=false;this.loop=false;this._log=new c("Anim");this._lastKeyIndex=0;this._cachedIndex=0;this.name=e.name||null;this.defaultEasing=e.defaultEasing||v.ANIM.EASING_LINEAR;this.onLooped=null;this._timesLooped=0;this._needsSort=false};C.prototype.forceChangeCallback=function(){if(this.onChange!==null)this.onChange();this.emitEvent("onChange",this)};C.prototype.getLoop=function(){return this.loop};C.prototype.setLoop=function(e){this.loop=e;this.emitEvent("onChange",this)};C.prototype.hasEnded=function(e){if(this.keys.length===0)return true;if(this.keys[this._lastKeyIndex].time<=e)return true;return false};C.prototype.isRising=function(e){if(this.hasEnded(e))return false;const t=this.getKeyIndex(e);if(this.keys[t].value<this.keys[t+1].value)return true;return false};C.prototype.clearBefore=function(e){const t=this.getValue(e);const n=this.getKeyIndex(e);this.setValue(e,t);if(n>1)this.keys.splice(0,n);this._updateLastIndex()};C.prototype.clear=function(e){let t=0;if(e)t=this.getValue(e);this.keys.length=0;this._updateLastIndex();if(e)this.setValue(e,t);if(this.onChange!==null)this.onChange();this.emitEvent("onChange",this)};C.prototype.sortKeys=function(){this.keys.sort((e,t)=>{return parseFloat(e.time)-parseFloat(t.time)});this._updateLastIndex();this._needsSort=false;if(this.keys.length%1e3==0)console.log(this.name,this.keys.length)};C.prototype.getLength=function(){if(this.keys.length===0)return 0;return this.keys[this.keys.length-1].time};C.prototype.getKeyIndex=function(t){let n=0;let r=0;if(this._cachedIndex&&this.keys.length>this._cachedIndex&&t>=this.keys[this._cachedIndex].time)r=this._cachedIndex;for(let e=r;e<this.keys.length;e++){if(t>=this.keys[e].time)n=e;if(this.keys[e].time>t){if(t!=0)this._cachedIndex=n;return n}}return n};C.prototype.setValue=function(t,n,r){let i=null;if(this.keys.length==0||t<=this.keys[this.keys.length-1].time)for(let e=0;e<this.keys.length;e++)if(this.keys[e].time==t){i=this.keys[e];this.keys[e].setValue(n);this.keys[e].cb=r;break}if(!i){i=new b({time:t,value:n,e:this.defaultEasing,cb:r});this.keys.push(i);this._updateLastIndex()}if(this.onChange)this.onChange();this.emitEvent("onChange",this);this._needsSort=true;return i};C.prototype.setKeyEasing=function(e,t){if(this.keys[e]){this.keys[e].setEasing(t);this.emitEvent("onChange",this)}};C.prototype.getSerialized=function(){const t={};t.keys=[];t.loop=this.loop;for(let e=0;e<this.keys.length;e++)t.keys.push(this.keys[e].getSerialized());return t};C.prototype.getKey=function(e){const t=this.getKeyIndex(e);return this.keys[t]};C.prototype.getNextKey=function(e){let t=this.getKeyIndex(e)+1;if(t>=this.keys.length)t=this.keys.length-1;return this.keys[t]};C.prototype.isFinished=function(e){if(this.keys.length<=0)return true;return e>this.keys[this.keys.length-1].time};C.prototype.isStarted=function(e){if(this.keys.length<=0)return false;return e>=this.keys[0].time};C.prototype.getValue=function(e){if(this.keys.length===0){return 0}if(this._needsSort)this.sortKeys();if(!this.loop&&e>this.keys[this._lastKeyIndex].time){if(this.keys[this._lastKeyIndex].cb&&!this.keys[this._lastKeyIndex].cbTriggered)this.keys[this._lastKeyIndex].trigger();return this.keys[this._lastKeyIndex].value}if(e<this.keys[0].time){return this.keys[0].value}if(this.loop&&e>this.keys[this._lastKeyIndex].time){const s=e/this.keys[this._lastKeyIndex].time;if(s>this._timesLooped){this._timesLooped++;if(this.onLooped)this.onLooped()}e=(e-this.keys[0].time)%(this.keys[this._lastKeyIndex].time-this.keys[0].time);e+=this.keys[0].time}const t=this.getKeyIndex(e);if(t>=this._lastKeyIndex){if(this.keys[this._lastKeyIndex].cb&&!this.keys[this._lastKeyIndex].cbTriggered)this.keys[this._lastKeyIndex].trigger();return this.keys[this._lastKeyIndex].value}const n=t+1;const r=this.keys[t];const i=this.keys[n];if(r.cb&&!r.cbTriggered)r.trigger();if(!i)return-1;const a=(e-r.time)/(i.time-r.time);if(!r.ease)this.log._warn("has no ease",r,i);return r.ease(a,i)};C.prototype._updateLastIndex=function(){this._lastKeyIndex=this.keys.length-1};C.prototype.addKey=function(e){if(e.time===undefined){this.log.warn("key time undefined, ignoring!")}else{this.keys.push(e);if(this.onChange!==null)this.onChange();this.emitEvent("onChange",this)}this._updateLastIndex()};C.prototype.easingFromString=function(e){if(e=="linear")return v.ANIM.EASING_LINEAR;if(e=="absolute")return v.ANIM.EASING_ABSOLUTE;if(e=="smoothstep")return v.ANIM.EASING_SMOOTHSTEP;if(e=="smootherstep")return v.ANIM.EASING_SMOOTHERSTEP;if(e=="Cubic In")return v.ANIM.EASING_CUBIC_IN;if(e=="Cubic Out")return v.ANIM.EASING_CUBIC_OUT;if(e=="Cubic In Out")return v.ANIM.EASING_CUBIC_INOUT;if(e=="Expo In")return v.ANIM.EASING_EXPO_IN;if(e=="Expo Out")return v.ANIM.EASING_EXPO_OUT;if(e=="Expo In Out")return v.ANIM.EASING_EXPO_INOUT;if(e=="Sin In")return v.ANIM.EASING_SIN_IN;if(e=="Sin Out")return v.ANIM.EASING_SIN_OUT;if(e=="Sin In Out")return v.ANIM.EASING_SIN_INOUT;if(e=="Back In")return v.ANIM.EASING_BACK_IN;if(e=="Back Out")return v.ANIM.EASING_BACK_OUT;if(e=="Back In Out")return v.ANIM.EASING_BACK_INOUT;if(e=="Elastic In")return v.ANIM.EASING_ELASTIC_IN;if(e=="Elastic Out")return v.ANIM.EASING_ELASTIC_OUT;if(e=="Bounce In")return v.ANIM.EASING_BOUNCE_IN;if(e=="Bounce Out")return v.ANIM.EASING_BOUNCE_OUT;if(e=="Quart Out")return v.ANIM.EASING_QUART_OUT;if(e=="Quart In")return v.ANIM.EASING_QUART_IN;if(e=="Quart In Out")return v.ANIM.EASING_QUART_INOUT;if(e=="Quint Out")return v.ANIM.EASING_QUINT_OUT;if(e=="Quint In")return v.ANIM.EASING_QUINT_IN;if(e=="Quint In Out")return v.ANIM.EASING_QUINT_INOUT};C.prototype.createPort=function(e,t,n){const r=e.inDropDown(t,v.ANIM.EASINGS);r.set("linear");r.defaultValue="linear";r.onChange=function(){this.defaultEasing=this.easingFromString(r.get());this.emitEvent("onChangeDefaultEasing",this);if(n)n()}.bind(this);return r};C.slerpQuaternion=function(e,t,n,r,i,a){if(!C.slerpQuaternion.q1){C.slerpQuaternion.q1=quat.create();C.slerpQuaternion.q2=quat.create()}const s=n.getKeyIndex(e);let o=s+1;if(o>=n.keys.length)o=n.keys.length-1;if(s==o){quat.set(t,n.keys[s].value,r.keys[s].value,i.keys[s].value,a.keys[s].value)}else{const l=n.keys[s].time;const u=n.keys[o].time;const c=(e-l)/(u-l);quat.set(C.slerpQuaternion.q1,n.keys[s].value,r.keys[s].value,i.keys[s].value,a.keys[s].value);quat.set(C.slerpQuaternion.q2,n.keys[o].value,r.keys[o].value,i.keys[o].value,a.keys[o].value);quat.slerp(t,C.slerpQuaternion.q1,C.slerpQuaternion.q2,c)}return t};const T={Key:b};const I=function(e,t,n,r){m.apply(this);this.data={};this._log=new c("core_port");this.direction=v.PORT.PORT_DIR_IN;this.id=String(CABLES.simpleId());this._op=e;this.links=[];this.value=0;this.name=t;this.type=n||v.OP.OP_PORT_TYPE_VALUE;this.uiAttribs=r||{};this.anim=null;this._oldAnimVal=-5711;this.defaultValue=null;this._uiActiveState=true;this.ignoreValueSerialize=false;this.onLinkChanged=null;this.crashed=false;this._valueBeforeLink=null;this._lastAnimFrame=-1;this._animated=false;this.onValueChanged=null;this.onTriggered=null;this.onUiActiveStateChange=null;this.changeAlways=false;this.forceRefChange=false;this._useVariableName=null;this.activityCounter=0;this.apf=0;this.activityCounterStartFrame=0;this._tempLastUiValue=null;Object.defineProperty(this,"title",{get(){return this.uiAttribs.title||this.name}});Object.defineProperty(this,"parent",{get(){this._log.stack("use port.op, not .parent");return this._op}});Object.defineProperty(this,"op",{get(){return this._op}});Object.defineProperty(this,"val",{get(){this._log.warn("val getter deprecated!",this);this._log.stack("val getter deprecated");return this.get()},set(e){this._log.warn("val setter deprecated!",this);this._log.stack("val setter deprecated");this.setValue(e)}})};I.prototype.copyLinkedUiAttrib=function(e,t){if(!CABLES.UI)return;if(!this.isLinked())return;const n={};n[e]=this.links[0].getOtherPort(this).getUiAttrib(e);t.setUiAttribs(n)};I.prototype.getValueForDisplay=function(){let e=this.value;if(typeof this.value==="string"||this.value instanceof String){if(e.length>1e3){e=e.substring(0,999);e+="..."}if(this.uiAttribs&&this.uiAttribs.display=="boolnum"){e+=" - ";if(!this.value)e+="false";else e+="true"}e=e.replace(/[\u00A0-\u9999<>\&]/g,function(e){return"&#"+e.charCodeAt(0)+";"});if(e.length>100)e=e.substring(0,100)}else{e=this.value}return e};I.prototype.onAnimToggle=function(){};I.prototype._onAnimToggle=function(){this.onAnimToggle()};I.prototype.remove=function(){this.removeLinks();this._op.removePort(this)};I.prototype.setUiAttribs=function(e){let t=false;if(!this.uiAttribs)this.uiAttribs={};for(const n in e){if(e[n]===undefined){delete this.uiAttribs[n];continue}if(this.uiAttribs[n]!=e[n])t=true;this.uiAttribs[n]=e[n];if(n=="group"&&this.indexPort)this.indexPort.setUiAttribs({group:e[n]})}if(e.hasOwnProperty("expose"))this._op.patch.emitEvent("subpatchExpose",this._op.uiAttribs.subPatch);if(t)this.emitEvent("onUiAttrChange",e,this)};I.prototype.getUiAttribs=function(){return this.uiAttribs};I.prototype.getUiAttrib=function(e){if(!this.uiAttribs||!this.uiAttribs.hasOwnProperty(e)){return null}return this.uiAttribs[e]};I.prototype.get=function(){if(this._animated&&this._lastAnimFrame!=this._op.patch.getFrameNum()){this._lastAnimFrame=this._op.patch.getFrameNum();this.value=this.anim.getValue(this._op.patch.timer.getTime());this._oldAnimVal=this.value;this.forceChange()}return this.value};I.prototype.setRef=function(e){this.forceRefChange=true;this.set(e)};I.prototype.set=I.prototype.setValue=function(e){if(e===undefined)e=null;if(this._op.enabled&&!this.crashed){if(e!==this.value||this.changeAlways||this.type==v.OP.OP_PORT_TYPE_TEXTURE||this.type==v.OP.OP_PORT_TYPE_ARRAY){if(this._animated){this.anim.setValue(this._op.patch.timer.getTime(),e)}else{try{this.value=e;this.forceChange()}catch(e){this.crashed=true;this.op.crashed=true;console.log("crash",this.op.objName);this.setValue=function(e){};this.onTriggered=function(){};this._log.error("onvaluechanged exception cought",e);this._log.error(e.stack);this._log.warn("exception in: "+this._op.name);if(this._op.patch.isEditorMode())gui.showOpCrash(this._op);this._op.patch.emitEvent("exception",e,this._op);if(this._op.onError)this._op.onError(e)}if(this._op&&this._op.patch&&this._op.patch.isEditorMode()&&this.type==v.OP.OP_PORT_TYPE_TEXTURE)gui.texturePreview().updateTexturePort(this)}if(this.direction==v.PORT.PORT_DIR_OUT)for(let e=0;e<this.links.length;++e)this.links[e].setValue()}}};I.prototype.updateAnim=function(){if(this._animated){this.value=this.get();if(this._oldAnimVal!=this.value||this.changeAlways){this._oldAnimVal=this.value;this.forceChange()}this._oldAnimVal=this.value}};I.prototype.forceChange=function(){if(this.onValueChanged||this.onChange){}this._activity();this.emitEvent("change",this.value,this);if(this.onChange)this.onChange(this,this.value);else if(this.onValueChanged)this.onValueChanged(this,this.value)};I.prototype.getTypeString=function(){if(this.type==v.OP.OP_PORT_TYPE_VALUE)return"Number";if(this.type==v.OP.OP_PORT_TYPE_FUNCTION)return"Trigger";if(this.type==v.OP.OP_PORT_TYPE_OBJECT)return"Object";if(this.type==v.OP.OP_PORT_TYPE_DYNAMIC)return"Dynamic";if(this.type==v.OP.OP_PORT_TYPE_ARRAY)return"Array";if(this.type==v.OP.OP_PORT_TYPE_STRING)return"String";return"Unknown"};I.prototype.deSerializeSettings=function(e){if(!e)return;if(e.animated)this.setAnimated(e.animated);if(e.useVariable)this.setVariableName(e.useVariable);if(e.title)this.setUiAttribs({title:e.title});if(e.expose)this.setUiAttribs({expose:true});if(e.order)this.setUiAttribs({order:e.order});if(e.multiPortNum)this.setUiAttribs({multiPortNum:e.multiPortNum});if(e.anim){if(!this.anim)this.anim=new C({name:"port "+this.name});this._op._hasAnimPort=true;this.anim.addEventListener("onChange",()=>{this._op.patch.emitEvent("portAnimUpdated",this._op,this,this.anim)});if(e.anim.loop)this.anim.loop=e.anim.loop;for(const t in e.anim.keys){this.anim.keys.push(new T.Key(e.anim.keys[t]))}this.anim.sortKeys()}};I.prototype.setInitialValue=function(e){if(this.op.preservedPortLinks[this.name]){for(let e=0;e<this.op.preservedPortLinks[this.name].length;e++){const t=this.op.preservedPortLinks[this.name][e];this.op.patch._addLink(t.objIn,t.objOut,t.portIn,t.portOut)}}if(this.op.preservedPortValues&&this.op.preservedPortValues.hasOwnProperty(this.name)&&this.op.preservedPortValues[this.name]!==undefined){this.set(this.op.preservedPortValues[this.name])}else if(e!==undefined)this.set(e);if(e!==undefined)this.defaultValue=e};I.prototype.getSerialized=function(){let e={name:this.getName()};if(!this.ignoreValueSerialize&&this.links.length===0){if(this.type==v.OP.OP_PORT_TYPE_OBJECT&&this.value&&this.value.tex){}else e.value=this.value}if(this._useVariableName)e.useVariable=this._useVariableName;if(this._animated)e.animated=true;if(this.anim)e.anim=this.anim.getSerialized();if(this.uiAttribs.multiPortNum)e.multiPortNum=this.uiAttribs.multiPortNum;if(this.uiAttribs.display=="file")e.display=this.uiAttribs.display;if(this.uiAttribs.expose){e.expose=true;if(this.uiAttribs.hasOwnProperty("order"))e.order=this.uiAttribs.order}if(this.uiAttribs.title)e.title=this.uiAttribs.title;if((this.preserveLinks||this.direction==v.PORT.PORT_DIR_OUT)&&this.links.length>0){e.links=[];for(const t in this.links){if(!this.links[t].ignoreInSerialize&&(this.links[t].portIn&&this.links[t].portOut))e.links.push(this.links[t].getSerialized())}}if(this.direction==v.PORT.PORT_DIR_IN&&this.links.length>0){for(const t in this.links){if(!this.links[t].portIn||!this.links[t].portOut)continue;const n=this.links[t].getOtherPort(this);if(n.op.isInBlueprint2&&this.op.isInBlueprint2){if(n.op.isInBlueprint2()&&!this.op.isInBlueprint2()){e.links=e.links||[];e.links.push(this.links[t].getSerialized())}}}}if(e.links&&e.links.length==0)delete e.links;if(this.type===v.OP.OP_PORT_TYPE_FUNCTION)delete e.value;if(this.type===v.OP.OP_PORT_TYPE_FUNCTION&&this.links.length==0)e=null;if(e&&Object.keys(e).length==1&&e.name)e=null;a(e);return e};I.prototype.shouldLink=function(){return true};I.prototype.removeLinks=function(){let e=0;while(this.links.length>0){e++;if(e>5e3){this._log.warn("could not delete links... / infinite loop");this.links.length=0;break}this.links[0].remove()}};I.prototype.removeLink=function(e){for(const t in this.links)if(this.links[t]==e)this.links.splice(t,1);if(this.direction==v.PORT.PORT_DIR_IN){if(this.type==v.OP.OP_PORT_TYPE_VALUE)this.setValue(this._valueBeforeLink||0);else this.setValue(this._valueBeforeLink||null)}if(CABLES.UI&&this._op.checkLinkTimeWarnings)this._op.checkLinkTimeWarnings();if(this.onLinkChanged)this.onLinkChanged();this.emitEvent("onLinkChanged");this._op.emitEvent("onLinkChanged")};I.prototype.getName=function(){return this.name};I.prototype.getTitle=function(){if(this.uiAttribs.title)return this.uiAttribs.title;return this.name};I.prototype.addLink=function(e){this._valueBeforeLink=this.value;this.links.push(e);if(CABLES.UI&&this._op.checkLinkTimeWarnings)this._op.checkLinkTimeWarnings();if(this.onLinkChanged)this.onLinkChanged();this.emitEvent("onLinkChanged");this._op.emitEvent("onLinkChanged")};I.prototype.getLinkTo=function(e){for(const t in this.links)if(this.links[t].portIn==e||this.links[t].portOut==e)return this.links[t]};I.prototype.removeLinkTo=function(e){for(const t in this.links){if(this.links[t].portIn==e||this.links[t].portOut==e){this.links[t].remove();if(CABLES.UI&&this._op.checkLinkTimeWarnings)this._op.checkLinkTimeWarnings();if(this.onLinkChanged)this.onLinkChanged();this.emitEvent("onLinkChanged");return}}};I.prototype.isLinkedTo=function(e){for(const t in this.links)if(this.links[t].portIn==e||this.links[t].portOut==e)return true;return false};I.prototype._activity=function(){this.activityCounter++};I.prototype.trigger=function(){const t=this.links.length;this._activity();if(t===0)return;if(!this._op.enabled)return;let n=null;try{for(let e=0;e<t;++e){if(this.links[e].portIn){n=this.links[e].portIn;n.op.patch.pushTriggerStack(n);n._onTriggered();n.op.patch.popTriggerStack()}if(this.links[e])this.links[e].activity()}}catch(e){n.op.enabled=false;if(this._op.patch.isEditorMode()){this._op.patch.emitEvent("exception",e,n.op);this._op.patch.emitEvent("opcrash",n);console.log("crash",n.op.objName);if(n.op.onError)n.op.onError(e)}this._log.warn("exception!");this._log.error("ontriggered exception caught",e);this._log.error(e.stack);this._log.warn("exception in: "+n.op.name)}};I.prototype.call=function(){this._log.warn("call deprecated - use trigger() ");this.trigger()};I.prototype.execute=function(){this._log.warn("### execute port: "+this.getName(),this.goals.length)};I.prototype.setVariableName=function(e){this._useVariableName=e;this._op.patch.on("variableRename",(e,t)=>{if(e!=this._useVariableName)return;this._useVariableName=t})};I.prototype.getVariableName=function(){return this._useVariableName};I.prototype.setVariable=function(e){this.setAnimated(false);const t={useVariable:false};if(this._variableIn&&this._varChangeListenerId){this._variableIn.off(this._varChangeListenerId);this._variableIn=null}if(e){this._variableIn=this._op.patch.getVar(e);if(!this._variableIn){this._log.warn("PORT VAR NOT FOUND!!!",e)}else{if(this.type==v.OP.OP_PORT_TYPE_OBJECT){this._varChangeListenerId=this._variableIn.on("change",()=>{this.set(null);this.set(this._variableIn.getValue())})}else{this._varChangeListenerId=this._variableIn.on("change",this.set.bind(this))}this.set(this._variableIn.getValue())}this._useVariableName=e;t.useVariable=true;t.variableName=this._useVariableName}else{t.variableName=this._useVariableName=null;t.useVariable=false}this.setUiAttribs(t);this._op.patch.emitEvent("portSetVariable",this._op,this,e)};I.prototype._handleNoTriggerOpAnimUpdates=function(e){let t=false;for(let e=0;e<this._op.portsIn.length;e++){if(this._op.portsIn.type==v.OP.OP_PORT_TYPE_FUNCTION){t=true;break}}if(!t){if(e)this._notriggerAnimUpdate=this._op.patch.on("onRenderFrame",()=>{this.updateAnim()});else this._op.patch.removeEventListener(this._notriggerAnimUpdate)}};I.prototype.setAnimated=function(e){if(this._animated!=e){this._animated=e;this._op._hasAnimPort=true;if(this._animated&&!this.anim){this.anim=new C({name:"port "+this.name});this.anim.addEventListener("onChange",()=>{this._op.patch.emitEvent("portAnimUpdated",this._op,this,this.anim)})}this._onAnimToggle()}this._handleNoTriggerOpAnimUpdates(e);if(!e){this.anim=null}this.setUiAttribs({isAnimated:this._animated})};I.prototype.toggleAnim=function(){this._animated=!this._animated;if(this._animated&&!this.anim){this.anim=new C({name:"port "+this.name});this.anim.addEventListener("onChange",()=>{this._op.patch.emitEvent("portAnimUpdated",this._op,this,this.anim)})}this.setAnimated(this._animated);this._onAnimToggle();this.setUiAttribs({isAnimated:this._animated})};I.prototype.getType=function(){return this.type};I.prototype.isLinked=function(){return this.links.length>0||this._animated||this._useVariableName!=null};I.prototype.isBoundToVar=function(){const e=this._useVariableName!=null;this.uiAttribs.boundToVar=e;return e};I.prototype.isAnimated=function(){return this._animated};I.prototype.isHidden=function(){return this.uiAttribs.hidePort};I.prototype._onTriggered=function(e){this._activity();this._op.updateAnims();if(this._op.enabled&&this.onTriggered)this.onTriggered(e)};I.prototype._onSetProfiling=function(e){this._op.patch.profiler.add("port",this);this.setValue(e);this._op.patch.profiler.add("port",null)};I.prototype._onTriggeredProfiling=function(){if(this._op.enabled&&this.onTriggered){this._op.patch.profiler.add("port",this);this.onTriggered();this._op.patch.profiler.add("port",null)}};I.prototype.getUiActiveState=function(){return this._uiActiveState};I.prototype.setUiActiveState=function(e){this._uiActiveState=e;if(this.onUiActiveStateChange)this.onUiActiveStateChange()};I.prototype.onValueChange=function(e){this.onChange=e};I.prototype.hidePort=function(){};I.portTypeNumberToString=function(e){if(e==v.OP.OP_PORT_TYPE_VALUE)return"value";if(e==v.OP.OP_PORT_TYPE_FUNCTION)return"function";if(e==v.OP.OP_PORT_TYPE_OBJECT)return"object";if(e==v.OP.OP_PORT_TYPE_ARRAY)return"array";if(e==v.OP.OP_PORT_TYPE_STRING)return"string";if(e==v.OP.OP_PORT_TYPE_DYNAMIC)return"dynamic";return"unknown"};class E{constructor(e,t,n,r,i,a,s,o,l,u){this._log=new c("cg_uniform");this._type=t;this._name=n;this._shader=e;this._value=1e-5;this._oldValue=null;this._port=null;this._structName=l;this._structUniformName=o;this._propertyName=u;this._shader._addUniform(this);this.needsUpdate=true;this.shaderType=null;this.comment=null;if(t=="f"){this.set=this.setValue=this.setValueF.bind(this);this.updateValue=this.updateValueF.bind(this)}else if(t=="f[]"){this.set=this.setValue=this.setValueArrayF.bind(this);this.updateValue=this.updateValueArrayF.bind(this)}else if(t=="2f[]"){this.set=this.setValue=this.setValueArray2F.bind(this);this.updateValue=this.updateValueArray2F.bind(this)}else if(t=="3f[]"){this.set=this.setValue=this.setValueArray3F.bind(this);this.updateValue=this.updateValueArray3F.bind(this)}else if(t=="4f[]"){this.set=this.setValue=this.setValueArray4F.bind(this);this.updateValue=this.updateValueArray4F.bind(this)}else if(t=="i"){this.set=this.setValue=this.setValueI.bind(this);this.updateValue=this.updateValueI.bind(this)}else if(t=="2i"){this.set=this.setValue=this.setValue2I.bind(this);this.updateValue=this.updateValue2I.bind(this)}else if(t=="3i"){this.set=this.setValue=this.setValue3I.bind(this);this.updateValue=this.updateValue3I.bind(this)}else if(t=="4i"){this.set=this.setValue=this.setValue4I.bind(this);this.updateValue=this.updateValue4I.bind(this)}else if(t=="b"){this.set=this.setValue=this.setValueBool.bind(this);this.updateValue=this.updateValueBool.bind(this)}else if(t=="4f"){this.set=this.setValue=this.setValue4F.bind(this);this.updateValue=this.updateValue4F.bind(this)}else if(t=="3f"){this.set=this.setValue=this.setValue3F.bind(this);this.updateValue=this.updateValue3F.bind(this)}else if(t=="2f"){this.set=this.setValue=this.setValue2F.bind(this);this.updateValue=this.updateValue2F.bind(this)}else if(t=="t"){this.set=this.setValue=this.setValueT.bind(this);this.updateValue=this.updateValueT.bind(this)}else if(t=="tc"){this.set=this.setValue=this.setValueT.bind(this);this.updateValue=this.updateValueT.bind(this)}else if(t=="t[]"){this.set=this.setValue=this.setValueArrayT.bind(this);this.updateValue=this.updateValueArrayT.bind(this)}else if(t=="m4"||t=="m4[]"){this.set=this.setValue=this.setValueM4.bind(this);this.updateValue=this.updateValueM4.bind(this)}else throw new Error("Unknown uniform type");if(typeof r=="object"&&r instanceof I){this._port=r;this._value=this._port.get();if(i&&a&&s){if(!(i instanceof I)||!(a instanceof I)||!(s instanceof I)){this._log.error("[cgl_uniform] mixed port/value parameter for vec4 ",this._name)}this._value=[0,0,0,0];this._port2=i;this._port3=a;this._port4=s;this._port.on("change",this.updateFromPort4f.bind(this));this._port2.on("change",this.updateFromPort4f.bind(this));this._port3.on("change",this.updateFromPort4f.bind(this));this._port4.on("change",this.updateFromPort4f.bind(this));this.updateFromPort4f()}else if(i&&a){if(!(i instanceof I)||!(a instanceof I)){this._log.error("[cgl_uniform] mixed port/value parameter for vec4 ",this._name)}this._value=[0,0,0];this._port2=i;this._port3=a;this._port.on("change",this.updateFromPort3f.bind(this));this._port2.on("change",this.updateFromPort3f.bind(this));this._port3.on("change",this.updateFromPort3f.bind(this));this.updateFromPort3f()}else if(i){if(!(i instanceof I)){this._log.error("[cgl_uniform] mixed port/value parameter for vec4 ",this._name)}this._value=[0,0];this._port2=i;this._port.on("change",this.updateFromPort2f.bind(this));this._port2.on("change",this.updateFromPort2f.bind(this));this.updateFromPort2f()}else{this._port.on("change",this.updateFromPort.bind(this))}}else this._value=r;this.setValue(this._value);this.needsUpdate=true}getType(){return this._type}getName(){return this._name}getValue(){return this._value}getShaderType(){return this.shaderType}isStructMember(){return!!this._structName}updateFromPort4f(){this._value[0]=this._port.get();this._value[1]=this._port2.get();this._value[2]=this._port3.get();this._value[3]=this._port4.get();this.setValue(this._value)}updateFromPort3f(){this._value[0]=this._port.get();this._value[1]=this._port2.get();this._value[2]=this._port3.get();this.setValue(this._value)}updateFromPort2f(){this._value[0]=this._port.get();this._value[1]=this._port2.get();this.setValue(this._value)}updateFromPort(){this.setValue(this._port.get())}}const L=E;class N extends L{constructor(e,t,n,r,i,a,s,o,l,u){super(e,t,n,r,i,a,s,o,l,u);this._loc=-1;this._cgl=e._cgl}get name(){return this._name}copy(e){const t=new N(e,this._type,this._name,this._value,this._port2,this._port3,this._port4,this._structUniformName,this._structName,this._propertyName);t.shaderType=this.shaderType;return t}getGlslTypeString(){return N.glslTypeString(this._type)}_isValidLoc(){return this._loc!=-1}resetLoc(){this._loc=-1;this.needsUpdate=true}bindTextures(){}getLoc(){return this._loc}updateFromPort4f(){this._value[0]=this._port.get();this._value[1]=this._port2.get();this._value[2]=this._port3.get();this._value[3]=this._port4.get();this.setValue(this._value)}updateFromPort3f(){this._value[0]=this._port.get();this._value[1]=this._port2.get();this._value[2]=this._port3.get();this.setValue(this._value)}updateFromPort2f(){this._value[0]=this._port.get();this._value[1]=this._port2.get();this.setValue(this._value)}updateFromPort(){this.setValue(this._port.get())}updateValueF(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;this._shader.getCgl().gl.uniform1f(this._loc,this._value);this._cgl.profileData.profileUniformCount++}setValueF(e){if(e!=this._value){this.needsUpdate=true;this._value=e}}updateValueI(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;this._shader.getCgl().gl.uniform1i(this._loc,this._value);this._cgl.profileData.profileUniformCount++}updateValue2I(){if(!this._value)return;if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}this._shader.getCgl().gl.uniform2i(this._loc,this._value[0],this._value[1]);this.needsUpdate=false;this._cgl.profileData.profileUniformCount++}updateValue3I(){if(!this._value)return;if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}this._shader.getCgl().gl.uniform3i(this._loc,this._value[0],this._value[1],this._value[2]);this.needsUpdate=false;this._cgl.profileData.profileUniformCount++}updateValue4I(){if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}this._shader.getCgl().gl.uniform4i(this._loc,this._value[0],this._value[1],this._value[2],this._value[3]);this._cgl.profileData.profileUniformCount++}setValueI(e){if(e!=this._value){this.needsUpdate=true;this._value=e}}setValue2I(e){if(!e)return;if(!this._oldValue){this._oldValue=[e[0]-1,1];this.needsUpdate=true}else if(e[0]!=this._oldValue[0]||e[1]!=this._oldValue[1]){this._oldValue[0]=e[0];this._oldValue[1]=e[1];this.needsUpdate=true}this._value=e}setValue3I(e){if(!e)return;if(!this._oldValue){this._oldValue=[e[0]-1,1,2];this.needsUpdate=true}else if(e[0]!=this._oldValue[0]||e[1]!=this._oldValue[1]||e[2]!=this._oldValue[2]){this._oldValue[0]=e[0];this._oldValue[1]=e[1];this._oldValue[2]=e[2];this.needsUpdate=true}this._value=e}setValue4I(e){this.needsUpdate=true;this._value=e||vec4.create()}updateValueBool(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;this._shader.getCgl().gl.uniform1i(this._loc,this._value?1:0);this._cgl.profileData.profileUniformCount++}setValueBool(e){if(e!=this._value){this.needsUpdate=true;this._value=e}}setValueArray4F(e){this.needsUpdate=true;this._value=e}updateValueArray4F(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;if(!this._value)return;this._shader.getCgl().gl.uniform4fv(this._loc,this._value);this._cgl.profileData.profileUniformCount++}setValueArray3F(e){this.needsUpdate=true;this._value=e}updateValueArray3F(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;if(!this._value)return;this._shader.getCgl().gl.uniform3fv(this._loc,this._value);this._cgl.profileData.profileUniformCount++}setValueArray2F(e){this.needsUpdate=true;this._value=e}updateValueArray2F(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;if(!this._value)return;this._shader.getCgl().gl.uniform2fv(this._loc,this._value);this._cgl.profileData.profileUniformCount++}setValueArrayF(e){this.needsUpdate=true;this._value=e}updateValueArrayF(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;if(!this._value)return;this._shader.getCgl().gl.uniform1fv(this._loc,this._value);this._cgl.profileData.profileUniformCount++}setValueArrayT(e){this.needsUpdate=true;this._value=e}updateValue3F(){if(!this._value)return;if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}this._shader.getCgl().gl.uniform3f(this._loc,this._value[0],this._value[1],this._value[2]);this.needsUpdate=false;this._cgl.profileData.profileUniformCount++}setValue3F(e){if(!e)return;if(!this._oldValue){this._oldValue=[e[0]-1,1,2];this.needsUpdate=true}else if(e[0]!=this._oldValue[0]||e[1]!=this._oldValue[1]||e[2]!=this._oldValue[2]){this._oldValue[0]=e[0];this._oldValue[1]=e[1];this._oldValue[2]=e[2];this.needsUpdate=true}this._value=e}updateValue2F(){if(!this._value)return;if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}this._shader.getCgl().gl.uniform2f(this._loc,this._value[0],this._value[1]);this.needsUpdate=false;this._cgl.profileData.profileUniformCount++}setValue2F(e){if(!e)return;if(!this._oldValue){this._oldValue=[e[0]-1,1];this.needsUpdate=true}else if(e[0]!=this._oldValue[0]||e[1]!=this._oldValue[1]){this._oldValue[0]=e[0];this._oldValue[1]=e[1];this.needsUpdate=true}this._value=e}updateValue4F(){if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}if(!this._value){this._log.warn("no value for uniform",this._name,this);this._value=[0,0,0,0]}this.needsUpdate=false;this._shader.getCgl().gl.uniform4f(this._loc,this._value[0],this._value[1],this._value[2],this._value[3]);this._cgl.profileData.profileUniformCount++}setValue4F(e){if(typeof this.value=="number")this.value=vec4.create();if(!e)return;if(!this._oldValue){this._oldValue=[e[0]-1,1,2,3];this.needsUpdate=true}else if(e[0]!=this._oldValue[0]||e[1]!=this._oldValue[1]||e[2]!=this._oldValue[2]||e[3]!=this._oldValue[3]){this._oldValue[0]=e[0];this._oldValue[1]=e[1];this._oldValue[2]=e[2];this.needsUpdate=true}this._value=e}updateValueM4(){if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}if(!this._value||this._value.length%16!=0)return console.log("this.name",this._name,this._value);this._shader.getCgl().gl.uniformMatrix4fv(this._loc,false,this._value);this._cgl.profileData.profileUniformCount++}setValueM4(e){this.needsUpdate=true;this._value=e||mat4.create()}updateValueArrayT(){if(!this._isValidLoc())this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);else this.needsUpdate=false;if(!this._value)return;this._shader.getCgl().gl.uniform1iv(this._loc,this._value);this._cgl.profileData.profileUniformCount++}updateValueT(){if(!this._isValidLoc()){this._loc=this._shader.getCgl().gl.getUniformLocation(this._shader.getProgram(),this._name);this._cgl.profileData.profileShaderGetUniform++;this._cgl.profileData.profileShaderGetUniformName=this._name}this._cgl.profileData.profileUniformCount++;this._shader.getCgl().gl.uniform1i(this._loc,this._value);this.needsUpdate=false}setValueT(e){this.needsUpdate=true;this._value=e}}N.glslTypeString=e=>{if(e=="f")return"float";if(e=="b")return"bool";if(e=="i")return"int";if(e=="2i")return"ivec2";if(e=="2f")return"vec2";if(e=="3f")return"vec3";if(e=="4f")return"vec4";if(e=="m4")return"mat4";if(e=="t")return"sampler2D";if(e=="tc")return"samplerCube";if(e=="3f[]")return null;if(e=="m4[]")return null;if(e=="f[]")return null;console.warn("[CGL UNIFORM] unknown glsl type string ",e)};const U={SHADERVAR_VERTEX_POSITION:"vPosition",SHADERVAR_VERTEX_NUMBER:"attrVertIndex",SHADERVAR_VERTEX_NORMAL:"attrVertNormal",SHADERVAR_VERTEX_TEXCOORD:"attrTexCoord",SHADERVAR_INSTANCE_MMATRIX:"instMat",SHADERVAR_VERTEX_COLOR:"attrVertColor",SHADERVAR_INSTANCE_INDEX:"instanceIndex",SHADERVAR_UNI_PROJMAT:"projMatrix",SHADERVAR_UNI_VIEWMAT:"viewMatrix",SHADERVAR_UNI_MODELMAT:"modelMatrix",SHADERVAR_UNI_NORMALMAT:"normalMatrix",SHADERVAR_UNI_INVVIEWMAT:"inverseViewMatrix",SHADERVAR_UNI_INVPROJMAT:"invProjMatrix",SHADERVAR_UNI_MATERIALID:"materialId",SHADERVAR_UNI_OBJECTID:"objectId",SHADERVAR_UNI_VIEWPOS:"camPos"};const ne={BLEND_NONE:0,BLEND_NORMAL:1,BLEND_ADD:2,BLEND_SUB:3,BLEND_MUL:4};const re=180/Math.PI;const ie=Math.PI/180;const R={MATH:{DEG2RAD:ie,RAD2DEG:re},SHADER:U,BLEND_MODES:ne};function ae(e){e.prototype.hasFeedbacks=function(){return this._feedBacks.length>0};e.prototype.removeFeedbacks=function(e){if(!this._feedbacks)return;this._feedbacks.length=0;this._feedBacksChanged=true};e.prototype.setAttributeFeedback=function(){};e.prototype.setFeedback=function(e,t,n){let r={nameOut:t};let i=false;this.unBindFeedbacks();for(let e=0;e<this._feedBacks.length;e++){if(this._feedBacks[e].nameOut==t){r=this._feedBacks[e];i=true}}if(!i)this._feedBacksChanged=true;r.initialArr=n;r.attrib=e;if(r.outBuffer)this._cgl.gl.deleteBuffer(r.outBuffer);r.outBuffer=this._cgl.gl.createBuffer();this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,r.outBuffer);this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER,r.initialArr,this._cgl.gl.STATIC_DRAW);this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,r.attrib.buffer);this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER,r.initialArr,this._cgl.gl.STATIC_DRAW);if(!i)this._feedBacks.push(r);return r};e.prototype.bindFeedback=function(t){if(!this._feedBacks||this._feedBacks.length===0)return;if(this._transformFeedBackLoc==-1)this._transformFeedBackLoc=this._cgl.gl.createTransformFeedback();this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK,this._transformFeedBackLoc);let n=false;for(let e=0;e<this._feedBacks.length;e++){const r=this._feedBacks[e];if(r.attrib==t){n=true;this._cgl.gl.bindBufferBase(this._cgl.gl.TRANSFORM_FEEDBACK_BUFFER,e,r.outBuffer)}}if(!n){}};e.prototype.drawFeedbacks=function(e,t){let n=0;if(this._feedBacksChanged){const r=[];this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK,this._transformFeedBackLoc);for(n=0;n<this._feedBacks.length;n++)r.push(this._feedBacks[n].nameOut);e.setFeedbackNames(r);console.log("feedbacknames",r);e.compile();this._feedBacksChanged=false;this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK,null);console.log("changed finished");return}this._cgl.gl.beginTransformFeedback(this.glPrimitive);this._cgl.gl.drawArrays(t,0,this._feedBacks[0].attrib.numItems);this._cgl.gl.endTransformFeedback();this.unBindFeedbacks();this.feedBacksSwapBuffers()};e.prototype.unBindFeedbacks=function(){for(let e=0;e<this._feedBacks.length;e++){this._cgl.gl.bindBufferBase(this._cgl.gl.TRANSFORM_FEEDBACK_BUFFER,e,null)}this._cgl.gl.bindTransformFeedback(this._cgl.gl.TRANSFORM_FEEDBACK,null)};e.prototype.feedBacksSwapBuffers=function(){for(let e=0;e<this._feedBacks.length;e++){const t=this._feedBacks[e].attrib.buffer;this._feedBacks[e].attrib.buffer=this._feedBacks[e].outBuffer;this._feedBacks[e].outBuffer=t}}}const P={};P.lastMesh=null;const M=function(e,t,n){this._cgl=e;let r=n||{};if(CABLES.UTILS.isNumeric(r))r={glPrimitive:n};this._log=new c("cgl_mesh");this._bufVertexAttrib=null;this._bufVerticesIndizes=this._cgl.gl.createBuffer();this._indexType=this._cgl.gl.UNSIGNED_SHORT;this._attributes=[];this._attribLocs={};this._geom=null;this._lastShader=null;this._numInstances=0;this._glPrimitive=r.glPrimitive;this.opId=r.opId||"";this._preWireframeGeom=null;this.addVertexNumbers=false;this._name="unknown";this.feedBackAttributes=[];this.setGeom(t);this._feedBacks=[];this._feedBacksChanged=false;this._transformFeedBackLoc=-1;this._lastAttrUpdate=0;this.memFreed=false;this._cgl.profileData.addHeavyEvent("mesh constructed",this._name);this._queryExt=null;Object.defineProperty(this,"numInstances",{get(){return this._numInstances},set(e){this.setNumInstances(e)}})};M.prototype.freeMem=function(){this.memFreed=true;for(let e=0;e<this._attributes.length;e++){this._attributes[e].floatArray=null}};M.prototype.updateVertices=function(e){this.setAttribute(R.SHADER.SHADERVAR_VERTEX_POSITION,e.vertices,3);this._numVerts=e.vertices.length/3};M.prototype.setAttributePointer=function(t,n,r,i){for(let e=0;e<this._attributes.length;e++){if(this._attributes[e].name==t){if(!this._attributes[e].pointer)this._attributes[e].pointer=[];this._attributes[e].pointer.push({loc:-1,name:n,stride:r,offset:i,instanced:t==R.SHADER.SHADERVAR_INSTANCE_MMATRIX})}}};M.prototype.getAttribute=function(t){for(let e=0;e<this._attributes.length;e++)if(this._attributes[e].name==t)return this._attributes[e]};M.prototype.setAttributeRange=function(e,t,n,r){if(!e)return;if(!n&&!r)return;if(!e.name){this._log.stack("no attrname?!")}this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,e.buffer);this._cgl.profileData.profileMeshAttributes+=r-n||0;this._cgl.profileData.profileSingleMeshAttribute[this._name]=this._cgl.profileData.profileSingleMeshAttribute[this._name]||0;this._cgl.profileData.profileSingleMeshAttribute[this._name]+=r-n||0;if(e.numItems<t.length/e.itemSize){this._resizeAttr(t,e)}if(r>=t.length-1){this._log.log(this._cgl.canvas.id+" "+e.name+" buffersubdata out of bounds ?",t.length,r,n,e)}if(this._cgl.glVersion==1)this._cgl.gl.bufferSubData(this._cgl.gl.ARRAY_BUFFER,0,t);else this._cgl.gl.bufferSubData(this._cgl.gl.ARRAY_BUFFER,n*4,t,n,r-n)};M.prototype._resizeAttr=function(e,t){if(t.buffer)this._cgl.gl.deleteBuffer(t.buffer);t.buffer=this._cgl.gl.createBuffer();this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,t.buffer);this._bufferArray(e,t);t.numItems=e.length/t.itemSize};M.prototype._bufferArray=function(e,t){let n=t.floatArray||null;if(!e)return;if(this._cgl.debugOneFrame){console.log("_bufferArray",e.length,t.name)}if(!(e instanceof Float32Array)){if(t&&n&&n.length==e.length){n.set(e)}else{n=new Float32Array(e);if(this._cgl.debugOneFrame){console.log("_bufferArray create new float32array",e.length,t.name)}if(e.length>1e4){this._cgl.profileData.profileNonTypedAttrib++;this._cgl.profileData.profileNonTypedAttribNames="("+this._name+":"+t.name+")"}}}else n=e;t.arrayLength=n.length;t.floatArray=null;this._cgl.gl.bufferData(this._cgl.gl.ARRAY_BUFFER,n,this._cgl.gl.DYNAMIC_DRAW)};M.prototype.addAttribute=M.prototype.updateAttribute=M.prototype.setAttribute=function(e,t,n,r){if(!t){this._log.error("mesh addAttribute - no array given! "+e);throw new Error}let i=null;let a=false;let s=0;const o=t.length/n;this._cgl.profileData.profileMeshAttributes+=o||0;if(typeof r=="function"){i=r}if(typeof r=="object"){if(r.cb)i=r.cb;if(r.instanced)a=r.instanced}if(e==R.SHADER.SHADERVAR_INSTANCE_MMATRIX)a=true;for(s=0;s<this._attributes.length;s++){const c=this._attributes[s];if(c.name==e){if(c.numItems===o){}else{this._resizeAttr(t,c)}this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,c.buffer);this._bufferArray(t,c);return c}}const l=this._cgl.gl.createBuffer();this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,l);let u=this._cgl.gl.FLOAT;if(r&&r.type)u=r.type;const c={buffer:l,name:e,cb:i,itemSize:n,numItems:o,startItem:0,instanced:a,type:u};this._bufferArray(t,c);if(e==R.SHADER.SHADERVAR_VERTEX_POSITION)this._bufVertexAttrib=c;this._attributes.push(c);this._attribLocs={};return c};M.prototype.getAttributes=function(){return this._attributes};M.prototype.updateTexCoords=function(e){if(e.texCoords&&e.texCoords.length>0){this.setAttribute(R.SHADER.SHADERVAR_VERTEX_TEXCOORD,e.texCoords,2)}else{const t=new Float32Array(Math.round(e.vertices.length/3*2));this.setAttribute(R.SHADER.SHADERVAR_VERTEX_TEXCOORD,t,2)}};M.prototype.updateNormals=function(e){if(e.vertexNormals&&e.vertexNormals.length>0){this.setAttribute(R.SHADER.SHADERVAR_VERTEX_NORMAL,e.vertexNormals,3)}else{const t=new Float32Array(Math.round(e.vertices.length));this.setAttribute(R.SHADER.SHADERVAR_VERTEX_NORMAL,t,3)}};M.prototype._setVertexNumbers=function(e){if(!this._verticesNumbers||this._verticesNumbers.length!=this._numVerts||e){if(e)this._verticesNumbers=e;else{this._verticesNumbers=new Float32Array(this._numVerts);for(let e=0;e<this._numVerts;e++)this._verticesNumbers[e]=e}this.setAttribute(R.SHADER.SHADERVAR_VERTEX_NUMBER,this._verticesNumbers,1,(e,t,n)=>{if(!n.uniformNumVertices)n.uniformNumVertices=new N(n,"f","numVertices",this._numVerts);n.uniformNumVertices.setValue(this._numVerts)})}};M.prototype.setVertexIndices=function(t){if(!this._bufVerticesIndizes){this._log.warn("no bufVerticesIndizes: "+this._name);return}if(t.length>0){if(t instanceof Float32Array)this._log.warn("vertIndices float32Array: "+this._name);for(let e=0;e<t.length;e++){if(t[e]>=this._numVerts){this._log.warn("invalid index in "+this._name,e,t[e]);return}}this._cgl.gl.bindBuffer(this._cgl.gl.ELEMENT_ARRAY_BUFFER,this._bufVerticesIndizes);if(t.length>65535){this.vertIndicesTyped=new Uint32Array(t);this._indexType=this._cgl.gl.UNSIGNED_INT}else if(t instanceof Uint32Array){this.vertIndicesTyped=t;this._indexType=this._cgl.gl.UNSIGNED_INT}else if(!(t instanceof Uint16Array)){this.vertIndicesTyped=new Uint16Array(t);this._indexType=this._cgl.gl.UNSIGNED_SHORT}else this.vertIndicesTyped=t;this._cgl.gl.bufferData(this._cgl.gl.ELEMENT_ARRAY_BUFFER,this.vertIndicesTyped,this._cgl.gl.DYNAMIC_DRAW);this._bufVerticesIndizes.itemSize=1;this._bufVerticesIndizes.numItems=t.length}else this._bufVerticesIndizes.numItems=0};M.prototype.setGeom=function(e,t){this._geom=e;if(e.glPrimitive!=null)this._glPrimitive=e.glPrimitive;if(this._geom&&this._geom.name)this._name="mesh "+this._geom.name;P.lastMesh=null;this._cgl.profileData.profileMeshSetGeom++;this._disposeAttributes();this.updateVertices(this._geom);this.setVertexIndices(this._geom.verticesIndices);if(this.addVertexNumbers)this._setVertexNumbers();const n=this._geom.getAttributes();const r={texCoords:R.SHADER.SHADERVAR_VERTEX_TEXCOORD,vertexNormals:R.SHADER.SHADERVAR_VERTEX_NORMAL,vertexColors:R.SHADER.SHADERVAR_VERTEX_COLOR,tangents:"attrTangent",biTangents:"attrBiTangent"};for(const i in n)if(n[i].data&&n[i].data.length)this.setAttribute(r[i]||i,n[i].data,n[i].itemSize);if(t){this._geom=null}};M.prototype._preBind=function(t){for(let e=0;e<this._attributes.length;e++)if(this._attributes[e].cb)this._attributes[e].cb(this._attributes[e],this._geom,t)};M.prototype._checkAttrLengths=function(){if(this.memFreed)return;for(let e=0;e<this._attributes.length;e++){if(this._attributes[e].arrayLength/this._attributes[e].itemSize<this._attributes[0].arrayLength/this._attributes[0].itemSize){let e="unknown";if(this._geom)e=this._geom.name}}};M.prototype._bind=function(t){if(!t.isValid())return;let n=[];if(this._attribLocs[t.id])n=this._attribLocs[t.id];else this._attribLocs[t.id]=n;this._lastShader=t;if(t.lastCompile>this._lastAttrUpdate||n.length!=this._attributes.length){this._lastAttrUpdate=t.lastCompile;for(let e=0;e<this._attributes.length;e++)n[e]=-1}for(let e=0;e<this._attributes.length;e++){const r=this._attributes[e];if(n[e]==-1){if(r._attrLocationLastShaderTime!=t.lastCompile){r._attrLocationLastShaderTime=t.lastCompile;n[e]=this._cgl.glGetAttribLocation(t.getProgram(),r.name);this._cgl.profileData.profileAttrLoc++}}if(n[e]!=-1){this._cgl.gl.enableVertexAttribArray(n[e]);this._cgl.gl.bindBuffer(this._cgl.gl.ARRAY_BUFFER,r.buffer);if(r.instanced){if(r.itemSize<=4){if(!r.itemSize||r.itemSize==0)this._log.warn("instanced attrib itemsize error",this._geom.name,r);this._cgl.gl.vertexAttribPointer(n[e],r.itemSize,r.type,false,r.itemSize*4,0);this._cgl.gl.vertexAttribDivisor(n[e],1)}else if(r.itemSize==16){const i=16*4;this._cgl.gl.vertexAttribPointer(n[e],4,r.type,false,i,0);this._cgl.gl.enableVertexAttribArray(n[e]+1);this._cgl.gl.vertexAttribPointer(n[e]+1,4,r.type,false,i,4*4*1);this._cgl.gl.enableVertexAttribArray(n[e]+2);this._cgl.gl.vertexAttribPointer(n[e]+2,4,r.type,false,i,4*4*2);this._cgl.gl.enableVertexAttribArray(n[e]+3);this._cgl.gl.vertexAttribPointer(n[e]+3,4,r.type,false,i,4*4*3);this._cgl.gl.vertexAttribDivisor(n[e],1);this._cgl.gl.vertexAttribDivisor(n[e]+1,1);this._cgl.gl.vertexAttribDivisor(n[e]+2,1);this._cgl.gl.vertexAttribDivisor(n[e]+3,1)}else{this._log.warn("unknown instance attrib size",r.name)}}else{if(!r.itemSize||r.itemSize==0)this._log.warn("attrib itemsize error",this._name,r);this._cgl.gl.vertexAttribPointer(n[e],r.itemSize,r.type,false,r.itemSize*4,0);if(r.pointer){for(let e=0;e<r.pointer.length;e++){const a=r.pointer[e];if(a.loc==-1)a.loc=this._cgl.glGetAttribLocation(t.getProgram(),a.name);this._cgl.profileData.profileAttrLoc++;this._cgl.gl.enableVertexAttribArray(a.loc);this._cgl.gl.vertexAttribPointer(a.loc,r.itemSize,r.type,false,a.stride,a.offset)}}this.bindFeedback(r)}}}if(this._bufVerticesIndizes&&this._bufVerticesIndizes.numItems!==0)this._cgl.gl.bindBuffer(this._cgl.gl.ELEMENT_ARRAY_BUFFER,this._bufVerticesIndizes)};M.prototype.unBind=function(){const e=this._lastShader;this._lastShader=null;if(!e)return;let t=[];if(this._attribLocs[e.id])t=this._attribLocs[e.id];else this._attribLocs[e.id]=t;P.lastMesh=null;for(let e=0;e<this._attributes.length;e++){if(this._attributes[e].instanced){if(this._attributes[e].itemSize<=4){if(t[e]!=-1)this._cgl.gl.vertexAttribDivisor(t[e],0);if(t[e]>=0)this._cgl.gl.disableVertexAttribArray(t[e])}else{this._cgl.gl.vertexAttribDivisor(t[e],0);this._cgl.gl.vertexAttribDivisor(t[e]+1,0);this._cgl.gl.vertexAttribDivisor(t[e]+2,0);this._cgl.gl.vertexAttribDivisor(t[e]+3,0);this._cgl.gl.disableVertexAttribArray(t[e]+1);this._cgl.gl.disableVertexAttribArray(t[e]+2);this._cgl.gl.disableVertexAttribArray(t[e]+3)}}if(t[e]!=-1)this._cgl.gl.disableVertexAttribArray(t[e])}};M.prototype.meshChanged=function(){return this._cgl.lastMesh&&this._cgl.lastMesh!=this};M.prototype.printDebug=function(e){console.log("--attributes");for(let e=0;e<this._attributes.length;e++){console.log("attribute "+e+" "+this._attributes[e].name)}};M.prototype.setNumVertices=function(e){this._bufVertexAttrib.numItems=e};M.prototype.getNumVertices=function(){return this._bufVertexAttrib.numItems};M.prototype.render=function(n){if(!n||!n.isValid()||this._cgl.aborted)return;this._checkAttrLengths();if(this._geom){if(this._preWireframeGeom&&!n.wireframe&&!this._geom.isIndexed()){this.setGeom(this._preWireframeGeom);this._preWireframeGeom=null}if(n.wireframe){let e=false;if(this._geom.isIndexed()){if(!this._preWireframeGeom){this._preWireframeGeom=this._geom;this._geom=this._geom.copy()}this._geom.unIndex();e=true}if(!this._geom.getAttribute("attrBarycentric")){if(!this._preWireframeGeom){this._preWireframeGeom=this._geom;this._geom=this._geom.copy()}e=true;this._geom.calcBarycentric()}if(e)this.setGeom(this._geom)}}let e=false;if(P.lastMesh!=this){if(P.lastMesh)P.lastMesh.unBind();e=true}if(e)this._preBind(n);if(!n.bind())return;this._bind(n);if(this.addVertexNumbers)this._setVertexNumbers();P.lastMesh=this;let t=this._cgl.gl.TRIANGLES;if(this._glPrimitive!==undefined)t=this._glPrimitive;if(n.glPrimitive!==null)t=n.glPrimitive;let r=1;let i=this._cgl.profileData.doProfileGlQuery;let a=false;if(i){let e=this._name+" - "+n.getName()+" #"+n.id;if(this._numInstances)e+=" instanced "+this._numInstances+"x";let t=this._cgl.profileData.glQueryData[e];if(!t)t={id:e,num:0};if(n.opId)t.shaderOp=n.opId;if(this.opId)t.meshOp=this.opId;this._cgl.profileData.glQueryData[e]=t;if(!this._queryExt&&this._queryExt!==false)this._queryExt=this._cgl.enableExtension("EXT_disjoint_timer_query_webgl2")||false;if(this._queryExt){if(t._drawQuery){const s=this._cgl.gl.getQueryParameter(t._drawQuery,this._cgl.gl.QUERY_RESULT_AVAILABLE);if(s){const o=this._cgl.gl.getQueryParameter(t._drawQuery,this._cgl.gl.QUERY_RESULT);const l=o/1e6;t._times=t._times||0;t._times+=l;t._numcount++;t.when=performance.now();t._drawQuery=null;t.queryStarted=false}}if(!t.queryStarted){t._drawQuery=this._cgl.gl.createQuery();this._cgl.gl.beginQuery(this._queryExt.TIME_ELAPSED_EXT,t._drawQuery);a=t.queryStarted=true}}}if(this.hasFeedbacks()){this.drawFeedbacks(n,t)}else if(!this._bufVerticesIndizes||this._bufVerticesIndizes.numItems===0){if(t==this._cgl.gl.TRIANGLES)r=3;if(this._numInstances===0)this._cgl.gl.drawArrays(t,this._bufVertexAttrib.startItem,this._bufVertexAttrib.numItems-this._bufVertexAttrib.startItem);else this._cgl.gl.drawArraysInstanced(t,this._bufVertexAttrib.startItem,this._bufVertexAttrib.numItems,this._numInstances)}else{if(t==this._cgl.gl.TRIANGLES)r=3;if(this._numInstances===0){this._cgl.gl.drawElements(t,this._bufVerticesIndizes.numItems,this._indexType,0)}else{this._cgl.gl.drawElementsInstanced(t,this._bufVerticesIndizes.numItems,this._indexType,0,this._numInstances)}}if(this._cgl.debugOneFrame&&this._cgl.gl.getError()!=this._cgl.gl.NO_ERROR){this._log.error("mesh draw gl error");this._log.error("mesh",this);this._log.error("shader",n);const u=[];for(let e=0;e<this._cgl.gl.getProgramParameter(n.getProgram(),this._cgl.gl.ACTIVE_ATTRIBUTES);e++){const c=this._cgl.gl.getActiveAttrib(n.getProgram(),e).name;this._log.error("attrib ",c)}}this._cgl.profileData.profileMeshNumElements+=this._bufVertexAttrib.numItems/r*(this._numInstances||1);this._cgl.profileData.profileMeshDraw++;if(i&&a){this._cgl.gl.endQuery(this._queryExt.TIME_ELAPSED_EXT)}this._cgl.printError("mesh render "+this._name);this.unBind()};M.prototype.setNumInstances=function(t){t=Math.max(0,t);if(this._numInstances!=t){this._numInstances=t;const n=new Float32Array(t);for(let e=0;e<t;e++)n[e]=e;this.setAttribute(R.SHADER.SHADERVAR_INSTANCE_INDEX,n,1,{instanced:true})}};M.prototype._disposeAttributes=function(){if(!this._attributes)return;for(let e=0;e<this._attributes.length;e++){if(this._attributes[e].buffer){this._cgl.gl.deleteBuffer(this._attributes[e].buffer);this._attributes[e].buffer=null}}this._attributes.length=0};M.prototype.dispose=function(){if(this._bufVertexAttrib&&this._bufVertexAttrib.buffer)this._cgl.gl.deleteBuffer(this._bufVertexAttrib.buffer);if(this._bufVerticesIndizes)this._cgl.gl.deleteBuffer(this._bufVerticesIndizes);this._bufVerticesIndizes=null;this._disposeAttributes()};ae(M);const k={};k.getSimpleRect=function(e,t){const n=new g(t);n.vertices=[1,1,0,-1,1,0,1,-1,0,-1,-1,0];n.texCoords=[1,1,0,1,1,0,0,0];n.verticesIndices=[0,1,2,2,1,3];n.vertexNormals=[0,0,0,0,0,0,0,0,0,0,0,0];return new M(e,n)};k.getSimpleCube=function(e,t){const n=new g(t);n.vertices=[-1,-1,1,1,-1,1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,1,-1,-1,1,-1,-1,1,-1,1,1,-1,1,1,1,-1,1,1,-1,-1,-1,1,-1,-1,1,-1,1,-1,-1,1,1,-1,-1,1,-1,1,1,1,1,1,1,-1,-1,-1,-1,-1,-1,1,-1,1,1,-1,1,-1];n.setTexCoords([0,1,1,1,1,0,0,0,1,1,1,0,0,0,0,1,0,0,0,1,1,1,1,0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,1,1,1,1,0,0,0]);n.verticesIndices=[0,1,2,0,2,3,4,5,6,4,6,7,8,9,10,8,10,11,12,13,14,12,14,15,16,17,18,16,18,19,20,21,22,20,22,23];n.vertexNormals=new Float32Array([0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0]);n.tangents=new Float32Array([0,1,0,0,1,0,0,1,0,0,1,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1]);n.biTangents=new Float32Array([-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1,0,0,1,0,0,1,0,0,1,0,0,1,0,0,-1,0,0,-1,0,0,-1,0,0,-1]);return new M(e,n)};class se{constructor(e,t,n){this.cgl=e;this._options=n;this.fb=null;let r=n.shader;this._useDefaultShader=true;if(n.shader)this._useDefaultShader=false;n.numRenderBuffers=n.numRenderBuffers||1;if(!r){r="".endl()+"IN vec2 texCoord;";for(let e=0;e<n.numRenderBuffers;e++){r=r.endl()+"UNI sampler2D tex"+e+";".endl()}r=r.endl()+"void main()".endl()+"{";if(n.numRenderBuffers==1){r=r.endl()+"    outColor= texture(tex0,texCoord);;".endl()}else for(let e=0;e<n.numRenderBuffers;e++){r=r.endl()+"outColor"+e+" = texture(tex"+e+",texCoord);".endl()}r=r.endl()+"}"}const i=n.vertexShader||"".endl()+"IN vec3 vPosition;".endl()+"IN vec2 attrTexCoord;".endl()+"OUT vec2 texCoord;".endl()+"void main()".endl()+"{".endl()+"   texCoord=attrTexCoord;".endl()+"   gl_Position = vec4(vPosition,  1.0);".endl()+"}";this.bgShader=new CGL.Shader(e,"corelib copytexture "+t);this.bgShader.setSource(i,r);if(!n.vertexShader)this.bgShader.ignoreMissingUniforms=true;new CGL.Uniform(this.bgShader,"t","tex",0);new CGL.Uniform(this.bgShader,"t","tex1",1);new CGL.Uniform(this.bgShader,"t","tex2",2);new CGL.Uniform(this.bgShader,"t","tex3",3);this.mesh=k.getSimpleRect(this.cgl,"texEffectRect")}setSize(e,t){this._options.width=e;this._options.height=t}copy(e,t,n,r,i){const a=this.cgl;if(!e)e=CGL.Texture.getEmptyTexture(this.cgl);let s=this._options.width||e.width,o=this._options.height||e.height;if(this.fb){if(s<=0)s=8;if(o<=0)o=8;if(this.fb.getWidth()!=s||this.fb.getHeight()!=o)this.fb.setSize(s,o)}else{let e=CGL.Texture.FILTER_LINEAR;let t=CGL.Texture.WRAP_CLAMP_TO_EDGE;if(this._options.isFloatingPointTexture)e=CGL.Texture.FILTER_NEAREST;if(this._options.hasOwnProperty("filter"))e=this._options.filter;if(this._options.hasOwnProperty("wrap"))t=this._options.wrap;const l={isFloatingPointTexture:this._options.isFloatingPointTexture,pixelFormat:this._options.pixelFormat,numRenderBuffers:this._options.numRenderBuffers||1,filter:e,wrap:t};if(a.glVersion==1)this.fb=new CGL.Framebuffer(a,s,o,l);else this.fb=new CGL.Framebuffer2(a,s,o,l)}a.frameStore.renderOffscreen=true;this.fb.renderStart(a);a.setTexture(0,e.tex);if(t)a.setTexture(1,t.tex);if(n)a.setTexture(2,n.tex);if(r)a.setTexture(3,r.tex);if(i)a.setTexture(4,i.tex);a.pushShader(this.bgShader);this.mesh.render(this.bgShader);a.popShader();this.fb.renderEnd();a.frameStore.renderOffscreen=false;return this.fb.getTextureColor()}dispose(){if(this.fb)this.fb.dispose();if(this.bgShader)this.bgShader.dispose();if(this.mesh)this.mesh.dispose()}}CGL.CopyTexture=se;((this.CGL=this.CGL||{}).COREMODULES=this.CGL.COREMODULES||{}).Copytexture=e.Copytexture})();
+//# sourceMappingURL=patch.js.map
\ No newline at end of file
diff --git a/src/cables-js/patch.js.map b/src/cables-js/patch.js.map
new file mode 100644
index 0000000..2382ec7
--- /dev/null
+++ b/src/cables-js/patch.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["0"],"names":["CABLES","exportedPatches","_id","ops","id","uiAttribs","portsIn","name","value","portsOut","links","portIn","portOut","objIn","objOut","objName","subPatch","storage","subPatchVer","blueprintVer","title","display","export","time","service","exportNumber","exportedPatch","OPS","Ops","Gl","Ui","Anim","Html","Math","Vars","Array","Patch","Number","String","Boolean","Devices","Trigger","Graphics","Extension","Matrix","Meshes","Shader","Deprecated","Textures","Compare","Mouse","PuvBp73","Browser","ImageCompose","Geometry","OpenType","Intersection","SubPatch2","Op","apply","this","arguments","op","attachments","inc_gen_ports_js","subpatch_json","initInnerPorts","addedOps","let","i","length","innerInput","innerOutput","patchId","SubPatchOp","subId","initializeSubpatch","p","JSON","parse","replaceOpIds","parentSubPatchId","prefixHash","oldIdAsRef","doNotUnlinkLostLinks","blueprintSubpatch2","patch","deSerialize","opsCreated","UI","gui","savedState","setSaved","emitEvent","setStorage","prototype","f","ParseInt_v2","str","inString","outNum","outNumber","onChange","num","parseInt","get","set","VarGetString","val","outString","varName","inValueSelect","VarGetOpWrapper","StringReplace","inStr","inSearch","inRepl","inWhat","inSwitch","outStr","update","setUiError","replace","RegExp","e","message","GreaterThan","number1","inValueFloat","number2","result","outBoolNum","setUiAttribs","mathTitle","exec","VarSetNumber_v2","inDropDown","VarSetOpWrapper","GateNumber","valueInPort","inValue","passThroughPort","inValueBool","inIfNot","inCustomNot","inFloat","valueOutPort","changeAlways","updateUi","greyout","SubPatchInput","goto","inTriggerButton","hidePort","onTriggered","parent","getSubPatchOuterOp","patchView","centerSelectOp","SubPatchOutput","MainLoop","fpsLimit","trigger","outTrigger","width","height","reduceFocusFPS","reduceLoadingFPS","clear","clearAlpha","fullscreen","active","hdpi","inUnit","onAnimFrame","render","cgl","pixelDensity","window","devicePixelRatio","updateSize","setLayout","removeOnAnimFrame","setUiAttrib","extendTitle","addOnAnimFrame","log","rframes","rframeStart","timeOutTest","addedListener","uiAttr","error","identTranslate","vec3","create","identTranslateView","updateFullscreenButton","setTimeout","fsElement","winhasFocus","winVisible","addEventListener","document","hidden","testMultiMainloop","mainloopOp","getFpsLimit","loading","getProgress","onMouseEnter","style","onMouseLeave","canvas","createElement","container","parentElement","appendChild","shiftKey","cycleFullscreen","fullScreen","padding","position","right","top","cursor","background","innerHTML","remove","onDelete","gl","clearColor","COLOR_BUFFER_BIT","DEPTH_BUFFER_BIT","aborted","clientWidth","clientHeight","cg","startTime","performance","now","config","canvasWidth","setCanvas","glCanvasId","canvasHeight","div","CGL","fpsReport","push","MESH","lastShader","lastMesh","renderStart","unBind","Texture","previewTexture","texturePreviewer","texturePreview","renderEnd","colorMask","frameStore","phong","profileData","profileMainloopMs","clearTimeout","getOpsByObjName","Sequence","exe","inTrigger","cleanup","resizable","resizableY","stretchPorts","exes","triggers","updateTimeout","connectedOuts","triggerAll","clean","hideParam","onLinkChanged","updateButton","newExe","updateConnected","show","isCurrentUiOp","refreshParams","count","removeLinks","j","otherPort","getOtherPort","link","Mouse_v3","inCoords","area","flipY","rightClickPrevDef","inBool","touchscreen","inPassive","outMouseX","outMouseY","mouseClick","mouseClickRight","mouseDown","mouseOver","outMovementX","outMovementY","normalize","listenerElement","sizeElement","addListeners","updateCoordNormalizing","removeListeners","on","onStart","console","setValue","x","y","w","h","xx","yy","clamp","checkHovering","r","getBoundingClientRect","clientX","left","clientY","onMouseDown","onMouseUp","onClickRight","preventDefault","onmouseclick","setCoords","offsetX","offsetY","onmousemove","movementX","movementY","ontouchmove","event","touches","ontouchstart","ontouchend","removeEventListener","body","passive","DeltaSum","inVal","defVal","inMul","inReset","inLimit","inMin","inMax","inRubber","outVal","setPortGroup","lastEvent","rubTimeout","updateLimit","resetValue","updateValue","v","max","min","releaseRubberband","rubber","minr","maxr","bind","aa","abs","PatchInput","dyn","addOutPort","Port","OP_PORT_TYPE_DYNAMIC","getPatchOp","mySubPatchOp","addNewInPort","newPortName","l","scene","getName","saveData","PatchOutput","addInPort","addNewOutPort","SubPatch","dynOut","dataStr","OP_PORT_TYPE_VALUE","data","ports","oldPatchId","generateUUID","getSubPatchInputOp","getSubPatchOutputOp","dataLoaded","init","isEditorMode","oldPatchOps","getSubPatchOps","DEFAULTOPS","isInBlueprint","undo","pause","deleteOp","resume","onLoaded","onLoadedValueSet","setupPorts","loadData","logError","stringify","addPortListener","newPort","newPortInPatch","hasSubpatchLstener","attribs","direction","PORT_DIR_IN","type","OP_PORT_TYPE_FUNCTION","isLinked","getPortByName","patchInputOp","ignoreValueSerialize","editableTitle","objType","newPortOut","patchOutputOp","newPortOutPatch","newName","o","removeLinkTo","patchOutputOP","getSubPatchOp","addOp","translate","warn","patchInputOP","addSubLink","p2","sublPortname","numOut","bounds","getSubPatchBounds","minx","miny","maxy","rebuildListeners","outop","Transform","posX","posY","posZ","scale","rotX","rotY","rotZ","setUiAxisPorts","toWorkPortsNeedToBeLinked","vPos","vScale","transMatrix","mat4","identity","doScale","doTranslate","translationChanged","scaleChanged","rotChanged","setRotChanged","setTranslateChanged","setScaleChanged","updateMatrix","updateTranslation","updateScale","doUpdateMatrix","pushModelMatrix","multiply","mMatrix","popModelMatrix","setTransform","setTransformGizmo","rotateX","DEG2RAD","rotateY","rotateZ","ClearColor","inFloatSlider","g","b","a","colorPick","MouseDrag","speed","inputType","outDeltaX","outDeltaY","outDragging","absoluteX","absoluteY","pressed","lastX","lastY","firstMove","updateArea","isHovering","onMouseMove","deltaX","deltaY","setPointerCapture","pointerId","_e","releasePointerCapture","lockChange","el","pointerLockElement","mozPointerLockElement","webkitPointerLockElement","removeListener","addListener","AttributeAsColorMaterial","normalsmaterial_frag","normalsmaterial_vert","inAttr","inAbs","inMulModel","outShader","outObject","shader","setSource","doRender","updateAttr","toggleDefine","pushShader","popShader","TriggerSend","updateName","doTrigger","updateVarNamesDropdown","varnames","vars","namedTriggers","values","ModalDialog","prompt","text","promptValue","promptOk","setTitle","arr","Area","inTitle","hasArea","setUnSaved","comment_title","VarGetNumber_v2","IntersectWorld","inTextCol","next","outCollisions","outArray","SHAPE_SPHERE","SHAPE_AABB","SHAPE_POINT","collisionWorld","bodies","testCollision","checkCollisions","bodyA","bodyB","dist","distance","pos","radius","body0","name0","body1","name1","bodyPoint","bodySphere","xd","yd","zd","sqrt","bodyBox","minX","maxX","minY","maxY","minZ","maxZ","bBox","bSphere","r2","dmin","dist_squared","collisions","c","setRef","IntersectTestRaycast","inX","inY","inZ","inToX","inToY","inToZ","inCursor","outHasHit","outName","outX","outY","outZ","oc","mat","dir","didsetCursor","isScreenCoords","origin","fromValues","mul","pMatrix","vMatrix","invert","transformMat4","to","sub","dot","foundDist","found","discriminant","add","t1","t2","t3","t4","t5","t6","tmin","tmax","IntersectBody","shapes","inArea","inName","inRadius","inSizeX","inSizeY","inSizeZ","inPositions","inArray","inPosIndex","empty","objs","obj","getCopyObj","indexOf","setBox","size","renderOverlay","shouldDrawHelpers","OverlayMeshes","drawSphere","drawCube","drawAxisMarker","posArr","objCopy","TriggerReceive","oldName","oldCbs","splice","cbs","updateError","Translate","z","vec","Repeat2d","numx","inValueInt","numy","center","idx","total","subX","subY","m","nx","ny","VarSetString_v2","Equals","Subtract","isNaN","Multiply","n1","n2","ArrayGetNumber","array","index","valueInvalid","outValidIndex","input","parseFloat","VarSetArray_v2","VarGetArray_v2","Array_v3","inLength","modeSelect","inDefaultValue","inReverse","outArr","outArrayLength","selectIndex","MODE_NUMBER","MODE_1_TO_4","MODE_0_TO_1","onFilterChange","reset","selectedMode","arrLength","valueForArray","reverse","Camera","projectionMode","zNear","zFar","fov","autoAspect","aspect","eyeX","eyeY","eyeZ","centerX","centerY","centerZ","outAsp","asp","vUp","vEye","vCenter","transMatrixMove","updateCameraMovementMatrix","shadowPass","getViewPort","pushViewMatrix","pushPMatrix","perspective","ortho","lookAt","popViewMatrix","popPMatrix","updateUI","cameraMovementChanged","OrbitControls","minDist","maxDist","minRotY","maxRotY","initialRadius","initialAxis","inValueSlider","initialX","smoothness","speedX","speedY","allowPanning","allowZooming","allowRotation","restricted","outRadius","outXDeg","outYDeg","eye","viewMatrix","tempViewMatrix","vOffset","finalEyeAbs","lastMouseX","lastMouseY","percX","percY","tempEye","finalEye","tempCenter","finalCenter","px","py","divisor","element","updateSmoothness","unbind","halfCircle","PI","fullCircle","off","circlePos","initializing","ip","goal","lastPy","lastPx","setElement","degY","degX","RAD2DEG","circlePosi","rotate","perc","mmul","degInRad","cos","sin","buttons","onMouseWheel","delta","getWheelSpeed","ele","BasicMaterial_v3","basicmaterial_frag","basicmaterial_vert","shaderOut","toWorkShouldNotBeChild","addAttribute","nameFrag","setModules","random","colUni","addUniformFrag","uniformColorDiffuse","diffuseTexture","inTexture","diffuseTextureUniform","updateDiffuseTexture","colorizeTexture","vertexColors","textureOpacity","textureOpacityUniform","alphaMaskSource","updateOpacity","texCoordAlpha","discardTransPxl","diffuseRepeatX","diffuseRepeatY","diffuseOffsetX","diffuseOffsetY","cropRepeat","doBillboard","updateDefines","preRender","popTextures","pushTexture","removeUniform","define","Uniform","removeDefine","hasDefine","hasTexture","notUsingColor","Ease","anim","createPort","updateAnimEasing","updateMinMax","keys","setEasing","defaultEasing","getValue","JsMemory","inExec","outUsed","outTotal","memory","usedJSHeapSize","totalJSHeapSize","Cylinder_v2","inRender","inDraw","inSegments","inStacks","inOuterRadius","inInnerRadius","inUVMode","flipSideMapping","inCaps","inFlat","outGeometry","geom","TAU","needsRebuild","mesh","buildMesh","flipTex","segments","innerRadius","outerRadius","stacks","defaultValue","stackLength","segmentRadians","uvMode","positions","normals","tangents","biTangents","texcoords","indices","d","slice","vertices","texCoords","vertexNormals","verticesIndices","unIndex","createMesh","opId","setGeom","getShader","dispose","MatCapMaterial_v3","matcap_frag","matcap_vert","textureMatcap","textureDiffuse","textureNormal","textureSpec","textureSpecMatCap","textureAo","pOpacity","aoIntensity","normalMapIntensity","repeatX","repeatY","ssNormals","calcTangents","uniOpacity","textureMatcapUniform","textureDiffuseUniform","textureNormalUniform","normalMapIntensityUniform","textureSpecUniform","textureSpecMatCapUniform","textureAoUniform","offsetUniform","repeatUniform","aoIntensityUniform","colorUniform","glVersion","getExtension","enableExtension","updateMatcap","defaultMatcapTex3","pixels","Uint8Array","initFromData","FILTER_LINEAR","WRAP_REPEAT","updateAlphaMaskMethod","checkUiErrors","tex","Texture_v2","filename","inUrl","tfilter","wrap","aniso","dataFrmt","flip","unpackAlpha","inFreeMemory","textureOut","outTexture","addCacheBust","ratio","loaded","loadedFilename","loadingId","cgl_filter","FILTER_MIPMAP","cgl_wrap","cgl_aniso","timedLoader","reloadSoon","onWrapChange","getEmptyTexture","delete","setTempTexture","t","getTempTexture","nocache","realReload","getPixelFormat","PFORMATSTR_R8UB","PFORMATSTR_RG8UB","PFORMATSTR_RGB8UB","PFORMATSTR_SRGBA8","PFORMATSTR_RGBA8UB","checkMainloopExists","finished","start","url","getFilePath","cacheBust","needsRefresh","fileToLoad","basename","addAssetLoadingTask","load","err","newTex","checkFrameStarted","getErrorTexture","image","anisotropic","pixelFormat","filter","FILTER_NEAREST","FILTER_ANISOTROPIC","WRAP_MIRRORED_REPEAT","WRAP_CLAMP_TO_EDGE","onFileChanged","fn","RenderToTexture_v3","inSize","twrap","msaa","texDepth","inPixelFormat","PIXELFORMATS","depth","fb","reInitFb","initFbLater","TextureEffect","checkOpNotInTextureEffect","selectedWrap","selectFilter","ms","msSamples","Framebuffer2","multisampling","multisamplingSamples","Framebuffer","isFloatingPointTexture","valid","getTextureDepth","setAspect","checkTextureSize","getWidth","getHeight","setSize","pushViewPort","popViewPort","getTextureColor","Rectangle_v4","pivotX","pivotY","axis","flipTcX","flipTcY","nColumns","nRows","geomOut","OP_PORT_TYPE_TRIGGER","AXIS_XY","AXIS_XZ","curAxis","rebuildLater","rebuild","numRows","round","numColumns","stepColumn","stepRow","tc","Float32Array","verts","norms","idxTc","idxVert","idxNorms","idxTangent","idxBiTangent","ind","v1","v2","v3","v4","TransformView","didScaleChanged","didRotChanged","transform3d","translateChanged","ScaleXYZViewMatrix","scaleX","scaleY","scaleZ","ScaleXYZ","hasChanged","execrender","Grid","inNum","inInt","inSpacing","inCenter","geomStepsOne","geomX","space","floor","end","setTexCoords","calculateNormals","Mesh","oldPrim","glPrimitive","LINES","FullscreenRectangle_v2","shader_frag","shader_vert","inScale","flipX","rebuildFlip","fullscreenRectUniform","aspectUni","useShader","updateShaderLater","fitImageAspect","updateShader","viewPort","rat","_h","_w","setTexture","xy","Uint16Array","GradientTexture","inGrad","inGradient","inDir","inSmoothstep","inStep","inFlip","inSRGB","inOklab","inGradArray","inRandom","outTex","outColors","outColorPos","timeout","editShortcut","parseKeys","forEach","key","newKeys","rgbToOklab","s","cbrt","oklabToRGB","L","rgb_r","rgb_g","rgb_b","lin2srgb","thr","c_loR","c_hiR","pow","updateGradient","isArray","grad","gradEditSmoothstep","gradEditStep","gradOklab","selectedFilter","keyA","keyB","map","smoothStep","klabA","labA_r","labA_g","labA_b","klabB","labB_r","labB_g","labB_b","pixCol","alpha","rpixels","dx","dy","colorArr","colorPosArr","CombineTextures","rgbe2fp_frag","inPixel","inTexR","inSrcR","inSrcRVal","inSrcRDefault","inTexG","inSrcG","inSrcGVal","inSrcGDefault","inTexB","inSrcB","inSrcBVal","inSrcBDefault","inTexA","inSrcA","inSrcAVal","inSrcADefault","currentSize","needsUpdate","unitexR","unitexG","unitexB","unitexA","uniFloatR","uniFloatG","uniFloatB","uniFloatA","getSize","sizes","biggest","smallest","MAX_TEXTURE_SIZE","initShader","CopyTexture","PFORMATSTR_RGBA32F","bgShader","copy","ImageCompose_v4","imgcomp_frag","inTex","inUVTex","inFilter","inWrap","texOut","outRatio","outWidth","outHeight","prevViewPort","effect","reInitEffect","isFloatTex","copyShader","copyShaderTexUni","copyShaderUVTexUni","copyShaderRGBAUni","reInitLater","initEffect","isPixelFormatFloat","maxAnisotropic","getFilter","getWrap","setSourceTexture","ceil","updateResolution","updateResolutionInfo","checkTypes","info","changed","isFloatingPoint","copyTexture","getDefaultVertexShader","currentTextureEffect","finish","pushBlend","oldEffect","imgCompVer","startEffect","endEffect","getCurrentSourceTexture","popBlend","FastBlur_v2","blur_frag","blur_vert","inPasses","mask","maskInvert","textureUniform","uniDirX","uniDirY","uniWidth","uniHeight","uniPass","uniAmount","textureAlpha","checkOpInEffect","numPasses","Vignette_v3","vignette_frag","blendMode","AddBlendSelect","maskAlpha","AddBlendAlphaMask","amount","strength","lensRadius1","sharp","amountUniform","uniLensRadius1","uniaspect","unistrength","unisharp","unir","setupBlending","TextMeshMSDF_v2","textmeshsdf_frag","textmeshsdf_vert","inFont","letterSpace","lineHeight","align","valign","doSDF","smoothing","inBorder","inBorderWidth","inBorderSmooth","br","bg","bb","inShadow","inTexColor","inTexMask","inPosArr","inScaleArr","inRotArr","inColors","outScales","outLines","outStartY","outNumChars","fontDataVarPrefix","substrLength","alignVec","fontTexs","fontData","fontChars","needUpdate","disabled","valignMode","heightAll","widthAll","avgHeight","needsUpdateTransmats","transMats","offY","uniTex","uniTex1","uniTex2","uniTex3","uniTexMul","uniTexMulMask","uniColor","uniColorBorder","uniTexSize","uniSmoothing","uniborderSmooth","uniborderWidth","setAttribute","instanced","updateAlign","updateFontList","updateFontData","varname","dataVar","getVar","textVar","chars","char","getVars","names","substr","undefined","buildTransMats","transformations","translates","scales","rots","numInstances","call","concat","generateMesh","getChar","chStr","_","X","theString","strings","split","tcOffsets","texPos","tcSizes","pages","charCounter","arrPositions","mulSize","txt","numChars","lineWidth","substring","xadvance","page","common","scaleW","scaleH","charWidth","charHeight","charOffsetY","yoffset","charOffsetX","xoffset","adv","Round","decPlaces","decm","updateDecm","NumberToString_v2","FontMSDF_v2","inUUID","uuid","urlData","urlTex","urlTex1","urlTex2","urlTex3","outLoaded","outBool","outChars","loadedData","loadedTex","textures","updateLoaded","oldUUID","deleteVar","varNameData","varNameTex","setVarValue","urlDatastr","ajax","_data","xhr","face","allChars","texPort","loadingIdTex","urlTexstr","Incrementor","increment","decrement","inMode","inDefault","outChanged","outRestarted","MODE_REWIND","MODE_STOP","mode","doReset","SmootherStep","StringCompose_v3","format","Circle_v3","percent","steps","invertSteps","mapping","drawSpline","calcLater","lastSegs","needsCalc","renderMesh","calc","LINE_STRIP","segs","faces","oldPosX","oldPosY","oldPosXTexCoord","oldPosYTexCoord","oldPosXIn","oldPosYIn","oldPosXTexCoordIn","oldPosYTexCoordIn","posxTexCoordIn","posyTexCoordIn","posxTexCoord","posyTexCoord","posx","posy","setPointVertices","buildFromFaces","numSteps","posxIn","posyIn","mapTexCoords2d","StringToArray_v2","inStringEditor","separator","toNumber","trim","splitNewLines","parsed","len","ignoreBigPort","textInput","sep","hasStrings","UTILS","isNumeric","ArrayGetString","VizArrayTable","inArr","inOffset","vizLayerMaxZoom","getCellValue","preview","renderVizLayer","ctx","layer","fillStyle","fillRect","save","font","stride","lines","offset","columnsWidth","columsPos","addUpPos","lineNum","fillText","gradHeight","radGrad","createLinearGradient","addColorStop","restore","TriggerOnChangeNumber","inval","number","DivElement_v3","inText","inId","inClass","inStyle","inInteractive","inVisible","inBreaks","inPropagation","outElement","outHover","outClicked","oldStr","prevDisplay","updateClass","updateText","updateStyle","updateInteractive","updateVisibility","warning","removeElement","getDocument","dataset","classList","removeClasses","parentNode","removeChild","setCSSVisible","visible","visibility","oldClassesStr","classes","oldClasses","onMouseClick","stopPropagation","enabled","StringEditor","syntax","updateSyntax","editorSyntax","CSS_v2","code","inActive","styleEle","eleId","addElement","getCssContent","css","blueprint","getAssetPath","getElementById","textContent","css_spinner","head","getElementsByTagName","TransformCSS3DElement","origins","inElement","inObject","inOrigin","sCSSMatrix","sScalingVector","oldEle","elProjection","querySelector","provide","zIndex","pointerEvents","perspectiveOrigin","join","view","css3did","self","DOMTokenList","pxfov","drawingBufferHeight","drawingBufferWidth","transform","removeProperties","CanvasInfo_v2","pixelRatio","widthPixel","heightPixel","landscape","outCanvasEle","outCanvasParentEle","Divide","CSSProperty_v2","inEle","inProperty","inValueSuffix","outEle","updateProperty","BoolToNumber_v2","useValue1Port","value0port","value1port","outValuePort","setOutput","useValue1","HyperLink_v2","inTarget","inSpecs","open","OpentypeFont","outFont","async","await","opentype","OpentypeToSvgPath","inLs","outPathStr","getPath","paths","getPaths","ls","commands","hasOwnProperty","x1","toPathData","SvgPathToGeometry_v2","inStepSize","inRescale","outGeom","cmds","fromPathToArray","polys","y1","x2","y2","Polygon","moveTo","cubicTo","conicTo","close","sort","root","inside","points","children","totalPoints","reduce","sum","vertexData","vertexCount","process","poly","coords","holes","child","earcut","finalVertexData","resc","setVertices","getBounds","flipVertDir","calcTangentsBitangents","PATH_COMMANDS","M","H","V","Z","C","S","Q","q","T","A","path","items","currentCommand","currentElement","it","shift","unshift","prop","MAX_BEZIER_STEPS","EPSILON","constructor","BEZIER_STEP_SIZE","lineTo","cur","cross","p1","p0","lerp","RenderGeometry_v2","geometry","inVertNums","isGeometry","addVertexNumbers","GeometryExtrude","inGeom","inHeight","inSmooth","inExtrudeWalls","inCapTop","inCapBottom","isClockwise","edgesUsedMulti","idx1","idx2","vert1","vert2","vert3","newGeom","merge","flippedgeo","flipNormals","forceZUp","Smooth","inDivisorUp","inDivisorDown","oldVal","lastTrigger","divisorUp","divisorDown","MODE_SINGLE","MODE_UP_DOWN","getDivisors","oldGoal","tm","diff","Infinity","MathExpression","inA","inB","inC","inD","inExpression","outResult","outExpressionIsValid","currentFunction","functionValid","createFunction","Function","evaluateFunction","ReferenceError","SyntaxError","GateArray_v2","arrayIn","passThrough","inIfNull","arrayOut","oldArr","copyArray","source","dest","ArraySetNumberAtIndex_v4","inIndex","srcArr","jsLoaded","Event","dispatchEvent","global","factory","exports","module","amd","codePointAt","defineProperty","object","$defineProperty","Object","TypeError","string","first","charCodeAt","second","configurable","writable","TINF_OK","TINF_DATA_ERROR","Tree","table","trans","Data","sourceIndex","tag","bitcount","destLen","ltree","dtree","sltree","sdtree","length_bits","length_base","dist_bits","dist_base","clcidx","code_tree","lengths","tinf_build_bits_base","bits","base","tinf_build_fixed_trees","lt","dt","offs","tinf_build_tree","tinf_getbit","bit","tinf_read_bits","tinf_decode_symbol","tinf_decode_trees","hlit","hdist","hclen","clen","sym","prev","tinf_inflate_block_data","tinf_inflate_uncompressed_block","invlength","tinf_uncompress","bfinal","btype","res","Error","subarray","tinyInflate","derive","v0","BoundingBox","NaN","isEmpty","addPoint","addX","addY","addBezier","x0","y0","p3","b2ac","addQuad","cp1x","cp1y","cp2x","cp2y","Path","fill","stroke","strokeWidth","curveTo","bezierCurveTo","quadTo","quadraticCurveTo","closePath","extend","pathOrCommands","box","getBoundingBox","startX","startY","prevX","prevY","cmd","draw","beginPath","strokeStyle","decimalPlaces","floatToString","toFixed","packValues","arguments$1","toSVG","svg","toDOMElement","temporaryPath","newPath","createElementNS","fail","argument","predicate","check","assert","LIMIT16","LIMIT32","decode","encode","sizeOf","constant","BYTE","CHAR","CHARARRAY","USHORT","SHORT","UINT24","ULONG","LONG","FIXED","FWORD","UFWORD","LONGDATETIME","TAG","Card8","Card16","OffSize","SID","NUMBER","NUMBER16","NUMBER32","REAL","toString","epsilon","nibbles","ii","out","i$1","ii$1","NAME","STRING","UTF8","numBytes","codePoints","getUint8","fromCharCode","UTF16","getUint16","codepoint","eightBitMacEncodings","x-mac-croatian","x-mac-cyrillic","x-mac-gaelic","x-mac-greek","x-mac-icelandic","x-mac-inuit","x-mac-ce","macintosh","x-mac-romanian","x-mac-turkish","MACSTRING","dataView","dataLength","encoding","macEncodingTableCache","WeakMap","macEncodingCacheKeys","getMacEncodingTable","cacheKey","cachedTable","decodingTable","encodingTable","isByteEncodable","encodeVarDeltaRunAsZeroes","deltas","runLength","numDeltas","encodeVarDeltaRunAsBytes","encodeVarDeltaRunAsWords","VARDELTAS","INDEX","offsets","OBJECT","encodedOffsets","offSize","offsetEncoder","encodedOffset","DICT","k","OPERAND","OPERATOR","OP","wmm","CHARSTRING","cachedValue","encodingFunction","sizeOfFunction","TABLE","fields","subtables","subtableOffsets","field","bytes","tableName","RECORD","LITERAL","Table","options","optionKeys","ushortList","itemName","list","tableList","records","itemCallback","recordList","Coverage","coverageTable","glyphs","ranges","RangeRecord","ScriptList","scriptListTable","scriptRecord","script","defaultLangSys","reqFeatureIndex","featureIndexes","langSysRecords","langSysRecord","langSys","FeatureList","featureListTable","featureRecord","feature","featureParams","lookupListIndexes","LookupList","lookupListTable","subtableMakers","lookupTable","subtableCallback","lookupType","lookupFlag","Record","getByte","getUShort","getShort","getInt16","getULong","getUint32","getFixed","decimal","fraction","getTag","getInt8","getOffset","getBytes","startOffset","endOffset","bytesToString","typeOffsets","byte","uShort","short","uLong","fixed","longDateTime","Parser","relativeOffset","parseByte","parseChar","parseCard8","parseUShort","parseCard16","parseSID","parseOffset16","parseShort","parseF2Dot14","parseULong","parseOffset32","parseFixed","parseString","parseTag","parseLongDateTime","parseVersion","minorBase","major","minor","skip","parseULongList","parseOffset16List","parseUShortList","parseShortList","parseByteList","parseList","parseList32","parseRecordList","recordDescription","rec","fieldName","fieldType","parseRecordList32","parseStruct","description","struct","parseValueRecord","valueFormat","valueRecord","xPlacement","yPlacement","xAdvance","yAdvance","xPlaDevice","yPlaDevice","xAdvDevice","yAdvDevice","parseValueRecordList","valueCount","parsePointer","structOffset","parsePointer32","parseListOfLists","subOffsets","subList","parseCoverage","parseClassDef","startGlyph","classId","list32","recordList32","pointer","pointer32","offset16","uShortList","offset32","uLongList","coverage","classDef","langSysTable","reserved","parseScriptList","parseFeatureList","parseLookupList","lookupTableParsers","useMarkFilteringSet","markFilteringSet","parseFeatureVariationsList","majorVersion","minorVersion","featureVariations","conditionSetOffset","featureTableSubstitutionOffset","getCard8","getCard16","parseCmapTableFormat12","cmap","language","groupCount","glyphIndexMap","startCharCode","endCharCode","startGlyphId","parseCmapTableFormat4","segCount","endCountParser","startCountParser","idDeltaParser","idRangeOffsetParser","glyphIndexOffset","glyphIndex","endCount","startCount","idDelta","idRangeOffset","parseCmapTable","version","numTables","platformId","encodingId","addSegment","addTerminatorSegment","makeCmapTable","isPlan0Only","unicode","cmapTable","glyph","unicodes","segCountToRemove","endCounts","startCounts","idDeltas","idRangeOffsets","glyphIds","cmap12Groups","segment","glyphId","segCountX2","searchRange","entrySelector","rangeShift","cmap4Length","cmap12Length","cmap12Offset","make","cffStandardStrings","cffStandardEncoding","cffExpertEncoding","standardNames","DefaultEncoding","charToGlyphIndex","CmapEncoding","CffEncoding","charset","charName","GlyphNames","post","numberOfGlyphs","glyphNameIndex","nameToGlyphIndex","glyphIndexToName","gid","addGlyphNamesAll","tables","charCodes","addUnicode","cffEncoding","isCIDFont","glyphNames","addGlyphNamesToUnicodeMap","_IndexToUnicodeMap","addGlyphNames","opt","lowMemory","line","getPathDefinition","_path","Glyph","bindConstructorValues","xMin","yMin","xMax","yMax","advanceWidth","fontSize","hPoints","xScale","yScale","hinting","getCommands","unitsPerEm","getContours","contours","currentContour","pt","lastPointOfContour","getMetrics","xCoords","yCoords","metrics","leftSideBearing","isFinite","rightSideBearing","drawPoints","drawCircles","arc","blueCircles","redCircles","drawMetrics","defineDependentProperty","externalName","internalName","newValue","enumerable","GlyphSet","_push","unicodeObj","_hmtxTableData","loader","glyphLoader","ttfGlyphLoader","parseGlyph","buildPath","cffGlyphLoader","parseCFFCharstring","charstring","glyphset","equals","calcCFFSubroutineBias","subrs","bias","parseCFFIndex","conversionFn","objects","objectOffset","offsetSize","parseCFFIndexLowMemory","getCffIndexObject","parseFloatOperand","parser","eof","lookup","parseOperand","b0","b1","b2","b3","b4","entriesToObject","entries","parseCFFDict","operands","getCFFString","interpretDict","dict","meta","newDict","parseCFFHeader","header","formatMajor","formatMinor","TOP_DICT_META","PRIVATE_DICT_META","parseCFFTopDict","byteLength","parseCFFPrivateDict","gatherCFFTopDicts","cffIndex","topDictArray","iTopDict","topDictData","DataView","buffer","topDict","_subrs","_subrsBias","_defaultWidthX","_nominalWidthX","privateSize","private","privateOffset","privateDict","defaultWidthX","nominalWidthX","subrOffset","subrIndex","_privateDict","parseCFFCharset","nGlyphs","sid","i$2","parseCFFEncoding","enc","nCodes","nRanges","nLeft","c1x","c1y","c2x","c2y","stack","nStems","haveWidth","subrsBias","fdIndex","cff","_fdSelect","fdDict","_fdArray","newContour","parseStems","hasWidthArg","codeIndex","subrCode","jpx","jpy","c3x","c3y","c4x","c4y","pop","gsubrsBias","gsubrs","parseCFFFDSelect","fdArrayCount","fdSelect","iGid","iRange","parseCFFTable","nameIndex","topDictIndex","stringIndex","globalSubrIndex","ros","fdArrayOffset","fdArray","fdSelectOffset","fdArrayIndex","numGlyphs","privateDictOffset","charStringsIndex","charStrings","charString","encodeString","makeHeader","makeNameIndex","fontNames","makeDict","attrs","entry","makeTopDict","makeTopDictIndex","topDicts","makeStringIndex","makeGlobalSubrIndex","makeCharsets","glyphName","glyphSID","glyphToOps","_13","_23","dx1","dy1","dx2","dy2","makeCharStringsIndex","makePrivateDict","makeCFFTable","fontScale","fullName","familyName","weight","weightName","fontBBox","fontMatrix","privateAttrs","postScriptName","charsets","parseHeadTable","fontRevision","checkSumAdjustment","magicNumber","flags","created","modified","macStyle","lowestRecPPEM","fontDirectionHint","indexToLocFormat","glyphDataFormat","makeHeadTable","timestamp","Date","getTime","createdTimestamp","parseHheaTable","hhea","ascender","descender","lineGap","advanceWidthMax","minLeftSideBearing","minRightSideBearing","xMaxExtent","caretSlopeRise","caretSlopeRun","caretOffset","metricDataFormat","numberOfHMetrics","makeHheaTable","parseHmtxTableAll","numMetrics","parseHmtxTableOnLowMemory","parseHmtxTable","makeHmtxTable","hmtx","makeLtagTable","tags","stringPool","stringPoolOffset","parseLtagTable","tableVersion","numTags","ltag","parseMaxpTable","maxp","maxPoints","maxContours","maxCompositePoints","maxCompositeContours","maxZones","maxTwilightPoints","maxStorage","maxFunctionDefs","maxInstructionDefs","maxStackElements","maxSizeOfInstructions","maxComponentElements","maxComponentDepth","makeMaxpTable","nameTableNames","macLanguages","0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23","24","25","26","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","47","48","49","50","51","52","53","54","55","56","57","58","59","60","61","62","63","64","65","66","67","68","69","70","71","72","73","74","75","76","77","78","79","80","81","82","83","84","85","86","87","88","89","90","91","92","93","94","128","129","130","131","132","133","134","135","136","137","138","139","140","141","142","143","144","145","146","147","148","149","150","151","macLanguageToScript","windowsLanguages","1078","1052","1156","1118","5121","15361","3073","2049","11265","13313","12289","4097","6145","8193","16385","1025","10241","7169","14337","9217","1067","1101","2092","1068","1133","1069","1059","2117","1093","8218","5146","1150","1026","1027","3076","5124","2052","4100","1028","1155","1050","4122","1029","1030","1164","1125","2067","1043","3081","10249","4105","9225","16393","6153","8201","17417","5129","13321","18441","7177","11273","2057","1033","12297","1061","1080","1124","1035","2060","3084","1036","5132","6156","4108","1122","1110","1079","3079","1031","5127","4103","2055","1032","1135","1095","1128","1037","1081","1038","1039","1136","1057","1117","2141","2108","1076","1077","1040","2064","1041","1099","1087","1107","1158","1159","1089","1111","1042","1088","1108","1062","1063","2094","1134","1071","2110","1086","1100","1082","1153","1146","1102","1148","1104","2128","1121","1044","2068","1154","1096","1123","1045","1046","2070","1094","1131","2155","3179","1048","1047","1049","9275","4155","5179","3131","1083","2107","8251","6203","7227","1103","7194","3098","6170","2074","1132","1074","1115","1051","1060","11274","16394","13322","9226","5130","7178","12298","17418","4106","18442","2058","19466","6154","15370","10250","20490","3082","1034","21514","14346","8202","2077","1053","1114","1064","2143","1097","1092","1098","1054","1105","1055","1090","1152","1058","1070","1056","2115","1091","1066","1106","1160","1157","1144","1130","getLanguageCode","platformID","languageID","utf16","macScriptEncodings","macLanguageEncodings","getEncoding","encodingID","parseNameTable","stringOffset","nameID","property","translations","langTagCount","reverseDict","makeNameRecord","findSubArray","needle","haystack","needleLength","limit","loop","addStringToPool","pool","makeNameTable","nameIDs","namesWithNumericKeys","nameTableIds","macLanguageIds","windowsLanguageIds","nameRecords","lang","macPlatform","macLanguage","macScript","macEncoding","macName","macNameOffset","winLanguage","winName","winNameOffset","_name","unicodeRanges","begin","getUnicodeRange","range","parseOS2Table","os2","xAvgCharWidth","usWeightClass","usWidthClass","fsType","ySubscriptXSize","ySubscriptYSize","ySubscriptXOffset","ySubscriptYOffset","ySuperscriptXSize","ySuperscriptYSize","ySuperscriptXOffset","ySuperscriptYOffset","yStrikeoutSize","yStrikeoutPosition","sFamilyClass","panose","ulUnicodeRange1","ulUnicodeRange2","ulUnicodeRange3","ulUnicodeRange4","achVendID","fsSelection","usFirstCharIndex","usLastCharIndex","sTypoAscender","sTypoDescender","sTypoLineGap","usWinAscent","usWinDescent","ulCodePageRange1","ulCodePageRange2","sxHeight","sCapHeight","usDefaultChar","usBreakChar","usMaxContent","makeOS2Table","parsePostTable","italicAngle","underlinePosition","underlineThickness","isFixedPitch","minMemType42","maxMemType42","minMemType1","maxMemType1","nameLength","makePostTable","subtableParsers","parseLookup1","substFormat","deltaGlyphId","substitute","parseLookup2","sequences","parseLookup3","alternateSets","parseLookup4","ligatureSets","ligGlyph","components","lookupRecordDesc","sequenceIndex","lookupListIndex","parseLookup5","ruleSets","glyphCount","substCount","lookupRecords","classSets","coverages","parseLookup6","chainRuleSets","backtrack","lookahead","backtrackClassDef","inputClassDef","lookaheadClassDef","chainClassSet","backtrackCoverage","inputCoverage","lookaheadCoverage","parseLookup7","extensionLookupType","extensionParser","extension","parseLookup8","substitutes","parseGsubTable","scripts","features","lookups","variations","makeLookup1","subtable","makeLookup2","sequenceSet","makeLookup3","alternateSet","makeLookup4","ligatureSet","ligature","makeLookup6","returnTable","chainRuleSet","chainRule","tableData","record","returnTable$1","makeGsubTable","gsub","parseMetaTable","numDataMaps","dataOffset","makeMetaTable","log2","computeCheckSum","makeTableRecord","checkSum","makeSfntTable","sfnt","highestPowerOf2","recordFields","tableFields","tableLength","tableRecord","r1","metricsForChar","notFoundMetrics","average","vs","fontToSfntTable","xMins","yMins","xMaxs","yMaxs","advanceWidths","leftSideBearings","rightSideBearings","firstCharIndex","lastCharIndex","globals","advanceWidthAvg","maxLeftSideBearing","headTable","hheaTable","maxpTable","os2Table","assign","hasChar","hmtxTable","englishFamilyName","getEnglishName","englishStyleName","englishFullName","n","uniqueID","en","preferredFamily","fontFamily","preferredSubfamily","fontSubfamily","languageTags","nameTable","ltagTable","postTable","cffTable","metaTable","metas","sfntTable","checkSumAdjusted","fontToTable","searchTag","imin","imax","imid","binSearch","Layout","getTable","layout","createDefaultTable","getScriptNames","getDefaultScriptName","hasLatn","getScriptTable","scr","getLangSysTable","scriptTable","getFeatureTable","featIndexes","allFeatures","params","getLookupTables","featureTable","allLookups","getGlyphClass","classDefTable","getCoverageIndex","expandCoverage","Position","defaultKerningTables","getKerningTables","getKerningValue","kerningLookups","leftIndex","rightIndex","covIndex","posFormat","pairSet","pairSets","pair","secondGlyph","value1","class1","classDef1","class2","classDef2","pair$1","classRecords","gpos","Substitution","arraysEqual","ar1","ar2","getSubstFormat","defaultSubtable","getSingle","substitutions","lookupTables","by","getMultiple","replacements","getAlternates","alternates","getLigatures","ligatures","ligSet","lig","addSingle","substitution","coverageGlyph","addMultiple","addAlternate","addLigature","ligComponents","ligatureTable","getFeature","test","isBrowser","nodeBufferToArrayBuffer","ab","ArrayBuffer","arrayBufferToNodeBuffer","Buffer","checkArgument","expression","parseGlyphCoordinate","flag","previousValue","shortVectorBitMask","sameBitMask","numberOfContours","_xMin","_yMin","_xMax","_yMax","endPointIndices","instructionLength","instructions","numberOfCoordinates","repeatCount","point","i$3","onCurve","i$4","i$5","isComposite","moreComponents","component","scale01","scale10","matchedPoints","i$6","transformPoints","newPoints","newPt","contourIndex","contour","curr","prev2","next2","componentGlyph","transformedPoints","firstPt","secondPt","parseGlyfTableAll","loca","nextOffset","parseGlyfTableOnLowMemory","parseGlyfTable","glyf","instructionTable","execGlyph","execComponent","Hinting","_fpgmState","_prepState","_errorState","roundOff","roundToGrid","sign","roundToDoubleGrid","roundToHalfGrid","roundUpToGrid","roundDownToGrid","roundSuper","period","srPeriod","phase","srPhase","threshold","srThreshold","trunc","xUnitVector","o1","o2","xo","interpolate","rp1","rp2","pv","do1","do2","doa1","doa2","dm1","dm2","setRelative","normalSlope","NEGATIVE_INFINITY","rp","org","rpx","rpy","yo","rpdx","rpdy","slope","touch","xTouched","touched","untouch","yUnitVector","POSITIVE_INFINITY","yTouched","freeze","UnitVector","pvns","fvs","getUnitVector","HPoint","prevPointOnContour","nextPointOnContour","preventExtensions","nextTouched","prevTouched","HPZero","defaultState","cvCutIn","deltaBase","deltaShift","minDis","autoFlip","State","env","prog","zp0","zp1","zp2","rp0","fv","dpv","ppem","prepState","fpgmState","fpgm","funcs","DEBUG","step","prep","oCvt","cvt","gZone","state","gz","cc","pi","gLen","inhibitGridFit","z0","z1","z2","pLen","cp","sp","np","ins","initTZone","tZone","handleElse","nesting","SVTCA","SPVTCA","SFVTCA","SPVTL","p2i","p1i","SFVTL","SPVFS","SFVFS","GPV","GFV","SFVTPV","ISECT","pa0i","pa1i","pb0i","pb1i","pa0","pa1","pb0","pb1","x3","y3","x4","y4","f1","f2","SRP0","SRP1","SRP2","SZP0","SZP1","SZP2","SZPS","SLOOP","RTG","RTHG","SMD","ELSE","JMPR","SCVTCI","DUP","POP","CLEAR","SWAP","DEPTH","LOOPCALL","cip","cprog","CALL","CINDEX","MINDEX","FDEF","ipBegin","MDAP","IUP","pp","SHP","rpi","SHC","ci","SHZ","SHPIX","IP","rp1i","rp2i","MSIRP","ALIGNRP","rp0i","RTDG","MIAP","cv","NPUSHB","NPUSHW","WS","store","RS","WCVTP","RCVT","cvte","GC","MD","pi2","pi1","MPPEM","FLIPON","LT","e2","e1","LTEQ","GT","GTEQ","EQ","NEQ","ODD","EVEN","IF","EIF","AND","OR","NOT","DELTAP123","ds","arg","appem","mag","SDB","SDS","ADD","SUB","DIV","MUL","ABS","NEG","FLOOR","CEILING","ROUND","WCVTF","DELTAC123","SROUND","S45ROUND","ROFF","RUTG","RDTG","SCANCTRL","SDPVTL","GETINFO","sel","ROLL","MAX","MIN","SCANTYPE","INSTCTRL","ignoreCvt","PUSHB","PUSHW","MDRP_MIRP","indirect","setRp0","keepD","ro","md","od","Token","activeState","ContextRange","startIndex","contextName","ContextChecker","checkStart","checkEnd","openRange","ContextParams","context","currentIndex","current","eventId","subscribers","initializeCoreEvents","events","this$1","coreEvents","subscribe","requiresContextUpdate","updateContextsRanges","Tokenizer","tokens","registeredContexts","contextCheckers","registeredModifiers","setState","getState","stateId","inboundIndex","composeRUD","RUDs","silent","RUD","hasFAILObject","every","FAIL","report","dispatch","replaceRange","isTokenType","token","replaced","replaceToken","removeRange","removeToken","insertToken","tokenType","registerModifier","modifierId","condition","modifier","newToken","contextParams","conditionParams","canApplyModifier","modifierParams","newStateValue","eventHandler","unsubscribe","subsId","setCurrentIndex","rangeToText","getRangeTokens","getText","getContext","eventName","args","subscriber","registerContextChecker","contextStartCheck","contextEndCheck","endIndex","getContextRanges","resetContextsRanges","runContextCheck","setEndOffset","rangeId","contextChecker","tokenize","from","isArabicChar","isIsolatedArabicChar","isTashkeelArabicChar","isLatinChar","isWhiteSpace","FeatureQuery","SubstitutionAction","action","lookupCoverage","singleSubstitutionFormat1","substituteIndex","singleSubstitutionFormat2","lookupCoverageList","coverageList","lookupList","lookupIndex","chainingSubstitutionFormat3","lookupsCount","inputLookups","lookaheadOffset","lookaheadContext","lookaheadParams","lookaheadLookups","backtrackContext","backtrackParams","backtrackLookups","contextRulesMatch","lookupRecord","getLookupByIndex","subtable$1","getLookupMethod","substitutionType","getSubstitutionType","ligatureSubstitutionFormat1","ligSetIndex","lookaheadItem","decompositionSubstitutionFormat1","getDefaultScriptFeaturesIndexes","getScriptFeaturesIndexes","scriptTag","mapTagsToFeatures","getScriptFeatures","featuresIndexes","lookupFeature","query","getFeatureLookups","getLookupSubtables","substType","supports","supportedScript","supportedFeature","some","scriptFeatures","arabicWordStartCheck","prevChar","arabicWordEndCheck","nextChar","arabicWordCheck","startCheck","endCheck","arabicSentenceStartCheck","arabicSentenceEndCheck","nextIsWhitespace","arabicCharAhead","arabicSentenceCheck","singleSubstitutionFormat1$1","singleSubstitutionFormat2$1","chainingSubstitutionFormat3$1","subst","ligatureSubstitutionFormat1$1","compsCount","SUBSTITUTIONS","applySubstitution","willConnectPrev","charContextParams","isolated","tashkeel","willConnectNext","arabicPresentationForms","featuresTags","tokenizer","CONNECT","getContextParams","arabicRequiredLigatures","latinWordStartCheck","latinWordEndCheck","latinWordCheck","getContextParams$1","latinLigature","Bidi","baseDir","setText","contextChecks","checkId","tokenizeText","reverseArabicSentences","rangeTokens","registerFeatures","supportedTags","applyFeatures","checkGlyphIndexStatus","applyArabicPresentationForms","applyArabicRequireLigatures","applyLatinLigatures","checkContextReady","contextId","applyFeaturesToContexts","processText","getBidiText","getTextGlyphs","indexes","deleted","Font","styleName","designer","designerURL","manufacturer","manufacturerURL","license","licenseURL","copyright","trademark","weightClass","usWeightClasses","MEDIUM","widthClass","usWidthClasses","fsSelectionValues","REGULAR","supported","_hinting","outlinesFormat","charToGlyph","updateFeatures","defaultRenderOptions","stringToGlyphs","bidi","charToGlyphIndexMod","notdef","nameToGlyph","leftGlyph","rightGlyph","gposKerning","kerningPairs","kerning","forEachGlyph","callback","kerningValue","letterSpacing","tracking","fullPath","gX","gY","gFontSize","glyphPath","glyphPaths","getAdvanceWidth","validate","_this","assertNamePresent","englishName","toTables","toBuffer","toArrayBuffer","intArray","download","fileName","arrayBuffer","URL","webkitURL","blob","Blob","href","createObjectURL","createEvent","initEvent","fs","require","writeFileSync","ITALIC","UNDERSCORE","NEGATIVE","OUTLINED","STRIKEOUT","BOLD","USER_TYPO_METRICS","WWS","OBLIQUE","ULTRA_CONDENSED","EXTRA_CONDENSED","CONDENSED","SEMI_CONDENSED","SEMI_EXPANDED","EXPANDED","EXTRA_EXPANDED","ULTRA_EXPANDED","THIN","EXTRA_LIGHT","LIGHT","NORMAL","SEMI_BOLD","EXTRA_BOLD","BLACK","addName","nameString","nameKey","makeFvarAxis","minValue","maxValue","parseFvarAxis","makeFvarInstance","inst","axes","axisTag","coordinates","parseFvarInstance","makeFvarTable","fvar","instances","offsetToData","parseFvarTable","axisCount","axisSize","instanceCount","instanceSize","instanceStart","attachList","attachPoints","caretValue","coordinate","pointindex","ligCaretList","ligGlyphs","markGlyphSets","parseGDEFTable","gdef","markAttachClassDef","subtableParsers$1","posformat","valueFormat1","valueFormat2","value2","class1Count","class2Count","parseLookup9","parseGposTable","subtableMakers$1","makeGposTable","parseWindowsKernTable","pairs","subtableVersion","nPairs","parseMacKernTable","nTables","parseKernTable","kern","parseLocaTable","shortVersion","parseFn","glyphOffsets","glyphOffset","loadFromFile","readFile","loadFromUrl","request","XMLHttpRequest","responseType","onload","response","statusText","onerror","send","parseOpenTypeTableEntries","tableEntries","checksum","compression","parseWOFFTableEntries","compLength","origLength","compressedLength","uncompressTable","tableEntry","inBuffer","outBuffer","parseBuffer","signature","flavor","cffTableEntry","fvarTableEntry","glyfTableEntry","gdefTableEntry","gposTableEntry","gsubTableEntry","hmtxTableEntry","kernTableEntry","locaTableEntry","nameTableEntry","metaTableEntry","locaTable","locaOffsets","glyfTable","kernTable","gdefTable","gposTable","gsubTable","fvarTable","isNode","loadFn","isUrl","Promise","resolve","reject","loadSync","readFileSync","__proto__","_parse","default","u","holeIndices","dim","hasHoles","outerLen","outerNode","linkedList","triangles","invSize","eliminateHoles","earcutLinked","clockwise","last","signedArea","insertNode","removeNode","filterPoints","again","steiner","ear","pass","indexCurve","stop","isEarHashed","isEar","cureLocalIntersections","splitEarcut","pointInTriangle","minTX","minTY","maxTX","maxTY","zOrder","prevZ","nextZ","intersects","locallyInside","isValidDiagonal","splitPolygon","queue","getLeftmost","compareX","eliminateHole","hole","bridge","findHoleBridge","bridgeReverse","filteredBridge","hx","hy","qx","mx","my","tanMin","tan","sectorContainsSector","sortLinked","tail","numMerges","pSize","qSize","leftmost","ax","ay","bx","cx","cy","intersectsPolygon","middleInside","q1","q2","o3","o4","onSegment","a2","Node","an","bp","deviation","polygonArea","trianglesArea","flatten","dimensions","holeIndex","__webpack_exports__","CONSTANTS","ANIM","EASINGS","EASING_LINEAR","EASING_ABSOLUTE","EASING_SMOOTHSTEP","EASING_SMOOTHERSTEP","EASING_CUBICSPLINE","EASING_CUBIC_IN","EASING_CUBIC_OUT","EASING_CUBIC_INOUT","EASING_EXPO_IN","EASING_EXPO_OUT","EASING_EXPO_INOUT","EASING_SIN_IN","EASING_SIN_OUT","EASING_SIN_INOUT","EASING_BACK_IN","EASING_BACK_OUT","EASING_BACK_INOUT","EASING_ELASTIC_IN","EASING_ELASTIC_OUT","EASING_BOUNCE_IN","EASING_BOUNCE_OUT","EASING_QUART_IN","EASING_QUART_OUT","EASING_QUART_INOUT","EASING_QUINT_IN","EASING_QUINT_OUT","EASING_QUINT_INOUT","OP_PORT_TYPE_NUMBER","OP_PORT_TYPE_OBJECT","OP_PORT_TYPE_TEXTURE","OP_PORT_TYPE_ARRAY","OP_PORT_TYPE_STRING","OP_VERSION_PREFIX","PORT","PORT_DIR_OUT","PACO","PACO_CLEAR","PACO_VALUECHANGE","PACO_OP_DELETE","PACO_UNLINK","PACO_LINK","PACO_LOAD","PACO_OP_CREATE","PACO_OP_ENABLE","PACO_OP_DISABLE","PACO_UIATTRIBS","PACO_VARIABLES","PACO_TRIGGERS","PACO_PORT_SETVARIABLE","PACO_PORT_SETANIMATED","PACO_PORT_ANIM_UPDATED","PACO_DESERIALIZE","valuePort","varNamePort","triggerPort","nextPort","_valuePort","_varNamePort","_op","_type","_typeId","_triggerPort","_nextPort","_btnCreate","_createVar","_helper","inUiTriggerButtons","which","CMD","PATCH","renameVariable","_updateVarNamesDropdown","_updateName","_renameVar","_isTexture","_setVarValue","_updateErrorUi","hasUiErrors","vari","hasVar","_updateDisplay","createVariable","perf","uiProfiler","oldname","newname","triggered","_arr","_cgl","varnamePort","_varnamePort","_variable","_valueOutPort","_listenerId","_updateTitle","_changeVar","_init","variable","_setValueOut","COREMODULES","Vargetset","Cables","subpatchInputOpName","subpatchOutputOpName","subPatchOp","parentOfSubpatch","createInOutOps","loadDependencies","serverOps","loadProjectDependencies","clearSubPatchCache","isExposableSubpatchOp","Subpatchop","Logger","initiator","_logs","groupCollapsed","groupEnd","verbose","logFilter","shouldPrint","logSilent","userInteraction","float32Concat","getShortOpName","fullname","contains","shuffleArray","seededRandom","temp","_shortIds","_shortId","shortId","_uuid","cleanJson","objValue","_prefixedHash","prefix","hash","character","prefixedHash","simpleIdCounter","simpleId","smootherStep","_oldMin","_oldMax","_newMin","_newMax","_easing","reverseInput","oldMin","oldMax","reverseOutput","newMin","newMax","portion","randomSeed","setRandomSeed","seed","rnd","endl","startsWith","endsWith","suffix","match","searchStr","src","dst","parts2","logStack","parts","ajaxSync","cb","method","contenttype","sync","jsonP","headers","requestOptions","credentials","asynch","onreadystatechange","readyState","status","responseText","toUpperCase","msg","setRequestHeader","withCredentials","keyCodeToName","keyCode","112","113","114","115","116","117","118","119","120","121","122","123","224","base64Chars","_base64lookup","base64lookup","b64encTypesArray","arraybuffer","base64","b64decTypedArray","bufferLength","encoded1","encoded2","encoded3","encoded4","_first","_wireMesh","_max","MAX_VALUE","_min","_center","_size","_maxAxis","maxAxis","applyPos","calcCenterSize","mulMat4","WireCube","_log","faceVertCount","_attributes","_vertices","morphTargets","att","getAttribute","getAttributes","itemSize","attrType","attr","copyAttribute","newgeom","calcNormals","smooth","getNumTriangles","newInd","isIndexed","oldIndizesLength","vertLength","calcNormal","triangle","subtract","getVertexVec","nn","faceNormals","vv","texCoordLength","triangleCount","tempVertices","w1","vec2","w2","w3","sdir","tdir","tri","i1","i2","i3","s1","s2","normal","tempVert","bitan","temp1","temp2","crossPd","normalized","vert","_dp","reIndex","dontCalcNormals","newVerts","newIndizes","na","calcBarycentric","barycentrics","vertX","vertY","getInfoOneLine","getInfo","numFaces","numVerts","numNormals","numTexCoords","numTangents","numBiTangents","numVertexColors","numAttribs","optimize","iv","json2geom","jsonMesh","colors","bitangents","texturecoords","vertices_b64","normals_b64","tangents_b64","bitangents_b64","texturecoords_b64","faces_b64","Uint32Array","EventTarget","_eventCallbacks","_logName","_logEvents","_listeners","idPrefix","hasEventListener","hasListenerForEventName","logEvents","param1","param2","param3","param4","param5","param6","constants_CONSTANTS","Key","cbTriggered","cubicSpline","key1","key2","previousPoint","previousTangent","bezTangOut","nextPoint","nextTangent","bezTangIn","easeCubicSpline","linear","easeLinear","easeAbsolute","easeExpoIn","easeExpoOut","easeExpoInOut","easeSinIn","easeSinOut","easeSinInOut","easeCubicIn","easeInQuint","easeOutQuint","easeInOutQuint","easeInQuart","easeOutQuart","easeInOutQuart","bounce","easeInBounce","easeOutBounce","easeInElastic","asin","easeOutElastic","easeInBack","easeOutBack","easeInOutBack","easeCubicOut","easeCubicInOut","easeSmoothStep","easeSmootherStep","ease","EASING_ELASTIC_INOUT","easeElasticInOut","getSerialized","getEasing","cfg","stayInTimeline","_lastKeyIndex","_cachedIndex","onLooped","_timesLooped","_needsSort","forceChangeCallback","getLoop","setLoop","target","hasEnded","isRising","ki","getKeyIndex","clearBefore","_updateLastIndex","sortKeys","getLength","setKeyEasing","getKey","getNextKey","isFinished","isStarted","currentLoop","index2","_warn","addKey","easingFromString","port","slerpQuaternion","animx","animy","animz","animw","quat","key1Time","key2Time","slerp","___op","_oldAnimVal","_uiActiveState","crashed","_valueBeforeLink","_lastAnimFrame","_animated","onValueChanged","onUiActiveStateChange","forceRefChange","_useVariableName","activityCounter","apf","activityCounterStartFrame","_tempLastUiValue","copyLinkedUiAttrib","getUiAttrib","getValueForDisplay","onAnimToggle","_onAnimToggle","removePort","newAttribs","indexPort","group","getUiAttribs","attribName","getFrameNum","timer","forceChange","ex","_v","showOpCrash","onError","updateTexturePort","updateAnim","_activity","getTypeString","deSerializeSettings","objPort","animated","setAnimated","useVariable","setVariableName","expose","order","multiPortNum","_hasAnimPort","ani","setInitialValue","preservedPortLinks","lobj","_addLink","preservedPortValues","preserveLinks","ignoreInSerialize","otherp","isInBlueprint2","shouldLink","removeLink","checkLinkTimeWarnings","getTitle","addLink","getLinkTo","isLinkedTo","linksLength","portTriggered","pushTriggerStack","_onTriggered","popTriggerStack","activity","execute","goals","getVariableName","setVariable","_variableIn","_varChangeListenerId","variableName","_handleNoTriggerOpAnimUpdates","hasTriggerPort","_notriggerAnimUpdate","isAnimated","toggleAnim","getType","isBoundToVar","boundToVar","isHidden","updateAnims","_onSetProfiling","profiler","_onTriggeredProfiling","getUiActiveState","setUiActiveState","onoff","onValueChange","portTypeNumberToString","CgUniform","__shader","__type","__name","_value","_port2","_port3","_port4","_structUniformName","_structName","_propertyName","_shader","_oldValue","_port","_addUniform","shaderType","comment","setValueF","updateValueF","setValueArrayF","updateValueArrayF","setValueArray2F","updateValueArray2F","setValueArray3F","updateValueArray3F","setValueArray4F","updateValueArray4F","setValueI","updateValueI","setValue2I","updateValue2I","setValue3I","updateValue3I","setValue4I","updateValue4I","setValueBool","updateValueBool","setValue4F","updateValue4F","setValue3F","updateValue3F","setValue2F","updateValue2F","setValueT","updateValueT","setValueArrayT","updateValueArrayT","setValueM4","updateValueM4","updateFromPort4f","updateFromPort3f","updateFromPort2f","updateFromPort","getShaderType","isStructMember","cg_uniform","super","_loc","newShader","uni","getGlslTypeString","glslTypeString","_isValidLoc","resetLoc","bindTextures","getLoc","getCgl","getUniformLocation","getProgram","uniform1f","profileUniformCount","uniform1i","profileShaderGetUniform","profileShaderGetUniformName","uniform2i","uniform3i","uniform4i","vec4","uniform4fv","uniform3fv","uniform2fv","uniform1fv","uniform3f","uniform2f","uniform4f","uniformMatrix4fv","uniform1iv","SHADER","SHADERVAR_VERTEX_POSITION","SHADERVAR_VERTEX_NUMBER","SHADERVAR_VERTEX_NORMAL","SHADERVAR_VERTEX_TEXCOORD","SHADERVAR_INSTANCE_MMATRIX","SHADERVAR_VERTEX_COLOR","SHADERVAR_INSTANCE_INDEX","SHADERVAR_UNI_PROJMAT","SHADERVAR_UNI_VIEWMAT","SHADERVAR_UNI_MODELMAT","SHADERVAR_UNI_NORMALMAT","SHADERVAR_UNI_INVVIEWMAT","SHADERVAR_UNI_INVPROJMAT","SHADERVAR_UNI_MATERIALID","SHADERVAR_UNI_OBJECTID","SHADERVAR_UNI_VIEWPOS","BLEND_MODES","BLEND_NONE","BLEND_NORMAL","BLEND_ADD","BLEND_SUB","BLEND_MUL","cgl_constants_CONSTANTS","MATH","extendMeshWithFeedback","hasFeedbacks","_feedBacks","removeFeedbacks","_feedbacks","_feedBacksChanged","setAttributeFeedback","setFeedback","attrib","nameOut","initialArr","unBindFeedbacks","deleteBuffer","createBuffer","bindBuffer","ARRAY_BUFFER","bufferData","STATIC_DRAW","bindFeedback","_transformFeedBackLoc","createTransformFeedback","bindTransformFeedback","TRANSFORM_FEEDBACK","bindBufferBase","TRANSFORM_FEEDBACK_BUFFER","drawFeedbacks","prim","setFeedbackNames","compile","beginTransformFeedback","drawArrays","numItems","endTransformFeedback","feedBacksSwapBuffers","__geom","_options","_bufVertexAttrib","_bufVerticesIndizes","_indexType","UNSIGNED_SHORT","_attribLocs","_geom","_lastShader","_numInstances","_glPrimitive","_preWireframeGeom","feedBackAttributes","_lastAttrUpdate","memFreed","addHeavyEvent","_queryExt","setNumInstances","freeMem","floatArray","updateVertices","_numVerts","setAttributePointer","attrName","loc","setAttributeRange","profileMeshAttributes","profileSingleMeshAttribute","_resizeAttr","bufferSubData","_bufferArray","debugOneFrame","profileNonTypedAttrib","profileNonTypedAttribNames","arrayLength","DYNAMIC_DRAW","updateAttribute","FLOAT","startItem","updateTexCoords","tcBuff","updateNormals","_setVertexNumbers","_verticesNumbers","uniformNumVertices","setVertexIndices","vertIndices","ELEMENT_ARRAY_BUFFER","vertIndicesTyped","UNSIGNED_INT","removeRef","profileMeshSetGeom","_disposeAttributes","geomAttribs","attribAssoc","_preBind","_checkAttrLengths","_bind","isValid","attrLocs","lastCompile","attribute","_attrLocationLastShaderTime","glGetAttribLocation","profileAttrLoc","enableVertexAttribArray","vertexAttribPointer","vertexAttribDivisor","disableVertexAttribArray","meshChanged","printDebug","setNumVertices","getNumVertices","wireframe","needsBind","TRIANGLES","elementDiv","doQuery","doProfileGlQuery","queryStarted","queryProfilerData","glQueryData","shaderOp","meshOp","_drawQuery","available","getQueryParameter","QUERY_RESULT_AVAILABLE","elapsedNanos","QUERY_RESULT","currentTimeGPU","_times","_numcount","when","createQuery","beginQuery","TIME_ELAPSED_EXT","drawArraysInstanced","drawElements","drawElementsInstanced","getError","NO_ERROR","attribNames","getProgramParameter","ACTIVE_ATTRIBUTES","getActiveAttrib","profileMeshNumElements","profileMeshDraw","endQuery","printError","indexArr","MESHES","getSimpleRect","getSimpleCube","_useDefaultShader","numRenderBuffers","vertexShader","ignoreMissingUniforms","tex1","tex2","tex3","tex4","renderOffscreen","Copytexture"],"mappings":"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,EAAG,EACHC,EAAG,EACHC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,EACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,GACJC,GAAI,GACJC,GAAI,GACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,GAAI,EACJC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,GACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,GACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,IAAK,EACLC,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O,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,IAAM,EAC3B,CAACgvD,MAAO,KAAQhvD,IAAK,KAAM,EAC3B,CAACgvD,MAAO,MAAQhvD,IAAK,KAAM,EAC3B,CAACgvD,MAAO,MAAQhvD,IAAK,KAAM,EAC3B,CAACgvD,MAAO,MAAQhvD,IAAK,KAAM,EAC3B,CAACgvD,MAAO,MAAQhvD,IAAK,K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F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,CAAC,EACvC4gE,EAAU5/F,KAAKg/B,UAAW,EAAG,EAAG,EAAG,EAAG,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"}
\ No newline at end of file
diff --git a/src/cables-ui.js b/src/cables-ui.js
new file mode 100644
index 0000000..4c7bbc9
--- /dev/null
+++ b/src/cables-ui.js
@@ -0,0 +1,10 @@
+// console.log( 'cables-ui loading' );
+
+// const myVar = globalThis.CABLES.patch.getVar("ui_dialValues");
+
+// if(myVar) {
+//     // will be called every time value changes
+//     myVar.on("change", (function(newValue) {
+//         console.log(newValue);
+//     }));
+// }
\ No newline at end of file
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..b0a33cf
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,7 @@
+
+import { mount } from 'svelte';
+import App from './App.svelte'
+
+const app = mount(App, { target: document.getElementById("app") });
+
+export default app;
diff --git a/src/DragBehavior.jsx b/src/previous-react-version/DragBehavior.jsx
similarity index 100%
rename from src/DragBehavior.jsx
rename to src/previous-react-version/DragBehavior.jsx
diff --git a/src/Interface.jsx b/src/previous-react-version/Interface.jsx
similarity index 100%
rename from src/Interface.jsx
rename to src/previous-react-version/Interface.jsx
diff --git a/src/Knob.jsx b/src/previous-react-version/Knob.jsx
similarity index 100%
rename from src/Knob.jsx
rename to src/previous-react-version/Knob.jsx
diff --git a/src/Lockup.svg b/src/previous-react-version/Lockup.svg
similarity index 100%
rename from src/Lockup.svg
rename to src/previous-react-version/Lockup.svg
diff --git a/src/index.css b/src/previous-react-version/index.css
similarity index 100%
rename from src/index.css
rename to src/previous-react-version/index.css
diff --git a/src/main.jsx b/src/previous-react-version/main.jsx
similarity index 100%
rename from src/main.jsx
rename to src/previous-react-version/main.jsx
diff --git a/src/stores/NativeMessage.ts b/src/stores/NativeMessage.ts
new file mode 100644
index 0000000..baa80c1
--- /dev/null
+++ b/src/stores/NativeMessage.ts
@@ -0,0 +1,250 @@
+export declare var globalThis: any;
+
+import { get } from "svelte/store";
+import type {
+  NEL_Preset,
+  MessagesToHost,
+} from "../../types";
+
+import { getValueFromEntries } from "../utils/utils";
+import {
+  HostState,
+  LicenseStatus,
+  HostInfo,
+  LICENSE_VALIDATED,
+} from "./stores";
+
+
+/** ━━━━━━━ generated doc ━━━━━━━
+ * `processHostState` is a function that processes and denormalizes parameter values sent from the host.
+ * It receives these values via the `__receiveStateChange__` global function.
+ * @param state - The state object received from the host.
+ *
+ * `MessageToHost` is an object that contains callable functions for interfacing with the Host code.
+ *
+ * `stashMeshState` is a function that manually gets the current state key of each storage slot and serializes it for persistentState storage in the host plugin.
+ *
+ * `requestParamValueUpdate` is a function that updates parameter values in the host.
+ * @param paramId - The ID of the parameter to update.
+ * @param value - The new value of the parameter.
+ *
+ * `requestReady` is a function that sends a ready message to the host.
+ *
+ * `requestUnlock` is a function that sends an unlock message to the KeyZey handler.
+ * @param serial - The serial number for unlocking.
+ *
+ * `__setMeshStateInHost` is a function that stores any persistent UI state in the host.
+ * @param dataToPersist - The data to persist in the host.
+ *
+ * `__bindHotReload` is a function that hot reloads the DSP during development.
+ *
+ * `RegisterMessagesFromHost` is a function that registers the message handlers for receiving and processing messages from the host.
+ * It sets up global functions that handle state changes, mesh state changes, license activation, error handling, and host information.
+ */ 
+
+
+/** ━━━━━━━
+ * Main method for processing and denormalizing parameter values sent from the host
+ * received via the `__receiveStateChange__` global function.
+ * @param state - The state object received from the host.
+ */
+
+function processHostState(state: any) {
+  // ━━━━━━━
+  // Parse the state object and convert it to an array of key-value pairs
+  let parsedEntries: Array<[string, any]> = [];
+  try {
+    parsedEntries = Object.entries(JSON.parse(state));
+  } catch (e) {
+    console.warn("Bad state received", parsedEntries);
+  }
+  const processedEntries: Map<string, number> = new Map(parsedEntries);
+  // ━━━━━━━
+  // denormalize the full range type, shift, and climb parameters
+  processedEntries.set(
+    "type",
+    getValueFromEntries(processedEntries, "type") * 2 - 1
+  );
+  processedEntries.set(
+    "shift",
+    getValueFromEntries(processedEntries, "shift") * 2 - 1
+  );
+  processedEntries.set(
+    "climb",
+    getValueFromEntries(processedEntries, "climb") * 2 - 1
+  );
+
+  /** ━━━━━━━
+   * Finally, assign the processed entries as Map<string, number> )
+   * to the HostState store which triggers observer / subscribers
+   * across the View code updating parameter values.
+   **/
+  HostState.set(new Map(processedEntries));
+}
+
+/** ━━━━━━━
+ * Callable functions for interfacing with the Host code.
+ **/
+export const MessageToHost: MessagesToHost = {
+  /** ━━━━━━━
+   * Manually get the current state key of each storage slot and serialize for
+   * persistentState storage in the host plugin. We need to stash and retrieve the view state
+   * as the WebView is destroyed when the user closes the plugin window.
+   * The solution must also work for preset store/recall originating from DAW Host.
+   **/
+  stashMeshState: function () {
+    let dataToPersist = {
+      nodeStates: get(UI_NodesData).map((data) => get(data.state) as string),
+      presets: get(UI_NodesData).map((data) => {
+        if (!data.preset) return {} as NEL_Preset;
+        let parameters = Array.from(data.preset.parameters.entries());
+        return { ...data.preset, parameters } as unknown as NEL_Preset;
+      }),
+      license: get(LicenseStatus),
+      viewOptions: get(ViewOptions),
+    };
+    this.__setMeshStateInHost(dataToPersist);
+  },
+
+  /** ━━━━━━━
+   * Update parameter values in the host.
+   * @param paramId - The ID of the parameter to update.
+   * @param value - The new value of the parameter.
+   */
+  requestParamValueUpdate: function (paramId: string, value: number) {
+    if (typeof globalThis.__postNativeMessage__ === "function") {
+      if (paramId === "type" || paramId === "shift" || paramId === "climb") {
+        value = (value + 1) / 2;
+      }
+      globalThis.__postNativeMessage__("setParameterValue", {
+        paramId,
+        value,
+      });
+    }
+  },
+
+  /** ━━━━━━━
+   * Send a ready message to the host.
+   */
+  requestReady: function () {
+    if (typeof globalThis.__postNativeMessage__ === "function") {
+      globalThis.__postNativeMessage__("ready", {});
+    }
+  },
+
+  /** ━━━━━━━
+   * Send an unlock message to the KeyZey handler.
+   * @param serial - The serial number for unlocking.
+   */
+  requestUnlock: function (serial: string = "") {
+    if (get(LicenseStatus) !== LICENSE_VALIDATED) {
+      console.count("Requesting unlock");
+      if (typeof globalThis.__postNativeMessage__ === "function") {
+        globalThis.__postNativeMessage__("unlock", { serial });
+      }
+    }
+  },
+
+  /** ━━━━━━━
+   * Store any persistent UI state in the host.
+   * @param dataToPersist - The data to persist in the host.
+   */
+  __setMeshStateInHost: function (dataToPersist: any) {
+    if (typeof globalThis.__postNativeMessage__ === "function") {
+      globalThis.__postNativeMessage__(
+        "setMeshState",
+        JSON.stringify(dataToPersist)
+      );
+    }
+  },
+
+  /** ━━━━━━━
+   * Hot reload the DSP during development.
+   */
+  __bindHotReload: function () {
+    if (process.env.NODE_ENV !== "production") {
+      import.meta.hot?.on("reload-dsp", () => {
+        // console.log("Sending reload dsp message");
+
+        if (typeof globalThis.__postNativeMessage__ === "function") {
+          globalThis.__postNativeMessage__("reload");
+        }
+      });
+    }
+  },
+};
+
+/** ━━━━━━━
+ * Registers the message handlers for receiving and processing messages from the host.
+ * This function sets up global functions that handle state changes, mesh state changes,
+ * license activation, error handling, and host information.
+ */
+
+export function RegisterMessagesFromHost() {
+  /** ━━━━━━━
+   * Handles the state change received from the host.
+   * @param state - The host state change object.
+   */
+  globalThis.__receiveStateChange__ = function (state: any) {
+    processHostState(state);
+  };
+
+  /** ━━━━━━━
+   * Handles the mesh state change received from the host.
+   * @param meshState - The mesh state object.
+   */
+  globalThis.__receiveMeshStateChange__ = function (meshState: any) {
+    let incomingMeshState: IncomingMeshState;
+    try {
+      incomingMeshState = JSON.parse(JSON.parse(meshState).meshState);
+    } catch (e) {
+      // console.log("Invalid mesh state (rcv)", meshState, e);
+      LicenseStatus.set("Mesh state error. Contact support.");
+      return;
+    }
+    if (typeof incomingMeshState !== "object") return;
+
+    if (!incomingMeshState.license) {
+      MessageToHost.requestUnlock();
+    } else {
+      LicenseStatus.set(incomingMeshState.license);
+      MessageToHost.stashMeshState();
+    }
+
+    if (incomingMeshState.nodeStates && incomingMeshState.presets) {
+      MeshStateIncoming.set(incomingMeshState);
+    }
+
+    UI_needsUpdate.set(true);
+  };
+
+  /** ━━━━━━━
+   * Handles the unlock status received from the host.
+   * @param status - The unlock status string.
+   */
+  globalThis.__onUnlock__ = function (status: string | undefined) {
+    LicenseStatus.set(status || "License not valid");
+    if (status === LICENSE_VALIDATED) {
+      globalThis.__postNativeMessage__("ready", {});
+      MessageToHost.stashMeshState();
+    }
+  };
+
+  /** ━━━━━━━
+   * Handles the DAW name received from the host.
+   * @param message - The host information object.
+   */
+  globalThis.__hostInfo__ = function (message: string) {
+    HostInfo.set(message);
+    // console.log("Host Info: ", message);
+  };
+
+  /** ━━━━━━━
+   * DEV: Handles an error received from the host.
+   * @param error - The error object.
+   */
+  globalThis.__receiveError__ = function (error: any) {
+    ConsoleText.set("Error: " + error);
+  };
+}
+ 
\ No newline at end of file
diff --git a/src/stores/WWTimer.ts b/src/stores/WWTimer.ts
new file mode 100644
index 0000000..5a83115
--- /dev/null
+++ b/src/stores/WWTimer.ts
@@ -0,0 +1,55 @@
+import { setInterval, setTimeout, clearTimeout } from 'worker-timers'
+
+// ui related 
+export  class WWTimer {
+    // Existing members
+    private startTime: number | null = null;
+    private timeoutId: number | any;
+    private duration: number;
+    public isRunning: boolean = false;
+    // New member to track if the timer is running
+    
+  
+    constructor(duration: number) {
+      this.duration = duration;
+    }
+  
+    // Starts the timer
+    start(callback: () => void): void {
+      if (this.isRunning) { // Check if the timer is already running
+        return;
+      }
+      this.isRunning = true; // Update isRunning state
+      this.startTime = Date.now();
+      this.timeoutId = setTimeout(() => {
+        callback();
+        this.reset();
+      }, this.duration);
+    }
+  
+    // Resets the timer
+    reset(): void {
+      if (this.timeoutId !== null) {
+        clearTimeout(this.timeoutId);
+        this.timeoutId = null;
+      }
+      this.startTime = null;
+      this.isRunning = false; // Update isRunning state
+    }
+  
+    // Sets a new duration for the timer
+    setDuration(newDuration: number): void {
+      this.duration = newDuration;
+      // If the timer is running, restart it with the new duration
+      if (this.isRunning) { // Use isRunning to check if the timer is active
+        this.reset();
+        this.start(() => {
+          console.log("Timer finished after duration update");
+        });
+      }
+    }
+
+    get stopped(): boolean {
+        return !this.isRunning;
+    }
+  }
\ No newline at end of file
diff --git a/src/stores/stores.ts b/src/stores/stores.ts
new file mode 100644
index 0000000..d133f9e
--- /dev/null
+++ b/src/stores/stores.ts
@@ -0,0 +1,104 @@
+//@ts-nocheck
+/** typescript disabled for now */
+
+//#region IMPORTS 
+import type {
+  LocalManifest,
+  HostParameter,
+  NEL_ControlsMap,
+  NEL_NodeUserData,
+} from "../types/index";
+
+
+//#endregion
+
+
+//#region CONSTANTS 
+export const UNCHECKED_LICENSE_STATUS = "Checking";
+export const LICENSE_VALIDATED = "Valid";
+ // UI MANIFEST
+  // 📍 Extended version of public/manifest.json --- keep them in sync!
+export const manifest: LocalManifest = {
+  window: { width: 575, height: 930 },
+  parameters: [
+    { paramId: "blend", name: "Blend", min: 0.0, max: 1.0, defaultValue: 0.0, group: "shifter" },
+    { paramId: "shift", name: "Shift", min: -1.0, max: 1.0, defaultValue: 0.0, group: "shifter" },
+    { paramId: "type", name: "Type", min: -1.0, max: 1.0, defaultValue: -1.0, group: "shifter" },
+    { paramId: "climb", name: "Climb", min: -1.0, max: 1.0, defaultValue: -1.0, group: "feedback" },
+    { paramId: "ladder", name: "Ladder", min: 0.0, max: 1.0, defaultValue: 0.0, group: "feedback" },
+    { paramId: "stride", name: "Stride", min: 0.0, max: 1.0, defaultValue: 0.25, group: "feedback" },
+    { paramId: "gain", name: "Gain", min: 0.0, max: 1.0, defaultValue: 0.25, group: "feedback" },
+    { paramId: "size", name: "Size", min: 0.0, max: 1.0, defaultValue: 0.125, group: "reverb" },
+    { paramId: "decay", name: "Decay", min: 0.0, max: 1.0, defaultValue: 0.15, group: "reverb" },
+    { paramId: "mod", name: "Mod", min: 0.0, max: 1.0, defaultValue: 0.125, group: "reverb" },
+    { paramId: "mix", name: "Mix", min: 0.0, max: 1.0, defaultValue: 0.25, group: "reverb" },
+  ]
+};
+export const NUMBER_HOSTPARAMS = manifest.parameters.length;
+//#endregion
+
+
+
+//#region LICENSE ACTIVATION 
+
+export const LicenseStatus: string = $state(UNCHECKED_LICENSE_STATUS);
+
+//#endregion
+
+
+//#region AUDIO PARAMS 
+//---- registered audio parameters -------------------
+export const ParamDefsHost: HostParameter[] = $state( manifest.parameters);
+// registered audio parameters for UI
+export const ParamIds: string[] = $state(manifest.parameters.map((p: HostParameter) => p.paramId));
+
+//#endregion
+
+//#region UI STATE MACHINES,  CONTROLS 
+
+
+// we only need to store the user data, not the whole mesh
+export const UI_NodesData: NEL_NodeUserData[] = $state([]); 
+export const focusedNodeParams: NEL_ControlsMap = $state(new Map());
+
+
+// Explicit refresh of the stored presets
+export const UI_StoredPresetsRefresh: boolean = $state(false);
+export const UI_needsUpdate: boolean = $state(true);
+export const UI_asyncReady: boolean = $state(false);
+// Sidebar controls
+export const UI_Controls: NEL_ControlsMap = $state(new Map());
+
+//#endregion
+
+//#region RAYCASTER & PICKING 
+
+// Global export of current RayCast target
+export const CurrentPickedId: number = $state(0);
+export const CurrentFocusId: number = $state(0);
+export const ActiveId: number = $state(0);
+export const MouseDownWindow: boolean = $state(false);
+
+//#endregion
+
+//#region USER INTERACTION 
+
+export const ConsoleText: string = $state("Console:");
+export const ShiftPressed: boolean = $state(false);
+export const BillboardText: string = $state("");  
+
+//#endregion
+
+//#region HOST STATE 
+export const MeshStateIncoming: any = $state();
+export const HostState: Map<string, any> = $state( new Map());
+export const ErrorStore: any = $state();
+
+//#endregion
+
+//#region MISC 
+
+export const PixelDensity: number = $state(2);
+export const HostInfo: string = $state('');
+
+//#endregion
\ No newline at end of file
diff --git a/src/types/index.d.ts b/src/types/index.d.ts
new file mode 100644
index 0000000..65b3dba
--- /dev/null
+++ b/src/types/index.d.ts
@@ -0,0 +1 @@
+// todo
diff --git a/src/utils/utils.ts b/src/utils/utils.ts
new file mode 100644
index 0000000..7f034b1
--- /dev/null
+++ b/src/utils/utils.ts
@@ -0,0 +1,167 @@
+import type { Vec } from "@thi.ng/vectors";
+import type { UI_Slider, NEL_ControlsMap, NEL_Preset } from "../../types";
+import type { InstancedMesh, Object3D } from "three";
+
+
+// This function extracts the 'value' property from each UI_Slider
+// object in the UI_ControlsMap and returns them as an array of type Vec.
+export function extractValuesFrom(view: NEL_ControlsMap): Vec {
+  return Array.from(view.values()).map((slider) => slider.value) as Vec;
+}
+
+ // Helper function to get the value from the tuple that results from deserializing the host state object
+ export function getValueFromEntries(entries: any, key: string): number {
+  let result = 0;
+  try {
+    result = entries.find(([k]: [string]) => k === key)[1];
+  } catch { (e:any) =>
+    console.warn("Error setting state entries on key ", key, e.message);
+  }
+  return result;
+}
+
+// filter out params that are not registered with the host
+export function onlyRegisteredParams(
+  view: NEL_ControlsMap
+): Map<string, UI_Slider> {
+  let onlyRegisteredParams = new Map(
+    [...view].filter(([key, value]) => value.isRegistered)
+  );
+  return onlyRegisteredParams;
+}
+
+// Convert an array of UI_ControlsMap to 
+// serializable structure (array of objects)
+export function serialisePresets(arrayOfPresets: Array<NEL_Preset>) {
+  if (!arrayOfPresets) return {};
+  let parametersMap: Map<string, UI_Slider>
+  const result = arrayOfPresets.map((preset) => {
+    if (preset === undefined) return {};
+    parametersMap = preset.parameters;
+    let obj: { [key: string]: UI_Slider } = {};
+    preset.parameters.forEach((settings, key, map) => {
+      obj[key] = settings;
+    });
+    return obj;
+  });
+  return result;
+}
+
+// Convert an array of objects to an array of UI_ControlsMap (Map<string, UI_Slider>)
+export function deserialisePresets(
+  arrayOfObjects: { [key: string]: UI_Slider }[]
+) {
+  const result = arrayOfObjects.map((presetObj) => {
+    let presetMap = new Map<string, UI_Slider>();
+    for (let key in presetObj) {
+      presetMap.set(key, presetObj[key]);
+    }
+    return presetMap;
+  });
+  return result;
+}
+
+// sample and hold function
+export function sampleAndHold(value: number, hold: boolean) {
+  let heldValue: number = 0;
+  return function () {
+    if (hold) {
+      heldValue = value;
+    }
+    return heldValue;
+  };
+}
+
+// utility functions for generating the grid array and an iterator for it
+export const fillArrayUsing = (
+  arr: any[],
+  start: number,
+  end: number,
+  step: number,
+  value: number
+) => {
+  for (let i = start; i <= end; i += step) {
+    arr.push(value);
+  }
+  return arr;
+};
+
+export const arrayIterator = (arr: any[]) => arr.values();
+
+// utility functions for BufferGeometry transformations
+export function scaleXYZ(vertices: Float32Array, scale: number) {
+  const resizedVertices = vertices.map((v) => v * scale);
+  return resizedVertices;
+}
+
+export function scaleWidth(vertices: Float32Array, scale: number) {
+  const resizedVertices = new Float32Array(vertices.length);
+  for (let i = 0; i < vertices.length; i += 3) {
+    resizedVertices[i] = vertices[i] * scale;
+    resizedVertices[i + 1] = vertices[i + 1];
+    resizedVertices[i + 2] = vertices[i + 2];
+  }
+  return resizedVertices;
+}
+
+export function scaleHeight(vertices: Float32Array, scale: number) {
+  const resizedVertices = new Float32Array(vertices.length);
+  for (let i = 0; i < vertices.length; i += 3) {
+    resizedVertices[i] = vertices[i];
+    resizedVertices[i + 1] = vertices[i + 1] * scale;
+    resizedVertices[i + 2] = vertices[i + 2];
+  }
+  return resizedVertices;
+}
+
+export function offsetXY(
+  vertices: Float32Array,
+  offsetX: number,
+  offsetY: number
+) {
+  const offsetVertices = new Float32Array(vertices.length);
+
+  for (let i = 0; i < vertices.length; i += 3) {
+    offsetVertices[i] = vertices[i] + offsetX;
+    offsetVertices[i + 1] = vertices[i + 1] + offsetY;
+    offsetVertices[i + 2] = vertices[i + 2];
+  }
+  return offsetVertices;
+}
+
+export function retrieveNodeFromInstancedMesh (o: any | null, instanceId: number) : Object3D | null {
+  if (o) {
+        const parentMesh: InstancedMesh = o;
+        const node: Object3D = parentMesh.instances.current[instanceId];
+        return node;
+  } 
+    return null;
+}
+
+class ShiftRegister<T> {
+  currentState: T | null;
+  previousState: T | null;
+
+  constructor(initialState: T | null) {
+    this.currentState = initialState;
+    this.previousState = null;
+  }
+
+  updateState(newState: T) {
+    this.previousState = this.currentState;
+    this.currentState = newState;
+  }
+
+  isStateChanged() {
+    return this.currentState !== this.previousState;
+  }
+
+  fastCompare(): boolean {
+    if (this.currentState === null || this.previousState === null) { return true; }
+    return JSON.stringify(this.currentState) !== JSON.stringify(this.previousState);
+  }
+}
+
+export function shiftRegister<T>(initialState: T | null) {
+  return new ShiftRegister<T>(initialState);
+}
\ No newline at end of file
diff --git a/vite.config.js b/vite.config.js
index 7aeb03e..83e1ab6 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,11 +1,5 @@
 import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
-
-import { execSync } from 'node:child_process'
-
-const currentCommit = execSync("git rev-parse --short HEAD").toString();
-const date = new Date();
-const dateString = `${date.getFullYear()}.${date.getMonth() + 1}.${date.getDate()}`;
+import { svelte } from '@sveltejs/vite-plugin-svelte'
 
 // A helper plugin which specifically watches for changes to public/dsp.main.js,
 // which is built in a parallel watch job via esbuild during dev.
@@ -17,8 +11,8 @@ const dateString = `${date.getFullYear()}.${date.getMonth() + 1}.${date.getDate(
 function pubDirReloadPlugin() {
   return {
     name: 'pubDirReload',
-    handleHotUpdate({file, modules, server}) {
-      if (file.includes('public/dsp.main.js')) {
+    handleHotUpdate({ file, modules, server }) {
+      if (file.includes('public/dsp.main.js' )) {
         server.ws.send({
           type: 'custom',
           event: 'reload-dsp',
@@ -30,12 +24,19 @@ function pubDirReloadPlugin() {
   };
 }
 
-// https://vitejs.dev/config/
+// related to the audio blanking error on some devices
+// is the order of plugins important?
 export default defineConfig({
   base: './',
-  define: {
-    __COMMIT_HASH__: JSON.stringify(currentCommit),
-    __BUILD_DATE__: JSON.stringify(dateString),
+  plugins: [    
+    svelte(),
+    pubDirReloadPlugin(),
+  ],
+  server: {
+    watch: {
+      // The paths to be added to the watch list
+
+    }
   },
-  plugins: [react(), pubDirReloadPlugin()],
+  
 })