diff --git a/.github/workflows/prcommitname.yml b/.github/workflows/prcommitname.yml new file mode 100644 index 0000000..4f4c5b3 --- /dev/null +++ b/.github/workflows/prcommitname.yml @@ -0,0 +1,32 @@ +name: PR Conventional Commit Validation + +on: + pull_request: + types: [opened, synchronize, reopened, edited] + +jobs: + validate-pr-title: + runs-on: ubuntu-latest + steps: + # check PR title for conventional commit format + - name: PR Conventional Commit Validation + uses: ytanikin/PRConventionalCommits@1.1.0 + with: + task_types: '["build", "chore", "ci", "docs", "feat", "fix", "perf", "refactor", "revert", "style", "test", "release"]' + add_label: 'false' + # we need to install our node modules to get access to commitlint for the next step + - name: 'Checkout repository' + uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: 'Install Node Modules' + working-directory: ./javascript + run: npm ci + # lint the commit message to ensure it can be included in the changelog later + - name: Validate current commit (last commit) with commitlint + if: github.event_name == 'push' + run: NODE_PATH="${{ github.workspace }}/javascript/node_modules" ./javascript/node_modules/.bin/commitlint --from HEAD~1 --to HEAD --verbose + # all commits in a PR should conform, in the occasion that we do not squash it + - name: Validate PR commits with commitlint + if: github.event_name == 'pull_request' + run: NODE_PATH="${{ github.workspace }}/javascript/node_modules" ./javascript/node_modules/.bin/commitlint --from ${{ github.event.pull_request.head.sha }}~${{ github.event.pull_request.commits }} --to ${{ github.event.pull_request.head.sha }} --verbose diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..760d619 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,96 @@ +# Name of our workflow +name: 'Test and release' + +# Events that will trigger our workflow +on: [ 'pull_request', 'push' ] + +# List of custom jobs +jobs: + # Job is called "test" + test: + # Using a "label" to assign job to a specific hosted runner + runs-on: ubuntu-latest + steps: + # Checks-out our repository under "$GITHUB_WORKSPACE", so our job can access it + - name: 'Checkout repository' + uses: actions/checkout@v3 + with: + fetch-depth: 0 + + # Test and output coverage report + - name: 'Run tests' + working-directory: ./javascript + run: npm ci && npx nyc ava && npx nyc report --reporter cobertura --reporter json-summary + + # lint the commit message to ensure it can be included in the changelog later + - name: Validate current commit (last commit) with commitlint + if: github.event_name == 'push' + run: NODE_PATH="${{ github.workspace }}/javascript/node_modules" ./javascript/node_modules/.bin/commitlint --from HEAD~1 --to HEAD --verbose + # all commits in a PR should conform, in the occasion that we do not squash it + - name: Validate PR commits with commitlint + if: github.event_name == 'pull_request' + run: NODE_PATH="${{ github.workspace }}/javascript/node_modules" ./javascript/node_modules/.bin/commitlint --from ${{ github.event.pull_request.head.sha }}~${{ github.event.pull_request.commits }} --to ${{ github.event.pull_request.head.sha }} --verbose + + # Get the coverage report and add a coverage comment + - name: Code Coverage Report + uses: irongut/CodeCoverageSummary@v1.3.0 + with: + filename: ./javascript/coverage/cobertura-coverage.xml + badge: true + fail_below_min: true + format: markdown + hide_branch_rate: false + hide_complexity: false + indicators: true + output: both + thresholds: '60 80' + - name: Add Coverage PR Comment + uses: marocchino/sticky-pull-request-comment@v2 + if: github.event_name == 'pull_request' + with: + recreate: true + path: code-coverage-results.md + - name: Create Coverage Badges + uses: jaywcjlove/coverage-badges-cli@main + with: + style: flat + source: ./javascript/coverage/coverage-summary.json + output: ./javascript/coverage/badges.svg + + # Build a release from this version and archive it for testing + - name: 'build release' + working-directory: ./javascript + run: ./build-release.sh + + - name: Save short sha to env + run: | + calculatedSha=$(git rev-parse --short ${{ github.sha }}) + echo "short_sha=$calculatedSha" >> "$GITHUB_ENV" + + - name: test artifacts + uses: actions/upload-artifact@v3 + with: + name: GLRepl-${{ env.short_sha }} + path: .dist/GLRepl.zip + + # release: + # needs: ["test"] + # runs-on: ubuntu-latest + # if: + # contains('refs/heads/main', github.ref) + # steps: + # - name: 'Checkout repository' + # uses: actions/checkout@v3 + # with: + # fetch-depth: 0 + + # - name: git config + # run: | + # git config user.name "${GITHUB_ACTOR}" + # git config user.email "${GITHUB_ACTOR}@users.noreply.github.com" + # # Part of the release script is to compile the code, so we don't need to redo this + # - name: 'release' + # working-directory: ./javascript + # run: npm ci && npx release-it --ci + # env: + # GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6a836ed --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.nyc_output +corpus +javascript/coverage +javascript/node_modules +reference +examples/livecode-max/node_modules +javascript/dist +docs +.dist diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..385e06c --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,23 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Debug AVA test file", + "runtimeExecutable": "/Users/twhiston/.nvm/versions/node/v18.16.0/bin/node", + "program": "${workspaceFolder}/javascript/node_modules/ava/entrypoints/cli.mjs", + "args": [ + "${file}" + ], + "cwd": "${fileDirname}", + "outputCapture": "std", + "skipFiles": [ + "/**/*.js" + ] + } + ] +} \ No newline at end of file diff --git a/.vscode/node_modules/.cache/ava/failing-tests.json b/.vscode/node_modules/.cache/ava/failing-tests.json new file mode 100644 index 0000000..0637a08 --- /dev/null +++ b/.vscode/node_modules/.cache/ava/failing-tests.json @@ -0,0 +1 @@ +[] \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..b692fbe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,20 @@ +{ + "markiscodecoverage.searchCriteria": "javascript/coverage/lcov.info", + "editor.formatOnSave": true, + "coverage-gutters.coverageBaseDir": "./javascript/coverage", + "coverage-gutters.coverageFileNames": [ + "lcov.info", + "cov.xml", + "coverage.xml", + "jacoco.xml", + "coverage.cobertura.xml" + ], + "[handlebars]": { + "editor.formatOnSave": false + }, + "conventionalCommits.scopes": [ + "formatters", + "extras-patch" + ], + "GitHooks.hooksDirectory": "/Users/twhiston/Documents/Max 8/Packages/GLRepl/.git/hooks", +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b071fe1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,86 @@ +# tw.gl.repl changelog + +## [1.0.0-beta.9](https://github.com/twhiston/tw.gl.repl/compare/1.0.0-beta.8...1.0.0-beta.9) (2023-11-11) + + +### Features + +* add ability to hide text in the repl with key command and max message ([#16](https://github.com/twhiston/tw.gl.repl/issues/16)) ([fc6b2ee](https://github.com/twhiston/tw.gl.repl/commit/fc6b2ee20fbe739b258586eea88b93fc34676946)) + + +### Bug Fixes + +* fixes via c74 ([0b3ec8e](https://github.com/twhiston/tw.gl.repl/commit/0b3ec8ec88142d35bb89b3d5fc61d4f96b370476)) + +## [1.0.0-beta.8](https://github.com/twhiston/tw.gl.repl/compare/1.0.0-beta.7...1.0.0-beta.8) (2023-10-21) + + +### Bug Fixes + +* c74 feedback adjustments ([#15](https://github.com/twhiston/tw.gl.repl/issues/15)) ([51dfec4](https://github.com/twhiston/tw.gl.repl/commit/51dfec48305f53a137a05a3154b0d4796fbc246e)) + +## [1.0.0-beta.7](https://github.com/twhiston/tw.gl.repl/compare/1.0.0-beta.6...1.0.0-beta.7) (2023-09-09) + +## [1.0.0-beta.6](https://github.com/twhiston/tw.gl.repl/compare/1.0.0-beta.5...1.0.0-beta.6) (2023-09-07) + + +### Bug Fixes + +* fix polarity of ignore_keys option and shortcode, add to help file ([#14](https://github.com/twhiston/tw.gl.repl/issues/14)) ([3571ba9](https://github.com/twhiston/tw.gl.repl/commit/3571ba9423005d6da5b9557420b090a3858c9baa)) + +## [1.0.0-beta.5](https://github.com/twhiston/tw.gl.repl/compare/1.0.0-beta.4...1.0.0-beta.5) (2023-09-06) + + +### Features + +* add package-info.json ([#13](https://github.com/twhiston/tw.gl.repl/issues/13)) ([41ec4de](https://github.com/twhiston/tw.gl.repl/commit/41ec4deccadf0f5fc32c6c1a5ba10a419d522ae7)) + +## [1.0.0-beta.4](https://github.com/twhiston/tw.gl.repl/compare/1.0.0-beta.3...1.0.0-beta.4) (2023-09-04) + +### Features + +* **formatters:** add formatter to remove comment lines from output and activate by default ([#9](https://github.com/twhiston/tw.gl.repl/issues/9)) ([8338b12](https://github.com/twhiston/tw.gl.repl/commit/8338b12fe0c3335e3045c633e71302c05becab14)) + +* improved help ([#11](https://github.com/twhiston/tw.gl.repl/issues/11)) ([db6a17d](https://github.com/twhiston/tw.gl.repl/commit/db6a17d11c9cde270b9da30e6c989840995dc364)) + +* feat: expose jumpLine and jumpWord functions to router + +### Bug Fixes + +* full working windows config as default ([#10](https://github.com/twhiston/tw.gl.repl/issues/10)) ([265c8bb](https://github.com/twhiston/tw.gl.repl/commit/265c8bbcaf461d8cb1cf41f97ae2183e1f237f13)) + +* fix: fixes issue with scaling not being properly applied on text set commands + +* fix: fix gotoIndex bug due to variable overloading + +* fix: fix jump word bindings to key which appears on default mac keyboard + +* refactor: change package name to GLRepl + +* fix: fix keypress processor destruction on config load to ensure preattached functions work + +* ci: change artifact path to new package name + +* ci: remove cruft from release + +* refactor: refactor glrepl variable names and associated documentation + +* fix: fix bug with cursor line indices going to -1 + +* refactor: remove lines function in favor of length and add minimum index function + +* fix: fix issue with running the last line of the buffer in ephemeral mode + +* refactor(extras-patch): refactor example patch names and fix issue with livecode example when patcher deleted + +* docs: update docs and build out overview patch + +## [1.0.0-beta.3](https://github.com/twhiston/th.gl.texteditor/compare/1.0.0-beta.2...1.0.0-beta.3) (2023-05-16) + +## [1.0.0-beta.2](https://github.com/twhiston/th.gl.texteditor/compare/1.0.0-beta.1...1.0.0-beta.2) (2023-05-16) + +## [1.0.0-beta.1](https://github.com/twhiston/th.gl.texteditor/compare/1.0.0-beta.0...1.0.0-beta.1) (2023-05-11) + +### Features + +* add supress_output function to stop message output, use with output_matrix for mercury drop-in ([5c50ec3](https://github.com/twhiston/th.gl.texteditor/commit/5c50ec364c58185c036ba26a2992cac758163003)) \ No newline at end of file diff --git a/README.md b/README.md index 000359b..b414e04 100644 --- a/README.md +++ b/README.md @@ -1,43 +1,517 @@ -# th.gl.texteditor +# GLRepl -#### [More visuals and code!](http://gumroad.com/tmhglnd) +[![Test](https://github.com/twhiston/th.gl.texteditor/actions/workflows/test.yml/badge.svg)](https://github.com/twhiston/th.gl.texteditor/actions/workflows/test.yml) -#### [Become a Patron!](https://www.patreon.com/bePatron?u=9649817) +## About ---- +GLRepl is a Max Repl (Read/Execute/Print/Loop) environment based on the +excellent th.gl.texteditor. It consists of two objects `[tw.gl.repl]` and +`[tw.gl.repl.dynamic-size-helper]`. -A basic texteditor in the Max Jitter OpenGL window for interaction with your patch in a Livecoding-like style. +At it's core this is the same idea as th.gl.texteditor but the way in which +functions can be attached to keys now significantly extends what it is possible +to do. There is a fundamental philosophical difference between the idea of +having a text buffer repl which performs actions on run/execute and a program +where additionally every key press triggers a specific function. It means there +are subtle differences between this and th.gl.texteditor which are important to +be aware of. For example when you load a text file into th.gl.texteditor it just +fills the buffer, in tw.gl.repl it replays the keystrokes back through the input +processing. This means that any function which is attached to the individual +keypress will be executed again. In it's usual configuration this means that the +text is added to the text buffer, but it does not necessarily hold that this is +true in every possible configuration. It would be possible to attach functions +to keypresses which maintain state for other parts of an application, or which +trigger messages to be output immediately etc. This means you should think about +where you put your functionality, does it need to be in the repl itself, ie +should it be triggered every time the keypresses are played back? or does it +need to be some routing and handling in max? Further to this the repl introduces +the concept of output formatters, these can be attached to the repl and then +used in the configuration file to alter the output in some way. This allows you +to format text easily for whatever you are hooking the repl up for, for example +concatenating the output into a single line, or checking that it has balanced +brances, or ensuring whitespace is in a regular format. However it also means +that it's possible to, for example, have a short dsl for the repl, which is +expanded to a full DSL of the thing you wish to interface with. This is useful +if you need to interact with a verbose javascript but don't want to do a lot of +typing. -![screenshot of the editor with visuals](media/screenshot.png) +TLDR not only is it possible to output the contents of the repl buffer for +processing in max, but it's possible to attach any function to a keypress in the +repl, which can in turn do things including generate messages for output. The +text you input can also be mutated on run/execute so that something different is +output from the repl. -## About +Simple use cases for the repl can be handled entirely in configuration, and more +complex use cases can be easily managed by including a `user-repl.js` file +inside your project in which you can further customize behaviour by attaching +your own custom functions to keypresses or your own custom formatters for output +message handling. Read on for more about this. -Live coding is starting to become more and more popular. As a new form of performance, as a way of showing transparency to the audience in what you are doing, as a challenge for the performer to come up with interesting code on the fly and as a way of exploring the computer, creative coding and improvisation. Because coding entirely from scratch is a hard task, it can be helpful to prepare some code beforehand, and then perform with that on stage by for example adjusting parameters. This text editor lets you achieve just that! Build your entire audio/visual performance in max, and use the text-editor to live code parameters in your patch and send commands. +See the patch in the extras menu for a few examples of how you might use the repl. -This is a basic text editor for the opengl world of Max build in javascript. Add the object to your setup and initialize it with the name of the render context and dimensions for the context. Then make sure you send it the render bang in the top inlet. The outlet outputs the typed text as a list of per-line symbols ready for parsing in any way you like. For example control parameters of gl objects, control musical parameters, lighting shows, just use it as a typewriter or whatever you think of! +## Install -![screenshot of the editor with visuals](media/screenshot_2.png) +You should install this inside your Max packages directory, in a folder called `GLRepl`, +it should then be available in max after a restart. +See help files for some ideas on what you might do with it! -## Install +### Download zip -Download zip -``` -1. download zip -2. unzip and place in Max Searchpath (eg. MacOS ~/Documents/Max 8/Library) +```bash +1. download a release from the github release page for this project +2. unzip and place in Max Searchpath (eg. MacOS ~/Documents/Max 8/Packages) 3. restart Max8 ``` -Git clone + +### Git clone + +If you want to git clone the repo you will need to have `npm` and `tsc` installed +as the compiled sources are not included in the repo. + +```bash +cd ~/Documents/Max\ 8/Packages +git clone https://github.com/twhiston/tw.gl.repl.git +cd GLRepl/javascript +npm install && npm compile +//start Max8 ``` -1. $ cd ~/Documents/Max\ 8/Library -2. $ git clone https://github.com/tmhglnd/th.gl.texteditor.git -3. restart Max8 + +```bash +4. Go to the extras menu and open the "GLRepl Overview" patch +``` + +All source files loaded by max are in the `dist` folder and the typescript which +it is compiled from is found in `src`. Unless you have a more complex project in +mind you probably don't need to care about this and can use the config file and `user-repl.js` +to extend the functionality of the repl. + +## Execute/Run functionality + +By default executing the code in the repl will run a series of formatters and output +the resulting text from outlet 0. This allows you to write livecoding style commands +in the repl, ensure they are formatted as needed, and then output them for further +routing and processing in max. + +## Scaling + +It's undeniably the most useful to have a repl that you can dynamically resize +and to this end a helper object is included. See the help file for information +on how to connect this, or hover the inlets and outlets in max. The scaling fits +some window sizes better than others, and sometimes it might unavoidably break a +boundary, you should just resize the window in a way that sorts this out. +You can also send a `scale 1.` value to the object, which the current scaling will +be multiplied by. No guarantee that the current scaling works super well with every +font either! + +## Config + +Basic configuration of your repl can be achieved by loading a `replkeys.json` +file to reconfigure it. This file is an object + +The config is in the following form: + +```json +{ + "settings":{ + "keypressProcessor": { + "overrideAlphaNum": true + } + } + "bindings": [ + { + "id": "execute", + "asciiCode": 2044, + "functions": [ + "return 'run'" + ] + }, + { + "id": "backspace", + "asciiCode": -7, + "functions": [ + "ctx.backSpace()" + ] + }, + { + "id": "customSpace", + "asciiCode": -2, + "functions": [ + "myCustomFunction" + ] + } + ] +} +``` + +### Settings + +Settings allow you to set the value of some repl settings instead +of settings them through messages or in code. +All currently available settings are as follows: + +```json +"settings": { + "repl": { + "INDENTATION": 4, + "CMNT": "//" + }, + "keypressProcessor": { + "overrideAlphaNum": true + }, + "textbuffer": { + "formatters": [ + "whitespace", + "bracebalanced", + "singleline", + "commentremover" + //can also include your own custom formatters here + ] + } +} +``` + +### Bindings + +Bindings are an array of of objects which bind a key number to a function. In +contrast to th.gl.editor there are no internal functions, so everything is +defined in this file and the user can override anything. As you can see there +are a number of ways to define the functions that are called, and it is possible +to call multiple functions with a single key. Functions can be defined as a +function body in text (which will be wrapped +`new Function('k', 'ctx', funcString)`), it can be a function from whatever context +is passed in (in the case of this application it is an instance of `REPLManager`), +or it can be a reference to a custom function. + +There is one "special" keycode which is not defined in config, this is the binding +for 'ignore_keys'. This is hardcoded to `option+d` which is keycode 8706. This needs +to be handled outside of the javascript because you want to be able to re-enable +the keys. You can change this binding by sending the message `ignore_keys_id` and +the keycode id that you want. + +#### Binding a simple function + +You can create a simple key binding to output a message when a key is pressed with +the following configuration + +```json +{ + "id": "execute", + "asciiCode": 2044, + "functions": [ + "return 'run'" + ] +} +``` + +Each of the entries in `functions` will be wrapped in a +`new Function('k', 'ctx', funcString)` and will be executed on keypress. This +allows us to perform simple actions such as returning custom messages which we +can process further in max easily. + +#### Context based functions + +Because the functions called have the signature `('k', 'ctx')` functions we create in +config will always contain the value of the key that was pressed in `k`. The `ctx` +parameter however will contain an instance of REPLManager, which means that its functions +and all the functions of the subclasses are available here. This allows you to create very +complex functionality in just the config file. The shortkey to replace a line of +text in the buffer with the pastebin is an exaxple of this + +```json +{ + "id": "replaceLine-alt-p", + "asciiCode": 960, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + } +``` + +#### Including custom functions + +One of the ways to extend the repl further is to attach or preload your own functions +so you can tie them to a key in the config. +To make this easier the package tries to load a file called `user-repl.js`, max should +load this fine if it's in your patch folder. Inside it you have access to `glrepl.renderer` +and `glrepl.manager`, you also have access to a Dict of `replkeys.json` in `sKeys`. Which +will be stringified and passed into the repl on `init()` + +Most basic usage will be something like: + +```javascript +//Typescript signature is actually +//const functionOne = (k: number, ctx: {}) => { +const functionOne = (k, ctx) => { + return `some message`; +}; +glrepl.manager.kp.preloadFunction('doSomething', functionOne); +``` + +You can then use this in your `replkeys.json` app config by binding it +to a key + +```json +{ + "bindings": [ + { + "id": "pushSpace", + "asciiCode": -2, + "functions": [ + "doSomething" + ] + } + ] +} +``` + +See the `examples/custom-formatter/user-repl.js` for a working example. + +##### Attaching functions directly + +Alternatively if, for some reason, you want to configure it in code rather than +with json you could attach the function directly. + +```javascript +//glrepl.manager.kp.attachFunctions(id: string, keyCode: number, funcs: Array) +glrepl.manager.kp.attachFunctions("arbitraryName", -2, [functionOne]) +``` + +which will then be run when the key is pressed. All custom function should be of +type `KeyProcessor` and thus have the signature `function(k: number, ctx: {})`. + +Functions can return nothing or `Array`, these strings are treated +as messages to be output to max, so you can write routing and handling in max to +implement whatever you need. If you get an error message about prototype apply taking +an array you probably are outputting a string and not an array of strings! + +### JitterObjects + +Be very careful about creating JitterObjects in your custom functions or in your +code at all. When they are used outside of the top level js file they are not +freed automatically, which then results in a crash. See the bound `_close` +function for how this is handled for the GLRender class's `destroy` method. + +## Alphanumeric Characters + +By default alphanumeric characters are treated with a special function which +records the keypress into a text buffer for display and output. It may be the +case that you don't want to do this because you want to attach specific functions +to every key. You could override the default handler which will stop this function +being called: + +```javascript +//user-repl.js in your path +glrepl.manager.kp.customAlphaNum(true); ``` + +or + +```json +"settings": { + "keypressProcessor": { + "overrideAlphaNum": true + } +} ``` -4. Create a new object with "n" and type th.gl.texteditor. (Alt) + Right-click to open the helpfile. -5. Read the helpfile carefully, open the Big Example to play with some of the jit.gl objects + +If you instead want to just override the default handler for alpha-numerical keys +you should bind a function to keycode `127` replacing the default one (shown below) + +```JSON +{ + "bindings": [ + { + "id": "alphahandler", + "asciiCode": 127, + "functions": [ + "ctx.addChar(k)" + ] + } + ] +} ``` -![screenshot of the editor with visuals](media/screenshot_3.png) +### TextFormatters + +By default there are two formatters which run on execute, firstly `WhitespaceFormatter` +will trim stings and ensure consistency in the whitespace character used. Secondly +`BraceBalancedFormatter` will check that our output has fully balanced braces, or +it will throw an exception. This exception is handled in the repl and will be printed +to the max console. This formatter is extremely useful if you are outputting some +kind of dsl, and need to ensure it is formatted correctly. However it's easy to turn +it off by simply removing it from the config of the repl like so + +```json +"textbuffer": { + "formatters": [ + "whitespace", + ] +} +``` + +If you need to add additional formatters you can add them in your `user-repl.js` +by implementing a TextFormatter and preloading it. It can then be referenced in +your repl config. + +```Typescript +// This example is in typescript for clarity, and user-repl.js needs +// to be in the type of archaic javascript that max understands but +// hopefully you get the idea. To create a lot of extensions for the +// repl it's recommended to look into using typescript, transpiling and +// generating your user-repl.js file. +class UppercaseFormatter implements TextFormatter { + id: string = "uppercase" + format(strArr: Array, ctx: {}): Array { + // Example implementation that returns all strings in uppercase + return strArr.map(str => str.toUpperCase()); + } +} +glrepl.manager.preloadFormatter(new UppercaseFormatter); +//include via repl json config: {"settings"{"textbuffer": {"formatters": ["uppercase"]}}} +``` + +Always prefer preloading over setting formatters directly as failure to do +so will result in issues when the config is loaded, as this is the point at +which formatters are resolved and added to the TextBuffer. + +To see a full example of a pure javascript text formatter implementation check out +the Custom Formatter example from the Max Extras menu `tw.gl.repl.overview` patch. + +## Reading and Writing files + +Writing files will save the contents of the buffer into a text file. + +*IMPORTANT NOTE:* reading files does not just fill the buffer with the text, +because the possibility of attaching functions to each key means that +progressive keypresses can build up application state, when a file is loaded +it is played back as individual keypresses. Because of this you need to ensure +that your config handles both the max and filesystem keycodes for things like +spaces or new lines. You can see this in the default configuration provided. +If you need to work out what keycode a system specific keypress is look inside +the tw.gl.repl object and the messagebox connected to the output of `p quickKey`. + +## tw.gl.repl.dynamic-size-helper + +Usually `tw.gl.repl` is just calculating the scaling values from the dimensions +that you give it in the arguments. However there are occasions where it may be +beneficial to have dynamic scaling. To achieve this you can use the +`tw.gl.repl.dynamic-size-helper` object together with `jit.world` and +`tw.gl.repl`. Add the object, connect inlet 1 to outlet 2 of `jit.world` connect +inlet 2 to outlet 3 of `jit.world`, connect outlet 1 to the inlet of `jit.world` +and connect outlet 2 to the inlet of `tw.gl.repl`. With this in place the text +should scale fairly nicely with window resizing. It might still be a bit weird +at really strange aspect ratios. +See the help file for the object for more info. + +## Differences from th.gl.texteditor + +Key differences from th.gl.texteditor are listed below. Other than the total +refactoring there are some subtle, and not so subtle differences that mean it's +a little work to migrate from one to the other. + +* Different shortkey.json format, and also includes application settings +* Different concept of file handling, file contents is "played back" into the repl +* No internal functions, everything can be user defined in code or config and +attached to a key +* No MAX_CHARS buffer width restriction +* No buffer length restrictions +* output_matrix 1 will not stop commands being output from the first outlet, +it will just output the `jit_matrix name` command additionally! +* ephemeral_mode to clear the buffer/line after every run/execute +* adds some additional methods and arguments +* Helper object for dynamic window resizing +* routepass object in tw.gl.repl.maxpatch is generated in js on `init`. +* Autogenerated max bindings in js, routepass object and help xml file +* All js file handling +* Written in modern modular typescript code and then transpiled to es3 for max's +ancient engine +* Extremely flexible to extend +* Full set of tests + +Practically most patches using `th.gl.texteditor` can use `tw.gl.repl` as a drop +in replacement, though if you use a custom config you will need to adapt it to +the different format used here. In your max patch if `th.gl.texteditor`'s output +was connected to a `fromsymbol` or `iter` you can also delete these + +## Developing the REPL further + +We transpile so we can use modern js. See: + + +Although the runtime needs no external libraries, you will need to `npm install` +inside the javascript folder to develop this code, as it's all written in typescript +and needs to be transpiled. + +### Build cycle + +`npm run compile` will render the max compatible javascript from our typescript and +generate the `tw.gl.repl.js` file which is the core of our repl. It will also generate +the max help xml file because this should match the functions we have exposed in +the main repl file, and this might change if we add annotations to functions or methods. + +### Testing + +Testing is done with the `ava` framework. If you are going to add a new feature +and contribute it back (please do!) then you'll need to write tests for it as well. +The code here has pretty good test coverage so look at the `moduleName.test.ts` files +for lots of examples. +`npm run test` will run all the tests and output coverage. `npm run report` will +generate an html report you can use to see where you are missing test coverage. + +Github pipelines will run on push, these run all tests and output coverage and also +compile the code. + +### Max bindings + +The entrypoint into the code for max is in an autogenerated file, this makes binding +existing functions to the max interface easier as you just need to annotate the code +and run the generator. Functions are annotated like +`@maxMspBinding({ draw: true, functionName: 'cursor' })` see `MaxBindings/MaxBinding.ts` +for a full list of options. You can annotate the class as well, which is useful +for the eg. `instanceName` field. + +Although there are only a few options available to the binding the processor +enriches the content with various other bits of metadata which can be used in +template rendering. See the templates. + +Mostly you won't need to touch this stuff, as you can extend the repl using `replkeys.json` +and/or `user-repl.js` for most simple use cases. But if you want to build your own +more complex repl object you will need to recompile and generate the js code. + +### Helper Patch + +There is a helper patch included `editor-development.maxpat` which has a helpful +simple setup which you can use to help with developing. + +### Releases + +Releases are generated using `release-it`. Any commit into main will produce a release +and any release without breaking changes included will be a minor version bump. +Development releases are created as needed by manually running `npm run release-beta-major/minor` +in the javascript folder. You must have a clean checkout of the develop branch +to do this. + +The changlog is updated automatically on release and thus commits should be in +the conventional commits format so they can be included. +Commitlint will enforce this for commit messages and on merges in github actions. + +Lefthook is used for local commit linting. Note that because our `package.json` +is not in our root folder, since this is not a pure node project it is expected +that you have your own global install of lefthook `npm install -g lefthook` and +that you manually run `lefthook install` in the root after cloning the repo. + +It's worth noting that if you use vscode on OSXyou might have problems with these +hooks silently failing if the binaries are not found. vscode seems to always use +bash for git operations, although the default OSX shell is zsh. Therefore you +might need some specific bash config around node, especially if you are using NVM. +For me it looks like this: + +```.bashrc +export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +eval "$(/opt/homebrew/bin/brew shellenv)" # setup homebrew paths for global installs of linting tools +export NODE_PATH=$NODE_PATH:`npm root -g` # get the correct node path +``` ## License @@ -46,4 +520,7 @@ The GNU Lesser General Public License v.3 The artistic and aesthetic output of the software in the examples is licensed under: Creative Commons Attribution-ShareAlike 4.0 International License -(c) Timo Hoogland 2020 \ No newline at end of file +(c) Tom Whiston 2023 + +The origin of this project is a refactoring of th.gl.texteditor (c) Timo Hoogland +2020 diff --git a/code/th.gl.editor.js b/code/th.gl.editor.js deleted file mode 100644 index 5bb411f..0000000 --- a/code/th.gl.editor.js +++ /dev/null @@ -1,1125 +0,0 @@ -//=================================================================== -// th.gl.editor.js -// A responsive texteditor for the opengl environment - -// written by Timo Hoogland (c) 2020 -// www.timohoogland.com -// License -// GNU LGPL v.3 - -// FUNCTIONALITIES: -// - add characters by typing -// - capslock sensitive -// - move with cursors or shortkeys -// - backspace a character and a line -// - enter an extra line of text -// - use tab to input 4 spaces as indentation -// - copy insert a line of code to an other line -// - copy replace a line of code on an other line -// - delete a line of code and remove the line -// - console for display error messages -// - read a previous mercury file -// - write a mercury file every time the code runs - -// TO DO: -// undo/redo history (matrixset?) -//=================================================================== - -autowatch = 1; -inlets = 1; -outlets = 2; - -// GENERAL SETTINGS: -var CRSR = "<<"; -var CMMT = "//"; -var INDENTATION = 4; -var EDITOR_LINES = 30; -var MAX_CHARS = 80; -var LINE_CHARS = 140; -// var UNDO_HISTORY = 5; -// var CNSL_LINES = 40; -// var CNSL_CHARS = 24; -var OUT_MAT = 0; - -var POST_FLAG = 1; - -// load keybindings from json file -var sKeys = new Dict(jsarguments[2]); - -// fixed keybindings -var keys = { - "space" : -2, - "escape" : -3, - "return" : -4, - "tab" : -5, - "delete" : -6, - "backspace" : -7, - "up" : -9, - "down" : -10, - "left" : -11, - "right" : -12 -} - -var key; -var curLine, curChar, totalLines; -var isDisabled; - -var CRSR_CHARS = []; -var CMMT_CHARS = []; - -var UNIQ = Date.now(); - -// matrices for text display -var textMtx, crsrMtx, nmbrMtx; -// arrays for strings; -var textBuf; - -// var histMtxSet, hIndex; -// var cnslMtx, cnslText = []; - -function loadbang(){ - init(); -} - -function init(){ - textBuf = ['']; - - if (jsarguments.length>1) { - drawto(jsarguments[1]); - - } - clear(); - isDisabled = false; - - font("Courier New Bold"); - fontsize(100); - leadscale(0.94); - tracking(1); - line_length(999999); - alpha(1); - - cursor("<<"); - comment("//"); - - draw(); -} - -function clear(){ - curChar = 0; - curLine = 0; - totalLines = 1; - - empty(totalLines); - draw(); -} - -/* EXPERIMENTAL - -function max_linelength(v){ - MAX_CHARS = Math.max(1, Math.min(Math.floor(v), LINE_CHARS - 40)); - init(); -} - -function max_lines(v){ - EDITOR_LINES = Math.max(1, Math.min(Math.floor(v), 40)); - init(); -}*/ - -function empty(lines){ - textBuf = ['']; - // textMtx = new JitterMatrix("text"+UNIQ, 1, "char", LINE_CHARS, lines); - // crsrMtx = new JitterMatrix("crsr"+UNIQ, 1, "char", LINE_CHARS, lines); - // nmbrMtx = new JitterMatrix("nmbr"+UNIQ, 1, "char", 3, lines); - // cnslMtx = new JitterMatrix("cnsl"+UNIQ, 1, "char", LINE_CHARS, CNSL_LINES); - // textMtx.setall(0); -} - -// output the parsed code if output_matrix is disabled -function run(){ - outlet(0, "jit_matrix", textMtx.name); - if (!OUT_MAT){ - var out = textBuf.map(function(t){ - return t.replace(/\s+/g, ' ').trim(); - }) - outlet(0, out); - // outlet(0, mtxToSymbol(textMtx)); - } -} - -// enable the output_matrix flag -function output_matrix(v){ - OUT_MAT = v != 0; -} - -// convert the matrix to an array of strings per line -function mtxToSymbol(mat){ - var text = []; - for (var y=0; y 32 && k <= 126){ addChar(k); } - else if (k == keys["space"]){ addChar(32); } - - // FUNCTION KEYS - else if (k == keys["return"]){ newLine(); } - // Backspace Win = 8, Mac = 127 - // Delete Win = 127, Mac = 127 - else if (k == keys["backspace"]){ backSpace(); } - else if (k == keys["delete"]){ deleteChar(); } - // arrow keys Platform-independent - else if (k == keys["tab"]){ addTab(); } - else if (k == keys["up"] || k == keys["down"]){ - gotoLine(1-(k+10)); - } - else if (k == keys["left"] || k == keys["right"]){ - gotoCharacter(1-(k+12)); - } - - // arrow keys ASCII - // else if (k == 30 || k == 31){ gotoLine(k-30); } - // else if (k == 28 || k == 29){ gotoCharacter(k-28); } - - // SHORTKEYS - else if (k == sKeys.get("comment")[1]){ commentLine(); } - - else if (k == sKeys.get("delete-line")[1]){ deleteLine(); } - else if (k == sKeys.get("copy-line")[1]){ copyLine(); } - else if (k == sKeys.get("paste-line")[1]){ pasteInsertLine(); } - else if (k == sKeys.get("paste-replace-line")[1]){ pasteReplaceLine(); } - - // else if (k == ALT_B){ backSpace(); } - - // Jump Top/Bottom/Start/End with ALT + Arrow Keys - else if (k == sKeys.get("jump-top")[1]){ jumpTo(2); } - else if (k == sKeys.get("jump-bottom")[1]){ jumpTo(3); } - else if (k == sKeys.get("jump-begin")[1]){ jumpTo(0); } - else if (k == sKeys.get("jump-end")[1]){ jumpTo(1); } - - // Navigate the editor with ASDW - else if (k == sKeys.get("left")[1]){ gotoCharacter(0); } - else if (k == sKeys.get("right")[1]){ gotoCharacter(1); } - else if (k == sKeys.get("down")[1]){ gotoLine(1); } - else if (k == sKeys.get("up")[1]){ gotoLine(0); } - - else if (k == sKeys.get("jump-word-left")[1]){ gotoWord(0); } - else if (k == sKeys.get("jump-word-right")[1]){ gotoWord(1); } - - // Jump to top/bottom - // else if (k == ALT_Q){ jumpTo(2); } - // else if (k == ALT_SHFT_Q){ jumpTo(3); } - - // TO-DO - // else if (k == ALT_Z){ getHistory(); } - } - draw(); - - // for (var t=0; t= MAX_CHARS){ - if (endOfLines()) { - return; - } else { - newLine(); - } - } - // ascii code to string - var c = String.fromCharCode(k); - // insert character at index - textBuf[curLine] = textBuf[curLine].insertCharAt(curChar, c); - // increment current character - curChar++; -} - -// backspace a character -function backSpace(){ - // decrement character index - curChar = Math.max(-1, (curChar-=1)); - - if (curChar >= 0){ - // remove character at index - textBuf[curLine] = textBuf[curLine].removeCharAt(curChar); - } else if (curLine > 0){ - // remove line if at beginning of line - removeLine(); - } else { - // else index is 0 - curChar = 0; - } -} - -// delete a character (oposite of backspace) -function deleteChar(){ - if (curChar < textBuf[curLine].length){ - textBuf[curLine] = textBuf[curLine].removeCharAt(curChar); - } else { - if (curLine < textBuf.length-1){ - gotoLine(1); - removeLine(); - } - } -} - -// =========== -// Deprecated - -// return the amount of characters in one line -// function getCharCount(mat, line){ -// var charCount = 0; -// var len = mat.dim[0]; -// for (var i = 0; i < len; i++){ -// if (mat.getcell(i, line) < 32){ -// return charCount; -// } -// charCount++; -// } -// } - -// set an array of amount of characters per line -// function countChars(){ -// var lines = textBuf.length; -// lineLengths = []; -// for (var l=0; l 0){ - gotoLine(0); - jumpTo(1); - } else if (curChar > len && curLine != totalLines-1){ - gotoLine(1); - jumpTo(0); - } else { - curChar = Math.min(len, Math.max(0, curChar)); - } -} - -// move one line up or down -function gotoLine(k){ - k = k * 2 - 1; - var prevLen = textBuf[curLine].length; - - curLine = Math.min(Math.max(0, (curLine+k)), totalLines-1); - var len = textBuf[curLine].length; - - curChar = Math.min(len, curChar); - - if (curChar == prevLen){ - curChar = len; - } else { - curChar = Math.min(len, curChar); - } -} - -// jump to the next or previous word (looks for seprated by spaces) -function gotoWord(k){ - if (k === 0){ - var l = textBuf[curLine].slice(0, curChar); - if (l.match(/\ +[^ ]*$/g)){ - var move = l.match(/\s+[^\s]*(\s?)+$/g)[0].length; - curChar -= move; - } else { - jumpTo(0); - gotoCharacter(0); - } - } else if (k === 1){ - var l = textBuf[curLine].slice(curChar); - if (l.match(/^[^ ]*\ +/g)){ - var move = l.match(/^(\s?)+[^\s]*/g)[0].length; - curChar += move; - } else { - jumpTo(1); - gotoCharacter(1); - } - } -} - -// jump to beginning/end of line or top/bottom -function jumpTo(k){ - var len = textBuf[curLine].length; - switch(k){ - // beginning of line - case 0: curChar = 0; break; - // end of line - case 1: curChar = len; break; - // to beginning (top) - case 2: curLine = 0; - len = textBuf[curLine].length; - curChar = Math.min(len, curChar); break; - // to end (bottom) - case 3: curLine = textBuf.length - 1; - len = textBuf[curLine].length; - curChar = Math.min(len, curChar); break; - } -} - -// move the cursor to the index of the letter in the full text -function gotoIndex(i){ - // go to beginning if index less then 0 - if (i < 0){ - jumpTo(0); - jumpTo(2); - draw(); - return; - } - // else move to the index by checking every line length - for (var l=0; l= EDITOR_LINES; - if (isEnd){ - post("WARNING: End of lines reached \n"); - } - return isEnd; -} - -// set the cursor characters -function cursor(c){ - // post("@cursor: ", c, "\n"); - CRSR = c.toString(); - CRSR_CHARS = []; - for (var i=0; i 31) ? String.fromCharCode(v) : ''; - } - } -} - -// replace all the text with the incoming arguments -// this can be a list of symbols for every line -function set(){ - var text = arrayfromargs(arguments); - text = (text.length < 1) ? '' : text; - - totalLines = Math.min(EDITOR_LINES, text.length); - text = text.slice(0, totalLines); - // empty buffer - textBuf = []; - textBuf = Array.isArray(text)? text : [text]; - - curLine = textBuf.length-1; - jumpTo(2); - jumpTo(1); - draw(); -} - -// append a line of text or multiple symbols per line -function append(){ - var text = arrayfromargs(arguments); - text = Array.isArray(text)? text : [text]; - - if (totalLines + text.length > EDITOR_LINES){ - post('append(): maximum number of lines reached \n'); - return; - } - textBuf = textBuf.concat(text); - jumpTo(2); - jumpTo(1); - draw(); -} - -// append a line of text or multiple symbols per line -function prepend(){ - var text = arrayfromargs(arguments); - text = Array.isArray(text)? text : [text]; - - if (totalLines + text.length > EDITOR_LINES){ - post('append(): maximum number of lines reached \n'); - return; - } - textBuf = text.concat(textBuf); - jumpTo(2); - jumpTo(1); - draw(); -} - -// remove a line of text at a specified index -function remove(idx){ - if (idx === undefined){ idx = textBuf.length-1; } - curLine = idx; - deleteLine(); - draw(); -} - -// insert a line of text or multiple symbols at a specified index -// a list of symbols will inserte one line per symbol -function insert(){ - var args = arrayfromargs(arguments); - if (isNaN(args[0])){ - post('insert(): index is not a number \n'); - return; - } - var idx = Math.min(EDITOR_LINES, args[0]); - var text = args.slice(1); - text = Array.isArray(text)? text : [text]; - - // exit if doesn't fit in editor - if (totalLines + text.length > EDITOR_LINES){ - post('insert(): maximum number of lines reached \n'); - return; - } - // if insert between totalLines - if (idx < totalLines){ - var u = textBuf.slice(0, Math.max(0, idx)); - u = Array.isArray(u)? u : [u]; - u = u.concat(text); - textBuf = u.concat(textBuf.slice(idx)); - } else { - // else append to code and insert empty strings - var diff = idx - totalLines; - for (var d=0; d 31 && char < 126){ - addChar(char); - } - } - draw(); -} - -function back(){ - backSpace(); - draw(); -} - -function del(){ - deleteChar(); - draw(); -} - -/*function fillConsole(mess){ - mess = mess + " "; - var dashes = CNSL_CHARS - (mess.length % CNSL_CHARS); - for (var i = 0; i < dashes; i++){ - mess += "-"; - } - - for (var i = mess.length-1; i >= 0; i--){ - cnslText.unshift(mess.charCodeAt(i)); - } - - cnslText = cnslText.slice(0, CNSL_LINES*CNSL_CHARS); - for (var i = 0; i < cnslText.length; i++){ - cnslMtx.setcell2d(i%CNSL_CHARS, Math.floor(i/CNSL_CHARS), cnslText[i]); - } - draw(); -} - -function emptyConsole(){ - cnslText = []; - cnslMtx.setall(0); - draw(); -}*/ - -//=================================================================== -// GL TEXT OBJECTS -//=================================================================== - -var MAIN_CTX = "CTX"; -var NODE_CTX = "node" + UNIQ; -var ANIM_NODE = "anim" + UNIQ; -var CAM_CAP = "cam" + UNIQ; - -var SCALING = 1; -var FONT_SIZE = 100; - -// the main node that all text is drawn to -// for display on videoplane through camera capture -var textNode = new JitterObject("jit.gl.node"); -textNode.fsaa = 1; -textNode.type = "float32"; -textNode.name = NODE_CTX; -textNode.adapt = 0; - -function drawto(v){ - MAIN_CTX = v; - textNode.drawto = MAIN_CTX; - glVid.drawto = MAIN_CTX; -} - -// the main anim node to position all text according to screensize -var animNode = new JitterObject("jit.anim.node"); -animNode.name = ANIM_NODE; -animNode.position = [0, 0, 0]; - -// the text position -function position(x, y){ - animNode.position = [x, y, 0]; -} - -// the text scaling -function scale(s){ - SCALING = s * 100/FONT_SIZE; - animNode.scale = [SCALING, SCALING, 0]; -} - -// the anim node and text for the command line -var textAnim = new JitterObject("jit.anim.node"); -textAnim.anim = ANIM_NODE; -textAnim.position = [0.9, 0, 0]; - -var glText = new JitterObject("jit.gl.text"); -glText.drawto = NODE_CTX; -glText.anim = textAnim.name; -glText.gl_color = [1, 1, 1, 1]; -glText.screenmode = 0; -glText.cull_face = 1; - -var textColor = [1, 1, 1, 1]; -var runColor = [0, 0, 0, 1]; - -function color(){ - args = arrayfromargs(arguments); - if (args.length !== 4){ - error("th.gl.editor: Expected an RGBA value in floating-point \n"); - } else { - textColor = args; - glText.gl_color = args; - } -} - -function run_color(){ - args = arrayfromargs(arguments); - if (args.length !== 4){ - error("th.gl.editor: Expected an RGBA value in floating-point \n"); - } else { - runColor = args; - } -} - -function runBlink(t){ - - var c = []; - for (var i=0; i - - - - - - Create a texteditor for the rendering context - - - - A basic code text-editor for the opengl world of Max. Add the object to your setup and initialize it with the name of the render context. Make sure you send it the render bang in the top inlet. The outlet outputs the parsed text as a list of symbols that you can use in any way you like. For example control parameters of gl objects, control musical parameters, lighting shows, just use it as a typewriter or whatever you think of! - - - - - Timo Hoogland - thModules - max - jitter - opengl - code - text - - - - - - - - - - - - - The named drawing context in which to draw (default = none). - - - Set the name of the rendering context. This is the name given to the jit.world, jit.gl.render or jit.gl.node object. - - - - - - - - - - - - Input render bangs per frame. - - - Input a continuous stream of bangs so parameters stay up to date per frame. - - - - - - - - - Output the current textbuffer as a list of symbols per line. - - - Output the current textbuffer as a list of symbols per line. - - - - - - - - - Write the textbuffer to a disk file. - - - Write the textbuffer to a disk file. Additional filepath + filename sets the destination to store to. - - - - - - - - - Read the a textfile from disk. - - - Read the a textfile from disk. - - - - - - - - - Set the entire textbuffer. - - - Set the entire textbuffer with a list of symbols. Every symbol is placed on a new line. - - - - - - - - - Insert a symbol on a line. - - - Insert a symbol or list of symbols on a specified line. Line index start at 0. Every symbol is placed on a new line. - - - - - - - - - Append a symbol at the end. - - - Append a symbol or list of symbols at the end of the textbuffer. Every symbol is placed on a new line. - - - - - - - - - Prepend a symbol at the beginning. - - - Prepend a symbol or list of symbols at the beginning of the textbuffer. Every symbol is placed on a new line. - - - - - - - - - Remove last or a specified line. - - - Remove the last line from the textbuffer. Optional index removes a specific line (count from 0). - - - - - - - - - The named drawing context in which to draw (default = none). - - - The named drawing context in which to draw (default = none). A named drawing context is a named instace of a jit.window, jit.pwindow, or jit.matrix object taht ahas an instance of the jit.gl.render object associated with it. - - - - - - Output the text as a matrix (default = 0). - - - Output the text as a matrix instead of the list of symbols per line of text (default = 0). - - - - - - Ignore keystrokes from keyboard (default = 0). - - - Ignore the keystrokes from the keyboard (default = 0). - - - - - - Set the font for the editor (default = Courier New Bold). - - - Set the font for the editor (default = Courier New Bold). This must be a mono-spaced font otherwise the cursor won't align properly. - - - - - - Change the characters for the cursor (default = "<<"). - - - Change the characters for the cursor (default = "<<"). - - - - - - Change the characters for commenting text (default = //) - - - Change the characters for commenting text (default = //). - - - - - - Set the text color. - - - Set the text color. - - - - - - Set the color for blinking when the code is executed. - - - Set the color for blinking when the code is executed. - - - - - - Set the color for the cursor. - - - Set the color for the cursor. - - - - - - Set the color for the line numbers. - - - Set the color for the line numbers. - - - - - - Set the blink color for the cursor. - - - Set the blink color for the cursor. This is the secundary color visible when blinking is enabled. - - - - - - Enable the blink color of the cursor (default = 1). - - - Enable the blinking of the cursor. This will alternate between the cursor_color and the blink_color (default = 1). - - - - - - The speed of the cursor blinking in ms (default = 250). - - - The speed of the cursor blinking in ms (default = 250). - - - - - - The speed of the logarithmic scale smoothing of text in frames (default = 15). - - - The speed of the logarithmic scale smoothing of text in frames (default = 15). - - - - - - The relative scale for the entire text (default = 1). - - - The relative scale for the entire text (default = 1). - - - - - - The relative position of the text (default = 0 0) - - - The relative position of the text (default = 0 0) - - - - - - The spacing between characters (default = 1). - - - The spacing between characters (default = 1). - - - - - - The spacing between lines (default = 0.94) - - - The spacing between lines (default = 0.94) - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/tw.gl.repl.dynamic-size-helper.maxref.xml b/docs/tw.gl.repl.dynamic-size-helper.maxref.xml new file mode 100644 index 0000000..b719e7e --- /dev/null +++ b/docs/tw.gl.repl.dynamic-size-helper.maxref.xml @@ -0,0 +1,76 @@ + + + + + + + Make tw.gl.repl resizable easily + + + + A small wrapper object for the logic needed to make the repl rescale nicely in a dynamic way. + Using this object should allow the text to rescale well to almost any window size, and will + do so as you drag it around. + + + + + Tom Whiston + tw.gl.repl + max + jitter + opengl + repl + + + + + + bang from jit.world + + Connect outlet 2 of jit.world to this inlet. Used to refresh display + + + + dumpout from jit.world + + Connect outlet 3 of jit.world to this inlet. + Used to receive, rate-limit and pass on size messages to the repl. + + + + + + + + to jit.world + + Connect to inlet of jit.world. Sends rate limited getsize command + + + + to tw.gl.repl + + Connect to inlet of tw.gl.repl. Sends rate limited size commands + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/examples/custom-formatter/_glrepl-custom-formatter-example.maxpat b/examples/custom-formatter/_glrepl-custom-formatter-example.maxpat new file mode 100644 index 0000000..06c97ef --- /dev/null +++ b/examples/custom-formatter/_glrepl-custom-formatter-example.maxpat @@ -0,0 +1,1306 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 371.0, 100.0, 1444.0, 848.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-38", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 503.5, 356.0, 291.0, 141.0 ], + "text" : "You can see the code for the user-repl.js file which defines the custom formatters here. This file is loaded automatically by the repl when the patch is loaded, and in normal operation would not be loaded into a js object such as this.\nTo learn more about writing formatters see the README.md in the package root.\nThe error you see in the console that i is not defined is there because user-repl is loaded here for viewing convenience and can be ignored!" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-35", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 481.5, 356.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "7", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 791.0, 375.0, 80.0, 22.0 ], + "saved_object_attributes" : { + "filename" : "user-repl.js", + "parameter_enable" : 0 + } +, + "text" : "js user-repl.js" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 259.0, 564.5, 166.0, 22.0 ], + "text" : "loadmess keybindings default" + } + + } +, { + "box" : { + "id" : "obj-36", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 759.0, 497.0, 144.0, 87.0 ], + "text" : "This is the config for the repl. If you place a replkeys.json in your project folder it will automatically override the default configuration" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-34", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 110.5, 629.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "6", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-33", + "linecount" : 12, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 27.5, 654.0, 157.0, 167.0 ], + "text" : "Thes melodies you heard were the same but the file formatting was not.\nmelody2 is the result of melody1 being saved to disk with formatters being applied. You can see which formatters these are in the config.\n\nBy default format_writes is true." + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 127.0, 598.0, 91.0, 22.0 ], + "text" : "format_writes 1" + } + + } +, { + "box" : { + "id" : "obj-28", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 485.0, 516.0, 229.0, 60.0 ], + "text" : "send the \"clear\" message, then read melody1.txt and execute.\nsend \"clear\" again and read melody2.txt and execute." + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-29", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 485.0, 576.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 533.0, 51.0 ], + "text" : "tw.gl.repl - custom formatters", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 688.0, 282.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-4", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 270.0, 115.5, 228.0, 87.0 ], + "text" : "This midi handler simply adds messages to a queue and outputs them, it is strated by a bang from the repl when run has completed and then it selects note-off velocities and sends the next note out until the queue is empty" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-5", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 220.0, 49.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 17.5, 155.0, 43.0, 22.0 ], + "text" : "zlclear" + } + + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 26.5, 353.0, 35.0, 22.0 ], + "text" : "del 1" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 65.0, 221.0, 71.0, 22.0 ], + "text" : "fromsymbol" + } + + } +, { + "box" : { + "id" : "obj-57", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 65.0, 155.0, 57.0, 22.0 ], + "text" : "tosymbol" + } + + } +, { + "box" : { + "id" : "obj-51", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 125.5, 190.5, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "int", "int" ], + "patching_rect" : [ 65.0, 247.0, 77.0, 22.0 ], + "text" : "unpack 0 0 0" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 26.5, 325.5, 34.0, 22.0 ], + "text" : "sel 0" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 65.0, 190.5, 54.0, 22.0 ], + "text" : "zl.queue" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 65.0, 115.5, 63.0, 22.0 ], + "text" : "route note" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 2, + "outlettype" : [ "float", "float" ], + "patching_rect" : [ 65.0, 282.0, 77.0, 22.0 ], + "text" : "makenote" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 0, + "patching_rect" : [ 65.0, 325.5, 103.0, 22.0 ], + "text" : "noteout" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 138.0, 49.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 65.0, 49.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-43", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "midpoints" : [ 147.5, 182.0, 74.5, 182.0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 1 ], + "order" : 0, + "source" : [ "obj-29", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "order" : 1, + "source" : [ "obj-29", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-51", 0 ], + "source" : [ "obj-35", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-72", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 2 ], + "source" : [ "obj-38", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 1 ], + "source" : [ "obj-38", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-57", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "midpoints" : [ 229.5, 312.0, 74.5, 312.0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-57", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-58", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "midpoints" : [ 36.0, 377.0, 11.5, 377.0, 11.5, 188.0, 59.5, 188.0, 59.5, 185.0, 74.5, 185.0 ], + "source" : [ "obj-72", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 245.0, 725.0, 88.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midiHandling" + } + + } +, { + "box" : { + "id" : "obj-23", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 239.0, 497.0, 242.0, 33.0 ], + "text" : "execute the code with option+enter.\nYou should hear a midi sequence playing" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-21", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 215.0, 463.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-16", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 215.0, 410.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-20", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 239.0, 420.5, 244.0, 60.0 ], + "text" : "write the following in the repl:\n\nn 69 100 125 n 71 100 200 n 74 100 125 \nn 71 100 250 n 78 100 500 n 78 n 76" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-8", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 413.0, 746.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 428.0, 756.5, 114.0, 20.0 ], + "text" : "select a midi output" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 184.0, 629.0, 34.0, 22.0 ], + "text" : "write" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 496.5, 598.0, 97.0, 22.0 ], + "text" : "read melody2.txt" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 27.5, 598.0, 91.0, 22.0 ], + "text" : "format_writes 0" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 394.5, 598.0, 97.0, 22.0 ], + "text" : "read melody1.txt" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 353.5, 598.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 245.0, 666.5, 84.0, 22.0 ], + "text" : "print fromRepl" + } + + } +, { + "box" : { + "id" : "obj-45", + "linecount" : 18, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 98.0, 858.0, 248.0 ], + "text" : "This toy example shows how you could implement custom text formatter to both validate your input and create a short language for a message in max. In this case we are using the simple case of creating midi sequences from token strings. They are defined as follows:\n\nn noteNumber vel? dur?\nn 100 127 1000\n\nFirstly the messages will be run through out \"snippetExpander\" formatter, this looks for messages starting with the token n and expands that into \"note\". For such a simple example we don't need really the expansion, we could easily just route on the message \"n\" instead of \"note\", but it serves as an example of how you could build up a more complex output language from a simple short input. A good use case for this may be where you have a verbose API to interface with, but you want to keep your repl commands short.\n\nSecondly after the token \"n\" has been expanded to \"note\" the messages are run through our constrainToMidiNumbers formatter which will ensure the first 2 numbers in the message are between 0 and 127, and creates full messages of 3 elements to put into our queue. If a velocity or duration is not supplied it will use the data from the previous message. It requires that the first message to be parsed contains all three elements. You might think of expanding this by having musical note lengths which could be converted to durations in code! Or having note names with octaves instead of midi numbers!\n\nIt is worth noting that this implementation is not very robust and putting other commands into messages which are not parsed will very likely break the output! You could improve this in a number of ways, but the easiest might be to tell the snippet expander to throw away any messages it cannot expand!" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 197.5, 725.0, 43.0, 22.0 ], + "text" : "zlclear" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 527.5, 666.5, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 275.0, 598.0, 73.0, 22.0 ], + "text" : "ignore_keys" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 353.5, 720.0, 70.0, 22.0 ], + "text" : "loadmess 0" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-40", + "items" : [ "AU DLS Synth 1", ",", "from Max 1", ",", "from Max 2" ], + "labelclick" : 1, + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 353.5, 779.0, 100.0, 23.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 353.5, 746.5, 55.0, 23.0 ], + "text" : "midiinfo" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 605.0, 564.5, 60.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 605.0, 627.5, 267.0, 145.0 ] + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 605.0, 594.5, 216.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict default custom-formatter-shortkeys" + } + + } +, { + "box" : { + "color" : [ 0.364705882352941, 0.23921568627451, 1.0, 1.0 ], + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 332.5, 666.5, 188.0, 22.0 ], + "text" : "print tw.gl.repl-Clipboard @level 3" + } + + } +, { + "box" : { + "attr" : "visible", + "id" : "obj-26", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 45.0, 462.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 104.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-7", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 108.0, 225.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 108.0, 150.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 108.0, 180.0, 77.0, 22.0 ], + "text" : "fullscreen $1" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 108.0, 119.0, 41.0, 22.0 ], + "text" : "sel 27" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 108.0, 82.0, 50.5, 22.0 ], + "text" : "key" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 60.0, 497.0, 70.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p fullscreen" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 30.0, 400.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 410.0, 90.0, 20.0 ], + "text" : "turn world on" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 45.0, 535.0, 419.0, 22.0 ], + "text" : "jit.world snippet-example @fsaa 1 @fsmenubar 0 @size 640 480 @floating 1" + } + + } +, { + "box" : { + "attr" : "enable", + "id" : "obj-3", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 45.0, 432.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 245.0, 629.0, 194.0, 22.0 ], + "text" : "tw.gl.repl snippet-example 640 480" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "order" : 0, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "midpoints" : [ 254.5, 671.0, 254.5, 671.0 ], + "order" : 1, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "midpoints" : [ 429.5, 653.0, 537.0, 653.0 ], + "source" : [ "obj-1", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 37.0, 623.0, 254.5, 623.0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 506.0, 662.0, 239.5, 662.0, 239.5, 623.0, 254.5, 623.0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 404.0, 623.0, 254.5, 623.0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 193.5, 654.0, 239.5, 654.0, 239.5, 623.0, 254.5, 623.0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 136.5, 623.0, 254.5, 623.0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 2 ], + "midpoints" : [ 403.5, 812.0, 339.5, 812.0, 339.5, 719.0, 323.5, 719.0 ], + "source" : [ "obj-40", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 1 ], + "midpoints" : [ 537.0, 707.0, 289.0, 707.0 ], + "source" : [ "obj-7", 0 ] + } + + } + ], + "dependency_cache" : [ { + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/javascript/dist", + "patcherrelativepath" : "../../javascript/dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/examples/custom-formatter", + "patcherrelativepath" : ".", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/examples/custom-formatter/custom-formatter-shortkeys.json b/examples/custom-formatter/custom-formatter-shortkeys.json new file mode 100644 index 0000000..a74506f --- /dev/null +++ b/examples/custom-formatter/custom-formatter-shortkeys.json @@ -0,0 +1,328 @@ +{ + "settings": { + "textbuffer": { + "formatters": [ + "snippetExpander", + "constrainToMidiNumbers", + "whitespace" + ] + } + }, + "bindings": [ + { + "id": "execute-opt+enter-mac", + "asciiCode": 2044, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute-ctrl+enter-win", + "asciiCode": 4348, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute_line+ctrl+opt+enter-mac", + "asciiCode": 6140, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "execute_line+shift+ctrl+enter-win", + "asciiCode": 4860, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "alphahandler", + "asciiCode": 127, + "functions": [ + "ctx.addChar(k)" + ] + }, + { + "id": "addSpace", + "asciiCode": -2, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "addSpace", + "asciiCode": 32, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "newLine", + "asciiCode": -4, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 10, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 13, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "addTab", + "asciiCode": -5, + "functions": [ + "ctx.addTab()" + ] + }, + { + "id": "delete", + "asciiCode": -6, + "functions": [ + "ctx.deleteChar()" + ] + }, + { + "id": "backspace", + "asciiCode": -7, + "functions": [ + "ctx.backSpace()" + ] + }, + { + "id": "comment-opt+/-mac", + "asciiCode": 247, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "comment-ctrl+/-win", + "asciiCode": 4399, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "clear-opt+z-mac", + "asciiCode": 937, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "clear-ctrl+z-win", + "asciiCode": 4474, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "cutLine-opt+x-mac", + "asciiCode": 8776, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "cutLine-ctrl+x-win", + "asciiCode": 4472, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-opt+c-mac", + "asciiCode": 231, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-ctrl+c-win", + "asciiCode": 4451, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-opt+k-mac", + "asciiCode": 730, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-ctrl+k-win", + "asciiCode": 4459, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "paste-opt+v-mac", + "asciiCode": 8730, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "paste-ctrl+v-win", + "asciiCode": 4470, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "replaceLine-opt+p-mac", + "asciiCode": 960, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "replaceLine-ctrl+p-win", + "asciiCode": 4464, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "up", + "asciiCode": -9, + "functions": [ + "ctx.jumpLine(-1)" + ] + }, + { + "id": "down", + "asciiCode": -10, + "functions": [ + "ctx.jumpLine(1)" + ] + }, + { + "id": "left", + "asciiCode": -11, + "functions": [ + "ctx.jumpChar(-1)" + ] + }, + { + "id": "right", + "asciiCode": -12, + "functions": [ + "ctx.jumpChar(1)" + ] + }, + { + "id": "jump_top-opt+up-mac", + "asciiCode": 2039, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump_top-ctrl+up-win", + "asciiCode": 4343, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump_bottom-opt+down-mac", + "asciiCode": 2038, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump_bottom-opt+down-win", + "asciiCode": 4342, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump_startline-opt+left-mac", + "asciiCode": 2037, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump_startline-ctrl+left-win", + "asciiCode": 4341, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump_endline-opt+right-mac", + "asciiCode": 2036, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jump_endline-ctrl+right-win", + "asciiCode": 4340, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jumpWord_left-cmd+left-mac", + "asciiCode": 245, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord_left-ctrl+shift+left-win", + "asciiCode": 4853, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord_right-cmd+right-mac", + "asciiCode": 244, + "functions": [ + "ctx.jumpWord(1)" + ] + }, + { + "id": "jumpWord_right-ctrl+shift+right-win", + "asciiCode": 4852, + "functions": [ + "ctx.jumpWord(1)" + ] + }, + { + "id": "ephemeral_mode-opt+g-mac", + "asciiCode": 169, + "functions": [ + "return ['ephemeral_mode']" + ] + }, + { + "id": "ephemeral_mode-ctrl+g-win", + "asciiCode": 4455, + "functions": [ + "return ['ephemeral_mode']" + ] + } + ] +} \ No newline at end of file diff --git a/examples/custom-formatter/melody1.txt b/examples/custom-formatter/melody1.txt new file mode 100644 index 0000000..7472e75 --- /dev/null +++ b/examples/custom-formatter/melody1.txt @@ -0,0 +1,4 @@ +n 76 120 500 n 74 n 72 100 1000 +n 76 120 500 n 74 n 72 100 1000 +n 79 100 500 n 77 100 250 n 77 n 76 100 1000 +n 79 100 500 n 77 100 250 n 77 n 76 100 1000 diff --git a/examples/custom-formatter/melody2.txt b/examples/custom-formatter/melody2.txt new file mode 100644 index 0000000..25060a4 --- /dev/null +++ b/examples/custom-formatter/melody2.txt @@ -0,0 +1,14 @@ +note 76 120 500 +note 74 120 500 +note 72 100 1000 +note 76 120 500 +note 74 120 500 +note 72 100 1000 +note 79 100 500 +note 77 100 250 +note 77 100 250 +note 76 100 1000 +note 79 100 500 +note 77 100 250 +note 77 100 250 +note 76 100 1000 diff --git a/examples/custom-formatter/user-repl.js b/examples/custom-formatter/user-repl.js new file mode 100644 index 0000000..e8f7b7d --- /dev/null +++ b/examples/custom-formatter/user-repl.js @@ -0,0 +1,151 @@ +"use strict"; +/** + * This example user-repl defines two formatters in pure javascript and + * adds them to the repl so that we can activate them in the config file + */ +var ConstrainToMidiNumbers = /** @class */ (function () { + function ConstrainToMidiNumbers() { + this.id = "constrainToMidiNumbers"; + } + ConstrainToMidiNumbers.prototype.format = function (strArr) { + function isNumeric(str) { + return !isNaN(parseFloat(str)) && isFinite(str); + } + + function constrain(num, min, max) { + return Math.min(Math.max(num, min), max); + } + + var constrainedLines = []; + var prevMessage = [null, null, null]; + var numCount = 0; + + strArr.forEach(function (line) { + var prefix = ""; + var tokens = line.split(' '); + var constrainedLine = []; + var message = [null, null, null]; + + tokens.forEach(function (token, index) { + if (isNumeric(token)) { + numCount++; + + if (numCount === 3) { + message[numCount - 1] = token; + } else { + var constrainedNumber = constrain(parseInt(token, 10), 0, 127); + message[numCount - 1] = constrainedNumber.toString(); + } + } else { + numCount = 0; + prefix = token; + } + }); + + if (constrainedLines.length === 0 && (message[1] === null || message[2] === null)) { + throw new Error("The first message must have three elements."); + } + + for (var i = 0; i < 3; i++) { + if (message[i] === null) { + message[i] = prevMessage[i]; + } + } + + prevMessage = message; + constrainedLine = prefix + " " + message.join(' '); + constrainedLines.push(constrainedLine); + }); + + return constrainedLines; + } + return ConstrainToMidiNumbers; +}()); + + +// Polyfill for Array.prototype.find +// max is so archaic you're going to need a lot of polyfills if you like modern js! +// This makes the below snippet expander a lot easier to write compared to using filter +if (!Array.prototype.find) { + Array.prototype.find = function (predicate) { + if (this == null) { + throw new TypeError('"this" is null or not defined'); + } + + var o = Object(this); + var len = o.length >>> 0; + + if (typeof predicate !== 'function') { + throw new TypeError('predicate must be a function'); + } + + var thisArg = arguments[1]; + var k = 0; + + while (k < len) { + var kValue = o[k]; + if (predicate.call(thisArg, kValue, k, o)) { + return kValue; + } + k++; + } + + return undefined; + }; +} + + +var SnippetExpander = /** @class */ (function () { + function SnippetExpander() { + this.id = "snippetExpander"; + this.spacer = " "; + this.snips = [ + { + input: "n", + output: "note", + } + ]; + } + + SnippetExpander.prototype.format = function (strArr) { + var self = this; + var formattedLines = []; + var formattedLine = ''; + + strArr.forEach(function (line) { + var words = line.split(' '); + + words.forEach(function (word, index) { + var matchingSnip = self.snips.find(function (snip) { + return snip.input === word; + }); + + if (matchingSnip) { + if (formattedLine.length > 0) { + formattedLines.push(formattedLine.trim()); + formattedLine = ''; + } + formattedLine += matchingSnip.output + self.spacer; + } else { + formattedLine += word; + if (index !== words.length - 1) { + formattedLine += self.spacer; + } + } + }); + + if (formattedLine.length > 0) { + formattedLines.push(formattedLine.trim()); + formattedLine = ''; + } + }); + + return formattedLines; + }; + return SnippetExpander; +}()); + +var ctmn = new ConstrainToMidiNumbers() +var se = new SnippetExpander() +glrepl.manager.preloadFormatter(ctmn) +glrepl.manager.preloadFormatter(se) \ No newline at end of file diff --git a/examples/editor-development/_glrepl-editor-development.maxpat b/examples/editor-development/_glrepl-editor-development.maxpat new file mode 100644 index 0000000..1bc7325 --- /dev/null +++ b/examples/editor-development/_glrepl-editor-development.maxpat @@ -0,0 +1,1383 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 4, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 638.0, 66.0, 642.0, 841.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 2, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-49", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 417.0, 410.0, 101.0, 22.0 ], + "text" : "supress_output 1" + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 417.0, 377.0, 101.0, 22.0 ], + "text" : "supress_output 0" + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 292.0, 477.0, 112.0, 22.0 ], + "text" : "ephemeral_mode 0" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 292.0, 447.0, 112.0, 22.0 ], + "text" : "ephemeral_mode 1" + } + + } +, { + "box" : { + "id" : "obj-44", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 594.0, 209.0, 150.0, 20.0 ], + "text" : "640 480" + } + + } +, { + "box" : { + "id" : "obj-81", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 257.5, 173.0, 201.5, 22.0 ], + "text" : "tw.gl.repl.dynamic-size-helper" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 292.0, 410.0, 113.0, 22.0 ], + "text" : "ignore_keys_id 100" + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 292.0, 377.0, 119.0, 22.0 ], + "text" : "ignore_keys_id 8706" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 262.5, 213.0, 111.0, 22.0 ], + "text" : "keybindings default" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 382.0, 213.0, 124.0, 22.0 ], + "text" : "keybindings newKeys" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 55.0, 546.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 16.5, 548.0, 33.0, 22.0 ], + "text" : "read" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 16.5, 622.0, 210.0, 277.0 ] + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 16.5, 591.0, 79.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict newKeys" + } + + } +, { + "box" : { + "id" : "obj-91", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 560.5, 312.5, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-89", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "bang", "int" ], + "patching_rect" : [ 617.0, 320.5, 40.0, 22.0 ], + "text" : "text" + } + + } +, { + "box" : { + "id" : "obj-86", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "cr" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 4, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 106.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-3", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 186.0, 218.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 74.666666666666671, 218.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 48.0, 38.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "fontname" : "Geneva", + "fontsize" : 10.0, + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "cr", "int", "", "" ], + "patching_rect" : [ 48.0, 83.666626000000008, 59.0, 21.0 ], + "text" : "t cr 13 s s" + } + + } +, { + "box" : { + "fontname" : "Verdana", + "fontsize" : 11.0, + "id" : "obj-64", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 74.666666666666671, 179.0, 100.0, 22.0 ], + "text" : "prepend append" + } + + } +, { + "box" : { + "fontname" : "Verdana", + "fontsize" : 11.0, + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 41.0, 126.666626000000008, 37.0, 22.0 ], + "text" : "itoa" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-85", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-64", 0 ], + "midpoints" : [ 50.5, 171.0, 84.166666666666671, 171.0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-64", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "midpoints" : [ 97.5, 138.0, 195.5, 138.0 ], + "source" : [ "obj-85", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "midpoints" : [ 57.5, 114.0, 195.5, 114.0 ], + "source" : [ "obj-85", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-85", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-64", 0 ], + "source" : [ "obj-85", 2 ] + } + + } + ] + } +, + "patching_rect" : [ 520.0, 284.5, 116.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p formatForText" + } + + } +, { + "box" : { + "id" : "obj-55", + "maxclass" : "textedit", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "", "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 520.0, 348.5, 250.0, 211.0 ] + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 89.0, 469.0, 47.0, 22.0 ], + "text" : "silent 1" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 439.0, 47.0, 22.0 ], + "text" : "silent 0" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 406.0, 73.0, 22.0 ], + "text" : "ignore_keys" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 196.0, 476.0, 86.0, 22.0 ], + "text" : "blink_enable 0" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 230.0, 300.0, 83.0, 22.0 ], + "text" : "print codeText" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 7.0, 510.0, 53.0, 22.0 ], + "text" : "s toRepl" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 292.0, 559.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 292.0, 622.0, 210.0, 277.0 ] + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 503.0, 197.0, 22.0 ], + "text" : "set \"this is a buffer. It has text\"" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 139.5, 267.0, 33.0, 22.0 ], + "text" : "read" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 185.25, 216.0, 51.0, 22.0 ], + "text" : "r toRepl" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 7.0, 336.0, 53.0, 22.0 ], + "text" : "s toRepl" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 139.5, 231.0, 34.0, 22.0 ], + "text" : "write" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 267.0, 35.0, 22.0 ], + "text" : "bang" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 299.0, 29.5, 22.0 ], + "text" : "run" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 336.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 196.0, 412.0, 91.0, 22.0 ], + "text" : "output_matrix 1" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 377.0, 101.0, 22.0 ], + "text" : "drawto editor-dev" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 196.0, 377.0, 91.0, 22.0 ], + "text" : "output_matrix 0" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 196.0, 443.0, 86.0, 22.0 ], + "text" : "blink_enable 1" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 139.5, 299.0, 35.0, 22.0 ], + "text" : "draw" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 292.0, 589.0, 140.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict default replkeys.json" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 231.0, 29.5, 22.0 ], + "text" : "init" + } + + } +, { + "box" : { + "color" : [ 0.364705882352941, 0.23921568627451, 1.0, 1.0 ], + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 328.0, 284.5, 188.0, 22.0 ], + "text" : "print tw.gl.repl-Clipboard @level 3" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 244.5, 274.0, 66.0, 22.0 ], + "text" : "s codeText" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 231.0, 72.0, 64.0, 22.0 ], + "text" : "r codeText" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 231.0, 102.0, 48.0, 22.0 ], + "text" : "route w" + } + + } +, { + "box" : { + "attr" : "visible", + "id" : "obj-26", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 63.0, 67.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 4, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 104.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-7", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 108.0, 225.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 108.0, 150.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 108.0, 180.0, 77.0, 22.0 ], + "text" : "fullscreen $1" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 108.0, 119.0, 41.0, 22.0 ], + "text" : "sel 27" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 108.0, 82.0, 50.5, 22.0 ], + "text" : "key" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 93.0, 97.0, 70.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p fullscreen" + } + + } +, { + "box" : { + "id" : "obj-30", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 312.0, 102.0, 135.0, 33.0 ], + "text" : "focus on window / press esc for fullscreen" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 48.0, 5.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 63.0, 15.0, 90.0, 20.0 ], + "text" : "turn world on" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 63.0, 140.0, 384.0, 22.0 ], + "text" : "jit.world editor-dev @fsaa 1 @fsmenubar 0 @size 588 258 @floating 1" + } + + } +, { + "box" : { + "attr" : "enable", + "id" : "obj-3", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 63.0, 37.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 244.5, 245.0, 267.0, 22.0 ], + "text" : "tw.gl.repl editor-dev 588 258 @supress_output 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "order" : 1, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "order" : 1, + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "order" : 0, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-86", 0 ], + "order" : 0, + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "order" : 1, + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 1 ], + "source" : [ "obj-2", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 0 ], + "order" : 0, + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-46", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-47", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-49", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-81", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-81", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "source" : [ "obj-86", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "source" : [ "obj-86", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-9", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "midpoints" : [ 570.0, 336.5, 532.0, 336.5, 532.0, 342.5, 529.5, 342.5 ], + "order" : 1, + "source" : [ "obj-91", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "midpoints" : [ 570.0, 336.5, 613.0, 336.5, 613.0, 315.5, 626.5, 315.5 ], + "order" : 0, + "source" : [ "obj-91", 0 ] + } + + } + ], + "dependency_cache" : [ { + "name" : "tw.gl.repl.dynamic-size-helper.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/tw.gl.repl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/tw.gl.repl/javascript/dist", + "patcherrelativepath" : "../../javascript/dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/tw.gl.repl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/tw.gl.repl/examples/custom-formatter", + "patcherrelativepath" : "../custom-formatter", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/examples/editor-development/_shortbuffer_replkeys.json b/examples/editor-development/_shortbuffer_replkeys.json new file mode 100644 index 0000000..291f175 --- /dev/null +++ b/examples/editor-development/_shortbuffer_replkeys.json @@ -0,0 +1,215 @@ +{ + "settings": { + "textbuffer": { + "formatters": [ + "whitespace", + "bracebalanced" + ] + } + }, + "bindings": [ + { + "id": "execute", + "asciiCode": 2044, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute-line", + "asciiCode": 6140, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "alphahandler", + "asciiCode": 127, + "functions": [ + "ctx.addChar(k)" + ] + }, + { + "id": "ephemeral_mode-alt-g", + "asciiCode": 169, + "functions": [ + "return ['ephemeral_mode']" + ] + }, + { + "id": "addSpace", + "asciiCode": -2, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "addSpace", + "asciiCode": 32, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "newLine", + "asciiCode": -4, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 10, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 13, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "addTab", + "asciiCode": -5, + "functions": [ + "ctx.addTab()" + ] + }, + { + "id": "delete", + "asciiCode": -6, + "functions": [ + "ctx.deleteChar()" + ] + }, + { + "id": "backspace", + "asciiCode": -7, + "functions": [ + "ctx.backSpace()" + ] + }, + { + "id": "comment-alt-/", + "asciiCode": 247, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "clear-alt-z", + "asciiCode": 937, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "cutLine-alt-x", + "asciiCode": 8776, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-alt-c", + "asciiCode": 231, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-alt-k", + "asciiCode": 730, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "paste-alt-v", + "asciiCode": 8730, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "replaceLine-alt-p", + "asciiCode": 960, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "up", + "asciiCode": -9, + "functions": [ + "ctx.jumpLine(-1)" + ] + }, + { + "id": "down", + "asciiCode": -10, + "functions": [ + "ctx.jumpLine(1)" + ] + }, + { + "id": "left", + "asciiCode": -11, + "functions": [ + "ctx.jumpChar(-1)" + ] + }, + { + "id": "right", + "asciiCode": -12, + "functions": [ + "ctx.jumpChar(1)" + ] + }, + { + "id": "jump-top-alt-up", + "asciiCode": 2039, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump-bottom-alt-down", + "asciiCode": 2038, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump-begin-alt-left", + "asciiCode": 2037, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump-end-alt-right", + "asciiCode": 2036, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jumpWord-left-cmd-left", + "asciiCode": 8804, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord-right-cmd-right", + "asciiCode": 8805, + "functions": [ + "ctx.jumpWord(1)" + ] + } + ] +} \ No newline at end of file diff --git a/examples/livecode-max/_glrepl-livecode-max-example.maxpat b/examples/livecode-max/_glrepl-livecode-max-example.maxpat new file mode 100644 index 0000000..811eca7 --- /dev/null +++ b/examples/livecode-max/_glrepl-livecode-max-example.maxpat @@ -0,0 +1,749 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 592.0, 190.0, 886.0, 754.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 1, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-8", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 40.5, 13.0, 593.0, 51.0 ], + "text" : "GLRepl - livecode max objects", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-10", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 40.5, 66.0, 834.0, 60.0 ], + "text" : "Here is an example of how you might use the repl and the max javascript api to livecode max patches and interact with them.\nThis exposes a small number of api calls (new, connect, disconnect, remove, message) to create and manipulate objects. See interpreter.js and the original interpreter.ts in the example folder to see how this is coded. It could be easily expanded to cover more of the API interface as needed.\nYou must create objects with the API" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-16", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 523.0, 480.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-17", + "linecount" : 16, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 548.0, 480.0, 248.0, 221.0 ], + "text" : "We can see all the objects we created in the max console with the ls command\n\nls gives us the id's of all the objects. We can use these ids to address messages to objects, this is how we manipulated the toggle switches in point 3. Note that item id's are made up of their object type and a sequential numbering per type. Let's clean up by deleting the patcher we made\n\nrm patcher0\n\nif we run ls again we will see that all the objects in the patcher are also deleted and can no longer be addressed" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-13", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 51.0, 576.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-15", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 67.75, 588.0, 246.0, 60.0 ], + "text" : "Open this text object and see everything we have typed into the repl, a history of your livecoding session, which you will be prompted to save on patch exit" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-11", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 466.0, 207.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-12", + "linecount" : 13, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 466.0, 229.0, 174.0, 181.0 ], + "text" : "You should have a new patcher with the objects we described above in it, connected together. Now let's turn it on with the message command:\n\nm toggle0 1\nm toggle1 1\n\nNow you should see the metro running and bangs from the button" + } + + } +, { + "box" : { + "id" : "obj-9", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 291.0, 189.5, 150.0, 141.0 ], + "text" : "n patcher\nn toggle\nn toggle 150\nn gate 20 80\nn metro 150 80 100\nn button 20 120\nc toggle0 0 gate0 0\nc toggle1 0 metro0 0\nc metro0 0 gate0 1\nc gate0 0 button0 0" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-6", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 266.0, 159.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 291.0, 159.0, 246.0, 33.0 ], + "text" : "Type the following in the repl and execute the run command (option+enter)" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 55.5, 552.0, 35.0, 22.0 ], + "text" : "open" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 124.0, 508.0, 62.0, 22.0 ], + "text" : "append cr" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "write" ], + "patching_rect" : [ 59.5, 489.0, 41.0, 22.0 ], + "text" : "t write" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 59.5, 459.0, 63.0, 22.0 ], + "text" : "closebang" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "bang", "int" ], + "patching_rect" : [ 124.0, 548.0, 40.0, 22.0 ], + "text" : "text" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 232.5, 558.0, 167.0, 22.0 ], + "saved_object_attributes" : { + "filename" : "interpreter.js", + "parameter_enable" : 0 + } +, + "text" : "js interpreter.js @autowatch 1" + } + + } +, { + "box" : { + "id" : "obj-81", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 233.5, 409.0, 201.5, 22.0 ], + "text" : "tw.gl.repl.dynamic-size-helper" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 173.25, 451.0, 51.0, 22.0 ], + "text" : "r toRepl" + } + + } +, { + "box" : { + "color" : [ 0.364705882352941, 0.23921568627451, 1.0, 1.0 ], + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 316.0, 519.5, 188.0, 22.0 ], + "text" : "print tw.gl.repl-Clipboard @level 3" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 219.0, 307.0, 64.0, 22.0 ], + "text" : "r codeText" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 219.0, 337.0, 48.0, 22.0 ], + "text" : "route w" + } + + } +, { + "box" : { + "attr" : "visible", + "id" : "obj-26", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 51.0, 302.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 104.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-7", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 108.0, 225.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 108.0, 150.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 108.0, 180.0, 77.0, 22.0 ], + "text" : "fullscreen $1" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 108.0, 119.0, 41.0, 22.0 ], + "text" : "sel 27" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 108.0, 82.0, 50.5, 22.0 ], + "text" : "key" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 81.0, 332.0, 70.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p fullscreen" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 180.75, 272.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 138.0, 250.0, 90.0, 20.0 ], + "text" : "turn world on" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 51.0, 375.0, 387.0, 22.0 ], + "text" : "jit.world max-coder @fsaa 1 @fsmenubar 0 @size 640 480 @floating 1" + } + + } +, { + "box" : { + "attr" : "enable", + "id" : "obj-3", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 51.0, 272.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 232.5, 480.0, 281.0, 22.0 ], + "text" : "tw.gl.repl max-coder 640 480 @ephemeral_mode 1" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "order" : 1, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "order" : 0, + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "order" : 1, + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 1 ], + "source" : [ "obj-2", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 0 ], + "order" : 0, + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-46", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-81", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-81", 0 ] + } + + } + ], + "dependency_cache" : [ { + "name" : "interpreter.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/examples/livecode-max/dist", + "patcherrelativepath" : "./dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.dynamic-size-helper.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/javascript/dist", + "patcherrelativepath" : "../../javascript/dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/extras", + "patcherrelativepath" : "../../extras", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/examples/livecode-max/dist/interpreter.js b/examples/livecode-max/dist/interpreter.js new file mode 100644 index 0000000..c269de6 --- /dev/null +++ b/examples/livecode-max/dist/interpreter.js @@ -0,0 +1,108 @@ +"use strict"; +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +inlets = 1; +outlets = 0; +var p = this.patcher; +var objects = []; +function has(id, objects) { + var fromObj = objects.find(function (x) { return x.id === id; }); + if (fromObj === undefined) { + error("fromId: " + id + " does not exist"); + return; + } + return fromObj; +} +function n(type, posX, posY, args) { + if (type === 'patcher') { + var timestamp = new Date().getTime(); + var subpatcherName = "subpatcher_" + timestamp; + var existing_1 = objects.filter(function (x) { return x.type === type; }); + var nobj_1 = { + id: type + existing_1.length.toString(), + type: type, + obj: p.newdefault.apply(p, __spreadArray([posX || 0, posY || 0, "p", subpatcherName], args || [], false)), + patcher: p.name, + name: subpatcherName + }; + objects.push(nobj_1); + p = nobj_1.obj.subpatcher(0); + p.locked = true; + return; + } + if (type === 'bang') { + type = 'button'; + } + var existing = objects.filter(function (x) { return x.type === type; }); + if (!Array.isArray(args)) + args = [args]; + var nobj = { + id: type + existing.length.toString(), + type: type, + obj: p.newdefault.apply(p, __spreadArray([posX || 20, posY || 40, type], args || [], false)), + patcher: p.name + }; + objects.push(nobj); +} +function c(fromId, fromPort, toId, toPort) { + var fromObj = has(fromId, objects); + var toObj = has(toId, objects); + p.connect(fromObj === null || fromObj === void 0 ? void 0 : fromObj.obj, fromPort, toObj === null || toObj === void 0 ? void 0 : toObj.obj, toPort); +} +function d(fromId, fromPort, toId, toPort) { + var fromObj = has(fromId, objects); + var toObj = has(toId, objects); + p.disconnect(fromObj === null || fromObj === void 0 ? void 0 : fromObj.obj, fromPort, toObj === null || toObj === void 0 ? void 0 : toObj.obj, toPort); +} +function rm(id) { + var obj = has(id, objects); + var idx = objects.findIndex(function (x) { return x.id === id; }); + objects.splice(idx, 1); + if ((obj === null || obj === void 0 ? void 0 : obj.type) === "patcher") { + // although max will clean up the child objects itself we also need to do some + // housekeeping when something is removed so it's easiest to handle by finding + // what's in the patcher we are destroying and deleting all the children + var child = objects.findIndex(function (x) { return x.patcher === obj.name; }); + while (child !== -1) { + rm(objects[child].id); + child = objects.findIndex(function (x) { return x.patcher === obj.name; }); + } + p = this.patcher; + } + p.remove(obj === null || obj === void 0 ? void 0 : obj.obj); +} +function m() { + var _a; + var a = arrayfromargs(arguments); + var obj = has(a.shift(), objects); + obj === null || obj === void 0 ? void 0 : (_a = obj.obj).message.apply(_a, __spreadArray([a.shift()], a, false)); +} +function ls() { + objects.forEach(function (element) { + post(element.id + " " + element.type + " " + element.patcher + " " + element.name + "\n"); + }); +} +Array.prototype.findIndex = function (callback, thisArg) { + if (!callback || typeof callback !== 'function') + throw TypeError(); + var size = this.length; + var that = thisArg || this; + for (var i = 0; i < size; i++) { + try { + if (!!callback.apply(that, [this[i], i, this])) { + return i; + } + } + catch (e) { + return -1; + } + } + return -1; +}; diff --git a/examples/livecode-max/package-lock.json b/examples/livecode-max/package-lock.json new file mode 100644 index 0000000..b8a8300 --- /dev/null +++ b/examples/livecode-max/package-lock.json @@ -0,0 +1,1939 @@ +{ + "name": "livecode-max", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "livecode-max", + "version": "1.0.0", + "license": "MIT", + "devDependencies": { + "@types/maxmsp": "^1.0.0", + "ava": "^5.2.0" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/maxmsp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@types/maxmsp/-/maxmsp-1.0.0.tgz", + "integrity": "sha512-lgx/OBC7M8LBIYxGlak/zqvsVnqBLW3xlxEZC0CCZmYdPpB14Cl1zUIJ0FD5N2jY8ICN6fhU2jnIVtOKeWPB6g==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-5.2.0.tgz", + "integrity": "sha512-W8yxFXJr/P68JP55eMpQIa6AiXhCX3VeuajM8nolyWNExcMDD6rnIWKTjw0B/+GkFHBIaN6Jd0LtcMThcoqVfg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.2.1", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.7.1", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "del": "^7.0.0", + "emittery": "^1.0.1", + "figures": "^5.0.0", + "globby": "^13.1.3", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.5.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^8.0.0", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^5.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=14.19 <15 || >=16.15 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz", + "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chalk": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", + "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dev": true, + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/del": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", + "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", + "dev": true, + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/emittery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.1.tgz", + "integrity": "sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.12", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", + "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.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", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globby": { + "version": "13.1.4", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.1.4.tgz", + "integrity": "sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.11", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "dev": true, + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "dev": true, + "dependencies": { + "parse-ms": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/signal-exit": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.0.1.tgz", + "integrity": "sha512-uUWsN4aOxJAS8KOuf3QMyFtgm1pkb6I+KRZbRF/ghdf5T7sM+B1lLLzPDxswUjkmHyxQAVzEgG35E3NzDM9GVw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "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", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/examples/livecode-max/package.json b/examples/livecode-max/package.json new file mode 100644 index 0000000..1823c6d --- /dev/null +++ b/examples/livecode-max/package.json @@ -0,0 +1,19 @@ +{ + "name": "livecode-max", + "version": "1.0.0", + "description": "basic interpreter for livecoding max via its js api", + "main": "interpreter.js", + "scripts": { + "build": "tsc" + }, + "keywords": [ + "livecoding", + "max" + ], + "author": "Tom Whiston", + "license": "MIT", + "devDependencies": { + "@types/maxmsp": "^1.0.0", + "ava": "^5.2.0" + } +} diff --git a/examples/livecode-max/src/interpreter.ts b/examples/livecode-max/src/interpreter.ts new file mode 100644 index 0000000..992a8ed --- /dev/null +++ b/examples/livecode-max/src/interpreter.ts @@ -0,0 +1,115 @@ +inlets = 1 +outlets = 0 + +var p = this.patcher + +type ObjectWrapper = { + id: string + type: string + patcher: string + obj: Maxobj + name?: string +} + +var objects: ObjectWrapper[] = []; +function has(id: string, objects: ObjectWrapper[]): ObjectWrapper | undefined { + const fromObj = objects.find(x => x.id === id); + if (fromObj === undefined) { + error("fromId: " + id + " does not exist"); + return; + } + return fromObj; +} + +function n(type: string, posX?: number, posY?: number, args?: any[]) { + + if (type === 'patcher') { + var timestamp = new Date().getTime(); + var subpatcherName = "subpatcher_" + timestamp; + const existing = objects.filter(x => x.type === type); + const nobj = { + id: type + existing.length.toString(), + type: type, + obj: p.newdefault(posX || 0, posY || 0, "p", subpatcherName, ...args || []), + patcher: p.name, + name: subpatcherName + } + objects.push(nobj); + p = nobj.obj.subpatcher(0); + p.locked = true; + return; + } + if (type === 'bang') { + type = 'button' + } + const existing = objects.filter(x => x.type === type); + if (!Array.isArray(args)) + args = [args] + const nobj = { + id: type + existing.length.toString(), + type: type, + obj: p.newdefault(posX || 20, posY || 40, type, ...args || []), + patcher: p.name + } + objects.push(nobj); + +} + +function c(fromId: string, fromPort: number, toId: string, toPort: number) { + const fromObj = has(fromId, objects); + const toObj = has(toId, objects); + p.connect(fromObj?.obj, fromPort, toObj?.obj, toPort); +} + +function d(fromId: string, fromPort: number, toId: string, toPort: number) { + const fromObj = has(fromId, objects); + const toObj = has(toId, objects); + p.disconnect(fromObj?.obj, fromPort, toObj?.obj, toPort); +} + +function rm(this: any, id: string) { + const obj = has(id, objects); + const idx = objects.findIndex(x => x.id === id); + objects.splice(idx, 1); + if (obj?.type === "patcher") { + // although max will clean up the child objects itself we also need to do some + // housekeeping when something is removed so it's easiest to handle by finding + // what's in the patcher we are destroying and deleting all the children + let child = objects.findIndex(x => x.patcher === obj.name) + while (child !== -1) { + rm(objects[child].id) + child = objects.findIndex(x => x.patcher === obj.name) + } + p = (this).patcher + } + p.remove(obj?.obj); +} + +function m() { + var a = arrayfromargs(arguments); + const obj = has(a.shift(), objects); + obj?.obj.message(a.shift(), ...a) +} + +function ls() { + objects.forEach(element => { + post(element.id + " " + element.type + " " + element.patcher + " " + element.name + "\n") + }); +} + + +Array.prototype.findIndex = function (callback, thisArg) { + if (!callback || typeof callback !== 'function') throw TypeError(); + const size = this.length; + const that = thisArg || this; + for (var i = 0; i < size; i++) { + try { + if (!!callback.apply(that, [this[i], i, this])) { + return i; + } + } catch (e) { + return -1; + } + } + return -1; +} \ No newline at end of file diff --git a/examples/livecode-max/tsconfig.json b/examples/livecode-max/tsconfig.json new file mode 100644 index 0000000..67c3072 --- /dev/null +++ b/examples/livecode-max/tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "module": "CommonJS", + "target": "es3", + "ignoreDeprecations": "5.0", + "strict": true, + "noImplicitAny": true, + "sourceMap": false, + "outDir": "./dist", + "baseUrl": "src", + "types": [ + "maxmsp" + ], + "lib": [ + "es6" + ] + }, + "include": [ + "./src/*.ts", + "./src/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file diff --git a/example/_example.txt b/examples/opengl/_example1.txt similarity index 100% rename from example/_example.txt rename to examples/opengl/_example1.txt diff --git a/examples/opengl/_example10.txt b/examples/opengl/_example10.txt new file mode 100644 index 0000000..63e468a --- /dev/null +++ b/examples/opengl/_example10.txt @@ -0,0 +1,23 @@ +wo erase_color 0 0 0 1 + +gs shape cube +gs poly_mode 0 0 +gs lighting_enable 1 +gs fog 1 +gs fog_range 2 10 + +mp dim 8 8 8 +mp distance 1 +mp scale 10 0.01 0.01 +mp rotatexyz 0 0 0 +mp anim turn 0.2 0.03 0.01 + +cam ortho 0 +cam near_clip 0.1 +cam lens_angle 30 +cam position 2 0 0 + +light_1 diffuse 1 0 1 +light_2 diffuse 0 1 0 1 +light_3 diffuse 1 0 0.2 1 + diff --git a/examples/opengl/_example11.txt b/examples/opengl/_example11.txt new file mode 100644 index 0000000..520d021 --- /dev/null +++ b/examples/opengl/_example11.txt @@ -0,0 +1,23 @@ +wo erase_color 0 0 0.2 1 + +gs shape cube +gs poly_mode 0 0 +gs lighting_enable 1 +gs fog 1 +gs fog_range 2 10 +gs color 1 1 1 0.1 + +mp dim 5 5 5 +mp distance 1 +mp scale 10 0.2 0.01 +mp rotatexyz random 0 20 +mp anim turn 0.3 -0.4 0.1 + +cam ortho 1 +cam near_clip 0.1 +cam lens_angle 90 +cam position 2 0 0 + +light_1 diffuse 0 1 1 +light_2 diffuse 0 0 1 +light_3 diffuse 1 1 1 diff --git a/example/_example2.txt b/examples/opengl/_example2.txt similarity index 100% rename from example/_example2.txt rename to examples/opengl/_example2.txt diff --git a/example/_example3.txt b/examples/opengl/_example3.txt similarity index 100% rename from example/_example3.txt rename to examples/opengl/_example3.txt diff --git a/examples/opengl/_example4.txt b/examples/opengl/_example4.txt new file mode 100644 index 0000000..dbd9934 --- /dev/null +++ b/examples/opengl/_example4.txt @@ -0,0 +1,20 @@ +wo erase_color 0.1 0.2 0.15 1 + +gs shape cube +gs poly_mode 0 0 +gs lighting_enable 1 +gs fog 1 +gs fog_range 2 10 + +mp dim 7 7 7 +mp distance 2 +mp scale random 0.1 0.9 +mp rotatexyz 45 45 0 +mp anim turn 0.2 0.03 0.01 + +cam ortho 1 +cam lens_angle 110 + +light_1 diffuse 0.2 0.2 0.6 +light_2 diffuse 0.4 0.8 0 +light_3 diffuse 0.2 0.5 1 \ No newline at end of file diff --git a/examples/opengl/_example5.txt b/examples/opengl/_example5.txt new file mode 100644 index 0000000..757627b --- /dev/null +++ b/examples/opengl/_example5.txt @@ -0,0 +1,20 @@ +wo erase_color 0.1 0.2 0.35 1 + +gs shape opencube +gs poly_mode 1 1 +gs lighting_enable 1 +gs fog 0 +gs fog_range 2 10 + +mp dim 5 5 +mp distance 2 +mp scale random 0 1.4 +mp rotatexyz 45 45 0 +mp anim turn 0.2 0.03 0.01 + +cam ortho 1 +cam lens_angle 110 + +light_1 diffuse 0 0.2 0.6 +light_2 diffuse 0.1 0.8 0.3 +light_3 diffuse 1 1 1 \ No newline at end of file diff --git a/examples/opengl/_example6.txt b/examples/opengl/_example6.txt new file mode 100644 index 0000000..af1a3ec --- /dev/null +++ b/examples/opengl/_example6.txt @@ -0,0 +1,20 @@ +wo erase_color 0.1 0.2 0.35 1 + +gs shape opencube +gs poly_mode 1 1 +gs lighting_enable 1 +gs fog 0 +gs fog_range 2 10 + +mp dim 5 5 +mp distance 2 +mp scale random 0 1.4 +mp rotatexyz 45 45 0 +mp anim turn 0.2 0.03 0.01 + +cam ortho 1 +cam lens_angle 110 + +light_1 diffuse 1 1 0.6 +light_2 diffuse 0.1 0.8 0.3 +light_3 diffuse 1 1 1 \ No newline at end of file diff --git a/examples/opengl/_example7.txt b/examples/opengl/_example7.txt new file mode 100644 index 0000000..2466fbf --- /dev/null +++ b/examples/opengl/_example7.txt @@ -0,0 +1,21 @@ +wo erase_color 0.02 0.2 0.35 1 + +gs shape cube +gs poly_mode 0 0 +gs lighting_enable 1 +gs fog 0 +gs fog_range 2 10 + +mp dim 5 5 5 +mp distance 3 +mp scale 0.1 +mp rotatexyz 45 45 0 +mp anim turn 0.2 0.03 0.01 + +cam ortho 0 +cam lens_angle 50 +cam position 4 0 0 + +light_1 diffuse 1 1 0.3 +light_2 diffuse 0.2 0.1 0.2 +light_3 diffuse 1 0.2 0.1 \ No newline at end of file diff --git a/examples/opengl/_example8.txt b/examples/opengl/_example8.txt new file mode 100644 index 0000000..a4eae3b --- /dev/null +++ b/examples/opengl/_example8.txt @@ -0,0 +1,23 @@ +wo erase_color 0 0 0.2 1 + +gs shape cube +gs poly_mode 0 0 +gs lighting_enable 1 +gs fog 1 +gs fog_range 2 10 +gs color 1 1 1 0.1 + +mp dim 5 5 5 +mp distance 1 +mp scale 10 0.2 0.01 +mp rotatexyz random 0 20 +mp anim turn 0.3 -0.4 0.1 + +cam ortho 1 +cam near_clip 0.1 +cam lens_angle 90 +cam position 2 0 0 + +light_1 diffuse 0 1 1 +light_2 diffuse 0 0 1 +light_3 diffuse 1 1 1 \ No newline at end of file diff --git a/examples/opengl/_example9.txt b/examples/opengl/_example9.txt new file mode 100644 index 0000000..65031de --- /dev/null +++ b/examples/opengl/_example9.txt @@ -0,0 +1,22 @@ +wo erase_color 0.1 0.2 0.15 1 + +gs shape cube +gs poly_mode 0 0 +gs lighting_enable 1 +gs fog 1 +gs fog_range 2 10 + +mp dim 7 7 7 +mp distance 2 +mp scale random 0.1 0.9 +mp rotatexyz 45 45 0 +mp anim turn 0.2 0.03 0.01 + +cam ortho 1 +cam lens_angle 110 + + +light_1 diffuse 0.2 0.2 0.6 +light_2 diffuse 0.4 0.8 0 +light_3 diffuse 0.2 0.5 1 + diff --git a/example/_th.gl.texteditor-example.maxpat b/examples/opengl/_glrepl-opengl-example.maxpat similarity index 91% rename from example/_th.gl.texteditor-example.maxpat rename to examples/opengl/_glrepl-opengl-example.maxpat index c8ba19c..b407bbe 100644 --- a/example/_th.gl.texteditor-example.maxpat +++ b/examples/opengl/_glrepl-opengl-example.maxpat @@ -3,14 +3,14 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 34.0, 79.0, 997.0, 783.0 ], + "rect" : [ 832.0, 198.0, 974.0, 783.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -37,63 +37,178 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-52", + "id" : "obj-81", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 430.33331298828125, 353.0, 201.5, 22.0 ], + "text" : "tw.gl.repl.dynamic-size-helper" + } + + } +, { + "box" : { + "id" : "obj-74", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 97.0, 461.0, 41.0, 22.0 ], + "text" : "pipe 5" + } + + } +, { + "box" : { + "bgcolor" : [ 0.541176, 0.815686, 0.913725, 1.0 ], + "fontname" : "Arial Bold", + "fontsize" : 11.0, + "hint" : "", + "id" : "obj-63", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 57.5, 420.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "11", + "textcolor" : [ 1.0, 1.0, 1.0, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "fontsize" : 11.0, + "hint" : "", + "id" : "obj-62", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 623.0, 737.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "11", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-61", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "clear" ], + "patching_rect" : [ 98.0, 433.0, 47.0, 22.0 ], + "text" : "t i clear" + } + + } +, { + "box" : { + "id" : "obj-56", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 98.0, 492.0, 157.0, 22.0 ], + "text" : "sprintf read _example%s.txt" + } + + } +, { + "box" : { + "id" : "obj-55", + "items" : [ 1, ",", 2, ",", 3, ",", 4, ",", 5, ",", 6, ",", 7, ",", 8, ",", 9, ",", 10, ",", 11 ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 57.5, 395.0, 100.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-54", "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 150.0, 510.0, 111.0, 22.0 ], - "text" : "read _example3.txt" + "patching_rect" : [ 238.5, 418.0, 33.0, 22.0 ], + "text" : "read" } } , { "box" : { - "id" : "obj-42", + "id" : "obj-5", "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 150.0, 480.0, 111.0, 22.0 ], - "presentation_linecount" : 2, - "text" : "read _example2.txt" + "patching_rect" : [ 238.5, 387.0, 35.0, 22.0 ], + "text" : "clear" } } , { "box" : { - "id" : "obj-39", - "maxclass" : "comment", + "id" : "obj-10", + "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 345.0, 345.0, 165.0, 20.0 ], - "text" : "execute code (ALT+ENTER)" + "patching_rect" : [ 385.33331298828125, 480.0, 110.0, 22.0 ], + "text" : "print codeMessage" } } , { "box" : { - "id" : "obj-29", + "id" : "obj-36", "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 311.5, 345.0, 29.5, 22.0 ], - "text" : "run" + "patching_rect" : [ 261.5, 353.0, 29.5, 22.0 ], + "text" : "init" } } , { "box" : { - "id" : "obj-53", + "id" : "obj-39", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 343.166656494140625, 345.0, 86.0, 33.0 ], + "text" : "execute code (ALT+ENTER)" + } + + } +, { + "box" : { + "id" : "obj-29", "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 150.0, 450.0, 104.0, 22.0 ], - "text" : "read _example.txt" + "patching_rect" : [ 311.5, 345.0, 29.5, 22.0 ], + "text" : "run" } } @@ -185,78 +300,6 @@ "text" : "write" } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 524.0, 345.0, 86.0, 22.0 ], - "text" : "routepass size" - } - - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 62.0, 240.0, 54.0, 22.0 ], - "text" : "qlim 100" - } - - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 62.0, 210.0, 51.0, 22.0 ], - "text" : "r render" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 62.0, 270.0, 53.0, 22.0 ], - "text" : "t getsize" - } - - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 285.0, 450.0, 71.0, 22.0 ], - "text" : "fromsymbol" - } - - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 284.5, 420.0, 25.0, 22.0 ], - "text" : "iter" - } - } , { "box" : { @@ -584,7 +627,7 @@ "numoutlets" : 3, "outlettype" : [ "", "", "int" ], "parameter_enable" : 0, - "patching_rect" : [ 203.0, 283.0, 20.0, 20.0 ], + "patching_rect" : [ 238.5, 230.0, 20.0, 20.0 ], "rounded" : 60.0, "text" : "1", "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] @@ -597,7 +640,7 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 130.5, 293.0, 90.0, 20.0 ], + "patching_rect" : [ 203.0, 252.0, 90.0, 20.0 ], "text" : "turn world on" } @@ -673,8 +716,8 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } @@ -707,6 +750,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "bgcolor" : [ 0.541176, 0.815686, 0.913725, 1.0 ], @@ -758,8 +802,8 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } @@ -792,6 +836,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "id" : "obj-11", @@ -1017,8 +1062,8 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } @@ -1051,6 +1096,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "id" : "obj-11", @@ -1276,8 +1322,8 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } @@ -1310,6 +1356,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "id" : "obj-11", @@ -1633,8 +1680,8 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } @@ -1667,6 +1714,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "id" : "obj-1", @@ -2314,11 +2362,12 @@ "fontface" : 1, "fontsize" : 12.0, "id" : "obj-158", + "linecount" : 2, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 45.0, 138.0, 367.0, 20.0 ], - "text" : "written by Timo Hoogland © 2020, www.timohoogland.com" + "patching_rect" : [ 45.0, 102.0, 515.0, 33.0 ], + "text" : "This example originally written for [th.gl.texteditor] by Timo Hoogland © 2020, www.timohoogland.com" } } @@ -2331,8 +2380,8 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 45.0, 45.0, 510.0, 42.0 ], - "text" : "th.gl.texteditor - example patch", + "patching_rect" : [ 45.0, 6.0, 510.0, 42.0 ], + "text" : "GLRepl - opengl example", "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] } @@ -2348,8 +2397,8 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 0, - "revision" : 8, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } @@ -2382,6 +2431,7 @@ "tags" : "", "style" : "", "subpatcher_template" : "", + "assistshowspatchername" : 0, "boxes" : [ { "box" : { "id" : "obj-171", @@ -2495,6 +2545,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], + "parameter_enable" : 0, "patching_rect" : [ 120.0, 228.0, 177.0, 22.0 ], "text_width" : 144.5 } @@ -2509,6 +2560,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], + "parameter_enable" : 0, "patching_rect" : [ 120.0, 180.0, 177.0, 22.0 ], "text_width" : 144.5 } @@ -2523,6 +2575,7 @@ "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], + "parameter_enable" : 0, "patching_rect" : [ 120.0, 204.0, 177.0, 22.0 ], "text_width" : 144.5 } @@ -2534,10 +2587,10 @@ "id" : "obj-112", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 284.5, 387.0, 190.0, 22.0 ], - "text" : "th.gl.texteditor cmd-xmp 1280 720" + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 284.5, 391.0, 162.0, 22.0 ], + "text" : "tw.gl.repl cmd-xmp 1280 720" } } @@ -2580,12 +2633,12 @@ , { "box" : { "id" : "obj-40", - "linecount" : 49, + "linecount" : 51, "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 645.0, 67.5, 318.0, 663.0 ], - "text" : "This patch has 2 named shape objects, namely the jit.gl.gridshape and the jit.gl.plato. It has a jit.gl.multiple to target one of those objects. You can change parameters of the objects and the multiple with the correct messaging system. The orange numbers correspond with the same number in blue.\n\n=> control jit.world: start with \"wo\"\nwo erase_color 0.3 0.2 0.5 1\nwo erase_color 0 0 0 0.2\n\n\n=> control jit.gl.gridshape: start with \"gs\". \ngs shape cube\ngs poly_mode 1 1\ngs lighting_enable 1\ngs fog 1\n\n\n=> control jit.gl.plato: start with \"pl\".\npl shape dodeca\npl poly_mode 1 1\npl line_width 5\npl fog_range 5 20\n\n\n=> control jit.gl.multiple: start with \"mp\".\nmp dim 10 10 10\nmp distance 10\nmp scale random lo hi\nmp rotatexyz random lo hi\nmp targetname grid\nmp targetname plato\n\n\n=> control jit.gl.multiples anim.node: start with \"mp anim\".\nmp anim turn 0.3 0.5 0.2\n\n\n=> control jit.gl.camera: start with \"cam\".\ncam position 0 0 4\ncam lens_angle 110\ncam ortho 2\n\n\n=> control light source 1: start with \"light_1\"\n=> control light source 2: start with \"light_2\"\n=> control light source 3: start with \"light_3\"\n=> control both lights: start with \"light\"" + "patching_rect" : [ 645.0, 67.5, 318.0, 690.0 ], + "text" : "This patch has 2 named shape objects, namely the jit.gl.gridshape and the jit.gl.plato. It has a jit.gl.multiple to target one of those objects. You can change parameters of the objects and the multiple with the correct messaging system. The orange numbers correspond with the same number in blue.\n\n=> control jit.world: start with \"wo\"\nwo erase_color 0.3 0.2 0.5 1\nwo erase_color 0 0 0 0.2\n\n\n=> control jit.gl.gridshape: start with \"gs\". \ngs shape cube\ngs poly_mode 1 1\ngs lighting_enable 1\ngs fog 1\n\n\n=> control jit.gl.plato: start with \"pl\".\npl shape dodeca\npl poly_mode 1 1\npl line_width 5\npl fog_range 5 20\n\n\n=> control jit.gl.multiple: start with \"mp\".\nmp dim 10 10 10\nmp distance 10\nmp scale random lo hi\nmp rotatexyz random lo hi\nmp targetname grid\nmp targetname plato\n\n\n=> control jit.gl.multiples anim.node: start with \"mp anim\".\nmp anim turn 0.3 0.5 0.2\n\n\n=> control jit.gl.camera: start with \"cam\".\ncam position 0 0 4\ncam lens_angle 110\ncam ortho 2\n\n\n=> control light source 1: start with \"light_1\"\n=> control light source 2: start with \"light_2\"\n=> control light source 3: start with \"light_3\"\n=> control both lights: start with \"light\"\n\ntry loading some example files and running them" } } @@ -2622,8 +2675,8 @@ "maxclass" : "comment", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 45.0, 89.0, 510.0, 47.0 ], - "text" : "control parameters of jit.gl.plato, jit.gl.gridshape, camera and lights to live code with your own patch" + "patching_rect" : [ 45.0, 50.0, 515.0, 47.0 ], + "text" : "control parameters of jit.gl.plato, jit.gl.gridshape, camera and lights to live code with your own patch." } } @@ -2746,7 +2799,7 @@ "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "" ], - "patching_rect" : [ 120.0, 374.0, 72.0, 35.0 ] + "patching_rect" : [ 120.0, 353.0, 72.0, 35.0 ] } } @@ -2756,7 +2809,7 @@ "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 203.0, 387.0, 53.0, 22.0 ], + "patching_rect" : [ 203.0, 353.0, 53.0, 22.0 ], "text" : "s render" } @@ -2767,7 +2820,7 @@ "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 3, - "outlettype" : [ "", "bang", "" ], + "outlettype" : [ "jit_matrix", "bang", "" ], "patching_rect" : [ 45.0, 315.0, 498.0, 22.0 ], "text" : "jit.world cmd-xmp @floating 1 @fsaa 1 @fsmenubar 0 @size 480 270 @erase_color 0 0 0 1" } @@ -2777,7 +2830,7 @@ "lines" : [ { "patchline" : { "destination" : [ "obj-112", 0 ], - "order" : 0, + "order" : 1, "source" : [ "obj-1", 1 ] } @@ -2785,7 +2838,7 @@ , { "patchline" : { "destination" : [ "obj-14", 0 ], - "order" : 2, + "order" : 3, "source" : [ "obj-1", 1 ] } @@ -2793,21 +2846,39 @@ , { "patchline" : { "destination" : [ "obj-15", 0 ], - "order" : 1, + "order" : 2, "source" : [ "obj-1", 1 ] } } , { "patchline" : { - "destination" : [ "obj-9", 0 ], + "destination" : [ "obj-81", 1 ], "source" : [ "obj-1", 2 ] } } , { "patchline" : { - "destination" : [ "obj-4", 0 ], + "destination" : [ "obj-81", 0 ], + "order" : 0, + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "midpoints" : [ 294.0, 465.0, 394.83331298828125, 465.0 ], + "order" : 0, + "source" : [ "obj-112", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-206", 0 ], + "order" : 1, "source" : [ "obj-112", 0 ] } @@ -2878,21 +2949,15 @@ , { "patchline" : { "destination" : [ "obj-112", 0 ], + "midpoints" : [ 444.5, 444.0, 282.0, 444.0, 282.0, 414.0, 279.0, 414.0, 279.0, 387.0, 294.0, 387.0 ], "source" : [ "obj-31", 0 ] } - } -, { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-4", 0 ] - } - } , { "patchline" : { "destination" : [ "obj-112", 0 ], - "source" : [ "obj-42", 0 ] + "source" : [ "obj-36", 0 ] } } @@ -2906,6 +2971,7 @@ , { "patchline" : { "destination" : [ "obj-1", 0 ], + "midpoints" : [ 321.0, 234.0, 297.0, 234.0, 297.0, 300.0, 54.5, 300.0 ], "order" : 1, "source" : [ "obj-44", 0 ] } @@ -2922,6 +2988,7 @@ , { "patchline" : { "destination" : [ "obj-112", 0 ], + "midpoints" : [ 444.5, 474.0, 420.0, 474.0, 420.0, 423.0, 279.0, 423.0, 279.0, 387.0, 294.0, 387.0 ], "source" : [ "obj-45", 0 ] } @@ -2956,7 +3023,7 @@ } , { "patchline" : { - "destination" : [ "obj-206", 0 ], + "destination" : [ "obj-112", 0 ], "source" : [ "obj-5", 0 ] } @@ -2964,21 +3031,37 @@ , { "patchline" : { "destination" : [ "obj-112", 0 ], - "source" : [ "obj-52", 0 ] + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-61", 0 ], + "source" : [ "obj-55", 1 ] } } , { "patchline" : { "destination" : [ "obj-112", 0 ], - "source" : [ "obj-53", 0 ] + "midpoints" : [ 107.5, 525.0, 270.0, 525.0, 270.0, 450.0, 282.0, 450.0, 282.0, 411.0, 279.0, 411.0, 279.0, 381.0, 294.0, 381.0 ], + "source" : [ "obj-56", 0 ] } } , { "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-6", 0 ] + "destination" : [ "obj-112", 0 ], + "midpoints" : [ 135.5, 456.0, 282.0, 456.0, 282.0, 411.0, 279.0, 411.0, 279.0, 381.0, 294.0, 381.0 ], + "source" : [ "obj-61", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-74", 0 ], + "source" : [ "obj-61", 0 ] } } @@ -3036,22 +3119,22 @@ } , { "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-7", 0 ] + "destination" : [ "obj-69", 0 ], + "source" : [ "obj-70", 0 ] } } , { "patchline" : { - "destination" : [ "obj-69", 0 ], - "source" : [ "obj-70", 0 ] + "destination" : [ "obj-73", 0 ], + "source" : [ "obj-71", 0 ] } } , { "patchline" : { - "destination" : [ "obj-73", 0 ], - "source" : [ "obj-71", 0 ] + "destination" : [ "obj-56", 0 ], + "source" : [ "obj-74", 0 ] } } @@ -3071,36 +3154,47 @@ } , { "patchline" : { - "destination" : [ "obj-6", 0 ], - "source" : [ "obj-8", 0 ] + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 439.83331298828125, 378.0, 192.0, 378.0, 192.0, 348.0, 30.0, 348.0, 30.0, 300.0, 54.5, 300.0 ], + "source" : [ "obj-81", 0 ] } } , { "patchline" : { "destination" : [ "obj-112", 0 ], - "source" : [ "obj-9", 0 ] + "source" : [ "obj-81", 1 ] } } ], "dependency_cache" : [ { - "name" : "th.gl.texteditor.maxpat", - "bootpath" : "~/Documents/Max 7/Library/abstractions/th.gl.texteditor/patchers", - "patcherrelativepath" : "../patchers", + "name" : "tw.gl.repl.dynamic-size-helper.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../../patchers", "type" : "JSON", "implicit" : 1 } , { - "name" : "th.gl.editor.js", - "bootpath" : "~/Documents/Max 7/Library/abstractions/th.gl.texteditor/code", - "patcherrelativepath" : "../code", + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/javascript/dist", + "patcherrelativepath" : "../../javascript/dist", "type" : "TEXT", "implicit" : 1 } , { - "name" : "ease.mxo", - "type" : "iLaX" + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/examples/custom-formatter", + "patcherrelativepath" : "../custom-formatter", + "type" : "TEXT", + "implicit" : 1 } ], "autosave" : 0 diff --git a/examples/simple-midi/_generate_scale.js b/examples/simple-midi/_generate_scale.js new file mode 100644 index 0000000..a18cf09 --- /dev/null +++ b/examples/simple-midi/_generate_scale.js @@ -0,0 +1,93 @@ +outlets = 2; + +function noteNameToMidiNumber(noteName, octave) { + var noteNames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B']; + var noteIndex = noteNames.indexOf(noteName); + if (noteIndex === -1) { + return -1; + } + return (octave + 1) * 12 + noteIndex; +} +noteNameToMidiNumber.local = 1; + +var currentScale = []; +var noteIndex = 0; + +function setNoteIndex(dir){ + if(dir !== 1 && dir !== -1){ + post("dir must be 1 or -1 \n"); + return; + } + + if(dir === -1){ + noteIndex = prevIndex(noteIndex) + } else if (dir === 1){ + noteIndex = nextIndex(noteIndex) + } + +} + +function prevIndex(index){ + if(index > 0) + --index; + else + index = currentScale.length-1; + + return index; +} + +function nextIndex(index){ + if(index >= currentScale.length -1) + return 0 + else + return ++index; + +} + +function previousNote(){ + outlet(0,currentScale[prevIndex(noteIndex)]) + +} + +function currentNote(){ + outlet(0, currentScale[noteIndex]) +} + +function generate_scale(rootNoteName, octave, mode) { + var rootNote = noteNameToMidiNumber(rootNoteName, octave); + + var intervals = { + 'major': [2, 2, 1, 2, 2, 2, 1], + 'minor': [2, 1, 2, 2, 1, 2, 2], + 'dorian': [2, 1, 2, 2, 2, 1, 2], + 'phrygian': [1, 2, 2, 2, 1, 2, 2], + 'lydian': [2, 2, 2, 1, 2, 2, 1], + 'mixolydian': [2, 2, 1, 2, 2, 1, 2], + 'locrian': [1, 2, 2, 1, 2, 2, 2] + }; + + var scale = []; + + if (rootNote < 0 || rootNote > 127 || !intervals[mode]) { + post('Invalid root note or mode\n'); + return; + } + + var current_note; + for (var i = 0; i < 7; i++) { + current_note = rootNote + (12 * i); + intervals[mode].forEach(function (interval) { + if (current_note <= 127) { + scale.push(current_note); + current_note += interval; + } else { + return; + } + }); + } + + currentScale = scale; + + outlet(1, scale); +} + diff --git a/examples/simple-midi/_glrepl-simple-midi-example.maxpat b/examples/simple-midi/_glrepl-simple-midi-example.maxpat new file mode 100644 index 0000000..88cb462 --- /dev/null +++ b/examples/simple-midi/_glrepl-simple-midi-example.maxpat @@ -0,0 +1,1572 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 807.0, 191.0, 1023.0, 754.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 2, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-14", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 593.5, 238.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-21", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 20.0, 7.0, 585.0, 51.0 ], + "text" : "GLRepl - simple midi example", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-28", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 324.0, 270.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-23", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 317.0, 286.0, 244.0, 60.0 ], + "text" : "UP ARROW - increase pitch and play\nDOWN ARROW - decrease pitch and play\nRIGHT ARROW - play current pitch\nLEFT ARROW - play current pitch -1" + } + + } +, { + "box" : { + "id" : "obj-17", + "linecount" : 8, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 615.5, 238.0, 338.0, 114.0 ], + "text" : "In our config file we attach some functions to the arrow keys. Firstly the function does some housekeeping to add the character to the text buffer and add a newline if our current line is over 20 chars long. \nSecondly we return a message, which we route in max and process in the midiHandler subpathch. As such this is one of the simplest non \"process all alphanumerical keys\" programs we could create with the repl." + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-6", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 469.5, 636.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 488.0, 636.0, 117.0, 20.0 ], + "text" : "select a midi output" + } + + } +, { + "box" : { + "id" : "obj-44", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 134.25, 417.0, 29.5, 22.0 ], + "text" : "init" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 134.25, 450.0, 33.0, 22.0 ], + "text" : "read" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 172.25, 450.0, 34.0, 22.0 ], + "text" : "write" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 3, + "outlettype" : [ "float", "float", "float" ], + "patching_rect" : [ 220.5, 604.0, 118.0, 22.0 ], + "text" : "makenote 100 500 1" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 172.0, 581.0, 50.0, 22.0 ], + "text" : "93" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-19", + "items" : [ "AU DLS Synth 1", ",", "M4", ",", "from Max 1", ",", "from Max 2" ], + "labelclick" : 1, + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 393.5, 611.0, 100.0, 23.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 393.5, 576.0, 55.0, 23.0 ], + "text" : "midiinfo" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 393.5, 545.0, 70.0, 22.0 ], + "text" : "loadmess 0" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 0, + "patching_rect" : [ 220.5, 647.0, 118.0, 22.0 ], + "text" : "noteout" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-12", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 337.0, 483.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 355.5, 476.5, 140.0, 20.0 ], + "text" : "Select a key and mode" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "bang" ], + "patching_rect" : [ 240.5, 475.5, 29.5, 22.0 ], + "text" : "t i b" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 287.0, 450.0, 70.0, 22.0 ], + "text" : "loadmess 3" + } + + } +, { + "box" : { + "id" : "obj-22", + "items" : [ "major", ",", "minor", ",", "dorian", ",", "phrygian", ",", "lydian", ",", "mixolydian", ",", "locrian" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 355.5, 506.0, 100.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-11", + "items" : [ "A", ",", "A#", ",", "B", ",", "C", ",", "C#", ",", "D", ",", "D#", ",", "E", ",", "F", ",", "F#", ",", "G", ",", "G#" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 240.5, 506.0, 100.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 134.25, 390.0, 73.0, 22.0 ], + "text" : "ignore_keys" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 56.0, 290.0, 847.0, 701.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-7", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 494.5, 110.0, 50.0, 22.0 ], + "text" : "C" + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 68.0, 294.0, 150.0, 60.0 ], + "text" : "All our heavy lifting here is done in javascript, we are just passing some simple messages in to it." + } + + } +, { + "box" : { + "id" : "obj-130", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "bang" ], + "patching_rect" : [ 59.0, 153.0, 32.0, 22.0 ], + "text" : "t b b" + } + + } +, { + "box" : { + "id" : "obj-129", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "bang" ], + "patching_rect" : [ 96.0, 153.0, 32.0, 22.0 ], + "text" : "t b b" + } + + } +, { + "box" : { + "id" : "obj-125", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 515.0, 377.0, 32.0, 22.0 ], + "text" : "+ 64" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-124", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 514.5, 408.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-121", + "linecount" : 2, + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 571.0, 282.0, 78.0, 35.0 ], + "text" : "print notesInScale" + } + + } +, { + "box" : { + "id" : "obj-120", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "bang" ], + "patching_rect" : [ 469.0, 313.0, 29.5, 22.0 ], + "text" : "t i b" + } + + } +, { + "box" : { + "id" : "obj-118", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 514.5, 343.0, 66.0, 22.0 ], + "text" : "random 63" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-117", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 469.0, 408.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-116", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 488.0, 278.0, 50.0, 22.0 ], + "text" : "93" + } + + } +, { + "box" : { + "id" : "obj-114", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 63.0, 180.0, 89.0, 22.0 ], + "text" : "setNoteIndex 1" + } + + } +, { + "box" : { + "id" : "obj-113", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 101.25, 218.0, 93.0, 22.0 ], + "text" : "setNoteIndex -1" + } + + } +, { + "box" : { + "id" : "obj-107", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 170.75, 180.0, 79.0, 22.0 ], + "text" : "previousNote" + } + + } +, { + "box" : { + "id" : "obj-104", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 136.0, 251.0, 71.0, 22.0 ], + "text" : "currentNote" + } + + } +, { + "box" : { + "id" : "obj-102", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 262.0, 167.0, 201.0, 22.0 ], + "text" : "loadmess generate_scale C 0 major" + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 598.0, 84.0, 31.0, 22.0 ], + "text" : "t b s" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 170.75, 119.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 133.5, 119.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 96.25, 119.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 59.0, 119.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 5, + "outlettype" : [ "", "", "", "", "" ], + "patching_rect" : [ 59.0, 84.0, 168.0, 22.0 ], + "text" : "route up down next last" + } + + } +, { + "box" : { + "id" : "obj-23", + "linecount" : 2, + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.0, 167.0, 160.0, 35.0 ], + "text" : "sprintf generate_scale %s 0 %s" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 469.0, 246.0, 121.0, 22.0 ], + "saved_object_attributes" : { + "filename" : "_generate_scale.js", + "parameter_enable" : 0 + } +, + "text" : "js _generate_scale.js" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-3", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 604.0, 26.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 469.0, 26.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 59.0, 31.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-116", 1 ], + "order" : 0, + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-120", 0 ], + "order" : 1, + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-121", 0 ], + "source" : [ "obj-10", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "midpoints" : [ 271.5, 231.0, 478.5, 231.0 ], + "source" : [ "obj-102", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "midpoints" : [ 145.5, 285.0, 456.0, 285.0, 456.0, 240.0, 478.5, 240.0 ], + "source" : [ "obj-104", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "midpoints" : [ 180.25, 213.0, 478.5, 213.0 ], + "source" : [ "obj-107", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "midpoints" : [ 110.75, 285.0, 456.0, 285.0, 456.0, 240.0, 478.5, 240.0 ], + "source" : [ "obj-113", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "midpoints" : [ 72.5, 285.0, 456.0, 285.0, 456.0, 240.0, 478.5, 240.0 ], + "source" : [ "obj-114", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-125", 0 ], + "source" : [ "obj-118", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-117", 0 ], + "source" : [ "obj-120", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-118", 0 ], + "source" : [ "obj-120", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-124", 0 ], + "source" : [ "obj-125", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-104", 0 ], + "source" : [ "obj-129", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-113", 0 ], + "source" : [ "obj-129", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-104", 0 ], + "source" : [ "obj-130", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-114", 0 ], + "source" : [ "obj-130", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-129", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "order" : 1, + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 1 ], + "order" : 0, + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-107", 0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-104", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-130", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-32", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-32", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-32", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 1 ], + "source" : [ "obj-41", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-7", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 220.5, 549.0, 83.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midiHandler" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 172.25, 417.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-24", + "linecount" : 11, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 16.5, 60.0, 906.0, 154.0 ], + "text" : "Here we are making a toy midi output script with the repl\n Arrow Keys: These output simple messages which we handle inside max to produce midi notes.\n Option+Enter/Altgr+Enter: clear the repl\n\nIt is important to note that all of the repls output message generation and input display is handled in the config file. We have completely overridden the default behaviour of the repl by loading a new configuration file, we have even rebound our usual \"run\" key combination to instead clear the repl\n\nTo each arrow key we attach two functions, one which adds the character to the repl and then creates a newline after a certain length, and one which outputs a message to parse in max.\nTo Option+Enter we simply bind a function which outputs the \"clear\" message, which will then be consumed by the repl, as all repl output is first passed through its own message routing before being passed to the outside world." + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 220.5, 446.0, 63.0, 22.0 ], + "text" : "route note" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 240.5, 390.0, 177.0, 22.0 ], + "text" : "loadmess keybindings midikeys" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 655.5, 359.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 422.5, 390.0, 114.0, 22.0 ], + "text" : "keybindings midiout" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 615.5, 359.0, 33.0, 22.0 ], + "text" : "read" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 615.5, 417.0, 344.0, 245.0 ] + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 615.5, 386.0, 159.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict midikeys _midikeys.json" + } + + } +, { + "box" : { + "attr" : "visible", + "id" : "obj-26", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 38.0, 300.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 104.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-7", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 108.0, 225.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 108.0, 150.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 108.0, 180.0, 77.0, 22.0 ], + "text" : "fullscreen $1" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 108.0, 119.0, 41.0, 22.0 ], + "text" : "sel 27" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 108.0, 82.0, 50.5, 22.0 ], + "text" : "key" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 68.0, 330.0, 70.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p fullscreen" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 168.0, 271.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 194.0, 272.0, 90.0, 20.0 ], + "text" : "turn world on" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 38.0, 361.0, 402.0, 22.0 ], + "text" : "jit.world midi-example @fsaa 1 @fsmenubar 0 @size 640 480 @floating 1" + } + + } +, { + "box" : { + "attr" : "enable", + "id" : "obj-3", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 38.0, 270.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 220.5, 417.0, 177.0, 22.0 ], + "text" : "tw.gl.repl midi-example 640 480" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 1 ], + "source" : [ "obj-11", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-19", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 2 ], + "source" : [ "obj-22", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 1 ], + "order" : 1, + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 1 ], + "source" : [ "obj-31", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "order" : 0, + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 1 ], + "source" : [ "obj-36", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "midpoints" : [ 260.5, 499.0, 362.0, 499.0, 362.0, 502.0, 365.0, 502.0 ], + "source" : [ "obj-4", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-44", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "midpoints" : [ 296.5, 475.0, 250.0, 475.0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ], + "dependency_cache" : [ { + "name" : "_generate_scale.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/examples/simple-midi", + "patcherrelativepath" : ".", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/javascript/dist", + "patcherrelativepath" : "../../javascript/dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/examples/custom-formatter", + "patcherrelativepath" : "../custom-formatter", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/examples/simple-midi/_midikeys.json b/examples/simple-midi/_midikeys.json new file mode 100644 index 0000000..fa32b66 --- /dev/null +++ b/examples/simple-midi/_midikeys.json @@ -0,0 +1,50 @@ +{ + "settings": { + "textbuffer": { + "formatters": [ + "whitespace" + ] + } + }, + "bindings": [ + { + "id": "execute", + "asciiCode": 2044, + "functions": [ + "return ['clear']" + ] + }, + { + "id": "up", + "asciiCode": -9, + "functions": [ + "ctx.addChar(94); if(ctx.tb.lineLength(ctx.c.line()) >= 20){ctx.newLine()}", + "return ['note up']" + ] + }, + { + "id": "down", + "asciiCode": -10, + "functions": [ + "ctx.add(\".\"); if(ctx.tb.lineLength(ctx.c.line()) >= 20){ctx.newLine()}", + "return ['note down']" + ] + }, + { + "id": "left", + "asciiCode": -11, + "functions": [ + "ctx.addChar(60); if(ctx.tb.lineLength(ctx.c.line()) >= 20){ctx.newLine()}", + "return ['note last']" + ] + }, + { + "id": "right", + "asciiCode": -12, + "functions": [ + "ctx.addChar(62); if(ctx.tb.lineLength(ctx.c.line()) >= 20){ctx.newLine()}", + "return ['note next']" + ] + } + ] +} \ No newline at end of file diff --git a/extras/GLRepl Overview.maxpat b/extras/GLRepl Overview.maxpat new file mode 100644 index 0000000..3e50560 --- /dev/null +++ b/extras/GLRepl Overview.maxpat @@ -0,0 +1,6215 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 721.0, 302.0, 938.0, 656.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-17", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 523.0, 342.0, 131.0, 22.0 ], + "text" : "load tw.gl.repl.maxhelp" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 523.0, 372.0, 51.0, 22.0 ], + "text" : "pcontrol" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 268.5, 578.0, 285.0, 20.0 ], + "presentation" : 1, + "presentation_linecount" : 2, + "presentation_rect" : [ 476.0, 582.0, 150.0, 33.0 ], + "text" : "The router can be found on the \"parsing-output\" tab" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 748.5, 578.0, 88.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 764.5, 617.0, 88.0, 22.0 ], + "text" : "s replRunBang" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 655.25, 578.0, 89.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 671.25, 617.0, 89.0, 22.0 ], + "text" : "s replClipboard" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 150.0, 51.0 ], + "presentation" : 1, + "presentation_rect" : [ 24.0, 9.0, 146.0, 51.0 ], + "text" : "GLRepl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 938.0, 630.0 ], + "bglocked" : 0, + "openinpresentation" : 1, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-24", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 703.0, 753.0, 112.0, 22.0 ], + "text" : "ephemeral_mode 0" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "bang" ], + "patching_rect" : [ 703.0, 718.0, 32.0, 22.0 ], + "text" : "t b b" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 703.0, 689.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 244.0, 456.0, 151.0, 20.0 ], + "text" : "Once More with Feeling..." + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 578.0, 752.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 137.0, 456.0, 100.0, 20.0 ], + "text" : "Now Press Me!" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 578.0, 785.0, 51.0, 22.0 ], + "text" : "run_line" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 376.0, 869.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-12", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 344.0, 830.0, 473.0, 35.0 ], + "text" : "ephemeral_mode 1, replay \"jseval 9-5/(8-3)*2+6\", add \"// running a line with ephemeral mode is a good way to easily delete comments ;)\"" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "clear" ], + "patching_rect" : [ 344.0, 801.0, 51.0, 22.0 ], + "text" : "t b clear" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 344.0, 776.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 29.0, 456.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 137.0, 869.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 105.0, 839.0, 182.0, 22.0 ], + "text" : "replay \"jseval 9-5/(8-3)*2+6\", run" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "clear" ], + "patching_rect" : [ 105.0, 810.0, 51.0, 22.0 ], + "text" : "t b clear" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 105.0, 785.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 29.0, 275.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 137.0, 741.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 105.0, 711.0, 178.0, 22.0 ], + "text" : "replay \"jseval 9-5/(8-3*2+6\", run" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "clear" ], + "patching_rect" : [ 105.0, 682.0, 51.0, 22.0 ], + "text" : "t b clear" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 105.0, 657.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 29.0, 234.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 126.0, 610.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 5.0, 567.0, 542.0, 22.0 ], + "text" : "replay \"// this line will not appear in the max console\", replay \"this line will appear in the console\", run" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "bang", "clear", "bang" ], + "patching_rect" : [ 105.0, 502.0, 61.0, 22.0 ], + "text" : "t b clear b" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 105.0, 477.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 29.0, 181.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 147.0, 530.0, 101.0, 35.0 ], + "text" : ";\rmax maxwindow" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-1", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 354.0, 51.0 ], + "presentation" : 1, + "presentation_rect" : [ 24.0, 9.0, 364.0, 51.0 ], + "text" : "GLRepl - print/loop", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 27, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 80.0, 742.0, 382.0 ], + "presentation" : 1, + "presentation_linecount" : 27, + "presentation_rect" : [ 24.0, 80.0, 725.0, 382.0 ], + "text" : "As mentioned in the eval tab, to prepare the text for printing it is passed through a series of formatters. By default three formatters are applied:\n\ncommentremover - the comment lines are stripped from the text\nwhitespace - whitespace is normalized \nbracebalanced - your output is checked for balanced braces\n\n\n\nWhen you push the button above some text is replayed into the repl and the run command is executed. Because the commentremover formatter is active line 0 will not be output from the repl. You can see line1 printed to the max console.\n\n\nWhen you push the button above an error is printed to the max console, and the output of the message is not passed to the output. \n\n\nWhen you push the button above the run command is executed on a correctly balanced version of the expression, which you can see in the Repl. This time the expression is formatted, output and then evaluated by a further script to give us the answer (see the next tab for exactly how this works).\n\nYou can write your own custom formatters and add them to the repl using the user-repl.js file, in the same way that you can add custom keypress handlers. See the custom formatter example and the README.md for more information on how to do this.\n----------\n\nNormally when you send the run or run_line commands the text in the repl will be formatted and output, and the text will remain in the buffer. However you can engage ephemeral mode by sending the command \"ephemeral_mode 1\" to remove either a line or all of the text when it is run. This can be useful in a livecoding situation.\n" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-10", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-13", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-16", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-22", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-6", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-6", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 609.5, 8.0, 68.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p print/loop" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 562.0, 578.0, 64.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 578.0, 617.0, 64.0, 22.0 ], + "text" : "s toRouter" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 24.0, 398.0, 95.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 40.0, 441.0, 95.0, 22.0 ], + "text" : "r launcher-world" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 583.0, 502.0, 89.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 599.0, 541.0, 89.0, 22.0 ], + "text" : "r launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-81", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 293.0, 474.0, 288.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 309.0, 513.0, 288.0, 22.0 ], + "text" : "tw.gl.repl.dynamic-size-helper" + } + + } +, { + "box" : { + "color" : [ 0.952941, 0.564706, 0.098039, 1.0 ], + "id" : "obj-112", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 562.0, 538.0, 205.5, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 578.0, 577.0, 205.5, 22.0 ], + "text" : "tw.gl.repl launcher 527 399" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 24.0, 440.0, 557.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 40.0, 479.0, 557.0, 22.0 ], + "text" : "jit.world launcher @floating 1 @enable 1 @fsaa 1 @fsmenubar 0 @size 527 399 @erase_color 0 0 0 1" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 938.0, 630.0 ], + "bglocked" : 0, + "openinpresentation" : 1, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-36", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 836.0, 490.0, 121.0, 22.0 ], + "text" : "jumpLine -1, run_line" + } + + } +, { + "box" : { + "id" : "obj-35", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 90.0, 481.0, 151.0, 47.0 ], + "presentation" : 1, + "presentation_rect" : [ 80.0, 462.0, 368.0, 20.0 ], + "text" : "Number of run commands sent while this overview has been open" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 182.0, 582.0, 70.0, 22.0 ], + "text" : "loadmess 0" + } + + } +, { + "box" : { + "id" : "obj-32", + "ignoreclick" : 1, + "maxclass" : "number", + "minimum" : 0, + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 112.0, 679.0, 50.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 80.0, 484.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 4, + "outlettype" : [ "int", "", "", "int" ], + "patching_rect" : [ 107.0, 632.0, 61.0, 22.0 ], + "text" : "counter" + } + + } +, { + "box" : { + "id" : "obj-29", + "ignoreclick" : 1, + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 49.0, 617.0, 24.0, 24.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 462.0, 44.0, 44.0 ] + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 44.5, 556.0, 86.0, 22.0 ], + "text" : "r replRunBang" + } + + } +, { + "box" : { + "id" : "obj-25", + "linecount" : 8, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 817.0, 541.0, 299.0, 116.0 ], + "text" : "keyPress -4, replay \"// we just moved up a line with jumpLine -1\", replay \"// and then sent the command run_line\", replay \"// which parsed and output the line:\", replay \"// set \\\"the set command replaces all text in the buffer\\\"\", replay \"// Because the set command is known by the repl\", replay \"// it was routed internally and executed\", replay \"// resulting in the first line you see above\"" + } + + } +, { + "box" : { + "id" : "obj-23", + "linecount" : 9, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 480.0, 523.0, 204.0, 129.0 ], + "text" : "jumpLine 1, replay \"// we just sent the run_line command. \", replay \"// This output the line under the cursor from the repl\", replay \"// because it could not be routed internally.\", replay \"// You can see it in the max console\", jumpLine -1, jumpLine -1, jumpLine -1, jumpLine -1, jumpLine -1" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "bang" ], + "patching_rect" : [ 711.0, 460.0, 32.0, 22.0 ], + "text" : "t b b" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 823.0, 420.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 322.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 711.0, 685.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "bang" ], + "patching_rect" : [ 823.0, 453.0, 32.0, 22.0 ], + "text" : "t b b" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 724.0, 503.0, 51.0, 22.0 ], + "text" : "run_line" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 711.0, 420.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 295.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 704.0, 350.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "run" ], + "patching_rect" : [ 704.0, 217.0, 43.0, 22.0 ], + "text" : "t b run" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 704.0, 188.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 175.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-6", + "linecount" : 6, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 704.0, 248.0, 419.0, 89.0 ], + "text" : "replay \"// the button you pressed sent the run command\", replay \"// so the text above was formatted and output.\", replay \"// Because replay is a GLRepl command it was\", replay \"// routed back to the repl and the text was\", replay \"// replayed into the buffer\", replay \"// which is why line 1 now contains 'this is some text'\", replay \"set \\\"the set command replaces all text in the buffer\\\"\", replay \"this is not an internal command\", jumpLine -1" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 823.0, 174.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "run", "bang", "clear" ], + "patching_rect" : [ 823.0, 75.0, 72.0, 22.0 ], + "text" : "t run b clear" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 849.5, 126.0, 190.0, 22.0 ], + "text" : "replay \"replay \\\"this is some text\\\"\"" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 823.0, 44.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 68.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-1", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 261.0, 51.0 ], + "presentation" : 1, + "presentation_rect" : [ 24.0, 9.0, 270.0, 51.0 ], + "text" : "GLRepl - eval", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "autofit" : 1, + "embed" : 1, + "forceaspect" : 1, + "id" : "obj-16", + "maxclass" : "fpic", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "jit_matrix" ], + "patching_rect" : [ 547.0, 158.0, 100.0, 50.0 ], + "pic" : "/Users/twhiston/Downloads/eval-loop.svg", + "presentation" : 1, + "presentation_rect" : [ 395.372222222222263, 87.494845360824741, 308.255555555555475, 286.010309278350519 ] + } + + } +, { + "box" : { + "fontname" : "", + "id" : "obj-4", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 41.0, 290.0, 164.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 264.5, 164.0, 20.0 ], + "text" : "\"return ['run_line']\"" + } + + } +, { + "box" : { + "fontname" : "", + "id" : "obj-3", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 41.0, 168.0, 126.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 33.0, 145.0, 126.0, 20.0 ], + "text" : "\"return ['run']\"" + } + + } +, { + "box" : { + "angle" : 270.0, + "grad1" : [ 0.16078431372549, 0.16078431372549, 0.16078431372549, 1.0 ], + "grad2" : [ 0.07843137254902, 0.07843137254902, 0.07843137254902, 1.0 ], + "id" : "obj-17", + "maxclass" : "panel", + "mode" : 1, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 543.0, 80.0, 128.0, 128.0 ], + "presentation" : 1, + "presentation_rect" : [ 403.0, 82.994845360824741, 300.627777777777737, 295.010309278350519 ], + "proportion" : 0.5 + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 30, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 80.0, 647.0, 422.0 ], + "presentation" : 1, + "presentation_linecount" : 29, + "presentation_rect" : [ 24.0, 62.0, 701.0, 409.0 ], + "text" : "\n\nBy default the keypresses option+enter on mac and ctrl+enter on \nwindows are bound to a function which tells the REPL to return the \nmessage 'run'.\n\n\n\n\n\n\nThe keypresses ctrl+option+enter on mac and shift+ctrl+enter on \nwindows are bound to a function which tells the REPL to return the \nmessage 'run_line'.\n\n\n\n\n\n\n\n\nWhen these functions are called the following process occurs:\n\n* The whole text, or the selected line, is retrieved from the buffer.\n* The text is parsed through a series of text formatters, defined in the configuration json\n* These formatters mutate the text, in the order in which they appear in the configuration\n* The formatted text is passed back to the command router, where it is either routed back to the repl or passed to outlet 1\n* A bang is sent to outlet 3\n" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-10", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-14", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-20", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-20", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-21", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 3 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-8", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 562.0, 8.0, 41.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p eval" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 938.0, 630.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 422.948251953124895, 505.0, 66.0, 22.0 ], + "text" : "route open" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 610.268648274739462, 532.5, 91.0, 22.0 ], + "saved_object_attributes" : { + "filename" : "_dirty_eval.js", + "parameter_enable" : 0 + } +, + "text" : "js _dirty_eval.js" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-29", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 10.0, 371.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "7", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-31", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 205.448251953124895, 124.0, 261.0, 33.0 ], + "text" : "stop the loop playing by jumping down one line and running it, this outputs a stop message" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-37", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 318.948251953124895, 160.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "6", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-34", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 370.5, 251.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-32", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 499.5, 133.0, 284.0, 47.0 ], + "text" : "Once the REPL has received the run_line message it will format the buffer contents and output it from outlet 1, which is then received here." + } + + } +, { + "box" : { + "id" : "obj-30", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 125.0, 297.0, 150.0, 60.0 ], + "text" : "The list of messages in the message box above are sent to inlet 1 of [tw.gl.repl] and executed" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-26", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 370.5, 188.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-25", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 481.5, 137.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-24", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 103.0, 317.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-22", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 10.0, 160.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-18", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 499.0, 51.0 ], + "text" : "GLRepl - parsing output", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 523.0, 244.5, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 652.935314941406091, 505.0, 121.0, 22.0 ], + "text" : "print unmatchedInput" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 623.5, 244.5, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-36", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 392.5, 251.0, 109.0, 87.0 ], + "text" : "our seperate note list and stop messages can now be handled in our max patch ----->" + } + + } +, { + "box" : { + "id" : "obj-35", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 392.5, 188.5, 105.0, 47.0 ], + "text" : "our loop and stop messages are routed ----->" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 205.448251953124895, 160.0, 109.948251953124895, 20.0 ], + "text" : "Press Me To Stop!" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 254.448251953124895, 229.5, 67.0, 22.0 ], + "text" : "jumpLine 1" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "run_line", "bang" ], + "patching_rect" : [ 205.448251953124895, 194.0, 68.0, 22.0 ], + "text" : "t run_line b" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 32.0, 160.0, 118.0, 20.0 ], + "text" : "Press Me To Start!" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 15.0, 473.5, 97.0, 22.0 ], + "text" : "s launcher-world" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 15.0, 399.0, 62.0, 22.0 ], + "text" : "r toRouter" + } + + } +, { + "box" : { + "id" : "obj-21", + "linecount" : 3, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 32.0, 231.0, 165.0, 49.0 ], + "text" : "replay \"loop f2 500, c4 1000, d3 200, c3 100\", replay stop, gotoIndex 0, run_line" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "clear" ], + "patching_rect" : [ 32.0, 200.0, 51.0, 22.0 ], + "text" : "t b clear" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 32.0, 293.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 32.0, 371.0, 504.0, 20.0 ], + "text" : "Below you can see the routing and subpatchers for all of the tabs in this overview" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 294.0, 461.5, 121.0, 22.0 ], + "text" : "r interaction-example" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 294.0, 508.0, 51.0, 22.0 ], + "text" : "pcontrol" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 1203.0, 265.0, 683.0, 696.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 408.0, 53.0, 22.0, 22.0 ], + "text" : "t 1" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-5", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 408.0, 16.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 67.0, 375.0, 97.0, 22.0 ], + "text" : "loadmess 440. 1" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 427.0, 355.0, 81.0, 22.0 ], + "text" : "loadmess -15" + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 169.0, 48.0, 22.0 ], + "text" : "pipe 10" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 357.0, 169.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-53", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 300.0, 29.5, 22.0 ], + "text" : "0" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 85.0, 270.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 237.0, 32.0, 22.0 ], + "text" : "gate" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 85.0, 203.0, 133.0, 22.0 ], + "text" : "if $i1 == 0 then 1 else 0" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 336.0, 53.0, 22.0, 22.0 ], + "text" : "t b" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-36", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 336.0, 16.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 218.488129000000015, 104.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 189.488129000000015, 431.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-31", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 189.488129000000015, 468.0, 46.0, 23.0 ], + "text" : "local 1" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 264.0, 172.0, 71.0, 22.0 ], + "text" : "fromsymbol" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 336.0, 104.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 264.0, 61.0, 57.0, 22.0 ], + "text" : "tosymbol" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 264.0, 138.0, 54.0, 22.0 ], + "text" : "zl.queue" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 264.0, 199.0, 47.0, 22.0 ], + "text" : "unpack" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 264.0, 229.0, 75.0, 22.0 ], + "text" : "sprintf %f %i" + } + + } +, { + "box" : { + "id" : "obj-3", + "local" : 1, + "maxclass" : "ezdac~", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 264.0, 500.0, 45.0, 45.0 ] + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "signal", "bang" ], + "patching_rect" : [ 264.0, 263.0, 40.0, 23.0 ], + "text" : "line~" + } + + } +, { + "box" : { + "channels" : 1, + "fontsize" : 13.0, + "id" : "obj-27", + "lastchannelcount" : 0, + "maxclass" : "live.gain~", + "numinlets" : 1, + "numoutlets" : 4, + "orientation" : 1, + "outlettype" : [ "signal", "", "float", "list" ], + "parameter_enable" : 1, + "patching_rect" : [ 264.0, 388.0, 136.0, 35.0 ], + "saved_attribute_attributes" : { + "valueof" : { + "parameter_initial" : [ -70 ], + "parameter_initial_enable" : 1, + "parameter_longname" : "live.gain~", + "parameter_mmax" : 6.0, + "parameter_mmin" : -70.0, + "parameter_shortname" : "live.gain~", + "parameter_type" : 0, + "parameter_unitstyle" : 4 + } + + } +, + "showname" : 0, + "varname" : "live.gain~" + } + + } +, { + "box" : { + "fontname" : "Arial", + "fontsize" : 13.0, + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "signal" ], + "patching_rect" : [ 264.0, 355.0, 157.0, 23.0 ], + "text" : "cycle~ 440." + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 264.0, 16.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "midpoints" : [ 294.5, 288.0, 413.0, 288.0, 413.0, 95.0, 345.5, 95.0 ], + "order" : 0, + "source" : [ "obj-10", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 1 ], + "midpoints" : [ 294.5, 297.0, 129.0, 297.0, 129.0, 234.0, 107.5, 234.0 ], + "order" : 1, + "source" : [ "obj-10", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 1 ], + "source" : [ "obj-17", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "order" : 0, + "source" : [ "obj-21", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 0 ], + "midpoints" : [ 308.5, 162.0, 144.0, 162.0, 144.0, 156.0, 94.5, 156.0 ], + "order" : 1, + "source" : [ "obj-21", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 1 ], + "order" : 0, + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "order" : 1, + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "midpoints" : [ 345.5, 132.0, 330.0, 132.0, 330.0, 132.0, 273.5, 132.0 ], + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "midpoints" : [ 227.988129000000015, 390.0, 261.0, 390.0, 261.0, 459.0, 273.5, 459.0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-50", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "midpoints" : [ 94.5, 324.0, 72.0, 324.0, 72.0, 99.0, 227.988129000000015, 99.0 ], + "source" : [ "obj-53", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-43", 0 ], + "midpoints" : [ 94.5, 189.0 ], + "source" : [ "obj-59", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "midpoints" : [ 417.5, 91.0, 321.0, 91.0, 321.0, 91.0, 227.988129000000015, 91.0 ], + "source" : [ "obj-7", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 318.948251953124895, 542.0, 123.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p interaction-example" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 72.948251953124895, 513.0, 66.0, 22.0 ], + "text" : "r printbang" + } + + } +, { + "box" : { + "id" : "obj-14", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 72.948251953124895, 542.0, 118.0, 35.0 ], + "text" : "c3 e4 f#4 a4 g4 e4 c4 g3" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patching_rect" : [ 524.935314941406091, 473.5, 147.0, 22.0 ], + "text" : "routepass loop stop jseval" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 671.0, 516.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 339.5, 322.0, 35.0, 22.0 ], + "text" : "del 2" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 257.0, 227.0, 50.0, 22.0 ], + "text" : "55" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 326.5, 289.0, 71.0, 22.0 ], + "text" : "routepass 0" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 237.5, 113.0, 40.5, 22.0 ], + "text" : "t b l" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 237.5, 157.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 237.5, 192.0, 54.0, 22.0 ], + "text" : "zl.queue" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 0, + "patching_rect" : [ 237.5, 370.0, 49.0, 22.0 ], + "text" : "noteout" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 2, + "outlettype" : [ "float", "float" ], + "patching_rect" : [ 237.5, 258.0, 108.0, 22.0 ], + "text" : "makenote 100 500" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 113.0, 154.0, 391.0, 417.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontface" : 1, + "id" : "obj-2", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 182.0, 49.0, 160.0, 20.0 ], + "text" : "note names to numbers" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 182.0, 76.0, 150.0, 33.0 ], + "text" : "either single noteNames\nor lists" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 50.0, 100.0, 114.0, 22.0 ], + "text" : "t l l" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 50.0, 287.959991000000002, 114.0, 22.0 ], + "text" : "zl group" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 72.0, 188.0, 68.0, 20.0 ], + "text" : "<--- nslider" + } + + } +, { + "box" : { + "bgcolor" : [ 0.095481, 0.100396, 0.100293, 1.0 ], + "clefs" : 0, + "fgcolor" : [ 0.0, 0.0, 0.0, 1.0 ], + "id" : "obj-30", + "ignoreclick" : 1, + "maxclass" : "nslider", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 50.0, 168.959991000000002, 22.0, 58.080002 ] + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 145.0, 137.0, 39.0, 22.0 ], + "text" : "zl len" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 137.0, 27.0, 22.0 ], + "text" : "iter" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-34", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-35", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 369.959991000000002, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-21", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 1 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-34", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 237.5, 83.0, 89.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p note_to_num" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 237.5, 31.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-15", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "order" : 1, + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 1 ], + "order" : 0, + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "midpoints" : [ 268.5, 186.0, 247.0, 186.0 ], + "source" : [ "obj-24", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 388.0, 355.0, 262.0, 355.0 ], + "source" : [ "obj-25", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 336.0, 357.0, 262.0, 357.0 ], + "order" : 1, + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "midpoints" : [ 336.0, 318.0, 349.0, 318.0 ], + "order" : 0, + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "midpoints" : [ 349.0, 362.0, 224.5, 362.0, 224.5, 153.0, 247.0, 153.0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-36", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 116.987062988281238, 473.5, 85.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midiNoteOut" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 524.935314941406091, 505.0, 73.0, 22.0 ], + "text" : "s fromREPL" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 218.974125976562476, 571.5, 91.0, 22.0 ], + "text" : "print fromREPL" + } + + } +, { + "box" : { + "id" : "obj-44", + "maxclass" : "newobj", + "numinlets" : 6, + "numoutlets" : 6, + "outlettype" : [ "", "", "", "", "", "" ], + "patching_rect" : [ 15.0, 434.0, 528.935314941406205, 22.0 ], + "text" : "route wo play print c go" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 1151.0, 452.0, 688.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 184.0, 189.0, 41.0, 22.0 ], + "text" : "pipe 2" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "bang", "bang", "" ], + "patching_rect" : [ 237.5, 49.0, 41.0, 22.0 ], + "text" : "t b b s" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 237.5, 154.0, 57.0, 22.0 ], + "text" : "tosymbol" + } + + } +, { + "box" : { + "id" : "obj-19", + "linecount" : 3, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 237.5, 92.0, 76.0, 49.0 ], + "text" : "f2 500, c4 1000, d3 200, c3 100" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 385.5, 92.0, 43.0, 22.0 ], + "text" : "zlclear" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "int" ], + "patching_rect" : [ 237.5, 263.0, 108.0, 22.0 ], + "text" : "unpack sym 0" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 237.5, 226.0, 71.0, 22.0 ], + "text" : "fromsymbol" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 302.5, 154.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 237.5, 189.0, 54.0, 22.0 ], + "text" : "zl.queue" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 385.5, 31.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 339.5, 403.0, 35.0, 22.0 ], + "text" : "del 2" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 326.5, 370.0, 71.0, 22.0 ], + "text" : "routepass 0" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 0, + "patching_rect" : [ 237.5, 451.0, 49.0, 22.0 ], + "text" : "noteout" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 2, + "outlettype" : [ "float", "float" ], + "patching_rect" : [ 237.5, 339.0, 108.0, 22.0 ], + "text" : "makenote 100 500" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 113.0, 154.0, 391.0, 417.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "fontface" : 1, + "id" : "obj-2", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 182.0, 49.0, 160.0, 20.0 ], + "text" : "note names to numbers" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 182.0, 76.0, 150.0, 33.0 ], + "text" : "either single noteNames\nor lists" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 50.0, 100.0, 114.0, 22.0 ], + "text" : "t l l" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 50.0, 241.959991000000002, 114.0, 22.0 ], + "text" : "zl group" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 72.0, 188.0, 68.0, 20.0 ], + "text" : "<--- nslider" + } + + } +, { + "box" : { + "bgcolor" : [ 0.095481, 0.100396, 0.100293, 1.0 ], + "clefs" : 0, + "fgcolor" : [ 0.0, 0.0, 0.0, 1.0 ], + "id" : "obj-30", + "ignoreclick" : 1, + "maxclass" : "nslider", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 50.0, 168.959991000000002, 22.0, 58.080002 ] + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 145.0, 137.0, 39.0, 22.0 ], + "text" : "zl len" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 137.0, 27.0, 22.0 ], + "text" : "iter" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-34", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-35", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 277.959991000000002, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-21", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 1 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-34", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 237.5, 302.0, 89.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p note_to_num" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 237.5, 14.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "order" : 0, + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "order" : 1, + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-15", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 2 ], + "source" : [ "obj-22", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "midpoints" : [ 247.0, 72.0, 324.0, 72.0, 324.0, 147.0, 312.0, 147.0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 1 ], + "source" : [ "obj-23", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-23", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 388.0, 436.0, 262.0, 436.0 ], + "source" : [ "obj-25", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 336.0, 438.0, 262.0, 438.0 ], + "order" : 1, + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "midpoints" : [ 336.0, 399.0, 349.0, 399.0 ], + "order" : 0, + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "midpoints" : [ 349.0, 435.0, 408.0, 435.0, 408.0, 150.0, 312.0, 150.0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-36", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 499.5, 303.0, 124.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p midiNoteSequencer" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 499.5, 212.0, 229.0, 22.0 ], + "text" : "route loop stop" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 499.5, 182.0, 71.0, 22.0 ], + "text" : "r fromREPL" + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 69.0, 705.5, 33.0 ], + "text" : "As explained in the eval tab messages from the repl are printed from the first outlet and the expectation is that you use [route] and [routepass] objects to build ways to use the formatted text to interact with your patches." + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-11", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-11", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-11", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "midpoints" : [ 73.5, 224.0, 17.0, 224.0, 17.0, 287.0, 41.5, 287.0 ], + "source" : [ "obj-19", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "midpoints" : [ 263.948251953124895, 290.0, 41.5, 290.0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "order" : 1, + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "order" : 0, + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 2 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "order" : 1, + "source" : [ "obj-4", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "order" : 1, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-23", 0 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "order" : 0, + "source" : [ "obj-4", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "order" : 1, + "source" : [ "obj-44", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-44", 5 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 1 ], + "midpoints" : [ 126.487062988281238, 471.0, 211.948251953124895, 471.0, 211.948251953124895, 508.0, 211.948251953124895, 508.0, 211.948251953124895, 529.0, 181.448251953124895, 529.0 ], + "order" : 0, + "source" : [ "obj-44", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 1 ], + "source" : [ "obj-44", 4 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-44", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-44", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-44", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "midpoints" : [ 214.948251953124895, 290.0, 41.5, 290.0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-8", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-44", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 686.0, 8.0, 95.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p parsing-output" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 938.0, 630.0 ], + "bglocked" : 0, + "openinpresentation" : 1, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-36", + "linecount" : 3, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1064.0, 750.0, 298.0, 49.0 ], + "text" : "replay \"// this is the contents of the user-repl.js file\", replay \"// you can find it in the root folder of this patcher\"" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 1043.0, 706.0, 95.0, 22.0 ], + "text" : "read user-repl.js" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 1043.0, 862.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "bang", "bang", "clear" ], + "patching_rect" : [ 1043.0, 674.0, 61.0, 22.0 ], + "text" : "t b b clear" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 1043.0, 643.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 420.5, 768.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 891.0, 838.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 823.5, 869.0, 29.5, 22.0 ], + "text" : "set" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 823.5, 838.0, 63.0, 22.0 ], + "text" : "closebang" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 644.0, 1172.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 644.0, 1073.0, 22.0, 22.0 ], + "text" : "t b" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 644.0, 1117.0, 81.0, 22.0 ], + "text" : "keyPress 356" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 644.0, 1042.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 278.5, 693.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 733.5, 906.0, 243.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 30.0, 575.0, 370.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 857.5, 869.0, 87.0, 22.0 ], + "presentation" : 1, + "presentation_rect" : [ 301.0, 548.0, 87.0, 22.0 ], + "text" : "r replClipboard" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 644.0, 984.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 644.0, 884.0, 22.0, 22.0 ], + "text" : "t b" + } + + } +, { + "box" : { + "id" : "obj-13", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 644.0, 944.0, 680.0, 35.0 ], + "text" : "jumpLine -1, keyPress 231, keyPress 4451, keyPress -4, replay \"//check the msg box below the button you pressed to see the clipboard output\"" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 644.0, 853.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 286.0, 470.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 644.0, 812.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "run", "bang", "clear" ], + "patching_rect" : [ 644.0, 713.0, 72.0, 22.0 ], + "text" : "t run b clear" + } + + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 670.5, 764.0, 314.0, 35.0 ], + "text" : "replay \"all these keypresses have been replayed through the alphanumeric handler\"" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 644.0, 682.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 286.0, 360.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-1", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 527.0, 51.0 ], + "presentation" : 1, + "presentation_rect" : [ 24.0, 9.0, 281.0, 51.0 ], + "text" : "GLRepl - read", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontname" : "", + "id" : "obj-18", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 742.0, 238.0, 188.0, 34.0 ], + "presentation" : 1, + "presentation_linecount" : 2, + "presentation_rect" : [ 32.0, 214.0, 36.0, 34.0 ], + "text" : "k\nctx", + "textjustification" : 2 + } + + } +, { + "box" : { + "fontname" : "", + "id" : "obj-16", + "linecount" : 8, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 749.0, 537.0, 211.0, 118.0 ], + "presentation" : 1, + "presentation_linecount" : 7, + "presentation_rect" : [ 36.0, 651.0, 358.0, 104.0 ], + "text" : "{\n \"id\": \"overview-example\",\n \"asciiCode\": 356,\n \"functions\": [\n \"deckardsDream\"\n ]\n}" + } + + } +, { + "box" : { + "fontname" : "", + "id" : "obj-14", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 749.0, 389.0, 202.0, 146.0 ], + "presentation" : 1, + "presentation_linecount" : 7, + "presentation_rect" : [ 36.0, 466.0, 358.0, 104.0 ], + "text" : "{\n ...\n \"functions\": [\n \"ctx.tb.pasteBinCopyLine(ctx.c.line())\",\n \"return ['output_paste_bin']\"\n ]\n}" + } + + } +, { + "box" : { + "fontname" : "", + "id" : "obj-12", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 742.0, 277.0, 242.0, 104.0 ], + "presentation" : 1, + "presentation_linecount" : 7, + "presentation_rect" : [ 36.0, 318.0, 198.0, 104.0 ], + "text" : "{\n \"id\": \"alphahandler\",\n \"asciiCode\": 127,\n \"functions\": [\n \"ctx.addChar(k)\"\n ]\n}" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 742.0, 50.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 742.0, 111.5, 199.0, 111.0 ], + "presentation" : 1, + "presentation_rect" : [ 401.0, 180.5, 346.0, 538.0 ] + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 742.0, 82.0, 173.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict readexample replkeys.json" + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 58, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 80.0, 586.0, 784.0 ], + "presentation" : 1, + "presentation_linecount" : 56, + "presentation_rect" : [ 24.0, 80.0, 726.0, 757.0 ], + "text" : "The first thing a REPL does is read in text. By default when you write text into the REPL window keypresses are written into a text buffer and displayed. But this is only one possible behaviour as the user can change the REPL behaviour using a JSON config file. \nFor most livecoding scenarios the default configuration will not need changing.\n\nYou can bind any number of functions to any ascii keycode, the functions will be called in the order they are defined. Functions may return an array of messages which will be output by the REPL. These may be messages to the repl itself, or messages to be parsed externally.\n\nYou have access to the following variables in your function body:\n\n - the keypress which triggered the event\n - the REPLManager object\n\nSome examples of binding functions include:\n1. A simple call the REPLManager object. This uses ascii code 127 \n which is a special value in the REPL reserved to attach a function \n which will be run on any alphanumerical keypress.\n\n\n\n\n\n\n\n\n\n2. A more complex example, which copied the line under the cursor to\nthe clipboard and outputs it from outlet 2\n\n\n\n\n\n\n\n\n\n\n\n\n3. Call a custom function you have written directly.\nThis function must have the signature (k, ctx)\n\n\n\n\n\n\n\n\nThis third method is a special case and requires you to pre-bind a custom function which you have written in code. This overview patch contains a special user-repl.js file which is autoloaded by the repl on start\n\nSee README.md in the package root folder for more information on this and other code based features. \n\nTo understand what objects and methods are available on ctx please check the javascript folder in the package." + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-13", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-20", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-20", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-28", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-28", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 1 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-8", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 510.5, 8.0, 43.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p read" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 938.0, 630.0 ], + "bglocked" : 0, + "openinpresentation" : 1, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-23", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 368.0, 608.5, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 308.0, 280.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 275.0, 711.0, 29.5, 22.0 ], + "text" : "run" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 275.0, 684.0, 55.0, 22.0 ], + "text" : "del 3000" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 348.5, 515.0, 59.0, 22.0 ], + "text" : "cursor <<" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 337.0, 761.5, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-18", + "linecount" : 3, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 337.0, 684.0, 256.0, 49.0 ], + "text" : "replay clear, replay \"read _readexample.txt\", replay run, replay \"replay \\\"// we have just executed a chain of commands\\\"\"" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "bang", "bang", "bang" ], + "patching_rect" : [ 275.0, 639.0, 143.0, 22.0 ], + "text" : "t b b b" + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 597.399999999999977, 522.0, 68.0, 22.0 ], + "text" : "pipe 10000" + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 694.200000000000045, 596.5, 55.0, 22.0 ], + "text" : "del 1000" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 646.0, 701.0, 136.0, 22.0 ], + "text" : "run, ephemeral_mode 0" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 646.0, 663.0, 55.0, 22.0 ], + "text" : "del 4000" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 742.600000000000023, 556.0, 123.0, 22.0 ], + "text" : "s interaction-example" + } + + } +, { + "box" : { + "id" : "obj-17", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 781.200000000000045, 626.0, 265.0, 35.0 ], + "text" : "ephemeral_mode 1, replay \"c 100 2000\", replay \"c 440 2000\", replay go" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 723.0, 744.5, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 6, + "outlettype" : [ "bang", "close", "bang", "bang", "open", "clear" ], + "patching_rect" : [ 549.0, 493.0, 261.0, 22.0 ], + "text" : "t b close b b open clear" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 33.0, 542.0, 68.0, 22.0 ], + "text" : "s printbang" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "bang" ], + "patching_rect" : [ 90.0, 487.0, 32.0, 22.0 ], + "text" : "t b b" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 90.0, 462.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 28.0, 106.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 103.0, 521.0, 101.0, 35.0 ], + "text" : ";\rmax maxwindow" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "run" ], + "patching_rect" : [ 848.5, 98.0, 43.0, 22.0 ], + "text" : "t b run" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 916.5, 169.0, 210.0, 22.0 ], + "text" : "replay \"play c3 e4 f#4 a4 g4 e4 c4 g3\"" + } + + } +, { + "box" : { + "id" : "obj-41", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 958.5, 136.0, 188.0, 22.0 ], + "text" : "replay \"// lets write a midi melody\"" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 916.5, 209.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "bang", "bang", "clear" ], + "patching_rect" : [ 916.5, 106.0, 103.0, 22.0 ], + "text" : "t b b clear" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 233.0, 551.0, 97.0, 22.0 ], + "text" : "s launcher-world" + } + + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 233.0, 522.0, 111.0, 22.0 ], + "text" : "erase_color 0 0 0 1" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 834.0, 408.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 369.5, 551.0, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "bang", "bang", "clear" ], + "patching_rect" : [ 327.5, 485.0, 61.0, 22.0 ], + "text" : "t b b clear" + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "run", "bang", "clear" ], + "patching_rect" : [ 834.0, 309.0, 72.0, 22.0 ], + "text" : "t run b clear" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 860.5, 371.0, 162.0, 22.0 ], + "text" : "add \"wo erase_color 0 1 0 1\"" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 327.5, 454.0, 155.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 308.0, 467.0, 155.0, 20.0 ], + "text" : "Press Me To Clear REPL" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 834.0, 278.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 668.0, 244.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 549.0, 462.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 385.0, 244.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 848.5, 52.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 392.0, 81.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 916.5, 77.0, 100.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 197.0, 81.0, 100.0, 20.0 ], + "text" : "Press Me!" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 155.0, 185.0 ], + "presentation" : 1, + "presentation_rect" : [ 24.0, 9.0, 456.0, 51.0 ], + "text" : "GLRepl - Getting Started", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontsize" : 16.0, + "id" : "obj-8", + "linecount" : 21, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 80.0, 785.0, 382.0 ], + "presentation" : 1, + "presentation_linecount" : 21, + "presentation_rect" : [ 24.0, 81.0, 785.0, 382.0 ], + "text" : "A REPL - Reads in text Evaluates it Prints the output and Loops .\n\nOtherwise known as a language shell, a REPL is commonly used to execute programs which are written in a piecewise manner, which means you build them up by running consecutive commands rather than fully programming the code first and then executing it later. REPL's are probably most well known in an artistic context from live coding. \n\nA REPL interacts with a programming language and in this case you can think of Max as that! The REPL is designed to interact with patches you build in max ,it's own opengl window , \n\nand GLRepl's own internal functionality It does all of this with simple routing! \n\nAt it's heart GLRepl is a keypress processor, whose input is manipulated and displayed in various ways. The repl, when sent the `run` or `run_line` commands will output a series of formatted messages. This means that integrating GLRepl with your patch can be as simple as using a few [route] and [routepass] objects to direct the output, but could also be as complex as you can imagine! GLRepl's flexible user configuration, defined in json, coupled with the power of max and javascript, allows you to create very complex interactions in a very easy way.\n\nSee the other tabs to understand how the REPL works." + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "midpoints" : [ 408.5, 670.0, 480.0, 670.0, 480.0, 481.0, 390.0, 481.0, 390.0, 480.0, 337.0, 480.0 ], + "source" : [ "obj-1", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-10", 5 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 0 ], + "source" : [ "obj-10", 4 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-10", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-47", 0 ], + "source" : [ "obj-10", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-10", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-20", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-20", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-20", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-24", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-24", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-27", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-36", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "source" : [ "obj-36", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-46", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-47", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-6", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-46", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 409.0, 8.0, 95.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p getting-started" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 938.0, 630.0 ], + "bglocked" : 0, + "openinpresentation" : 1, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 467.0, 474.0, 29.5, 22.0 ], + "text" : "!= 1" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 467.0, 518.0, 121.0, 22.0 ], + "text" : "prepend ignore_keys" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 467.0, 551.5, 91.0, 22.0 ], + "text" : "s launcher-msg" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 320.0, 389.0, 70.0, 22.0 ], + "text" : "loadmess 1" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 320.0, 514.0, 92.0, 22.0 ], + "text" : "prepend enable" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "textbutton", + "mode" : 1, + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 320.0, 425.0, 211.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 12.0, 138.0, 211.0, 20.0 ], + "text" : "Run Overview jit.world", + "texton" : "Stop Overview jit.world" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 320.0, 551.5, 97.0, 22.0 ], + "text" : "s launcher-world" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 9.0, 83.0, 275.0 ], + "presentation" : 1, + "presentation_rect" : [ 24.0, 9.0, 542.0, 51.0 ], + "text" : "GLRepl - examples", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-9", + "linecount" : 15, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 35.0, 21.0, 152.0, 208.0 ], + "presentation" : 1, + "presentation_linecount" : 5, + "presentation_rect" : [ 12.0, 62.0, 732.0, 74.0 ], + "text" : "The max patches below show how you can use these basic ideas to build up more complex interfaces and interactions within Max using the REPL.\n\nYou should stop the jit.world for this overview before you open these patches so your keypresses are not registered in two different environments" + } + + } +, { + "box" : { + "fontface" : 1, + "id" : "obj-6", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 42.0, 300.0, 160.0, 141.0 ], + "presentation" : 1, + "presentation_linecount" : 2, + "presentation_rect" : [ 12.0, 453.0, 731.0, 33.0 ], + "text" : "For further information on the REPL please check the object help, which explains how to implement the object in your patch, and the README.md in the module folder, which explains how to extend the REPL with Javascript." + } + + } +, { + "box" : { + "id" : "obj-12", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 296.0, 314.0, 150.0, 33.0 ], + "presentation" : 1, + "presentation_rect" : [ 171.0, 503.0, 438.0, 20.0 ], + "text" : "Visit my website to see more of my work" + } + + } +, { + "box" : { + "id" : "obj-10", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 39.0, 233.0, 403.0, 47.0 ], + "presentation" : 1, + "presentation_linecount" : 2, + "presentation_rect" : [ 171.0, 382.0, 572.0, 33.0 ], + "text" : "An example of how you can use the repl together with a javascript parser to create an environment which you can livecode the creation and connection of max objects" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-68", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 353.0, 261.0, 35.0 ], + "text" : ";\rmax launchbrowser http://www.tomwhiston.com" + } + + } +, { + "box" : { + "align" : 0, + "bgcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 0.2 ], + "bgoncolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "fontface" : 1, + "id" : "obj-69", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 453.0, 314.0, 150.0, 23.0 ], + "presentation" : 1, + "presentation_rect" : [ 12.0, 503.0, 150.0, 23.0 ], + "text" : "go to my website", + "textjustification" : 0, + "textoncolor" : [ 0.239216, 0.254902, 0.278431, 1.0 ], + "textovercolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "usebgoncolor" : 1, + "usetextovercolor" : 1 + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-2", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 626.0, 239.0, 273.0, 22.0 ], + "text" : "loadunique _glrepl-livecode-max-example.maxpat" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 626.0, 268.0, 51.0, 22.0 ], + "text" : "pcontrol" + } + + } +, { + "box" : { + "bgcolor" : [ 0.949019607843137, 0.56078431372549, 0.094117647058824, 0.25 ], + "bgoncolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "fontface" : 1, + "id" : "obj-1", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 453.0, 233.0, 150.0, 60.0 ], + "presentation" : 1, + "presentation_rect" : [ 12.0, 382.0, 150.0, 60.0 ], + "text" : "Livecode Max Objects Example", + "textoncolor" : [ 0.0, 0.0, 0.0, 1.0 ], + "textovercolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "truncate" : 0, + "usetextovercolor" : 1 + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-34", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 155.0, 293.0, 22.0 ], + "text" : "loadunique _glrepl-custom-formatter-example.maxpat" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-41", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 184.0, 51.0, 22.0 ], + "text" : "pcontrol" + } + + } +, { + "box" : { + "bgcolor" : [ 0.949019607843137, 0.56078431372549, 0.094117647058824, 0.25 ], + "bgoncolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "fontface" : 1, + "id" : "obj-46", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 453.0, 155.0, 150.0, 60.0 ], + "presentation" : 1, + "presentation_rect" : [ 12.0, 308.0, 150.0, 60.0 ], + "text" : "Custom Formatter Example", + "textoncolor" : [ 0.0, 0.0, 0.0, 1.0 ], + "textovercolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "truncate" : 0, + "usetextovercolor" : 1 + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-18", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 81.0, 263.0, 22.0 ], + "text" : "loadunique _glrepl-simple-midi-example.maxpat" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 110.0, 51.0, 22.0 ], + "text" : "pcontrol" + } + + } +, { + "box" : { + "bgcolor" : [ 0.949019607843137, 0.56078431372549, 0.094117647058824, 0.25 ], + "bgoncolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "fontface" : 1, + "id" : "obj-29", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 453.0, 81.0, 150.0, 60.0 ], + "presentation" : 1, + "presentation_rect" : [ 12.0, 234.0, 150.0, 60.0 ], + "text" : "MIDI (SIMPLE) EXAMPLE", + "textoncolor" : [ 0.0, 0.0, 0.0, 1.0 ], + "textovercolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "truncate" : 0, + "usetextovercolor" : 1 + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 694.0, 42.0, 54.0, 22.0 ], + "text" : "onecopy" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-24", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 13.0, 239.0, 22.0 ], + "text" : "loadunique _glrepl-opengl-example.maxpat" + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 633.0, 42.0, 51.0, 22.0 ], + "text" : "pcontrol" + } + + } +, { + "box" : { + "bgcolor" : [ 0.949019607843137, 0.56078431372549, 0.094117647058824, 0.25 ], + "bgoncolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "fontface" : 1, + "id" : "obj-17", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 453.0, 13.0, 150.0, 60.0 ], + "presentation" : 1, + "presentation_rect" : [ 12.0, 166.0, 150.0, 60.0 ], + "text" : "GL EXAMPLE", + "textoncolor" : [ 0.0, 0.0, 0.0, 1.0 ], + "textovercolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "truncate" : 0, + "usetextovercolor" : 1 + } + + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 12.0, 155.0, 430.0, 33.0 ], + "presentation" : 1, + "presentation_linecount" : 2, + "presentation_rect" : [ 171.0, 308.0, 572.0, 33.0 ], + "text" : "An example showing how you can implement custom formatters to both validate input and expand a compact language into more verbose output." + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 12.0, 81.0, 438.0, 60.0 ], + "presentation" : 1, + "presentation_linecount" : 3, + "presentation_rect" : [ 171.0, 234.0, 575.0, 47.0 ], + "text" : "An example showing how you can completely reprogam the functionality of the repl by only using the config file. Instead of simply capturing the input in a buffer for printing later we immediately emit messages to be parsed by a midi handler and print a character to the display" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 12.0, 13.0, 348.0, 33.0 ], + "presentation" : 1, + "presentation_rect" : [ 171.0, 166.0, 572.0, 20.0 ], + "text" : "An example using openGL commands in the repl to draw inside the repl itself in a livecoding like manner" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "order" : 1, + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 0 ], + "order" : 0, + "source" : [ "obj-16", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "hidden" : 1, + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "hidden" : 1, + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "hidden" : 1, + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "hidden" : 1, + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "hidden" : 1, + "source" : [ "obj-29", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-41", 0 ], + "hidden" : 1, + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "hidden" : 1, + "source" : [ "obj-46", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-68", 0 ], + "hidden" : 1, + "source" : [ "obj-69", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 789.0, 8.0, 100.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p examples" + } + + } +, { + "box" : { + "id" : "obj-88", + "linecount" : 20, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 121.0, 497.0, 275.0 ], + "presentation" : 1, + "presentation_linecount" : 25, + "presentation_rect" : [ 24.0, 113.0, 420.0, 342.0 ], + "text" : "A fully featured and configurable repl environment made in javascript and opengl for Max. A command line text editor (similar to the workflow of the terminal) for the opengl world of Max. Add the object to your setup and initialize it with the name of the render context. Then make sure you send it the render bang in the top inlet. \n\nAttach functions to keypresses, mutate repl contents before output, and read files as a succession of keypresses. Configurable through both a json configuration file and code means that it's easily extensible for whatever your use case.\n\nSimple use cases for the repl can be handled entirely in configuration, add a shortkeys.json to your project or load any dict with the `keybindings dictname` message. \nMore complex use cases can be easily managed by including a `user-repl.js` file\ninside your project in which you can further customize behaviour by attaching\nyour own custom functions to keypresses or your own custom formatters for output\nmessage handling. This will be automatically read by the repl on start.\n\nFor a simple example of how you can start using the router you may wish to check the [tw.gl.repl] help file.\nSee README.md in the package folder for extensive information about how the repl works, or try the examples tab here.", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-21", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 24.0, 62.0, 367.0, 47.0 ], + "presentation" : 1, + "presentation_linecount" : 3, + "presentation_rect" : [ 24.0, 62.0, 372.0, 47.0 ], + "text" : "Written by Tom Whiston © 2023, www.tomwhiston.com\n\nThis project is based on th.gl.texteditor © Timo Hoogland 2020" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-112", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-112", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-112", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-112", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-112", 0 ], + "midpoints" : [ 302.5, 470.0, 279.0, 470.0, 279.0, 529.0, 558.0, 529.0, 558.0, 530.0, 571.5, 530.0 ], + "order" : 0, + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 1 ], + "source" : [ "obj-2", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-81", 0 ], + "order" : 1, + "source" : [ "obj-2", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-112", 0 ], + "source" : [ "obj-81", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "midpoints" : [ 302.5, 503.0, 15.0, 503.0, 15.0, 432.0, 33.5, 432.0 ], + "source" : [ "obj-81", 0 ] + } + + } + ], + "parameters" : { + "obj-8::obj-16::obj-27" : [ "live.gain~", "live.gain~", 0 ], + "parameterbanks" : { + "0" : { + "index" : 0, + "name" : "", + "parameters" : [ "-", "-", "-", "-", "-", "-", "-", "-" ] + } + + } +, + "inherited_shortname" : 1 + } +, + "dependency_cache" : [ { + "name" : "_dirty_eval.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/extras", + "patcherrelativepath" : ".", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "eval-loop.svg", + "bootpath" : "~/Downloads", + "patcherrelativepath" : "../../../../../Downloads", + "type" : "svg", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.dynamic-size-helper.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/javascript/dist", + "patcherrelativepath" : "../javascript/dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/extras", + "patcherrelativepath" : ".", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0 + } + +} diff --git a/extras/_dirty_eval.js b/extras/_dirty_eval.js new file mode 100644 index 0000000..45c971e --- /dev/null +++ b/extras/_dirty_eval.js @@ -0,0 +1,10 @@ +function jseval(expr) { + try { + var result = eval(expr) + post(result) + } catch (error) { + post("error: ") + post(error.message) + } + post() +} \ No newline at end of file diff --git a/extras/_readexample.txt b/extras/_readexample.txt new file mode 100644 index 0000000..1719b0a --- /dev/null +++ b/extras/_readexample.txt @@ -0,0 +1,19 @@ +// This file was read by the REPL directly +// using the command "read _readexample.txt" +// this can be sent to the inlet or called +// directly inside the repl itself. + +cursor *! + +// Consider the original REPL script: +// clear +// read _readexample.txt +// run +// replay "// we have just executed a chain of commands" +// +// We have now seen this executed: +// The screen was cleared +// this file was loaded in +// it was executed and the cursor changed +// and finally a comment will be appended +// below this final line of the file. diff --git a/extras/replkeys.json b/extras/replkeys.json new file mode 100644 index 0000000..9ded649 --- /dev/null +++ b/extras/replkeys.json @@ -0,0 +1,335 @@ +{ + "settings": { + "textbuffer": { + "formatters": [ + "commentremover", + "whitespace", + "bracebalanced" + ] + } + }, + "bindings": [ + { + "id": "execute-opt+enter-mac", + "asciiCode": 2044, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute-ctrl+enter-win", + "asciiCode": 4348, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute_line+ctrl+opt+enter-mac", + "asciiCode": 6140, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "execute_line+shift+ctrl+enter-win", + "asciiCode": 4860, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "alphahandler", + "asciiCode": 127, + "functions": [ + "ctx.addChar(k)" + ] + }, + { + "id": "addSpace", + "asciiCode": -2, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "addSpace", + "asciiCode": 32, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "newLine", + "asciiCode": -4, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 10, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 13, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "addTab", + "asciiCode": -5, + "functions": [ + "ctx.addTab()" + ] + }, + { + "id": "delete", + "asciiCode": -6, + "functions": [ + "ctx.deleteChar()" + ] + }, + { + "id": "backspace", + "asciiCode": -7, + "functions": [ + "ctx.backSpace()" + ] + }, + { + "id": "comment-opt+/-mac", + "asciiCode": 247, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "comment-ctrl+/-win", + "asciiCode": 4399, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "clear-opt+z-mac", + "asciiCode": 937, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "clear-ctrl+z-win", + "asciiCode": 4474, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "cutLine-opt+x-mac", + "asciiCode": 8776, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "cutLine-ctrl+x-win", + "asciiCode": 4472, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-opt+c-mac", + "asciiCode": 231, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-ctrl+c-win", + "asciiCode": 4451, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-opt+k-mac", + "asciiCode": 730, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-ctrl+k-win", + "asciiCode": 4459, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "paste-opt+v-mac", + "asciiCode": 8730, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "paste-ctrl+v-win", + "asciiCode": 4470, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "replaceLine-opt+p-mac", + "asciiCode": 960, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "replaceLine-ctrl+p-win", + "asciiCode": 4464, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "up", + "asciiCode": -9, + "functions": [ + "ctx.jumpLine(-1)" + ] + }, + { + "id": "down", + "asciiCode": -10, + "functions": [ + "ctx.jumpLine(1)" + ] + }, + { + "id": "left", + "asciiCode": -11, + "functions": [ + "ctx.jumpChar(-1)" + ] + }, + { + "id": "right", + "asciiCode": -12, + "functions": [ + "ctx.jumpChar(1)" + ] + }, + { + "id": "jump_top-opt+up-mac", + "asciiCode": 2039, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump_top-ctrl+up-win", + "asciiCode": 4343, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump_bottom-opt+down-mac", + "asciiCode": 2038, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump_bottom-opt+down-win", + "asciiCode": 4342, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump_startline-opt+left-mac", + "asciiCode": 2037, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump_startline-ctrl+left-win", + "asciiCode": 4341, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump_endline-opt+right-mac", + "asciiCode": 2036, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jump_endline-ctrl+right-win", + "asciiCode": 4340, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jumpWord_left-cmd+left-mac", + "asciiCode": 245, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord_left-ctrl+shift+left-win", + "asciiCode": 4853, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord_right-cmd+right-mac", + "asciiCode": 244, + "functions": [ + "ctx.jumpWord(1)" + ] + }, + { + "id": "jumpWord_right-ctrl+shift+right-win", + "asciiCode": 4852, + "functions": [ + "ctx.jumpWord(1)" + ] + }, + { + "id": "ephemeral_mode-opt+g-mac", + "asciiCode": 169, + "functions": [ + "return ['ephemeral_mode']" + ] + }, + { + "id": "ephemeral_mode-ctrl+g-win", + "asciiCode": 4455, + "functions": [ + "return ['ephemeral_mode']" + ] + }, + { + "id": "overview-example", + "asciiCode": 356, + "functions": [ + "deckardsDream" + ] + } + ] +} \ No newline at end of file diff --git a/extras/user-repl.js b/extras/user-repl.js new file mode 100644 index 0000000..1c81c92 --- /dev/null +++ b/extras/user-repl.js @@ -0,0 +1,12 @@ +function overviewCustomFunction(k, ctx) { + //This does not make a huge amount of sense to do, but none the less it is possible! + const line = ctx.tb.getLine(0) + const regex = /have been replayed through the alphanumeric handler/g; + var newStr = line.replace(regex, 'will be lost in time, like tears in rain...'); + ctx.tb.setLine(0, newStr) + //when we also return something from custom handler + //it will be output from the repl as a message + return [newStr]; +}; + +glrepl.manager.kp.preloadFunction('deckardsDream', overviewCustomFunction); \ No newline at end of file diff --git a/help/th.gl.texteditor.maxhelp b/help/th.gl.texteditor.maxhelp deleted file mode 100644 index 1b9c0e0..0000000 --- a/help/th.gl.texteditor.maxhelp +++ /dev/null @@ -1,3104 +0,0 @@ -{ - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 0, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 100.0, 100.0, 861.0, 639.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "showrootpatcherontab" : 0, - "showontab" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 0, - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 0, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 100.0, 126.0, 861.0, 613.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "showontab" : 1, - "boxes" : [ { - "box" : { - "id" : "obj-23", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 195.0, 435.0, 202.0, 20.0 ], - "text" : "remove a specific line (count from 0)" - } - - } -, { - "box" : { - "id" : "obj-21", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 195.0, 403.0, 202.0, 20.0 ], - "text" : "remove the last line of the textbuffer" - } - - } -, { - "box" : { - "id" : "obj-19", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 403.0, 49.0, 22.0 ], - "text" : "remove" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 435.0, 59.0, 22.0 ], - "text" : "remove 5" - } - - } -, { - "box" : { - "id" : "obj-11", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 360.0, 360.0, 180.0, 33.0 ], - "text" : "inserting outside the textbuffer results in many empty lines" - } - - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 360.0, 209.0, 22.0 ], - "text" : "insert 17 \"I'm so lonely on the bottom\"" - } - - } -, { - "box" : { - "id" : "obj-3", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 375.0, 315.0, 240.0, 33.0 ], - "text" : "insert text at specified index (count from 0),\none symbol per line" - } - - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 315.0, 232.0, 22.0 ], - "text" : "insert 4 --> \"Somewhere in the middle\" <--" - } - - } -, { - "box" : { - "id" : "obj-16", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 401.0, 270.0, 134.0, 33.0 ], - "text" : "prepend text,\none symbol per line" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 270.0, 261.0, 22.0 ], - "text" : "prepend \"before all the text\" \"comes this line\" ..." - } - - } -, { - "box" : { - "id" : "obj-13", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 246.0, 180.0, 150.0, 20.0 ], - "text" : "one symbol per line" - } - - } -, { - "box" : { - "id" : "obj-12", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 345.0, 225.0, 134.0, 33.0 ], - "text" : "append text,\none symbol per line" - } - - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 225.0, 199.0, 22.0 ], - "text" : "append \"is it me your\" \"looking for?\"" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 90.0, 180.0, 146.0, 22.0 ], - "text" : "set \"hello world!\" \"foo bar\"" - } - - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 150.0, 150.0, 150.0, 20.0 ], - "text" : "replaces all text" - } - - } -, { - "box" : { - "id" : "obj-6", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 45.0, 150.0, 97.0, 22.0 ], - "text" : "set \"hello world!\"" - } - - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 495.0, 72.0, 22.0 ], - "text" : "s customize" - } - - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 105.0, 366.0, 20.0 ], - "text" : "You can set, insert, append and prepend text with messages." - } - - } -, { - "box" : { - "fontface" : 0, - "fontname" : "Arial", - "fontsize" : 40.0, - "id" : "obj-22", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], - "text" : "th.gl.texteditor", - "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-10", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-15", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-19", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-4", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-6", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-7", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-9", 0 ] - } - - } - ], - "styles" : [ { - "name" : "AudioStatus_Menu", - "default" : { - "bgfillcolor" : { - "type" : "color", - "color" : [ 0.294118, 0.313726, 0.337255, 1 ], - "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39, - "autogradient" : 0 - } - - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "Audiomix", - "default" : { - "bgfillcolor" : { - "type" : "gradient", - "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39 - } - - } -, - "parentstyle" : "", - "multi" : 0 - } - ] - } -, - "patching_rect" : [ 110.0, 345.0, 38.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p text" - } - - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 0, - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 0, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 0.0, 26.0, 861.0, 613.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "showontab" : 1, - "boxes" : [ { - "box" : { - "id" : "obj-80", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 743.0, 467.0, 86.0, 22.0 ], - "text" : "routepass size" - } - - } -, { - "box" : { - "id" : "obj-79", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 715.0, 398.0, 47.0, 22.0 ], - "text" : "getsize" - } - - } -, { - "box" : { - "attr" : "visible", - "id" : "obj-77", - "maxclass" : "attrui", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 540.0, 345.0, 150.0, 22.0 ] - } - - } -, { - "box" : { - "id" : "obj-75", - "linecount" : 4, - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 540.0, 510.0, 248.0, 62.0 ], - "text" : "th.gl.texteditor help-ctx2 1280 720 @cursor <-- @font \"Andale Mono\" @comment ## @blink_enable 1 @blink_time 100 @cursor_color 1 0 0 1 @blink_color 1 1 0 1" - } - - } -, { - "box" : { - "id" : "obj-74", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "bang", "" ], - "patching_rect" : [ 540.0, 437.0, 222.0, 22.0 ], - "text" : "jit.world help-ctx2 @enable 0 @visible 0" - } - - } -, { - "box" : { - "id" : "obj-73", - "linecount" : 3, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 660.0, 240.0, 128.0, 47.0 ], - "text" : "ALT + / \nto (un)comment the line the cursor is on" - } - - } -, { - "box" : { - "id" : "obj-66", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 540.0, 300.0, 72.0, 22.0 ], - "text" : "s customize" - } - - } -, { - "box" : { - "id" : "obj-67", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 540.0, 173.0, 195.0, 20.0 ], - "text" : "change the comment characters" - } - - } -, { - "box" : { - "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], - "fontname" : "Arial Bold", - "hint" : "", - "id" : "obj-68", - "ignoreclick" : 1, - "legacytextcolor" : 1, - "maxclass" : "textbutton", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 525.0, 180.0, 20.0, 20.0 ], - "rounded" : 60.0, - "text" : "6", - "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] - } - - } -, { - "box" : { - "id" : "obj-69", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 630.0, 195.0, 29.5, 22.0 ], - "text" : "#" - } - - } -, { - "box" : { - "id" : "obj-70", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 582.0, 195.0, 29.5, 22.0 ], - "text" : "|" - } - - } -, { - "box" : { - "id" : "obj-71", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 540.0, 240.0, 105.0, 22.0 ], - "text" : "prepend comment" - } - - } -, { - "box" : { - "id" : "obj-72", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 540.0, 195.0, 29.5, 22.0 ], - "text" : "//" - } - - } -, { - "box" : { - "id" : "obj-65", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 300.0, 72.0, 22.0 ], - "text" : "s customize" - } - - } -, { - "box" : { - "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], - "fontname" : "Arial Bold", - "hint" : "", - "id" : "obj-63", - "ignoreclick" : 1, - "legacytextcolor" : 1, - "maxclass" : "textbutton", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 294.5, 367.0, 20.0, 20.0 ], - "rounded" : 60.0, - "text" : "5", - "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] - } - - } -, { - "box" : { - "id" : "obj-62", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 156.5, 382.0, 83.0, 22.0 ], - "text" : "loadmess 250" - } - - } -, { - "box" : { - "id" : "obj-61", - "maxclass" : "number", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 156.5, 412.0, 50.0, 22.0 ] - } - - } -, { - "box" : { - "id" : "obj-59", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 156.5, 442.0, 79.0, 22.0 ], - "text" : "blink_time $1" - } - - } -, { - "box" : { - "id" : "obj-58", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 360.0, 212.5, 20.0 ], - "text" : "enable cursor blinking and blinkspeed" - } - - } -, { - "box" : { - "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], - "fontname" : "Arial Bold", - "hint" : "", - "id" : "obj-47", - "ignoreclick" : 1, - "legacytextcolor" : 1, - "maxclass" : "textbutton", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 28.5, 352.0, 20.0, 20.0 ], - "rounded" : 60.0, - "text" : "3", - "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] - } - - } -, { - "box" : { - "id" : "obj-56", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 45.0, 382.0, 70.0, 22.0 ], - "text" : "loadmess 1" - } - - } -, { - "box" : { - "id" : "obj-55", - "maxclass" : "toggle", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 45.0, 412.0, 24.0, 24.0 ] - } - - } -, { - "box" : { - "id" : "obj-53", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 45.0, 442.0, 93.0, 22.0 ], - "text" : "blink_enable $1" - } - - } -, { - "box" : { - "id" : "obj-51", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 375.0, 474.0, 134.0, 20.0 ], - "text" : "change numbers color" - } - - } -, { - "box" : { - "id" : "obj-50", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 353.5, 444.0, 155.0, 20.0 ], - "text" : "change blink color" - } - - } -, { - "box" : { - "id" : "obj-49", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 333.5, 414.0, 175.0, 20.0 ], - "text" : "change cursor color" - } - - } -, { - "box" : { - "id" : "obj-48", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 311.833333333333371, 384.0, 198.333333333333371, 20.0 ], - "text" : "change font color" - } - - } -, { - "box" : { - "id" : "obj-46", - "maxclass" : "newobj", - "numinlets" : 4, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 0, - "revision" : 8, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 59.0, 103.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "boxes" : [ { - "box" : { - "id" : "obj-38", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 560.0, 130.0, 129.0, 22.0 ], - "text" : "prepend number_color" - } - - } -, { - "box" : { - "id" : "obj-40", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "list", "bang" ], - "patching_rect" : [ 560.0, 100.0, 158.0, 22.0 ], - "text" : "colorpicker @compatibility 0" - } - - } -, { - "box" : { - "id" : "obj-35", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 395.0, 130.0, 113.0, 22.0 ], - "text" : "prepend blink_color" - } - - } -, { - "box" : { - "id" : "obj-37", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "list", "bang" ], - "patching_rect" : [ 395.0, 100.0, 158.0, 22.0 ], - "text" : "colorpicker @compatibility 0" - } - - } -, { - "box" : { - "id" : "obj-32", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 230.5, 130.0, 122.0, 22.0 ], - "text" : "prepend cursor_color" - } - - } -, { - "box" : { - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "list", "bang" ], - "patching_rect" : [ 230.5, 100.0, 158.0, 22.0 ], - "text" : "colorpicker @compatibility 0" - } - - } -, { - "box" : { - "id" : "obj-31", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 130.0, 82.0, 22.0 ], - "text" : "prepend color" - } - - } -, { - "box" : { - "id" : "obj-28", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "list", "bang" ], - "patching_rect" : [ 50.0, 100.0, 158.0, 22.0 ], - "text" : "colorpicker @compatibility 0" - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-41", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 50.0, 40.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-42", - "index" : 2, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 230.5, 40.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-43", - "index" : 3, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 395.0, 40.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-44", - "index" : 4, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 560.0, 40.0, 30.0, 30.0 ] - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-45", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 50.0, 210.0, 30.0, 30.0 ] - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-31", 0 ], - "source" : [ "obj-28", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-45", 0 ], - "source" : [ "obj-31", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-45", 0 ], - "source" : [ "obj-32", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-34", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-45", 0 ], - "source" : [ "obj-35", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-37", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-45", 0 ], - "source" : [ "obj-38", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-38", 0 ], - "source" : [ "obj-40", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-28", 0 ], - "source" : [ "obj-41", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-34", 0 ], - "source" : [ "obj-42", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-37", 0 ], - "source" : [ "obj-43", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-40", 0 ], - "source" : [ "obj-44", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 278.5, 517.0, 84.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p colorPickers" - } - - } -, { - "box" : { - "id" : "obj-39", - "maxclass" : "button", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 343.5, 472.0, 24.0, 24.0 ] - } - - } -, { - "box" : { - "id" : "obj-36", - "maxclass" : "button", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 321.833333333333314, 442.0, 24.0, 24.0 ] - } - - } -, { - "box" : { - "id" : "obj-33", - "maxclass" : "button", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 300.166666666666686, 412.0, 24.0, 24.0 ] - } - - } -, { - "box" : { - "id" : "obj-30", - "maxclass" : "button", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 278.5, 382.0, 24.0, 24.0 ] - } - - } -, { - "box" : { - "id" : "obj-26", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 409.0, 255.0, 69.0, 22.0 ], - "text" : "Menlo Bold" - } - - } -, { - "box" : { - "id" : "obj-25", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 399.0, 225.0, 79.0, 22.0 ], - "text" : "Andale Mono" - } - - } -, { - "box" : { - "id" : "obj-24", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 375.0, 195.0, 103.0, 22.0 ], - "text" : "Courier New Bold" - } - - } -, { - "box" : { - "id" : "obj-21", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 375.0, 300.0, 94.0, 22.0 ], - "text" : "prepend symbol" - } - - } -, { - "box" : { - "id" : "obj-17", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 240.0, 173.0, 210.0, 20.0 ], - "text" : "change the font, use mono-spaced!" - } - - } -, { - "box" : { - "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], - "fontname" : "Arial Bold", - "hint" : "", - "id" : "obj-18", - "ignoreclick" : 1, - "legacytextcolor" : 1, - "maxclass" : "textbutton", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 225.0, 180.0, 20.0, 20.0 ], - "rounded" : 60.0, - "text" : "2", - "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] - } - - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 278.5, 300.0, 76.0, 22.0 ], - "text" : "prepend font" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 268.0, 195.0, 58.0, 22.0 ], - "text" : "loadbang" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "button", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 238.0, 195.0, 24.0, 24.0 ] - } - - } -, { - "box" : { - "id" : "obj-12", - "items" : [ "3Dventure Medium", ",", "Abadi MT Condensed Extra Bold", ",", "Abadi MT Condensed Light", ",", "Ableton Sans Bold", ",", "Ableton Sans Light", ",", "Ableton Sans Medium", ",", "AC Mountain Inverted", ",", "AC Mountain", ",", "Academy Engraved LET Plain", ",", "Adobe Arabic", ",", "Adobe Arabic Italic", ",", "Adobe Arabic Bold", ",", "Adobe Arabic Bold Italic", ",", "Adobe Caslon Pro", ",", "Adobe Caslon Pro Italic", ",", "Adobe Caslon Pro Semibold", ",", "Adobe Caslon Pro Semibold Italic", ",", "Adobe Caslon Pro Bold", ",", "Adobe Caslon Pro Bold Italic", ",", "Adobe Devanagari", ",", "Adobe Devanagari Italic", ",", "Adobe Devanagari Bold", ",", "Adobe Devanagari Bold Italic", ",", "Adobe Fan Heiti Std B", ",", "Adobe Fangsong Std R", ",", "Adobe Garamond Pro", ",", "Adobe Garamond Pro Italic", ",", "Adobe Garamond Pro Bold", ",", "Adobe Garamond Pro Bold Italic", ",", "Adobe Gothic Std B", ",", "Adobe Hebrew", ",", "Adobe Hebrew Italic", ",", "Adobe Hebrew Bold", ",", "Adobe Hebrew Bold Italic", ",", "Adobe Heiti Std R", ",", "Adobe Kaiti Std R", ",", "Adobe Ming Std L", ",", "Adobe Myungjo Std M", ",", "Adobe Naskh Medium", ",", "Adobe Song Std L", ",", "Aggressive Angry Baby Killer", ",", "Al Bayan Plain", ",", "Al Bayan Bold", ",", "Al Nile", ",", "Al Nile Bold", ",", "Al Tarikh", ",", "Alphabet SNK by PMPEPS", ",", "American Typewriter", ",", "American Typewriter Light", ",", "American Typewriter Semibold", ",", "American Typewriter Bold", ",", "American Typewriter Condensed", ",", "American Typewriter Condensed Light", ",", "American Typewriter Condensed Bold", ",", "Amiri", ",", "Amiri Italic", ",", "Amiri Bold", ",", "Amiri Bold Italic", ",", "Andale Mono", ",", "Anime Ace 2.0 BB", ",", "Apple Braille Outline 6 Dot", ",", "Apple Braille Outline 8 Dot", ",", "Apple Braille Pinpoint 6 Dot", ",", "Apple Braille Pinpoint 8 Dot", ",", "Apple Braille", ",", "Apple Chancery Chancery", ",", "Apple Color Emoji", ",", "Apple SD Gothic Neo", ",", "Apple SD Gothic Neo Thin", ",", "Apple SD Gothic Neo UltraLight", ",", "Apple SD Gothic Neo UltraLight", ",", "Apple SD Gothic Neo Light", ",", "Apple SD Gothic Neo Light", ",", "Apple SD Gothic Neo Medium", ",", "Apple SD Gothic Neo Medium", ",", "Apple SD Gothic Neo SemiBold", ",", "Apple SD Gothic Neo SemiBold", ",", "Apple SD Gothic Neo Bold", ",", "Apple SD Gothic Neo ExtraBold", ",", "Apple SD Gothic Neo ExtraBold", ",", "Apple SD Gothic Neo Heavy", ",", "Apple SD Gothic Neo Heavy", ",", "Apple SD Gothic Neo Thin", ",", "Apple Symbols", ",", "AppleGothic", ",", "AppleMyungjo", ",", "Arial", ",", "Arial Italic", ",", "Arial Bold", ",", "Arial Bold Italic", ",", "Arial Black", ",", "Arial Hebrew", ",", "Arial Hebrew Light", ",", "Arial Hebrew Bold", ",", "Arial Hebrew Scholar", ",", "Arial Hebrew Scholar Light", ",", "Arial Hebrew Scholar Bold", ",", "Arial Narrow", ",", "Arial Narrow Italic", ",", "Arial Narrow Bold", ",", "Arial Narrow Bold Italic", ",", "Arial Rounded MT Bold", ",", "Arial Unicode MS", ",", "Arno Pro Caption", ",", "Arno Pro Display", ",", "Arno Pro", ",", "Arno Pro SmText", ",", "Arno Pro Subhead", ",", "Arno Pro Italic", ",", "Arno Pro Italic Caption", ",", "Arno Pro Italic Display", ",", "Arno Pro Italic SmText", ",", "Arno Pro Italic Subhead", ",", "Arno Pro Light Display", ",", "Arno Pro Light Italic Display", ",", "Arno Pro Semibold", ",", "Arno Pro Semibold Caption", ",", "Arno Pro Semibold Display", ",", "Arno Pro Semibold SmText", ",", "Arno Pro Semibold Subhead", ",", "Arno Pro Semibold Italic", ",", "Arno Pro Semibold Italic Caption", ",", "Arno Pro Semibold Italic Display", ",", "Arno Pro Semibold Italic SmText", ",", "Arno Pro Semibold Italic Subhead", ",", "Arno Pro Bold", ",", "Arno Pro Bold Caption", ",", "Arno Pro Bold Display", ",", "Arno Pro Bold SmText", ",", "Arno Pro Bold Subhead", ",", "Arno Pro Bold Italic", ",", "Arno Pro Bold Italic Caption", ",", "Arno Pro Bold Italic Display", ",", "Arno Pro Bold Italic SmText", ",", "Arno Pro Bold Italic Subhead", ",", "Athelas", ",", "Athelas Italic", ",", "Athelas Bold", ",", "Athelas Bold Italic", ",", "Avenir Book", ",", "Avenir Roman", ",", "Avenir Book Oblique", ",", "Avenir Oblique", ",", "Avenir Light", ",", "Avenir Light Oblique", ",", "Avenir Medium", ",", "Avenir Medium Oblique", ",", "Avenir Heavy", ",", "Avenir Heavy Oblique", ",", "Avenir Black", ",", "Avenir Black Oblique", ",", "Avenir Next", ",", "Avenir Next Italic", ",", "Avenir Next Ultra Light", ",", "Avenir Next Ultra Light Italic", ",", "Avenir Next Medium", ",", "Avenir Next Medium Italic", ",", "Avenir Next Demi Bold", ",", "Avenir Next Demi Bold Italic", ",", "Avenir Next Bold", ",", "Avenir Next Bold Italic", ",", "Avenir Next Heavy", ",", "Avenir Next Heavy Italic", ",", "Avenir Next Condensed", ",", "Avenir Next Condensed Italic", ",", "Avenir Next Condensed Ultra Light", ",", "Avenir Next Condensed Ultra Light Italic", ",", "Avenir Next Condensed Medium", ",", "Avenir Next Condensed Medium Italic", ",", "Avenir Next Condensed Demi Bold", ",", "Avenir Next Condensed Demi Bold Italic", ",", "Avenir Next Condensed Bold", ",", "Avenir Next Condensed Bold Italic", ",", "Avenir Next Condensed Heavy", ",", "Avenir Next Condensed Heavy Italic", ",", "AvenirCondensedHand CondensedHand", ",", "Ayuthaya", ",", "Baghdad", ",", "Bangla MN", ",", "Bangla MN Bold", ",", "Bangla Sangam MN", ",", "Bangla Sangam MN Bold", ",", "Bank Gothic Light", ",", "Bank Gothic Medium", ",", "Barlow", ",", "Barlow Italic", ",", "Barlow ExtraLight", ",", "Barlow ExtraLight Italic", ",", "Barlow Light", ",", "Barlow Light Italic", ",", "Barlow Medium", ",", "Barlow Medium Italic", ",", "Barlow SemiBold", ",", "Barlow SemiBold Italic", ",", "Barlow Bold", ",", "Barlow Bold Italic", ",", "Barlow ExtraBold", ",", "Barlow ExtraBold Italic", ",", "Barlow Black", ",", "Barlow Black Italic", ",", "Barlow Thin", ",", "Barlow Thin Italic", ",", "Basica v.2012", ",", "Baskerville", ",", "Baskerville Italic", ",", "Baskerville SemiBold", ",", "Baskerville SemiBold Italic", ",", "Baskerville Bold", ",", "Baskerville Bold Italic", ",", "Baskerville Old Face", ",", "Batang", ",", "Bauhaus 93", ",", "Beirut", ",", "Bell Gothic Std Bold", ",", "Bell Gothic Std Black", ",", "Bell MT", ",", "Bell MT Italic", ",", "Bell MT Bold", ",", "Bernard MT Condensed", ",", "Bickham Script Pro", ",", "Bickham Script Pro Semibold", ",", "Bickham Script Pro Bold", ",", "Big Caslon Medium", ",", "Birch Std", ",", "Birmingham", ",", "BirminghamBold", ",", "BIRTH OF A HERO", ",", "Blackmoor LET Plain", ",", "Blackoak Std", ",", "BlairMdITC TT Medium", ",", "Blake", ",", "Bodoni 72 Book", ",", "Bodoni 72 Book Italic", ",", "Bodoni 72 Bold", ",", "Bodoni 72 Oldstyle Book", ",", "Bodoni 72 Oldstyle Book Italic", ",", "Bodoni 72 Oldstyle Bold", ",", "Bodoni 72 Smallcaps Book", ",", "Bodoni Ornaments", ",", "Book Antiqua", ",", "Book Antiqua Italic", ",", "Book Antiqua Bold", ",", "Book Antiqua Bold Italic", ",", "Bookman Old Style", ",", "Bookman Old Style Italic", ",", "Bookman Old Style Bold", ",", "Bookman Old Style Bold Italic", ",", "Bookshelf Symbol 7", ",", "Bordeaux Roman Bold LET Plain", ",", "Bradley Hand Bold", ",", "Braggadocio", ",", "Braille", ",", "Britannic Bold", ",", "Brush Script MT Italic", ",", "Brush Script Std Medium", ",", "Calibri", ",", "Calibri Italic", ",", "Calibri Bold", ",", "Calibri Bold Italic", ",", "Calisto MT", ",", "Calisto MT Italic", ",", "Calisto MT Bold", ",", "Calisto MT Bold Italic", ",", "Cambria", ",", "Cambria Italic", ",", "Cambria Bold", ",", "Cambria Bold Italic", ",", "Cambria Math", ",", "Candara", ",", "Candara Italic", ",", "Candara Bold", ",", "Candara Bold Italic", ",", "CANDY INC. TRIAL", ",", "Capitals", ",", "Cardenio Modern", ",", "Cardenio Modern Bold", ",", "Casual", ",", "Century", ",", "Century Gothic", ",", "Century Gothic Italic", ",", "Century Gothic Bold", ",", "Century Gothic Bold Italic", ",", "Century Schoolbook", ",", "Century Schoolbook Italic", ",", "Century Schoolbook Bold", ",", "Century Schoolbook Bold Italic", ",", "Chalkboard", ",", "Chalkboard Bold", ",", "Chalkboard SE", ",", "Chalkboard SE Light", ",", "Chalkboard SE Bold", ",", "Chalkduster", ",", "Chaparral Pro", ",", "Chaparral Pro Italic", ",", "Chaparral Pro Light Italic", ",", "Chaparral Pro Bold", ",", "Chaparral Pro Bold Italic", ",", "Charlemagne Std Bold", ",", "Charter Roman", ",", "Charter Italic", ",", "Charter Bold", ",", "Charter Bold Italic", ",", "Charter Black", ",", "Charter Black Italic", ",", "Clarks Summit", ",", "Cochin", ",", "Cochin Italic", ",", "Cochin Bold", ",", "Cochin Bold Italic", ",", "Code Bold", ",", "Code Light", ",", "Colonna MT", ",", "Comic Sans MS", ",", "Comic Sans MS Bold", ",", "Consolas", ",", "Consolas Italic", ",", "Consolas Bold", ",", "Consolas Bold Italic", ",", "Constantia", ",", "Constantia Italic", ",", "Constantia Bold", ",", "Constantia Bold Italic", ",", "Cooper Black", ",", "Cooper Std Black", ",", "Cooper Std Black Italic", ",", "Copperplate", ",", "Copperplate Light", ",", "Copperplate Bold", ",", "Copperplate Gothic Bold", ",", "Copperplate Gothic Light", ",", "Corbel", ",", "Corbel Italic", ",", "Corbel Bold", ",", "Corbel Bold Italic", ",", "Corsiva Hebrew", ",", "Corsiva Hebrew Bold", ",", "Courier", ",", "Courier Oblique", ",", "Courier Bold", ",", "Courier Bold Oblique", ",", "Courier New", ",", "Courier New Italic", ",", "Courier New Bold", ",", "Courier New Bold Italic", ",", "Cracked", ",", "Cubic", ",", "Curlz MT", ",", "Damascus", ",", "Damascus Light", ",", "Damascus Medium", ",", "Damascus Semi Bold", ",", "Damascus Bold", ",", "DecoType Naskh", ",", "Desdemona", ",", "Devanagari MT", ",", "Devanagari MT Bold", ",", "Devanagari Sangam MN", ",", "Devanagari Sangam MN Bold", ",", "Didot", ",", "Didot Italic", ",", "Didot Bold", ",", "Dimitri", ",", "Dimitri Swank", ",", "DIN Alternate Bold", ",", "DIN Condensed Bold", ",", "Diwan Kufi", ",", "Diwan Thuluth", ",", "Eccentric Std", ",", "Edwardian Script ITC", ",", "Engravers MT", ",", "Engravers MT Bold", ",", "Euphemia UCAS", ",", "Euphemia UCAS Italic", ",", "Euphemia UCAS Bold", ",", "Eurostile", ",", "Eurostile Bold", ",", "Farah", ",", "Farisi", ",", "Footlight MT Light", ",", "Franklin Gothic Book", ",", "Franklin Gothic Book Italic", ",", "Franklin Gothic Medium", ",", "Franklin Gothic Medium Italic", ",", "Futura Medium", ",", "Futura Medium Italic", ",", "Futura Bold", ",", "Futura Condensed Medium", ",", "Futura Condensed ExtraBold", ",", "Gabriola", ",", "Garamond", ",", "Garamond Italic", ",", "Garamond Bold", ",", "Garamond Premier Pro", ",", "Garamond Premier Pro Italic", ",", "Garamond Premier Pro Semibold", ",", "Garamond Premier Pro Semibold Italic", ",", "GB18030 Bitmap", ",", "Geeza Pro", ",", "Geeza Pro Bold", ",", "GelPenUpright Medium", ",", "GelPenUprightHeavy Heavy", ",", "GelPenUprightLight Light", ",", "Geneva", ",", "Georgia", ",", "Georgia Italic", ",", "Georgia Bold", ",", "Georgia Bold Italic", ",", "Giddyup Std", ",", "Gill Sans", ",", "Gill Sans Italic", ",", "Gill Sans Light", ",", "Gill Sans Light Italic", ",", "Gill Sans SemiBold", ",", "Gill Sans SemiBold Italic", ",", "Gill Sans Bold", ",", "Gill Sans Bold Italic", ",", "Gill Sans UltraBold", ",", "Gill Sans MT", ",", "Gill Sans MT Italic", ",", "Gill Sans MT Bold", ",", "Gill Sans MT Bold Italic", ",", "Gloucester MT Extra Condensed", ",", "Goudy Old Style Italic", ",", "Goudy Old Style", ",", "Goudy Old Style Bold", ",", "green piloww", ",", "Guitar Pro 5", ",", "Gujarati MT", ",", "Gujarati MT Bold", ",", "Gujarati Sangam MN", ",", "Gujarati Sangam MN Bold", ",", "Gulim", ",", "Gurmukhi MN", ",", "Gurmukhi MN Bold", ",", "Gurmukhi MT", ",", "Gurmukhi Sangam MN", ",", "Gurmukhi Sangam MN Bold", ",", "HACKED", ",", "Haettenschweiler", ",", "Halo", ",", "Halo Outline", ",", "Handwriting - Dakota", ",", "Harrington", ",", "Heiti SC Light", ",", "Heiti SC Medium", ",", "Heiti TC Light", ",", "Heiti TC Medium", ",", "Helsinki Metronome Std", ",", "Helsinki Special Std", ",", "Helsinki Std", ",", "Helsinki Text Std", ",", "Helvetica", ",", "Helvetica Oblique", ",", "Helvetica Light", ",", "Helvetica Light Oblique", ",", "Helvetica Bold", ",", "Helvetica Bold Oblique", ",", "Helvetica Neue", ",", "Helvetica Neue Italic", ",", "Helvetica Neue UltraLight", ",", "Helvetica Neue UltraLight Italic", ",", "Helvetica Neue Thin", ",", "Helvetica Neue Thin Italic", ",", "Helvetica Neue Light", ",", "Helvetica Neue Light Italic", ",", "Helvetica Neue Medium", ",", "Helvetica Neue Medium Italic", ",", "Helvetica Neue Bold", ",", "Helvetica Neue Bold Italic", ",", "Helvetica Neue Condensed Bold", ",", "Helvetica Neue Condensed Black", ",", "Herculanum", ",", "Hind Guntur", ",", "Hind Guntur Light", ",", "Hind Guntur Medium", ",", "Hind Guntur SemiBold", ",", "Hind Guntur Bold", ",", "Hiragino Kaku Gothic Pro W3", ",", "Hiragino Kaku Gothic Pro W3", ",", "Hiragino Kaku Gothic Pro W6", ",", "Hiragino Kaku Gothic Pro W6", ",", "Hiragino Kaku Gothic ProN W3", ",", "Hiragino Kaku Gothic ProN W6", ",", "Hiragino Kaku Gothic Std W8", ",", "Hiragino Kaku Gothic Std W8", ",", "Hiragino Kaku Gothic StdN W8", ",", "Hiragino Kaku Gothic StdN W8", ",", "Hiragino Maru Gothic Pro W4", ",", "Hiragino Maru Gothic ProN W4", ",", "Hiragino Mincho Pro W3", ",", "Hiragino Mincho Pro W3", ",", "Hiragino Mincho Pro W6", ",", "Hiragino Mincho Pro W6", ",", "Hiragino Mincho ProN W3", ",", "Hiragino Mincho ProN W6", ",", "Hiragino Sans W0", ",", "Hiragino Sans W1", ",", "Hiragino Sans W2", ",", "Hiragino Sans W3", ",", "Hiragino Sans W4", ",", "Hiragino Sans W5", ",", "Hiragino Sans W6", ",", "Hiragino Sans W7", ",", "Hiragino Sans W8", ",", "Hiragino Sans W9", ",", "Hiragino Sans GB W3", ",", "Hiragino Sans GB W3", ",", "Hiragino Sans GB W6", ",", "Hiragino Sans GB W6", ",", "Hobo Std Medium", ",", "Hoefler Text", ",", "Hoefler Text Ornaments", ",", "Hoefler Text Italic", ",", "Hoefler Text Black", ",", "Hoefler Text Black Italic", ",", "IBM Plex Mono", ",", "IBM Plex Mono Italic", ",", "IBM Plex Mono ExtraLight", ",", "IBM Plex Mono ExtraLight Italic", ",", "IBM Plex Mono Light", ",", "IBM Plex Mono Light Italic", ",", "IBM Plex Mono Medium", ",", "IBM Plex Mono Text", ",", "IBM Plex Mono Medium Italic", ",", "IBM Plex Mono Text Italic", ",", "IBM Plex Mono SemiBold", ",", "IBM Plex Mono SemiBold Italic", ",", "IBM Plex Mono Bold", ",", "IBM Plex Mono Bold Italic", ",", "IBM Plex Mono Thin", ",", "IBM Plex Mono Thin Italic", ",", "IBM Plex Sans", ",", "IBM Plex Sans Italic", ",", "IBM Plex Sans ExtraLight", ",", "IBM Plex Sans ExtraLight Italic", ",", "IBM Plex Sans Light", ",", "IBM Plex Sans Light Italic", ",", "IBM Plex Sans Medium", ",", "IBM Plex Sans Text", ",", "IBM Plex Sans Medium Italic", ",", "IBM Plex Sans Text Italic", ",", "IBM Plex Sans SemiBold", ",", "IBM Plex Sans SemiBold Italic", ",", "IBM Plex Sans Bold", ",", "IBM Plex Sans Bold Italic", ",", "IBM Plex Sans Thin", ",", "IBM Plex Sans Thin Italic", ",", "IBM Plex Serif", ",", "IBM Plex Serif Italic", ",", "IBM Plex Serif ExtraLight", ",", "IBM Plex Serif ExtraLight Italic", ",", "IBM Plex Serif Light", ",", "IBM Plex Serif Light Italic", ",", "IBM Plex Serif Medium", ",", "IBM Plex Serif Text", ",", "IBM Plex Serif Medium Italic", ",", "IBM Plex Serif Text Italic", ",", "IBM Plex Serif SemiBold", ",", "IBM Plex Serif SemiBold Italic", ",", "IBM Plex Serif Bold", ",", "IBM Plex Serif Bold Italic", ",", "IBM Plex Serif Thin", ",", "IBM Plex Serif Thin Italic", ",", "Impact", ",", "Imprint MT Shadow", ",", "InaiMathi", ",", "Inconsolata", ",", "Inconsolata Bold", ",", "Inkpen2 Chords Std", ",", "Inkpen2 Metronome Std", ",", "Inkpen2 Script Std", ",", "Inkpen2 Special Std", ",", "Inkpen2 Std", ",", "Inkpen2 Text Std", ",", "Iowan Old Style Roman", ",", "Iowan Old Style Titling", ",", "Iowan Old Style Italic", ",", "Iowan Old Style Bold", ",", "Iowan Old Style Bold Italic", ",", "Iowan Old Style Black", ",", "Iowan Old Style Black Italic", ",", "ITF Devanagari Book", ",", "ITF Devanagari Light", ",", "ITF Devanagari Medium", ",", "ITF Devanagari Demi", ",", "ITF Devanagari Bold", ",", "ITF Devanagari Marathi Book", ",", "ITF Devanagari Marathi Light", ",", "ITF Devanagari Marathi Medium", ",", "ITF Devanagari Marathi Demi", ",", "ITF Devanagari Marathi Bold", ",", "Jazz LET Plain", ",", "Kailasa", ",", "Kailasa Bold", ",", "Kaiso Next B", ",", "Kannada MN", ",", "Kannada MN Bold", ",", "Kannada Sangam MN", ",", "Kannada Sangam MN Bold", ",", "Kefa", ",", "Kefa Bold", ",", "Khmer MN", ",", "Khmer MN Bold", ",", "Khmer Sangam MN", ",", "Kino MT", ",", "Kohinoor Bangla", ",", "Kohinoor Bangla Light", ",", "Kohinoor Bangla Medium", ",", "Kohinoor Bangla Semibold", ",", "Kohinoor Bangla Bold", ",", "Kohinoor Devanagari", ",", "Kohinoor Devanagari Light", ",", "Kohinoor Devanagari Medium", ",", "Kohinoor Devanagari Semibold", ",", "Kohinoor Devanagari Bold", ",", "Kohinoor Telugu", ",", "Kohinoor Telugu Light", ",", "Kohinoor Telugu Medium", ",", "Kohinoor Telugu Semibold", ",", "Kohinoor Telugu Bold", ",", "Kokonor", ",", "Kozuka Gothic Pr6N R", ",", "Kozuka Gothic Pr6N EL", ",", "Kozuka Gothic Pr6N L", ",", "Kozuka Gothic Pr6N M", ",", "Kozuka Gothic Pr6N B", ",", "Kozuka Gothic Pr6N H", ",", "Kozuka Gothic Pro R", ",", "Kozuka Gothic Pro EL", ",", "Kozuka Gothic Pro L", ",", "Kozuka Gothic Pro M", ",", "Kozuka Gothic Pro B", ",", "Kozuka Gothic Pro H", ",", "Kozuka Mincho Pr6N R", ",", "Kozuka Mincho Pr6N EL", ",", "Kozuka Mincho Pr6N L", ",", "Kozuka Mincho Pr6N M", ",", "Kozuka Mincho Pr6N B", ",", "Kozuka Mincho Pr6N H", ",", "Kozuka Mincho Pro R", ",", "Kozuka Mincho Pro EL", ",", "Kozuka Mincho Pro L", ",", "Kozuka Mincho Pro M", ",", "Kozuka Mincho Pro B", ",", "Kozuka Mincho Pro H", ",", "Krungthep", ",", "KufiStandardGK", ",", "Lao MN", ",", "Lao MN Bold", ",", "Lao Sangam MN", ",", "Lato", ",", "Lato Italic", ",", "Lato Hairline", ",", "Lato Hairline Italic", ",", "Lato Light", ",", "Lato Light Italic", ",", "Lato Medium", ",", "Lato Medium Italic", ",", "Lato Semibold", ",", "Lato Semibold Italic", ",", "Lato Bold", ",", "Lato Bold Italic", ",", "Lato Heavy", ",", "Lato Heavy Italic", ",", "Lato Black", ",", "Lato Black Italic", ",", "Lato Thin", ",", "Lato Thin Italic", ",", "Letter Gothic Std Slanted", ",", "Letter Gothic Std Medium", ",", "Letter Gothic Std Bold", ",", "Letter Gothic Std Bold Slanted", ",", "Libre Baskerville", ",", "Libre Baskerville Italic", ",", "Libre Baskerville Bold", ",", "Linux Libertine", ",", "Linux Libertine Italic", ",", "Linux Libertine Semibold", ",", "Linux Libertine Semibold Italic", ",", "Linux Libertine Bold", ",", "Linux Libertine Bold Italic", ",", "Linux Libertine Display", ",", "Lithos Pro", ",", "Lithos Pro Black", ",", "Lucida Blackletter", ",", "Lucida Bright", ",", "Lucida Bright Italic", ",", "Lucida Bright Demibold", ",", "Lucida Bright Demibold Italic", ",", "Lucida Calligraphy Italic", ",", "Lucida Console", ",", "Lucida Fax", ",", "Lucida Fax Italic", ",", "Lucida Fax Demibold", ",", "Lucida Fax Demibold Italic", ",", "Lucida Grande", ",", "Lucida Grande Bold", ",", "Lucida Handwriting Italic", ",", "Lucida Sans", ",", "Lucida Sans Italic", ",", "Lucida Sans Demibold Roman", ",", "Lucida Sans Demibold Italic", ",", "Lucida Sans Typewriter", ",", "Lucida Sans Typewriter Oblique", ",", "Lucida Sans Typewriter Bold", ",", "Lucida Sans Typewriter Bold Oblique", ",", "Lucida Sans Unicode", ",", "Luminari", ",", "Malayalam MN", ",", "Malayalam MN Bold", ",", "Malayalam Sangam MN", ",", "Malayalam Sangam MN Bold", ",", "Manbow Clear", ",", "Manbow Dots", ",", "Manbow Fill", ",", "Manbow Lines", ",", "Manbow Screen", ",", "Manbow Solid", ",", "Manbow Spots", ",", "Manbow Stripe", ",", "Manbow Tone", ",", "Marion", ",", "Marion Italic", ",", "Marion Bold", ",", "Marker Felt Thin", ",", "Marker Felt Wide", ",", "Marlett", ",", "MASTERPLAN TRIAL", ",", "Matrix Code NFI", ",", "Matura MT Script Capitals", ",", "Meiryo", ",", "Meiryo Italic", ",", "Meiryo Bold", ",", "Meiryo Bold Italic", ",", "Menlo", ",", "Menlo Italic", ",", "Menlo Bold", ",", "Menlo Bold Italic", ",", "Merriweather Sans", ",", "Merriweather Sans Italic", ",", "Merriweather Sans Light", ",", "Merriweather Sans Light Italic", ",", "Merriweather Sans Bold", ",", "Merriweather Sans Bold Italic", ",", "Merriweather Sans ExtraBold", ",", "Merriweather Sans ExtraBold Italic", ",", "Mesquite Std Medium", ",", "metafors", ",", "Microsoft Sans Serif", ",", "Minion Pro", ",", "Minion Pro Italic", ",", "Minion Pro Medium", ",", "Minion Pro Medium Italic", ",", "Minion Pro Semibold", ",", "Minion Pro Semibold Italic", ",", "Minion Pro Bold", ",", "Minion Pro Bold Italic", ",", "Minion Pro Bold Cond", ",", "Minion Pro Bold Cond Italic", ",", "Mishafi", ",", "Mishafi Gold", ",", "Mistral", ",", "Modern No. 20", ",", "Mona Lisa Solid ITC TT", ",", "Monaco", ",", "Monotype Corsiva", ",", "Monotype Sorts", ",", "MS Gothic", ",", "MS Mincho", ",", "MS PGothic", ",", "MS PMincho", ",", "MS Reference Sans Serif", ",", "MS Reference Specialty", ",", "Mshtakan", ",", "Mshtakan Oblique", ",", "Mshtakan Bold", ",", "Mshtakan BoldOblique", ",", "MT Extra", ",", "Muna", ",", "Muna Bold", ",", "Muna Black", ",", "Museo 500", ",", "Myanmar MN", ",", "Myanmar MN Bold", ",", "Myanmar Sangam MN", ",", "Myanmar Sangam MN Bold", ",", "Myriad Arabic", ",", "Myriad Arabic Italic", ",", "Myriad Arabic Bold", ",", "Myriad Arabic Bold Italic", ",", "Myriad Hebrew", ",", "Myriad Hebrew Italic", ",", "Myriad Hebrew Bold", ",", "Myriad Hebrew Bold Italic", ",", "Myriad Pro", ",", "Myriad Pro Italic", ",", "Myriad Pro Semibold", ",", "Myriad Pro Semibold Italic", ",", "Myriad Pro Bold", ",", "Myriad Pro Bold Italic", ",", "Myriad Pro Condensed", ",", "Myriad Pro Condensed Italic", ",", "Myriad Pro Bold Condensed", ",", "Myriad Pro Bold Condensed Italic", ",", "Myriad Web Pro", ",", "Myriad Web Pro Italic", ",", "Myriad Web Pro Bold", ",", "Myriad Web Pro Condensed", ",", "Myriad Web Pro Condensed Italic", ",", "Nadeem", ",", "New Peninim MT", ",", "New Peninim MT Inclined", ",", "New Peninim MT Bold", ",", "New Peninim MT Bold Inclined", ",", "News Gothic MT", ",", "News Gothic MT Italic", ",", "News Gothic MT Bold", ",", "NipCen's Handwriting Regular", ",", "Noteworthy Light", ",", "Noteworthy Bold", ",", "Noto Sans", ",", "Noto Sans Italic", ",", "Noto Sans Bold", ",", "Noto Sans Bold Italic", ",", "Noto Serif", ",", "Noto Serif Italic", ",", "Noto Serif Bold", ",", "Noto Serif Bold Italic", ",", "November for bach", ",", "Nueva Std", ",", "Nueva Std Italic", ",", "Nueva Std Bold", ",", "Nueva Std Bold Italic", ",", "Nueva Std Condensed", ",", "Nueva Std Condensed Italic", ",", "Nueva Std Bold Condensed", ",", "Nueva Std Bold Condensed Italic", ",", "OCR A Std", ",", "Onyx", ",", "Optima", ",", "Optima Italic", ",", "Optima Bold", ",", "Optima Bold Italic", ",", "Optima ExtraBlack", ",", "Opus", ",", "Opus Big Time Std", ",", "Opus Chords", ",", "Opus Chords Sans", ",", "Opus Chords Sans Condensed", ",", "Opus Chords Sans Condensed Std", ",", "Opus Chords Sans Std", ",", "Opus Chords Std", ",", "Opus Figured Bass", ",", "Opus Figured Bass Extras", ",", "Opus Figured Bass Extras Std", ",", "Opus Figured Bass Std", ",", "Opus Function Symbols", ",", "Opus Function Symbols Std", ",", "Opus Japanese Chords", ",", "Opus Metronome", ",", "Opus Metronome Std", ",", "Opus Note Names", ",", "Opus Note Names Std", ",", "Opus Ornaments", ",", "Opus Ornaments Std", ",", "Opus Percussion", ",", "Opus Percussion Std", ",", "Opus PlainChords", ",", "Opus PlainChords Std", ",", "Opus Roman Chords", ",", "Opus Roman Chords Std", ",", "Opus Special", ",", "Opus Special Extra", ",", "Opus Special Extra Std", ",", "Opus Special Std", ",", "Opus Std", ",", "Opus Text", ",", "Opus Text Std", ",", "Orator Std Slanted", ",", "Orator Std Medium", ",", "Oriya MN", ",", "Oriya MN Bold", ",", "Oriya Sangam MN", ",", "Oriya Sangam MN Bold", ",", "Palatino", ",", "Palatino", ",", "Palatino Italic", ",", "Palatino Italic", ",", "Palatino Bold", ",", "Palatino Bold", ",", "Palatino Bold Italic", ",", "Palatino Bold Italic", ",", "Palatino Linotype", ",", "Palatino Linotype Italic", ",", "Palatino Linotype Bold", ",", "Palatino Linotype Bold Italic", ",", "Papyrus", ",", "Papyrus Condensed", ",", "Park Lane NF", ",", "Party LET Plain", ",", "Perpetua", ",", "Perpetua Italic", ",", "Perpetua Bold", ",", "Perpetua Bold Italic", ",", "Perpetua Titling MT Light", ",", "Perpetua Titling MT Bold", ",", "Phosphate Inline", ",", "Phosphate Solid", ",", "PingFang HK", ",", "PingFang HK Ultralight", ",", "PingFang HK Thin", ",", "PingFang HK Light", ",", "PingFang HK Medium", ",", "PingFang HK Semibold", ",", "PingFang SC", ",", "PingFang SC Ultralight", ",", "PingFang SC Thin", ",", "PingFang SC Light", ",", "PingFang SC Medium", ",", "PingFang SC Semibold", ",", "PingFang TC", ",", "PingFang TC Ultralight", ",", "PingFang TC Thin", ",", "PingFang TC Light", ",", "PingFang TC Medium", ",", "PingFang TC Semibold", ",", "Plantagenet Cherokee", ",", "Plantin MT Std", ",", "Plantin MT Std Italic", ",", "Plantin MT Std Bold", ",", "Plantin MT Std Bold Italic", ",", "Playbill", ",", "PMingLiU", ",", "Poplar Std Black", ",", "PortagoITC TT", ",", "Prestige Elite Std Bold", ",", "Princetown LET", ",", "PT Mono", ",", "PT Mono Bold", ",", "PT Sans", ",", "PT Sans Italic", ",", "PT Sans Bold", ",", "PT Sans Bold Italic", ",", "PT Sans Caption", ",", "PT Sans Caption Bold", ",", "PT Sans Narrow", ",", "PT Sans Narrow Bold", ",", "PT Serif", ",", "PT Serif Italic", ",", "PT Serif Bold", ",", "PT Serif Bold Italic", ",", "PT Serif Caption", ",", "PT Serif Caption Italic", ",", "Raanana", ",", "Raanana Bold", ",", "Red Moon Rising", ",", "REMARK", ",", "Reprise Big Time Std", ",", "Reprise Chords Std", ",", "Reprise Metronome Std", ",", "Reprise Rehearsal Std", ",", "Reprise Script Std", ",", "Reprise Special Std", ",", "Reprise Stamp Std", ",", "Reprise Std", ",", "Reprise Text Std", ",", "Reprise Title Std", ",", "REVOLUTION REVOLUTION", ",", "Roboto", ",", "Roboto Italic", ",", "Roboto Light", ",", "Roboto Light Italic", ",", "Roboto Medium", ",", "Roboto Medium Italic", ",", "Roboto Bold", ",", "Roboto Bold Italic", ",", "Roboto Black", ",", "Roboto Black Italic", ",", "Roboto Thin", ",", "Roboto Thin Italic", ",", "Roboto Mono", ",", "Roboto Mono Italic", ",", "Roboto Mono Light", ",", "Roboto Mono Light Italic", ",", "Roboto Mono Medium", ",", "Roboto Mono Medium Italic", ",", "Roboto Mono Bold", ",", "Roboto Mono Bold Italic", ",", "Roboto Mono Thin", ",", "Roboto Mono Thin Italic", ",", "Rockwell", ",", "Rockwell Italic", ",", "Rockwell Bold", ",", "Rockwell Bold Italic", ",", "Rockwell Extra Bold", ",", "Rosewood Std", ",", "Sana", ",", "Santa Fe LET Plain", ",", "Sathu", ",", "Savoye LET Plain", ",", "SchoolHouse Cursive B", ",", "SchoolHouse Printed A", ",", "Seravek", ",", "Seravek Italic", ",", "Seravek ExtraLight", ",", "Seravek ExtraLight Italic", ",", "Seravek Light", ",", "Seravek Light Italic", ",", "Seravek Medium", ",", "Seravek Medium Italic", ",", "Seravek Bold", ",", "Seravek Bold Italic", ",", "Shree Devanagari 714", ",", "Shree Devanagari 714 Italic", ",", "Shree Devanagari 714 Bold", ",", "Shree Devanagari 714 Bold Italic", ",", "SignPainter HouseScript", ",", "SignPainter HouseScript Semibold", ",", "Silom", ",", "SimSun", ",", "Sin City", ",", "Sinhala MN", ",", "Sinhala MN Bold", ",", "Sinhala Sangam MN", ",", "Sinhala Sangam MN Bold", ",", "Skate Brand", ",", "Skia", ",", "Skia Light", ",", "Skia Bold", ",", "Skia Black", ",", "Skia Extended", ",", "Skia Light Extended", ",", "Skia Black Extended", ",", "Skia Condensed", ",", "Skia Light Condensed", ",", "Skia Black Condensed", ",", "Snell Roundhand", ",", "Snell Roundhand Bold", ",", "Snell Roundhand Black", ",", "Songti SC", ",", "Songti SC Light", ",", "Songti SC Bold", ",", "Songti SC Black", ",", "Songti TC", ",", "Songti TC Light", ",", "Songti TC Bold", ",", "Source Code Pro", ",", "Source Code Pro Italic", ",", "Source Code Pro ExtraLight", ",", "Source Code Pro ExtraLight Italic", ",", "Source Code Pro Light", ",", "Source Code Pro Light Italic", ",", "Source Code Pro Medium", ",", "Source Code Pro Medium Italic", ",", "Source Code Pro Semibold", ",", "Source Code Pro Semibold Italic", ",", "Source Code Pro Bold", ",", "Source Code Pro Bold Italic", ",", "Source Code Pro Black", ",", "Source Code Pro Black Italic", ",", "Space Mono", ",", "Space Mono Italic", ",", "Space Mono Bold", ",", "Space Mono Bold Italic", ",", "Springtime", ",", "SRG MARKER", ",", "Stencil", ",", "Stencil Std Bold", ",", "STIXGeneral", ",", "STIXGeneral Italic", ",", "STIXGeneral Bold", ",", "STIXGeneral Bold Italic", ",", "STIXIntegralsD", ",", "STIXIntegralsD Bold", ",", "STIXIntegralsSm", ",", "STIXIntegralsSm Bold", ",", "STIXIntegralsUp", ",", "STIXIntegralsUp Bold", ",", "STIXIntegralsUpD", ",", "STIXIntegralsUpD Bold", ",", "STIXIntegralsUpSm", ",", "STIXIntegralsUpSm Bold", ",", "STIXNonUnicode", ",", "STIXNonUnicode Italic", ",", "STIXNonUnicode Bold", ",", "STIXNonUnicode Bold Italic", ",", "STIXSizeFiveSym", ",", "STIXSizeFourSym", ",", "STIXSizeFourSym Bold", ",", "STIXSizeOneSym", ",", "STIXSizeOneSym Bold", ",", "STIXSizeThreeSym", ",", "STIXSizeThreeSym Bold", ",", "STIXSizeTwoSym", ",", "STIXSizeTwoSym Bold", ",", "STIXVariants", ",", "STIXVariants Bold", ",", "Stone Sans ITC TT Bold", ",", "Stone Sans Sem ITC TT Semi", ",", "Stone Sans Sem ITC TT SemiIta", ",", "STSong", ",", "Sukhumvit Set Text", ",", "Sukhumvit Set Light", ",", "Sukhumvit Set Medium", ",", "Sukhumvit Set Semi Bold", ",", "Sukhumvit Set Bold", ",", "Sukhumvit Set Thin", ",", "Superclarendon", ",", "Superclarendon Italic", ",", "Superclarendon Light", ",", "Superclarendon Light Italic", ",", "Superclarendon Bold", ",", "Superclarendon Bold Italic", ",", "Superclarendon Black", ",", "Superclarendon Black Italic", ",", "Symbol", ",", "Synchro LET", ",", "Tahoma Normal", ",", "Tahoma Negreta", ",", "Tamil MN", ",", "Tamil MN Bold", ",", "Tamil Sangam MN", ",", "Tamil Sangam MN Bold", ",", "Tekton Pro", ",", "Tekton Pro Oblique", ",", "Tekton Pro Bold", ",", "Tekton Pro Bold Oblique", ",", "Tekton Pro Bold Extended", ",", "Tekton Pro Bold Condensed", ",", "Telugu MN", ",", "Telugu MN Bold", ",", "Telugu Sangam MN", ",", "Telugu Sangam MN Bold", ",", "Thonburi", ",", "Thonburi Light", ",", "Thonburi Bold", ",", "Times", ",", "Times Italic", ",", "Times Bold", ",", "Times Bold Italic", ",", "Times New Roman", ",", "Times New Roman Italic", ",", "Times New Roman Bold", ",", "Times New Roman Bold Italic", ",", "Trajan Pro", ",", "Trajan Pro Bold", ",", "Trattatello", ",", "Trebuchet MS", ",", "Trebuchet MS Italic", ",", "Trebuchet MS Bold", ",", "Trebuchet MS Bold Italic", ",", "Tw Cen MT", ",", "Tw Cen MT Italic", ",", "Tw Cen MT Bold", ",", "Tw Cen MT Bold Italic", ",", "Type Embellishments One LET Embellishments One LET Plain", ",", "Ubuntu Mono", ",", "Ubuntu Mono Italic", ",", "Ubuntu Mono Bold", ",", "Ubuntu Mono Bold Italic", ",", "UNIVERSAL-COLLEGE-draft", ",", "Varsity", ",", "Verdana", ",", "Verdana Italic", ",", "Verdana Bold", ",", "Verdana Bold Italic", ",", "Very Damaged UL", ",", "VisualBraille VisualBraille", ",", "Vollkorn", ",", "Vollkorn Italic", ",", "Vollkorn SemiBold", ",", "Vollkorn SemiBold Italic", ",", "Vollkorn Bold", ",", "Vollkorn Bold Italic", ",", "Vollkorn Black", ",", "Vollkorn Black Italic", ",", "VT323", ",", "Waseem", ",", "Waseem Light", ",", "Webdings", ",", "Wide Latin", ",", "Wingdings", ",", "Wingdings 2", ",", "Wingdings 3", ",", "Zapf Dingbats", ",", "Zapfino" ], - "maxclass" : "umenu", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "int", "", "" ], - "parameter_enable" : 0, - "patching_rect" : [ 238.0, 270.0, 100.0, 22.0 ] - } - - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 238.0, 240.0, 43.0, 22.0 ], - "text" : "fontlist" - } - - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 173.0, 165.0, 20.0 ], - "text" : "change the cursor characters" - } - - } -, { - "box" : { - "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], - "fontname" : "Arial Bold", - "hint" : "", - "id" : "obj-27", - "ignoreclick" : 1, - "legacytextcolor" : 1, - "maxclass" : "textbutton", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "", "", "int" ], - "parameter_enable" : 0, - "patching_rect" : [ 30.0, 180.0, 20.0, 20.0 ], - "rounded" : 60.0, - "text" : "1", - "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] - } - - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 195.0, 50.0, 22.0 ], - "text" : "" + } + + } +, { + "box" : { + "id" : "obj-11", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 62.5, 512.5, 150.0, 47.0 ], + "text" : "go to the repl window and write\ntest (100" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-12", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 38.0, 512.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "8", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-1", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "parameter_mappable" : 0, + "patching_rect" : [ 38.0, 416.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "7", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 219.0, 481.0, 72.0, 22.0 ], + "text" : "s customize" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 219.0, 449.5, 105.0, 22.0 ], + "text" : "keybindings nobbf" + } + + } +, { + "box" : { + "data" : { + "settings" : { + "repl" : { + "BUFFER_SIZE" : 40 + } +, + "textbuffer" : { + "formatters" : [ "whitespace" ] + } + + } +, + "bindings" : [ { + "id" : "execute", + "asciiCode" : 2044, + "functions" : [ "return ['run']" ] + } +, { + "id" : "execute-line", + "asciiCode" : 6140, + "functions" : [ "return ['run_line']" ] + } +, { + "id" : "disable-editor-alt-D", + "asciiCode" : 8706, + "functions" : [ "return ['ignore_keys']" ] + } +, { + "id" : "alphahandler", + "asciiCode" : 127, + "functions" : [ "ctx.addChar(k)" ] + } +, { + "id" : "ephemeral_mode-alt-g", + "asciiCode" : 169, + "functions" : [ "return ['ephemeral_mode']" ] + } +, { + "id" : "addSpace", + "asciiCode" : -2, + "functions" : [ "ctx.addChar(32)" ] + } +, { + "id" : "addSpace", + "asciiCode" : 32, + "functions" : [ "ctx.addChar(32)" ] + } +, { + "id" : "newLine", + "asciiCode" : -4, + "functions" : [ "ctx.newLine()" ] + } +, { + "id" : "newLine", + "asciiCode" : 10, + "functions" : [ "ctx.newLine()" ] + } +, { + "id" : "newLine", + "asciiCode" : 13, + "functions" : [ "ctx.newLine()" ] + } +, { + "id" : "addTab", + "asciiCode" : -5, + "functions" : [ "ctx.addTab()" ] + } +, { + "id" : "delete", + "asciiCode" : -6, + "functions" : [ "ctx.deleteChar()" ] + } +, { + "id" : "backspace", + "asciiCode" : -7, + "functions" : [ "ctx.backSpace()" ] + } +, { + "id" : "comment-alt-/", + "asciiCode" : 247, + "functions" : [ "ctx.commentLine()" ] + } +, { + "id" : "clear-alt-z", + "asciiCode" : 937, + "functions" : [ "ctx.clear()" ] + } +, { + "id" : "cutLine-alt-x", + "asciiCode" : 8776, + "functions" : [ "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" ] + } +, { + "id" : "copyLine-alt-c", + "asciiCode" : 231, + "functions" : [ "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" ] + } +, { + "id" : "copyAll-alt-k", + "asciiCode" : 730, + "functions" : [ "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" ] + } +, { + "id" : "paste-alt-v", + "asciiCode" : 8730, + "functions" : [ "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" ] + } +, { + "id" : "replaceLine-alt-p", + "asciiCode" : 960, + "functions" : [ "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" ] + } +, { + "id" : "up", + "asciiCode" : -9, + "functions" : [ "ctx.jumpLine(-1)" ] + } +, { + "id" : "down", + "asciiCode" : -10, + "functions" : [ "ctx.jumpLine(1)" ] + } +, { + "id" : "left", + "asciiCode" : -11, + "functions" : [ "ctx.jumpChar(-1)" ] + } +, { + "id" : "right", + "asciiCode" : -12, + "functions" : [ "ctx.jumpChar(1)" ] + } +, { + "id" : "jump-top-alt-up", + "asciiCode" : 2039, + "functions" : [ "ctx.jumpTo(2)" ] + } +, { + "id" : "jump-bottom-alt-down", + "asciiCode" : 2038, + "functions" : [ "ctx.jumpTo(3)" ] + } +, { + "id" : "jump-begin-alt-left", + "asciiCode" : 2037, + "functions" : [ "ctx.jumpTo(0)" ] + } +, { + "id" : "jump-end-alt-right", + "asciiCode" : 2036, + "functions" : [ "ctx.jumpTo(1)" ] + } +, { + "id" : "jumpWord-left-cmd-left", + "asciiCode" : 8804, + "functions" : [ "ctx.jumpWord(-1)" ] + } +, { + "id" : "jumpWord-right-cmd-right", + "asciiCode" : 8805, + "functions" : [ "ctx.jumpWord(1)" ] + } + ] + } +, + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 296.5, 481.0, 123.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 1, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict nobbf @embed 1" + } + + } +, { + "box" : { + "id" : "obj-7", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 62.5, 411.5, 151.0, 100.0 ], + "text" : "But what if we don't want this formatter to run? Let's configure the repl with this alternative configuration ->\nnote that changing the keybindings clears the REPL content!" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-73", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "parameter_mappable" : 0, + "patching_rect" : [ 271.0, 349.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "6", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-16", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 36.0, 349.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-36", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 271.0, 293.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-31", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 38.0, 293.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-28", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 273.0, 233.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-6", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 297.5, 349.0, 151.0, 87.0 ], + "text" : "note the error in the max console\ntw.gl.repl: not balanced: test (100\nand that no message is sent from the object outlet" + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 62.5, 349.0, 151.0, 47.0 ], + "text" : "execute the run command (Option+Return or Option+Control+Return)" + } + + } +, { + "box" : { + "id" : "obj-4", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 297.5, 293.0, 153.0, 47.0 ], + "text" : "delete the last character of the line so it reads\ntest (100" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 62.5, 293.0, 151.0, 33.0 ], + "text" : "note the output is printed to the max console" + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 297.5, 233.5, 151.0, 47.0 ], + "text" : "execute the run command (Option+Return or Option+Control+Return)" + } + + } +, { + "box" : { + "id" : "obj-67", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 62.5, 233.5, 150.0, 47.0 ], + "text" : "go to the repl window and write\ntest (100) " + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 38.0, 233.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-88", + "linecount" : 9, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 98.0, 496.0, 127.0 ], + "text" : "The Repl can have text formatters attached via code and config which do something to transform your output before it is sent to max. By default there are two formatters added, the first is a whitespace formatter which just ensures consistency of output, the second it the BraceBalancedFormatter. This has a more specific application, it will throw an error (printed to the max console) if the nuber of braces in your input is not balanced.\nThis is particularly important in repl appliations where you might be outputting a DSL for another system and need to ensure it is valid.\nTo add your own text formatters please refer to README.md in the project as this needs to be done in code so users can select them in configuration", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "text" : "tw.gl.repl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 1 ], + "source" : [ "obj-17", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 227.0, 397.0, 96.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p textFormatters" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 917.0, 768.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "align" : 0, + "bgcolor" : [ 0.996078431372549, 0.996078431372549, 0.996078431372549, 0.2 ], + "bgoncolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "fontface" : 1, + "id" : "obj-69", + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 49.0, 607.0, 150.0, 23.0 ], + "presentation" : 1, + "presentation_rect" : [ 27.0, 518.0, 150.0, 23.0 ], + "text" : "maxpatch gist on github", + "textjustification" : 0, + "textoncolor" : [ 0.239216, 0.254902, 0.278431, 1.0 ], + "textovercolor" : [ 1.0, 1.0, 1.0, 1.0 ], + "usebgoncolor" : 1, + "usetextovercolor" : 1 + } + + } +, { + "box" : { + "hidden" : 1, + "id" : "obj-68", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 49.0, 629.0, 485.0, 35.0 ], + "text" : ";\rmax launchbrowser https://gist.github.com/twhiston/1224d30f2a3bbf67d5c67dc80e3f9e74" + } + + } +, { + "box" : { + "id" : "obj-8", + "linecount" : 5, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 531.0, 503.0, 74.0 ], + "text" : "You could implement more advanced functionality easily once your text is captured.\nYou can even use the [shell] object and pbcopy/pbpaste messages to read/write it to the real system clipboard! \nTo see an example of how this works see this maxpatch (but be aware you will need the [shell] object installed for this example to work)" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 475.0, 262.5, 33.0, 22.0 ], + "text" : "read" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 398.0, 262.5, 150.0, 20.0 ], + "text" : "read the file" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-23", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 376.0, 262.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "7", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 475.0, 232.5, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 480.0, 323.5, 72.0, 22.0 ], + "text" : "s customize" + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 398.0, 232.5, 150.0, 20.0 ], + "text" : "clear the repl" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-33", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 376.0, 232.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "6", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 398.0, 202.0, 150.0, 20.0 ], + "text" : "write the file to disk" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-16", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 376.0, 202.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 337.0, 206.0, 34.0, 22.0 ], + "text" : "write" + } + + } +, { + "box" : { + "id" : "obj-12", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 418.0, 157.0, 60.0 ], + "text" : "open the formatForText patcher to see how we add newlines for each of the different capture objects" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-36", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 27.0, 419.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-11", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 376.5, 157.0, 33.0 ], + "text" : "see it appear in the textedit and text objects" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-31", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 27.0, 377.5, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-10", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 342.0, 157.0, 33.0 ], + "text" : "copy the line with Option+c / Ctrl + c" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-28", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 27.0, 343.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 49.0, 307.0, 150.0, 20.0 ], + "text" : "write something in the repl" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 27.0, 308.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 73.0, 173.5, 126.0, 87.0 ], + "text" : "Using a simple abstraction such as this we can make the text read to write to either a textedit or text options ---->" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 100.0, 367.0, 60.0 ], + "text" : "Because you can't use the system clipboard directly in the repl we have our own clipboard functionality using the pastebin functions in the TextBuffer. Anything that you cut or copy from the repl will be output from the second outlet, so you have the chance to capture it." + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "text" : "tw.gl.repl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.0, 206.0, 115.0, 22.0 ], + "text" : "r replFromClipboard" + } + + } +, { + "box" : { + "id" : "obj-91", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 252.5, 269.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-89", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "bang", "int" ], + "patching_rect" : [ 309.0, 277.0, 40.0, 22.0 ], + "text" : "text" + } + + } +, { + "box" : { + "id" : "obj-86", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "cr" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 106.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-3", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 186.0, 218.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 74.666666666666671, 218.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 48.0, 38.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "fontname" : "Geneva", + "fontsize" : 10.0, + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "cr", "int", "", "" ], + "patching_rect" : [ 48.0, 83.666626000000008, 59.0, 21.0 ], + "text" : "t cr 13 s s" + } + + } +, { + "box" : { + "fontname" : "Verdana", + "fontsize" : 11.0, + "id" : "obj-64", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 74.666666666666671, 179.0, 100.0, 22.0 ], + "text" : "prepend append" + } + + } +, { + "box" : { + "fontname" : "Verdana", + "fontsize" : 11.0, + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 41.0, 126.666626000000008, 37.0, 22.0 ], + "text" : "itoa" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-85", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-64", 0 ], + "midpoints" : [ 50.5, 171.0, 84.166666666666671, 171.0 ], + "source" : [ "obj-48", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-64", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "midpoints" : [ 97.5, 138.0, 195.5, 138.0 ], + "source" : [ "obj-85", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "midpoints" : [ 57.5, 114.0, 195.5, 114.0 ], + "source" : [ "obj-85", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-85", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-64", 0 ], + "source" : [ "obj-85", 2 ] + } + + } + ] + } +, + "patching_rect" : [ 212.0, 241.0, 116.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p formatForText" + } + + } +, { + "box" : { + "id" : "obj-55", + "maxclass" : "textedit", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "", "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 212.0, 305.0, 250.0, 211.0 ], + "text" : "w erase_color 0 0 0 0.7\r" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-86", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-68", 0 ], + "source" : [ "obj-69", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "source" : [ "obj-86", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "source" : [ "obj-86", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-55", 0 ], + "midpoints" : [ 262.0, 293.0, 224.0, 293.0, 224.0, 299.0, 221.5, 299.0 ], + "order" : 1, + "source" : [ "obj-91", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-89", 0 ], + "midpoints" : [ 262.0, 293.0, 305.0, 293.0, 305.0, 272.0, 318.5, 272.0 ], + "order" : 0, + "source" : [ "obj-91", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 330.0, 397.0, 67.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p clipboard" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 917.0, 768.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-20", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 202.0, 251.0, 190.0, 47.0 ], + "text" : "note that this does not work and only inserts the first line. Add only works for a line at a time" + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 257.0, 155.0, 35.0 ], + "text" : "add \"this is also some text\" \"so is this\"" + } + + } +, { + "box" : { + "fontface" : 1, + "id" : "obj-55", + "linecount" : 6, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 676.0, 370.0, 135.0, 87.0 ], + "text" : "Some useful helpers for dealing with text.\nRemember all these commands can be run from inside the repl as well!" + } + + } +, { + "box" : { + "id" : "obj-53", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 464.0, 692.0, 339.0, 33.0 ], + "text" : "reading a file will play it back through the keyPress function a character at a time" + } + + } +, { + "box" : { + "id" : "obj-51", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 347.0, 692.0, 111.0, 22.0 ], + "text" : "read _example1.txt" + } + + } +, { + "box" : { + "id" : "obj-48", + "linecount" : 4, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 653.0, 601.0, 154.0, 60.0 ], + "text" : "replay will insert text into the buffer by iterating each char of each symbol through keyPress" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 449.5, 565.0, 353.5, 20.0 ], + "text" : "keyPress takes the ASCII/max charID of the key as its argument" + } + + } +, { + "box" : { + "fontface" : 1, + "id" : "obj-44", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 340.0, 505.0, 455.0, 47.0 ], + "text" : "These methods all insert text into the repl by playing it back through functionality attached to keypresses. This may or may not add it to the text buffer depending on your configuration and what is attached to the keypress" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 347.0, 606.0, 302.0, 22.0 ], + "text" : "replay \"the quick brown fox\" \"jumped over the lazy dog\"" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 347.0, 565.0, 81.0, 22.0 ], + "text" : "keyPress 104" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 400.0, 444.0, 170.0, 20.0 ], + "text" : "clears all text in the repl buffer" + } + + } +, { + "box" : { + "fontface" : 1, + "id" : "obj-30", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 39.0, 301.0, 261.0, 47.0 ], + "text" : "These methods all insert text into the buffer WITHOUT playing it back through functionality attached to keypresses." + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 358.0, 444.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "id" : "obj-24", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 172.0, 211.0, 218.0, 33.0 ], + "text" : "adds a single line of text at the current cursor position." + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 216.5, 126.0, 22.0 ], + "text" : "add \"this is some text\"" + } + + } +, { + "box" : { + "id" : "obj-23", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 425.0, 407.0, 202.0, 20.0 ], + "text" : "remove a specific line (count from 0)" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 425.0, 370.0, 202.0, 20.0 ], + "text" : "remove the last line of the textbuffer" + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 358.0, 370.0, 49.0, 22.0 ], + "text" : "remove" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 358.0, 407.0, 59.0, 22.0 ], + "text" : "remove 5" + } + + } +, { + "box" : { + "id" : "obj-11", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 615.0, 315.0, 180.0, 33.0 ], + "text" : "inserting outside the textbuffer results in many empty lines" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.5, 315.0, 209.0, 22.0 ], + "text" : "insert 17 \"I'm so lonely on the bottom\"" + } + + } +, { + "box" : { + "id" : "obj-3", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 661.0, 257.0, 134.0, 47.0 ], + "text" : "insert text at specified index (count from 0),\none symbol per line" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.5, 263.0, 232.0, 22.0 ], + "text" : "insert 4 --> \"Somewhere in the middle\" <--" + } + + } +, { + "box" : { + "id" : "obj-16", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 661.0, 205.5, 134.0, 33.0 ], + "text" : "prepend text,\none symbol per line" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.5, 211.0, 261.0, 22.0 ], + "text" : "prepend \"before all the text\" \"comes this line\" ..." + } + + } +, { + "box" : { + "id" : "obj-12", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 661.0, 150.0, 134.0, 33.0 ], + "text" : "append text,\none symbol per line" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.5, 155.5, 199.0, 22.0 ], + "text" : "append \"is it me\" \"your looking for?\"" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 182.0, 146.0, 22.0 ], + "text" : "set \"hello world!\" \"foo bar\"" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 150.0, 150.0, 150.0, 20.0 ], + "text" : "replaces all text" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 150.0, 97.0, 22.0 ], + "text" : "set \"hello world!\"" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 495.0, 72.0, 22.0 ], + "text" : "s customize" + } + + } +, { + "box" : { + "id" : "obj-2", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 105.0, 366.0, 33.0 ], + "text" : "You can set, insert, append and prepend text with messages. You can also load and save text in the repl to .txt files." + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "text" : "tw.gl.repl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "angle" : 270.0, + "bgcolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "id" : "obj-28", + "maxclass" : "panel", + "mode" : 0, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 32.0, 139.0, 779.0, 214.0 ], + "proportion" : 0.5 + } + + } +, { + "box" : { + "angle" : 270.0, + "bgcolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "id" : "obj-43", + "maxclass" : "panel", + "mode" : 0, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 329.0, 499.0, 482.0, 255.0 ], + "proportion" : 0.5 + } + + } +, { + "box" : { + "angle" : 270.0, + "bgcolor" : [ 0.647058823529412, 0.647058823529412, 0.647058823529412, 1.0 ], + "id" : "obj-54", + "maxclass" : "panel", + "mode" : 0, + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 329.0, 365.0, 482.0, 114.0 ], + "proportion" : 0.5 + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-19", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-51", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-6", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ], + "styles" : [ { + "name" : "AudioStatus_Menu", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "autogradient" : 0, + "color" : [ 0.294118, 0.313726, 0.337255, 1 ], + "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "color" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "Audiomix", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "gradient" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } + ] + } +, + "patching_rect" : [ 183.0, 397.0, 38.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p text" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 917.0, 768.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-4", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 518.0, 576.0, 372.0, 33.0 ], + "text" : "This is an example of how you can configure these options from the object itself rather than passing in messages" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-13", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 496.0, 576.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "6", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 816.0, 475.0, 83.0, 22.0 ], + "text" : "ignore_keys 0" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 523.0, 479.0, 79.0, 22.0 ], + "text" : "loadmess init" + } + + } +, { + "box" : { + "id" : "obj-80", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 726.0, 475.0, 86.0, 22.0 ], + "text" : "routepass size" + } + + } +, { + "box" : { + "id" : "obj-79", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 698.0, 406.0, 47.0, 22.0 ], + "text" : "getsize" + } + + } +, { + "box" : { + "attr" : "visible", + "id" : "obj-77", + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 523.0, 353.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-75", + "linecount" : 3, + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 523.0, 518.0, 367.0, 49.0 ], + "text" : "tw.gl.repl help-ctx2 1280 720 @cursor <-- @font \"Andale Mono\" @comment ## @blink_enable 1 @blink_time 100 @cursor_color 1 0 0 1 @blink_color 1 1 0 1 @ignore_keys 1" + } + + } +, { + "box" : { + "id" : "obj-74", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 523.0, 445.0, 222.0, 22.0 ], + "text" : "jit.world help-ctx2 @enable 0 @visible 0" + } + + } +, { + "box" : { + "id" : "obj-73", + "linecount" : 3, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 643.0, 248.0, 128.0, 47.0 ], + "text" : "ALT + / CTRL + /\nto (un)comment the line the cursor is on" + } + + } +, { + "box" : { + "id" : "obj-66", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 523.0, 308.0, 72.0, 22.0 ], + "text" : "s customize" + } + + } +, { + "box" : { + "id" : "obj-67", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 523.0, 181.0, 195.0, 20.0 ], + "text" : "change the comment characters" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-68", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 508.0, 188.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-69", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 613.0, 203.0, 29.5, 22.0 ], + "text" : "#" + } + + } +, { + "box" : { + "id" : "obj-70", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 565.0, 203.0, 29.5, 22.0 ], + "text" : "|" + } + + } +, { + "box" : { + "id" : "obj-71", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 523.0, 248.0, 105.0, 22.0 ], + "text" : "prepend comment" + } + + } +, { + "box" : { + "id" : "obj-72", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 523.0, 203.0, 29.5, 22.0 ], + "text" : "//" + } + + } +, { + "box" : { + "id" : "obj-65", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 301.0, 72.0, 22.0 ], + "text" : "s customize" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-63", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 294.5, 368.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-62", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 156.5, 383.0, 83.0, 22.0 ], + "text" : "loadmess 250" + } + + } +, { + "box" : { + "id" : "obj-61", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 156.5, 413.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 156.5, 443.0, 79.0, 22.0 ], + "text" : "blink_time $1" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 361.0, 212.5, 20.0 ], + "text" : "enable cursor blinking and blinkspeed" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-47", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 28.5, 353.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-56", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 383.0, 70.0, 22.0 ], + "text" : "loadmess 1" + } + + } +, { + "box" : { + "id" : "obj-55", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 45.0, 413.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-53", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 45.0, 443.0, 93.0, 22.0 ], + "text" : "blink_enable $1" + } + + } +, { + "box" : { + "id" : "obj-51", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 375.0, 475.0, 134.0, 20.0 ], + "text" : "change numbers color" + } + + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 353.5, 445.0, 155.0, 20.0 ], + "text" : "change blink color" + } + + } +, { + "box" : { + "id" : "obj-49", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 333.5, 415.0, 175.0, 20.0 ], + "text" : "change cursor color" + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 311.833333333333371, 385.0, 198.333333333333371, 20.0 ], + "text" : "change font color" + } + + } +, { + "box" : { + "id" : "obj-46", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 103.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-38", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 560.0, 130.0, 129.0, 22.0 ], + "text" : "prepend number_color" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "list", "bang" ], + "patching_rect" : [ 560.0, 100.0, 158.0, 22.0 ], + "text" : "colorpicker @compatibility 0" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 395.0, 130.0, 113.0, 22.0 ], + "text" : "prepend blink_color" + } + + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "list", "bang" ], + "patching_rect" : [ 395.0, 100.0, 158.0, 22.0 ], + "text" : "colorpicker @compatibility 0" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 230.5, 130.0, 122.0, 22.0 ], + "text" : "prepend cursor_color" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "list", "bang" ], + "patching_rect" : [ 230.5, 100.0, 158.0, 22.0 ], + "text" : "colorpicker @compatibility 0" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 130.0, 82.0, 22.0 ], + "text" : "prepend color" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "list", "bang" ], + "patching_rect" : [ 50.0, 100.0, 158.0, 22.0 ], + "text" : "colorpicker @compatibility 0" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-41", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 50.0, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-42", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 230.5, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-43", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 395.0, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-44", + "index" : 4, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 560.0, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-45", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 50.0, 210.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-34", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-37", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 0 ], + "source" : [ "obj-41", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-40", 0 ], + "source" : [ "obj-44", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 278.5, 518.0, 84.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p colorPickers" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 343.5, 473.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 321.833333333333314, 443.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 300.166666666666686, 413.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 278.5, 383.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 409.0, 256.0, 69.0, 22.0 ], + "text" : "Menlo Bold" + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 399.0, 226.0, 79.0, 22.0 ], + "text" : "Andale Mono" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 375.0, 196.0, 103.0, 22.0 ], + "text" : "Courier New Bold" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 375.0, 301.0, 94.0, 22.0 ], + "text" : "prepend symbol" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 240.0, 174.0, 210.0, 20.0 ], + "text" : "change the font, use mono-spaced!" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-18", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 225.0, 181.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 278.5, 301.0, 76.0, 22.0 ], + "text" : "prepend font" + } + + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 268.0, 196.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "button", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 238.0, 196.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-12", + "items" : [ "Ableton Sans Bold", ",", "Ableton Sans Light", ",", "Ableton Sans Medium", ",", "Academy Engraved LET Plain", ",", "Al Bayan Plain", ",", "Al Bayan Bold", ",", "Al Nile", ",", "Al Nile Bold", ",", "Al Tarikh", ",", "American Typewriter", ",", "American Typewriter Light", ",", "American Typewriter Semibold", ",", "American Typewriter Bold", ",", "American Typewriter Condensed", ",", "American Typewriter Condensed Light", ",", "American Typewriter Condensed Bold", ",", "Andale Mono", ",", "Apple Braille Outline 6 Dot", ",", "Apple Braille Outline 8 Dot", ",", "Apple Braille Pinpoint 6 Dot", ",", "Apple Braille Pinpoint 8 Dot", ",", "Apple Braille", ",", "Apple Chancery Chancery", ",", "Apple Color Emoji", ",", "Apple SD Gothic Neo", ",", "Apple SD Gothic Neo Thin", ",", "Apple SD Gothic Neo UltraLight", ",", "Apple SD Gothic Neo Light", ",", "Apple SD Gothic Neo Medium", ",", "Apple SD Gothic Neo SemiBold", ",", "Apple SD Gothic Neo Bold", ",", "Apple SD Gothic Neo ExtraBold", ",", "Apple SD Gothic Neo Heavy", ",", "Apple Symbols", ",", "AppleGothic", ",", "AppleMyungjo", ",", "Arial", ",", "Arial Italic", ",", "Arial Bold", ",", "Arial Bold Italic", ",", "Arial Black", ",", "Arial Hebrew", ",", "Arial Hebrew Light", ",", "Arial Hebrew Bold", ",", "Arial Hebrew Scholar", ",", "Arial Hebrew Scholar Light", ",", "Arial Hebrew Scholar Bold", ",", "Arial Narrow", ",", "Arial Narrow Italic", ",", "Arial Narrow Bold", ",", "Arial Narrow Bold Italic", ",", "Arial Rounded MT Bold", ",", "Arial Unicode MS", ",", "Avenir Book", ",", "Avenir Roman", ",", "Avenir Book Oblique", ",", "Avenir Oblique", ",", "Avenir Light", ",", "Avenir Light Oblique", ",", "Avenir Medium", ",", "Avenir Medium Oblique", ",", "Avenir Heavy", ",", "Avenir Heavy Oblique", ",", "Avenir Black", ",", "Avenir Black Oblique", ",", "Avenir Next", ",", "Avenir Next Italic", ",", "Avenir Next Ultra Light", ",", "Avenir Next Ultra Light Italic", ",", "Avenir Next Medium", ",", "Avenir Next Medium Italic", ",", "Avenir Next Demi Bold", ",", "Avenir Next Demi Bold Italic", ",", "Avenir Next Bold", ",", "Avenir Next Bold Italic", ",", "Avenir Next Heavy", ",", "Avenir Next Heavy Italic", ",", "Avenir Next Condensed", ",", "Avenir Next Condensed Italic", ",", "Avenir Next Condensed Ultra Light", ",", "Avenir Next Condensed Ultra Light Italic", ",", "Avenir Next Condensed Medium", ",", "Avenir Next Condensed Medium Italic", ",", "Avenir Next Condensed Demi Bold", ",", "Avenir Next Condensed Demi Bold Italic", ",", "Avenir Next Condensed Bold", ",", "Avenir Next Condensed Bold Italic", ",", "Avenir Next Condensed Heavy", ",", "Avenir Next Condensed Heavy Italic", ",", "Ayuthaya", ",", "Baghdad", ",", "Bangla MN", ",", "Bangla MN Bold", ",", "Bangla Sangam MN", ",", "Bangla Sangam MN Bold", ",", "Baskerville", ",", "Baskerville Italic", ",", "Baskerville SemiBold", ",", "Baskerville SemiBold Italic", ",", "Baskerville Bold", ",", "Baskerville Bold Italic", ",", "Beirut", ",", "Big Caslon Medium", ",", "Bodoni 72 Book", ",", "Bodoni 72 Book Italic", ",", "Bodoni 72 Bold", ",", "Bodoni 72 Oldstyle Book", ",", "Bodoni 72 Oldstyle Book Italic", ",", "Bodoni 72 Oldstyle Bold", ",", "Bodoni 72 Smallcaps Book", ",", "Bodoni Ornaments", ",", "Bradley Hand Bold", ",", "Brush Script MT Italic", ",", "Chalkboard", ",", "Chalkboard Bold", ",", "Chalkboard SE", ",", "Chalkboard SE Light", ",", "Chalkboard SE Bold", ",", "Chalkduster", ",", "Charter Roman", ",", "Charter Italic", ",", "Charter Bold", ",", "Charter Bold Italic", ",", "Charter Black", ",", "Charter Black Italic", ",", "Cochin", ",", "Cochin Italic", ",", "Cochin Bold", ",", "Cochin Bold Italic", ",", "Comic Sans MS", ",", "Comic Sans MS Bold", ",", "Consolas", ",", "Consolas Italic", ",", "Consolas Bold", ",", "Consolas Bold Italic", ",", "Copperplate", ",", "Copperplate Light", ",", "Copperplate Bold", ",", "Corsiva Hebrew", ",", "Corsiva Hebrew Bold", ",", "Courier New", ",", "Courier New Italic", ",", "Courier New Bold", ",", "Courier New Bold Italic", ",", "Damascus", ",", "Damascus Light", ",", "Damascus Medium", ",", "Damascus Semi Bold", ",", "Damascus Bold", ",", "DecoType Naskh", ",", "Devanagari MT", ",", "Devanagari MT Bold", ",", "Devanagari Sangam MN", ",", "Devanagari Sangam MN Bold", ",", "Didot", ",", "Didot Italic", ",", "Didot Bold", ",", "DIN Alternate Bold", ",", "DIN Condensed Bold", ",", "Diwan Kufi", ",", "Diwan Thuluth", ",", "Euphemia UCAS", ",", "Euphemia UCAS Italic", ",", "Euphemia UCAS Bold", ",", "Farah", ",", "Farisi", ",", "Futura Medium", ",", "Futura Medium Italic", ",", "Futura Bold", ",", "Futura Condensed Medium", ",", "Futura Condensed ExtraBold", ",", "Galvji", ",", "Galvji Oblique", ",", "Galvji Bold", ",", "Galvji Bold Oblique", ",", "GB18030 Bitmap", ",", "Geeza Pro", ",", "Geeza Pro Bold", ",", "Geneva", ",", "Georgia", ",", "Georgia Italic", ",", "Georgia Bold", ",", "Georgia Bold Italic", ",", "Gill Sans", ",", "Gill Sans Italic", ",", "Gill Sans Light", ",", "Gill Sans Light Italic", ",", "Gill Sans SemiBold", ",", "Gill Sans SemiBold Italic", ",", "Gill Sans Bold", ",", "Gill Sans Bold Italic", ",", "Gill Sans UltraBold", ",", "Grantha Sangam MN", ",", "Grantha Sangam MN Bold", ",", "Gujarati MT", ",", "Gujarati MT Bold", ",", "Gujarati Sangam MN", ",", "Gujarati Sangam MN Bold", ",", "Gurmukhi MN", ",", "Gurmukhi MN Bold", ",", "Gurmukhi MT", ",", "Gurmukhi Sangam MN", ",", "Gurmukhi Sangam MN Bold", ",", "Heiti SC Light", ",", "Heiti SC Medium", ",", "Heiti TC Light", ",", "Heiti TC Medium", ",", "Helvetica", ",", "Helvetica Oblique", ",", "Helvetica Light", ",", "Helvetica Light Oblique", ",", "Helvetica Bold", ",", "Helvetica Bold Oblique", ",", "Helvetica Neue", ",", "Helvetica Neue Italic", ",", "Helvetica Neue UltraLight", ",", "Helvetica Neue UltraLight Italic", ",", "Helvetica Neue Thin", ",", "Helvetica Neue Thin Italic", ",", "Helvetica Neue Light", ",", "Helvetica Neue Light Italic", ",", "Helvetica Neue Medium", ",", "Helvetica Neue Medium Italic", ",", "Helvetica Neue Bold", ",", "Helvetica Neue Bold Italic", ",", "Helvetica Neue Condensed Bold", ",", "Helvetica Neue Condensed Black", ",", "Herculanum", ",", "Hiragino Maru Gothic ProN W4", ",", "Hiragino Mincho ProN W3", ",", "Hiragino Mincho ProN W6", ",", "Hiragino Sans W0", ",", "Hiragino Sans W1", ",", "Hiragino Sans W2", ",", "Hiragino Sans W3", ",", "Hiragino Sans W4", ",", "Hiragino Sans W5", ",", "Hiragino Sans W6", ",", "Hiragino Sans W7", ",", "Hiragino Sans W8", ",", "Hiragino Sans W9", ",", "Hiragino Sans GB W3", ",", "Hiragino Sans GB W6", ",", "Hoefler Text", ",", "Hoefler Text Ornaments", ",", "Hoefler Text Italic", ",", "Hoefler Text Black", ",", "Hoefler Text Black Italic", ",", "Impact", ",", "InaiMathi", ",", "InaiMathi Bold", ",", "ITF Devanagari Book", ",", "ITF Devanagari Light", ",", "ITF Devanagari Medium", ",", "ITF Devanagari Demi", ",", "ITF Devanagari Bold", ",", "ITF Devanagari Marathi Book", ",", "ITF Devanagari Marathi Light", ",", "ITF Devanagari Marathi Medium", ",", "ITF Devanagari Marathi Demi", ",", "ITF Devanagari Marathi Bold", ",", "Kailasa", ",", "Kailasa Bold", ",", "Kannada MN", ",", "Kannada MN Bold", ",", "Kannada Sangam MN", ",", "Kannada Sangam MN Bold", ",", "Kefa", ",", "Kefa Bold", ",", "Khmer MN", ",", "Khmer MN Bold", ",", "Khmer Sangam MN", ",", "Kohinoor Bangla", ",", "Kohinoor Bangla Light", ",", "Kohinoor Bangla Medium", ",", "Kohinoor Bangla Semibold", ",", "Kohinoor Bangla Bold", ",", "Kohinoor Devanagari", ",", "Kohinoor Devanagari Light", ",", "Kohinoor Devanagari Medium", ",", "Kohinoor Devanagari Semibold", ",", "Kohinoor Devanagari Bold", ",", "Kohinoor Gujarati", ",", "Kohinoor Gujarati Light", ",", "Kohinoor Gujarati Medium", ",", "Kohinoor Gujarati Semibold", ",", "Kohinoor Gujarati Bold", ",", "Kohinoor Telugu", ",", "Kohinoor Telugu Light", ",", "Kohinoor Telugu Medium", ",", "Kohinoor Telugu Semibold", ",", "Kohinoor Telugu Bold", ",", "Kokonor", ",", "Krungthep", ",", "KufiStandardGK", ",", "Lao MN", ",", "Lao MN Bold", ",", "Lao Sangam MN", ",", "Lato", ",", "Lato Italic", ",", "Lato Hairline", ",", "Lato Hairline Italic", ",", "Lato Thin", ",", "Lato Thin Italic", ",", "Lato Light", ",", "Lato Light Italic", ",", "Lato Medium", ",", "Lato Medium Italic", ",", "Lato Semibold", ",", "Lato Semibold Italic", ",", "Lato Bold", ",", "Lato Bold Italic", ",", "Lato Heavy", ",", "Lato Heavy Italic", ",", "Lato Black", ",", "Lato Black Italic", ",", "Lucida Grande", ",", "Lucida Grande Bold", ",", "Luminari", ",", "Malayalam MN", ",", "Malayalam MN Bold", ",", "Malayalam Sangam MN", ",", "Malayalam Sangam MN Bold", ",", "Marker Felt Thin", ",", "Marker Felt Wide", ",", "Menlo", ",", "Menlo Italic", ",", "Menlo Bold", ",", "Menlo Bold Italic", ",", "Microsoft Sans Serif", ",", "Mishafi", ",", "Mishafi Gold", ",", "Monaco", ",", "Mshtakan", ",", "Mshtakan Oblique", ",", "Mshtakan Bold", ",", "Mshtakan BoldOblique", ",", "Mukta Mahee", ",", "Mukta Mahee ExtraLight", ",", "Mukta Mahee Light", ",", "Mukta Mahee Medium", ",", "Mukta Mahee SemiBold", ",", "Mukta Mahee Bold", ",", "Mukta Mahee ExtraBold", ",", "Muna", ",", "Muna Bold", ",", "Muna Black", ",", "Myanmar MN", ",", "Myanmar MN Bold", ",", "Myanmar Sangam MN", ",", "Myanmar Sangam MN Bold", ",", "Nadeem", ",", "New Peninim MT", ",", "New Peninim MT Inclined", ",", "New Peninim MT Bold", ",", "New Peninim MT Bold Inclined", ",", "Noteworthy Light", ",", "Noteworthy Bold", ",", "Noto Nastaliq Urdu", ",", "Noto Nastaliq Urdu Bold", ",", "Noto Sans Batak", ",", "Noto Sans Kannada", ",", "Noto Sans Kannada ExtraLight", ",", "Noto Sans Kannada Thin", ",", "Noto Sans Kannada Light", ",", "Noto Sans Kannada Medium", ",", "Noto Sans Kannada SemiBold", ",", "Noto Sans Kannada Bold", ",", "Noto Sans Kannada ExtraBold", ",", "Noto Sans Kannada Black", ",", "Noto Sans Myanmar", ",", "Noto Sans Myanmar ExtraLight", ",", "Noto Sans Myanmar Thin", ",", "Noto Sans Myanmar Light", ",", "Noto Sans Myanmar Medium", ",", "Noto Sans Myanmar SemiBold", ",", "Noto Sans Myanmar Bold", ",", "Noto Sans Myanmar ExtraBold", ",", "Noto Sans Myanmar Black", ",", "Noto Sans NKo", ",", "Noto Sans Oriya", ",", "Noto Sans Oriya Bold", ",", "Noto Sans Tagalog", ",", "Noto Serif Myanmar", ",", "Noto Serif Myanmar ExtraLight", ",", "Noto Serif Myanmar Thin", ",", "Noto Serif Myanmar Light", ",", "Noto Serif Myanmar Medium", ",", "Noto Serif Myanmar SemiBold", ",", "Noto Serif Myanmar Bold", ",", "Noto Serif Myanmar ExtraBold", ",", "Noto Serif Myanmar Black", ",", "Optima", ",", "Optima Italic", ",", "Optima Bold", ",", "Optima Bold Italic", ",", "Optima ExtraBlack", ",", "Oriya MN", ",", "Oriya MN Bold", ",", "Oriya Sangam MN", ",", "Oriya Sangam MN Bold", ",", "Palatino", ",", "Palatino Italic", ",", "Palatino Bold", ",", "Palatino Bold Italic", ",", "Papyrus", ",", "Papyrus Condensed", ",", "Party LET Plain", ",", "Phosphate Inline", ",", "Phosphate Solid", ",", "PingFang HK", ",", "PingFang HK Ultralight", ",", "PingFang HK Thin", ",", "PingFang HK Light", ",", "PingFang HK Medium", ",", "PingFang HK Semibold", ",", "PingFang SC", ",", "PingFang SC Ultralight", ",", "PingFang SC Thin", ",", "PingFang SC Light", ",", "PingFang SC Medium", ",", "PingFang SC Semibold", ",", "PingFang TC", ",", "PingFang TC Ultralight", ",", "PingFang TC Thin", ",", "PingFang TC Light", ",", "PingFang TC Medium", ",", "PingFang TC Semibold", ",", "Plantagenet Cherokee", ",", "PT Mono", ",", "PT Mono Bold", ",", "PT Sans", ",", "PT Sans Italic", ",", "PT Sans Bold", ",", "PT Sans Bold Italic", ",", "PT Sans Caption", ",", "PT Sans Caption Bold", ",", "PT Sans Narrow", ",", "PT Sans Narrow Bold", ",", "PT Serif", ",", "PT Serif Italic", ",", "PT Serif Bold", ",", "PT Serif Bold Italic", ",", "PT Serif Caption", ",", "PT Serif Caption Italic", ",", "Raanana", ",", "Raanana Bold", ",", "Rockwell", ",", "Rockwell Italic", ",", "Rockwell Bold", ",", "Rockwell Bold Italic", ",", "Sana", ",", "Sathu", ",", "Savoye LET Plain", ",", "Shree Devanagari 714", ",", "Shree Devanagari 714 Italic", ",", "Shree Devanagari 714 Bold", ",", "Shree Devanagari 714 Bold Italic", ",", "SignPainter HouseScript", ",", "SignPainter HouseScript Semibold", ",", "Silom", ",", "Sinhala MN", ",", "Sinhala MN Bold", ",", "Sinhala Sangam MN", ",", "Sinhala Sangam MN Bold", ",", "Skia", ",", "Skia Light", ",", "Skia Bold", ",", "Skia Black", ",", "Skia Extended", ",", "Skia Light Extended", ",", "Skia Black Extended", ",", "Skia Condensed", ",", "Skia Light Condensed", ",", "Skia Black Condensed", ",", "Snell Roundhand", ",", "Snell Roundhand Bold", ",", "Snell Roundhand Black", ",", "Songti SC", ",", "Songti SC Light", ",", "Songti SC Bold", ",", "Songti SC Black", ",", "Songti TC", ",", "Songti TC Light", ",", "Songti TC Bold", ",", "Source Code Pro", ",", "Source Code Pro ExtraLight", ",", "Source Code Pro Light", ",", "Source Code Pro Medium", ",", "Source Code Pro SemiBold", ",", "Source Code Pro Bold", ",", "Source Code Pro ExtraBold", ",", "Source Code Pro Black", ",", "STIX Two Math", ",", "STIX Two Text", ",", "STIX Two Text Italic", ",", "STIX Two Text Medium", ",", "STIX Two Text Medium Italic", ",", "STIX Two Text SemiBold", ",", "STIX Two Text SemiBold Italic", ",", "STIX Two Text Bold", ",", "STIX Two Text Bold Italic", ",", "STSong", ",", "Sukhumvit Set Text", ",", "Sukhumvit Set Light", ",", "Sukhumvit Set Medium", ",", "Sukhumvit Set Semi Bold", ",", "Sukhumvit Set Bold", ",", "Sukhumvit Set Thin", ",", "Symbol", ",", "Tahoma", ",", "Tahoma Bold", ",", "Tamil MN", ",", "Tamil MN Bold", ",", "Tamil Sangam MN", ",", "Tamil Sangam MN Bold", ",", "Telugu MN", ",", "Telugu MN Bold", ",", "Telugu Sangam MN", ",", "Telugu Sangam MN Bold", ",", "Thonburi", ",", "Thonburi Light", ",", "Thonburi Bold", ",", "Times New Roman", ",", "Times New Roman Italic", ",", "Times New Roman Bold", ",", "Times New Roman Bold Italic", ",", "Trattatello", ",", "Trebuchet MS", ",", "Trebuchet MS Italic", ",", "Trebuchet MS Bold", ",", "Trebuchet MS Bold Italic", ",", "Verdana", ",", "Verdana Italic", ",", "Verdana Bold", ",", "Verdana Bold Italic", ",", "Waseem", ",", "Waseem Light", ",", "Webdings", ",", "Wingdings", ",", "Wingdings 2", ",", "Wingdings 3", ",", "Zapf Dingbats", ",", "Zapfino" ], + "maxclass" : "umenu", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "int", "", "" ], + "parameter_enable" : 0, + "patching_rect" : [ 238.0, 271.0, 100.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 238.0, 241.0, 43.0, 22.0 ], + "text" : "fontlist" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 174.0, 165.0, 20.0 ], + "text" : "change the cursor characters" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 30.0, 181.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 135.0, 196.0, 50.0, 22.0 ], + "text" : "", + "fontsize" : 10.0, + "id" : "obj-13", + "linecount" : 13, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 424.0, 67.0, 363.0, 158.0 ], + "text" : "Option+Enter / Ctrl+Enter - run contents of REPL\nOption+Ctrl+Enter / Shift+Ctrl+Enter - Run line under cursor\n\nOption+G/Ctrl+G - enable/disable ephemeral mode (buffer contents or line contents are deleted when run)\n\nOption+/ / Ctrl+/ - comment line\n\nOption+z / Ctrl+z - clear REPL contents\n\nBackspace - delete characted behind cursor\nDelete - delete character in front of cursor" + } + + } +, { + "box" : { + "fontname" : "", + "fontsize" : 10.0, + "id" : "obj-11", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 420.5, 259.0, 376.0, 88.0 ], + "text" : "Option+x / Ctrl+x - cut line to internal clipboard\nOption+c / Ctrl+c - copy line to internal clipboard\nOption+k / Ctrl+k - copy all to internal clipboard\nOption+v / Ctrl+v - paste contents of internal clipboard to \n REPL\nOption+p / Ctrl+p - replace current line with contents of \n internal clipboard" + } + + } +, { + "box" : { + "fontname" : "", + "fontsize" : 10.0, + "id" : "obj-9", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 420.5, 370.0, 370.0, 123.0 ], + "text" : "Up Arrow - Go up one line\nDown Arrow - Go down one line\nLeft Arrow - Go left one character\nRight Arrow - Go right one character\nOption+Up / Ctrl+Up - Jump to top\nOption+Down / Ctrl+Down - Jump to bottom\nOption+Left / Ctrl+Left - Jump to start of line\nOption+Right / Ctrl+Right - Jump to end of line\nOption+Ctrl+Left / Shift+Ctrl+Left - Jump word left\nOption+Ctrl+Right/ Shift+Ctrl+Right - Jump word right" + } + + } +, { + "box" : { + "fontsize" : 12.0, + "id" : "obj-7", + "linecount" : 8, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 43.0, 392.0, 371.0, 114.0 ], + "text" : "Any command in the repl [routepass] is callable from inside the repl itself, so even if there is not a key combination assigned you could use the full route and execute the buffer or the line. \nEg:\n\ncursor *!\njumpLine 0\nblink_time 70" + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-6", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 43.0, 370.0, 367.0, 20.0 ], + "text" : "REPL Commands:" + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 5, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 98.0, 369.0, 74.0 ], + "text" : "All functionality is totally customisable by the user, so the descriptions here relate to the default replkeys.json file which comes with the repl.\nIf you are making your own configuration it's probably useful to look closely at the default file to see how function calls are handled" + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-3", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 422.0, 45.0, 367.0, 20.0 ], + "text" : "Default Short Keys: (mac/windows)" + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-2", + "linecount" : 31, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 420.5, 67.0, 397.0, 435.0 ], + "text" : "\n\n\n\n\n\n\n\n\n\n\n\nClipboard:\n\n\n\n\n\n\n\n\nNavigation:\n\n\n\n\n\n\n\n\n\n" + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-1", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 43.0, 192.0, 367.0, 20.0 ], + "text" : "Config File Functionalities:" + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "text" : "tw.gl.repl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontsize" : 12.0, + "id" : "obj-41", + "linecount" : 11, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 43.0, 214.0, 371.0, 154.0 ], + "text" : "- You can bind all characters and some special characters (all characters most be part of ASCII table)\n\n- Binding a function to keycode 127 it will apply to all non modified keypresses (so you do not need to bind a function individually to every alphanumeric key)\n\n- You cannot bind ALT + char. But you can bind ALTGR + char\n\n- Option+D/Ctrl+D will enable and disable the editor. This cannot be overriden in the configuration file!" + } + + } + ], + "lines" : [ ], + "styles" : [ { + "name" : "AudioStatus_Menu", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "autogradient" : 0, + "color" : [ 0.294118, 0.313726, 0.337255, 1 ], + "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "color" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "Audiomix", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "gradient" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } + ] + } +, + "patching_rect" : [ 601.0, 397.0, 83.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p keyBindings" + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 917.0, 768.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 2, + "assistshowspatchername" : 0, + "boxes" : [ ], + "lines" : [ ], + "styles" : [ { + "name" : "AudioStatus_Menu", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "autogradient" : 0, + "color" : [ 0.294118, 0.313726, 0.337255, 1 ], + "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "color" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "Audiomix", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "gradient" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } + ] + } +, + "patching_rect" : [ 688.5, 397.0, 27.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p ?" + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-21", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 98.0, 367.0, 20.0 ], + "presentation" : 1, + "presentation_rect" : [ 45.0, 98.0, 367.0, 20.0 ], + "text" : "written by Tom Whiston © 2023, www.tomwhiston.com" + } + + } +, { + "box" : { + "id" : "obj-88", + "linecount" : 18, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 124.0, 497.0, 248.0 ], + "presentation" : 1, + "presentation_linecount" : 18, + "presentation_rect" : [ 45.0, 124.0, 497.0, 248.0 ], + "text" : "A fully featured and configurable repl environment made in javascript and opengl for max. A command line text editor (similar to the workflow of the terminal) for the opengl world of Max. Add the object to your setup and initialize it with the name of the render context. Then make sure you send it the render bang in the top inlet. \n\nAttach functions to keypresses, mutate repl contents before output, reading files plays back all functions attached to keys. Configurable through json configuration file and code, easily extensible.\n\nSimple use cases for the repl can be handled entirely in configuration, add a shortkeys.json to your project or load any dict with the `keybindings dictname` message. \nMore complex use cases can be easily managed by including a `user-repl.js` file\ninside your project in which you can further customize behaviour by attaching\nyour own custom functions to keypresses or your own custom formatters for output\nmessage handling. This will be automatically read by the repl on start.\n\nSee README.md in the package folder for extensive information about how the repl works, or try the examples here.", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "presentation" : 1, + "presentation_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "text" : "tw.gl.repl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 0.0, 26.0, 917.0, 768.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "showontab" : 1, + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-20", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 430.0, 705.0, 150.0, 33.0 ], + "text" : "This is the configuration loaded into the repl" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 582.0, 473.0, 58.0, 22.0 ], + "text" : "loadbang" + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "dict.view", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 582.0, 536.0, 265.0, 207.0 ] + } + + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 582.0, 503.0, 140.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict default replkeys.json" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 439.0, 363.5, 148.0, 22.0 ], + "text" : "hide_text 0" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 235.0, 370.0, 35.0, 22.0 ], + "text" : "clear" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-42", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 532.0, 424.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "7", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 439.0, 411.5, 117.0, 22.0 ], + "text" : "s replFromClipboard" + } + + } +, { + "box" : { + "id" : "obj-40", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 428.0, 330.0, 70.0, 22.0 ], + "text" : "r customize" + } + + } +, { + "box" : { + "id" : "obj-37", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 363.0, 558.0, 151.0, 33.0 ], + "text" : "print the output to the max console" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-33", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 348.0, 552.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "6", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 285.0, 557.0, 70.0, 22.0 ], + "text" : "print CODE" + } + + } +, { + "box" : { + "attr" : "visible", + "id" : "obj-26", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 45.0, 255.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-16", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 30.0, 364.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "5", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-15", + "linecount" : 10, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 374.0, 176.0, 141.0 ], + "text" : "try the following code commands and execute them\n\nw erase_color 0 0 0 0.7\ngs mesh auto_colors 1\ngs shape opencube\ngs anim turn 0.5 0.5 0.5\ngs mesh poly_mode 1 1\ngs mesh scale 0.5 0.5 10\ngs mesh draw_mode line_strip" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 104.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "comment" : "", + "id" : "obj-7", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 108.0, 225.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 108.0, 150.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 108.0, 180.0, 77.0, 22.0 ], + "text" : "fullscreen $1" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 108.0, 119.0, 41.0, 22.0 ], + "text" : "sel 27" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 108.0, 82.0, 50.5, 22.0 ], + "text" : "key" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "source" : [ "obj-2", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-6", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 75.0, 285.0, 70.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p fullscreen" + } + + } +, { + "box" : { + "id" : "obj-38", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 648.0, 203.0, 178.0, 33.0 ], + "text" : "use receives and route objects to define your own \"functions\"" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-36", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 633.0, 193.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "4", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-35", + "linecount" : 7, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 235.0, 411.5, 174.0, 100.0 ], + "text" : "type some text and \npresss OPTION + ENTER (osx) CTRL + ENTER (windows) to execute the \"code\". Note that we don't need to go from a symbol or [iter] here" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-31", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 290.0, 495.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "3", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-30", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 345.0, 273.0, 135.0, 33.0 ], + "text" : "focus on window / press esc for fullscreen" + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-28", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 466.5, 265.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "2", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "bgcolor" : [ 1.0, 0.788235, 0.470588, 1.0 ], + "fontname" : "Arial Bold", + "hint" : "", + "id" : "obj-27", + "ignoreclick" : 1, + "legacytextcolor" : 1, + "maxclass" : "textbutton", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 167.0, 225.0, 20.0, 20.0 ], + "rounded" : 60.0, + "text" : "1", + "textcolor" : [ 0.34902, 0.34902, 0.34902, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 196.0, 225.0, 90.0, 20.0 ], + "text" : "turn world on" + } + + } +, { + "box" : { + "fontface" : 1, + "fontsize" : 12.0, + "id" : "obj-21", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 98.0, 367.0, 20.0 ], + "text" : "written by Tom Whiston © 2023, www.tomwhiston.com" + } + + } +, { + "box" : { + "id" : "obj-88", + "linecount" : 5, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 120.0, 447.0, 74.0 ], + "text" : "A repl for max in gl, with lots of customizable functionality which you can use to do some exciting things.\nThis is a simple example which you can use to understand some basic functionality. For further examples please see the GLRepl Overview in the Extras menu", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "fontface" : 0, + "fontname" : "Arial", + "fontsize" : 40.0, + "id" : "obj-22", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 45.0, 45.0, 367.0, 51.0 ], + "text" : "tw.gl.repl", + "textcolor" : [ 0.32548999786377, 0.345097988843918, 0.372548997402191, 1.0 ] + } + + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 628.0, 333.5, 69.0, 22.0 ], + "text" : "route mesh" + } + + } +, { + "box" : { + "id" : "obj-13", + "maxclass" : "newobj", + "numinlets" : 9, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 582.0, 416.0, 211.0, 22.0 ], + "text" : "jit.gl.mesh help-ctx @scale 0.4 0.4 0.4" + } + + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 582.0, 273.5, 65.0, 22.0 ], + "text" : "route anim" + } + + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 582.0, 303.5, 76.0, 22.0 ], + "text" : "jit.anim.drive" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 582.0, 213.5, 64.0, 22.0 ], + "text" : "r codeText" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 582.0, 243.5, 52.0, 22.0 ], + "text" : "route gs" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 222.0, 255.0, 64.0, 22.0 ], + "text" : "r codeText" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 222.0, 285.0, 48.0, 22.0 ], + "text" : "route w" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 222.0, 517.0, 66.0, 22.0 ], + "text" : "s codeText" + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 2, + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "jit_matrix", "" ], + "patching_rect" : [ 678.0, 363.5, 165.0, 35.0 ], + "text" : "jit.gl.gridshape help-ctx @matrixoutput 1 @dim 50 50" + } + + } +, { + "box" : { + "color" : [ 0.952941, 0.564706, 0.098039, 1.0 ], + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 285.0, 374.0, 148.0, 22.0 ], + "text" : "tw.gl.repl help-ctx 480 270" + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "jit_matrix", "bang", "" ], + "patching_rect" : [ 45.0, 330.0, 373.0, 22.0 ], + "text" : "jit.world help-ctx @fsaa 1 @fsmenubar 0 @size 480 270 @floating 1" + } + + } +, { + "box" : { + "attr" : "enable", + "id" : "obj-3", + "lock" : 1, + "maxclass" : "attrui", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "parameter_enable" : 0, + "patching_rect" : [ 45.0, 225.0, 150.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-44", + "linecount" : 8, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 439.0, 435.0, 134.0, 114.0 ], + "text" : "If you use the copy bindings: Option+x/Ctrl+x Option+c/Ctrl+c \nit will also output the copied text from output 2. See the clipboard tab for more about this" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-1", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-12", 0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-11", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-12", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-14", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-14", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-4", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 0 ], + "order" : 1, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "order" : 1, + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 1 ], + "order" : 0, + "source" : [ "obj-40", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-45", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 45.0, 397.0, 47.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p basic" + } + + } + ], + "lines" : [ ], + "dependency_cache" : [ { + "name" : "tw.gl.repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/javascript/dist", + "patcherrelativepath" : "../javascript/dist", + "type" : "TEXT", + "implicit" : 1 + } +, { + "name" : "tw.gl.repl.maxpat", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/patchers", + "patcherrelativepath" : "../patchers", + "type" : "JSON", + "implicit" : 1 + } +, { + "name" : "user-repl.js", + "bootpath" : "~/Documents/Max 8/Packages/GLRepl/examples/custom-formatter", + "patcherrelativepath" : "../examples/custom-formatter", + "type" : "TEXT", + "implicit" : 1 + } + ], + "autosave" : 0, + "styles" : [ { + "name" : "AudioStatus_Menu", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "autogradient" : 0, + "color" : [ 0.294118, 0.313726, 0.337255, 1 ], + "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "color" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "Audiomix", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "gradient" + } + + } +, + "parentstyle" : "", + "multi" : 0 + } + ] + } + +} diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..0798e7a Binary files /dev/null and b/icon.png differ diff --git a/javascript/.release-it.json b/javascript/.release-it.json new file mode 100644 index 0000000..6de0581 --- /dev/null +++ b/javascript/.release-it.json @@ -0,0 +1,47 @@ +{ + "git": { + "push": true, + "requireCleanWorkingDir": true, + "commitMessage": "chore: release v${version}", + "requireBranch": [ + "main", + "dev", + "package-info" + ] + }, + "hooks": { + "before:git:release": [ + "./build-release.sh", + "git add ./../CHANGELOG.md", + "git add ./../package-info.json" + ], + "after:release": "echo Successfully released ${name} v${version} to ${repo.repository}." + }, + "github": { + "release": true, + "assets": [ + "./../.dist/*.zip" + ] + }, + "npm": { + "publish": false + }, + "plugins": { + "@release-it/conventional-changelog": { + "preset": { + "name": "conventionalcommits" + }, + "header": "# tw.gl.repl changelog", + "infile": "./../CHANGELOG.md" + }, + "@j-ulrich/release-it-regex-bumper": { + "out": [ + { + "file": "./../package-info.json", + "search": "\"version\":\\s*\"([0-9.]+)(.*)\"", + "replace": "\"version\": \"{{version}}\"" + } + ] + } + } +} \ No newline at end of file diff --git a/javascript/build-release.sh b/javascript/build-release.sh new file mode 100755 index 0000000..7af1bc4 --- /dev/null +++ b/javascript/build-release.sh @@ -0,0 +1,16 @@ +# /bin/bash +set -euo pipefail + +PKGROOT="./../.dist/" +PKGNAME="GLRepl" +PKGPATH=$PKGROOT$PKGNAME + +npm run compile +rm -rf $PKGROOT +mkdir -p $PKGPATH +rsync -av ./../ $PKGPATH --exclude $PKGROOT +rm -rf $PKGPATH/.git $PKGPATH/.dist $PKGPATH/.github $PKGPATH/.vscode $PKGPATH/javascript $PKGPATH/.gitignore +rm -rf $PKGPATH/lefthook.yml $PKGPATH/code-coverage-results.md $PKGPATH/commitlint.config.js $PKGPATH/examples/livecode-max/src $PKGPATH/examples/livecode-max/node_modules $PKGPATH/examples/livecode-max/package* $PKGPATH/examples/livecode-max/tsconfig.json +mkdir $PKGPATH/javascript +rsync -av ./dist/* $PKGPATH/javascript +cd $PKGROOT; zip -r $PKGNAME.zip ./$PKGNAME \ No newline at end of file diff --git a/javascript/package-lock.json b/javascript/package-lock.json new file mode 100644 index 0000000..66745fb --- /dev/null +++ b/javascript/package-lock.json @@ -0,0 +1,10312 @@ +{ + "name": "glrepl", + "version": "1.0.0-beta.9", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "glrepl", + "version": "1.0.0-beta.9", + "license": "GPL", + "devDependencies": { + "@commitlint/cli": "^17.6.3", + "@commitlint/config-conventional": "^17.6.3", + "@j-ulrich/release-it-regex-bumper": "^5.0.0", + "@release-it/conventional-changelog": "^7.0.1", + "@types/glob": "^8.1.0", + "@types/maxmsp": "^1.0.0", + "@types/node": "^18.16.3", + "@vercel/ncc": "^0.36.1", + "ava": "^5.2.0", + "handlebars": "^4.7.7", + "nyc": "^15.1.0", + "reflect-metadata": "^0.1.13", + "release-it": "^16.1.5", + "sinon": "^15.0.4", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.2" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.0.tgz", + "integrity": "sha512-gMuZsmsgxk/ENC3O/fRw5QY8A9/uxQbbCEypnLIiYYc/qVJtEV7ouxC3EllIIwNzMqAQee5tanFabWsUOutS7g==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.3.tgz", + "integrity": "sha512-qIJONzoa/qiHghnm0l1n4i/6IIziDpzqc36FBs4pzMhDUraHqponwJLiAKm1hGLP3OSB/TVNz6rMwVGpwxxySw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-compilation-targets": "^7.20.7", + "@babel/helper-module-transforms": "^7.21.2", + "@babel/helpers": "^7.21.0", + "@babel/parser": "^7.21.3", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.3", + "@babel/types": "^7.21.3", + "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/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.3.tgz", + "integrity": "sha512-QS3iR1GYC/YGUnW7IdggFeN5c1poPUurnGttOV/bZgPGV+izC/D8HnD6DLwod0fsatNyVn1G3EVWMYIF0nHbeA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", + "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz", + "integrity": "sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.20.5", + "@babel/helper-validator-option": "^7.18.6", + "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-compilation-targets/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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-compilation-targets/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/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz", + "integrity": "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.20.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", + "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.0", + "@babel/types": "^7.21.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.3.tgz", + "integrity": "sha512-lobG0d7aOfQRXh8AyklEAgZGvA4FShxo6xQbUrrT/cNBPUdIDojlokwJsQyCC/eKia7ifqM0yP+2DRZ4WKw2RQ==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.15.tgz", + "integrity": "sha512-SAj8oKi8UogVi6eXQXKNPu8qZ78Yzy7zawrlTr0M+IuW/g8Qe9gVDhGcF9h1S69OyACpYoLxEzpjs1M15sI5wQ==", + "dev": true, + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.3.tgz", + "integrity": "sha512-XLyopNeaTancVitYZe2MlUEvgKb6YVVPXzofHgqHijCImG33b/uTurMS488ht/Hbsb2XK3U2BnSTxKVNGV3nGQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.18.6", + "@babel/generator": "^7.21.3", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.3", + "@babel/types": "^7.21.3", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.21.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.3.tgz", + "integrity": "sha512-sBGdETxC+/M4o/zKC0sl6sjWv62WFR/uzxrJ6uYyMLZOUlPnwzw0tKgVHOXxaAd5l2g8pEDM5RZ495GPQI77kg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@commitlint/cli": { + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-17.6.3.tgz", + "integrity": "sha512-ItSz2fd4F+CujgIbQOfNNerDF1eFlsBGEfp9QcCb1kxTYMuKTYZzA6Nu1YRRrIaaWwe2E7awUGpIMrPoZkOG3A==", + "dev": true, + "dependencies": { + "@commitlint/format": "^17.4.4", + "@commitlint/lint": "^17.6.3", + "@commitlint/load": "^17.5.0", + "@commitlint/read": "^17.5.1", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0", + "lodash.isfunction": "^3.0.9", + "resolve-from": "5.0.0", + "resolve-global": "1.0.0", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/cli/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@commitlint/cli/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@commitlint/cli/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/cli/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-17.6.3.tgz", + "integrity": "sha512-bLyHEjjRWqlLQWIgYFHmUPbEFMOOLXeF3QbUinDIJev/u9e769tkoTH9YPknEywiuIrAgZaVo+OfzAIsJP0fsw==", + "dev": true, + "dependencies": { + "conventional-changelog-conventionalcommits": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/config-conventional/node_modules/conventional-changelog-conventionalcommits": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-5.0.0.tgz", + "integrity": "sha512-lCDbA+ZqVFQGUj7h9QBKoIpLhl8iihkO0nCTyRNzuXtcd7ubODpYB04IFy31JloiJgG0Uovu8ot8oxRzn7Nwtw==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "lodash": "^4.17.15", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.4.4.tgz", + "integrity": "sha512-bi0+TstqMiqoBAQDvdEP4AFh0GaKyLFlPPEObgI29utoKEYoPQTvF0EYqIwYYLEoJYhj5GfMIhPHJkTJhagfeg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/ensure": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-17.4.4.tgz", + "integrity": "sha512-AHsFCNh8hbhJiuZ2qHv/m59W/GRE9UeOXbkOqxYMNNg9pJ7qELnFcwj5oYpa6vzTSHtPGKf3C2yUFNy1GGHq6g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-17.4.4.tgz", + "integrity": "sha512-+IS7vpC4Gd/x+uyQPTAt3hXs5NxnkqAZ3aqrHd5Bx/R9skyCAWusNlNbw3InDbAK6j166D9asQM8fnmYIa+CXQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/format/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "17.7.0", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-17.7.0.tgz", + "integrity": "sha512-043rA7m45tyEfW7Zv2vZHF++176MLHH9h70fnPoYlB1slKBeKl8BwNIlnPg4xBdRBVNPaCqvXxWswx2GR4c9Hw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "semver": "7.5.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/lint": { + "version": "17.6.3", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-17.6.3.tgz", + "integrity": "sha512-fBlXwt6SHJFgm3Tz+luuo3DkydAx9HNC5y4eBqcKuDuMVqHd2ugMNr+bQtx6riv9mXFiPoKp7nE4Xn/ls3iVDA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^17.6.3", + "@commitlint/parse": "^17.4.4", + "@commitlint/rules": "^17.6.1", + "@commitlint/types": "^17.4.4" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load": { + "version": "17.5.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.5.0.tgz", + "integrity": "sha512-l+4W8Sx4CD5rYFsrhHH8HP01/8jEP7kKf33Xlx2Uk2out/UKoKPYMOIRcDH5ppT8UXLMV+x6Wm5osdRKKgaD1Q==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.4.4", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.4.4", + "@commitlint/types": "^17.4.4", + "@types/node": "*", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/message": { + "version": "17.4.2", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-17.4.2.tgz", + "integrity": "sha512-3XMNbzB+3bhKA1hSAWPCQA3lNxR4zaeQAQcHj0Hx5sVdO6ryXtgUBGGv+1ZCLMgAPRixuc6en+iNAzZ4NzAa8Q==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/parse": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-17.4.4.tgz", + "integrity": "sha512-EKzz4f49d3/OU0Fplog7nwz/lAfXMaDxtriidyGF9PtR+SRbgv4FhsfF310tKxs6EPj8Y+aWWuX3beN5s+yqGg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^17.4.4", + "conventional-changelog-angular": "^5.0.11", + "conventional-commits-parser": "^3.2.2" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read": { + "version": "17.5.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-17.5.1.tgz", + "integrity": "sha512-7IhfvEvB//p9aYW09YVclHbdf1u7g7QhxeYW9ZHSO8Huzp8Rz7m05aCO1mFG7G8M+7yfFnXB5xOmG18brqQIBg==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^17.4.0", + "@commitlint/types": "^17.4.4", + "fs-extra": "^11.0.0", + "git-raw-commits": "^2.0.11", + "minimist": "^1.2.6" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/read/node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@commitlint/read/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@commitlint/read/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.4.4.tgz", + "integrity": "sha512-znXr1S0Rr8adInptHw0JeLgumS11lWbk5xAWFVno+HUFVN45875kUtqjrI6AppmD3JI+4s0uZlqqlkepjJd99A==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^17.4.4", + "@commitlint/types": "^17.4.4", + "import-fresh": "^3.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0", + "resolve-global": "^1.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules": { + "version": "17.6.1", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-17.6.1.tgz", + "integrity": "sha512-lUdHw6lYQ1RywExXDdLOKxhpp6857/4c95Dc/1BikrHgdysVUXz26yV0vp1GL7Gv+avx9WqZWTIVB7pNouxlfw==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^17.4.4", + "@commitlint/message": "^17.4.2", + "@commitlint/to-lines": "^17.4.0", + "@commitlint/types": "^17.4.4", + "execa": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/rules/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/rules/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/@commitlint/rules/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@commitlint/rules/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/rules/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-17.4.0.tgz", + "integrity": "sha512-LcIy/6ZZolsfwDUWfN1mJ+co09soSuNASfKEU5sCmgFCvX5iHwRYLiIuoqXzOVDYOy7E7IcHilr/KS0e5T+0Hg==", + "dev": true, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-17.4.0.tgz", + "integrity": "sha512-/1loE/g+dTTQgHnjoCy0AexKAEFyHsR2zRB4NWrZ6lZSMIxAhBJnmCqwao7b4H8888PsfoTBCLBYIw8vGnej8g==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0" + }, + "engines": { + "node": ">=v14" + } + }, + "node_modules/@commitlint/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@hutson/parse-repository-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hutson/parse-repository-url/-/parse-repository-url-5.0.0.tgz", + "integrity": "sha512-e5+YUKENATs1JgYHMzTr2MW/NDcXGfYFAuOQU8gJgF/kEh4EqKgfGrfLI67bMD4tbhZVlkigz/9YYwWcbOFthg==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@iarna/toml": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz", + "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@j-ulrich/release-it-regex-bumper": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@j-ulrich/release-it-regex-bumper/-/release-it-regex-bumper-5.0.0.tgz", + "integrity": "sha512-XHwTofWBvM7AFbib0sICK6BTRybHsZUW/I2X6IkQReRsFJVGfUo2cp34d9jCjyJfK1xfxE3t0LPTNlWDHt0I8g==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "date-fns": "^2.8.0", + "fast-glob": "^3.2.0", + "lodash": "^4.17.20", + "semver": "^7.3.0", + "xregexp": "^5.0.0" + }, + "engines": { + "node": ">=14.9" + }, + "optionalDependencies": { + "diff": "3 - 5" + }, + "peerDependencies": { + "release-it": "16" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@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, + "engines": { + "node": ">=6.0.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "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/@jridgewell/trace-mapping": { + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.9.tgz", + "integrity": "sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@octokit/auth-token": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-3.0.4.tgz", + "integrity": "sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/core": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/@octokit/core/-/core-4.2.4.tgz", + "integrity": "sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==", + "dev": true, + "dependencies": { + "@octokit/auth-token": "^3.0.0", + "@octokit/graphql": "^5.0.0", + "@octokit/request": "^6.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "before-after-hook": "^2.2.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/endpoint": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-7.0.6.tgz", + "integrity": "sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/graphql": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-5.0.6.tgz", + "integrity": "sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==", + "dev": true, + "dependencies": { + "@octokit/request": "^6.0.0", + "@octokit/types": "^9.0.0", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/openapi-types": { + "version": "18.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-18.0.0.tgz", + "integrity": "sha512-V8GImKs3TeQRxRtXFpG2wl19V7444NIOTDF24AWuIbmNaNYOQMWRbjcGDXV5B+0n887fgDcuMNOmlul+k+oJtw==", + "dev": true + }, + "node_modules/@octokit/plugin-paginate-rest": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz", + "integrity": "sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==", + "dev": true, + "dependencies": { + "@octokit/tsconfig": "^1.0.2", + "@octokit/types": "^9.2.3" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=4" + } + }, + "node_modules/@octokit/plugin-request-log": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz", + "integrity": "sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==", + "dev": true, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz", + "integrity": "sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==", + "dev": true, + "dependencies": { + "@octokit/types": "^10.0.0" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "@octokit/core": ">=3" + } + }, + "node_modules/@octokit/plugin-rest-endpoint-methods/node_modules/@octokit/types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-10.0.0.tgz", + "integrity": "sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@octokit/request": { + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-6.2.8.tgz", + "integrity": "sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==", + "dev": true, + "dependencies": { + "@octokit/endpoint": "^7.0.0", + "@octokit/request-error": "^3.0.0", + "@octokit/types": "^9.0.0", + "is-plain-object": "^5.0.0", + "node-fetch": "^2.6.7", + "universal-user-agent": "^6.0.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request-error": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-3.0.3.tgz", + "integrity": "sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==", + "dev": true, + "dependencies": { + "@octokit/types": "^9.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/request/node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/@octokit/rest": { + "version": "19.0.13", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-19.0.13.tgz", + "integrity": "sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==", + "dev": true, + "dependencies": { + "@octokit/core": "^4.2.1", + "@octokit/plugin-paginate-rest": "^6.1.2", + "@octokit/plugin-request-log": "^1.0.4", + "@octokit/plugin-rest-endpoint-methods": "^7.1.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@octokit/tsconfig": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@octokit/tsconfig/-/tsconfig-1.0.2.tgz", + "integrity": "sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==", + "dev": true + }, + "node_modules/@octokit/types": { + "version": "9.3.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-9.3.2.tgz", + "integrity": "sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==", + "dev": true, + "dependencies": { + "@octokit/openapi-types": "^18.0.0" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz", + "integrity": "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==", + "dev": true, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@pnpm/network.ca-file/-/network.ca-file-1.0.2.tgz", + "integrity": "sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==", + "dev": true, + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz", + "integrity": "sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==", + "dev": true, + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@release-it/conventional-changelog": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@release-it/conventional-changelog/-/conventional-changelog-7.0.1.tgz", + "integrity": "sha512-qvMSzyaTWVCgbAFJ4OYb2HC2S+h47hqua6A/aYe5surdp9dXu47POz22tJUMyKr4z66g+nh2TElFqaWrLmOC3Q==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog": "^5.0.0", + "conventional-recommended-bump": "^8.0.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "release-it": "^16.0.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-5.6.0.tgz", + "integrity": "sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", + "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.0.2.tgz", + "integrity": "sha512-SwUDyjWnah1AaNl7kxsa7cfLhlTYoiyhDAIgyh+El30YvXs/o7OLXpYH88Zdhyx9JExKrmHDJ+10bwIcY80Jmw==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0" + } + }, + "node_modules/@sinonjs/fake-timers/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.0.tgz", + "integrity": "sha512-Bp8KUVlLp8ibJZrnvq2foVhP0IVX2CIprMJPK0vqGqgrDa0OHVKeZyBykqskkrdxV6yKBPmGasO8LVjAKR3Gew==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "lodash.get": "^4.4.2", + "type-detect": "^4.0.8" + } + }, + "node_modules/@sinonjs/samsam/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", + "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "dev": true + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", + "integrity": "sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==", + "dev": true, + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", + "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "dev": true + }, + "node_modules/@types/maxmsp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@types/maxmsp/-/maxmsp-1.0.11.tgz", + "integrity": "sha512-LtOgDufOJ+GYUoHz5PCtXYoR0DwieV5J6PEopClUSksuOvcsTjCuB+d7gapQjOwPGiFvlSpa7alMuy49u+fqSQ==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.16.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.3.tgz", + "integrity": "sha512-OPs5WnnT1xkCBiuQrZA4+YAV4HEJejmHneyraIaxsbev5yCEr6KMwINNFP9wQeFIw8FWcoTqF3vQsa5CDaI+8Q==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/@vercel/ncc": { + "version": "0.36.1", + "resolved": "https://registry.npmjs.org/@vercel/ncc/-/ncc-0.36.1.tgz", + "integrity": "sha512-S4cL7Taa9yb5qbv+6wLgiKVZ03Qfkc4jGRuiUQMQ8HGBD5pcNRnHeYM33zBvJE4/zJGjJJ8GScB+WmTsn9mORw==", + "dev": true, + "bin": { + "ncc": "dist/ncc/cli.js" + } + }, + "node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==", + "dev": true + }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "dependencies": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dev": true, + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/ansi-align/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-align/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, + "node_modules/array.prototype.map": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.5.tgz", + "integrity": "sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrgv": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arrgv/-/arrgv-1.0.2.tgz", + "integrity": "sha512-a4eg4yhp7mmruZDQFqVMlxNRFGi/i1r87pt8SDHy0/I8PqSXoUTlWZRdAZo0VXgvEARcujbtTk8kiZRi1uDGRw==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/arrify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/async-retry": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/async-retry/-/async-retry-1.3.3.tgz", + "integrity": "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw==", + "dev": true, + "dependencies": { + "retry": "0.13.1" + } + }, + "node_modules/ava": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ava/-/ava-5.2.0.tgz", + "integrity": "sha512-W8yxFXJr/P68JP55eMpQIa6AiXhCX3VeuajM8nolyWNExcMDD6rnIWKTjw0B/+GkFHBIaN6Jd0LtcMThcoqVfg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.1", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.2.1", + "arrgv": "^1.0.2", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", + "chunkd": "^2.0.1", + "ci-info": "^3.7.1", + "ci-parallel-vars": "^1.0.1", + "clean-yaml-object": "^0.1.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", + "common-path-prefix": "^3.0.0", + "concordance": "^5.0.4", + "currently-unhandled": "^0.4.1", + "debug": "^4.3.4", + "del": "^7.0.0", + "emittery": "^1.0.1", + "figures": "^5.0.0", + "globby": "^13.1.3", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", + "is-error": "^2.2.2", + "is-plain-object": "^5.0.0", + "is-promise": "^4.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", + "ms": "^2.1.3", + "p-event": "^5.0.1", + "p-map": "^5.5.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^8.0.0", + "resolve-cwd": "^3.0.0", + "slash": "^3.0.0", + "stack-utils": "^2.0.6", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^5.0.0", + "yargs": "^17.6.2" + }, + "bin": { + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=14.19 <15 || >=16.15 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/before-after-hook": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.3.tgz", + "integrity": "sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==", + "dev": true + }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/blueimp-md5": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", + "dev": true + }, + "node_modules/boxen": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-7.1.1.tgz", + "integrity": "sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==", + "dev": true, + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/camelcase": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-7.0.1.tgz", + "integrity": "sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/boxen/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/bplist-parser": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", + "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", + "dev": true, + "dependencies": { + "big-integer": "^1.6.44" + }, + "engines": { + "node": ">= 5.10.0" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true + }, + "node_modules/bundle-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz", + "integrity": "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==", + "dev": true, + "dependencies": { + "run-applescript": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz", + "integrity": "sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.13", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", + "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", + "dev": true, + "dependencies": { + "@types/http-cache-semantics": "^4.0.1", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/caching-transform/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz", + "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001468", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz", + "integrity": "sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chunkd": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/chunkd/-/chunkd-2.0.1.tgz", + "integrity": "sha512-7d58XsFmOq0j6el67Ug9mHf9ELUXsQXYJBkyxhH/k+6Ke0qXRnv0kbemx+Twc6fRJ07C49lcbdgm9FL1Ei/6SQ==", + "dev": true + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/ci-parallel-vars": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ci-parallel-vars/-/ci-parallel-vars-1.0.1.tgz", + "integrity": "sha512-uvzpYrpmidaoxvIQHM+rKSrigjOe9feHYbw4uOI2gdfe1C3xIlxO+kVXq83WQWNniTf8bAxVpy+cQeFQsMERKg==", + "dev": true + }, + "node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clean-yaml-object": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/clean-yaml-object/-/clean-yaml-object-0.1.0.tgz", + "integrity": "sha512-3yONmlN9CSAkzNwnRCiJQ7Q2xK5mWuEfL3PuTZcAUzhObbXsfsnMptJzXwz93nc5zn9V9TwCVMmV7w4xsm43dw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz", + "integrity": "sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", + "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", + "dev": true, + "dependencies": { + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/code-excerpt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", + "dev": true, + "dependencies": { + "convert-to-spaces": "^2.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true + }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, + "node_modules/compare-func/node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "dev": true, + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concordance": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", + "dev": true, + "dependencies": { + "date-time": "^3.1.0", + "esutils": "^2.0.3", + "fast-diff": "^1.2.0", + "js-string-escape": "^1.0.1", + "lodash": "^4.17.15", + "md5-hex": "^3.0.1", + "semver": "^7.3.2", + "well-known-symbols": "^2.0.0" + }, + "engines": { + "node": ">=10.18.0 <11 || >=12.14.0 <13 || >=14" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-6.0.0.tgz", + "integrity": "sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==", + "dev": true, + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/configstore/node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/conventional-changelog": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-5.0.0.tgz", + "integrity": "sha512-k0c3lCtY3+k75gyrIoO7WEyBd4HLxu8QmTTPxM4D+vKk9wN06GZ/iaVJXQsGZae3Cezb02Is5PJ70fia3zZG8Q==", + "dev": true, + "dependencies": { + "conventional-changelog-angular": "^7.0.0", + "conventional-changelog-atom": "^4.0.0", + "conventional-changelog-codemirror": "^4.0.0", + "conventional-changelog-conventionalcommits": "^7.0.0", + "conventional-changelog-core": "^6.0.0", + "conventional-changelog-ember": "^4.0.0", + "conventional-changelog-eslint": "^5.0.0", + "conventional-changelog-express": "^4.0.0", + "conventional-changelog-jquery": "^5.0.0", + "conventional-changelog-jshint": "^4.0.0", + "conventional-changelog-preset-loader": "^4.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-angular": { + "version": "5.0.13", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz", + "integrity": "sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0", + "q": "^1.5.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-changelog-atom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-4.0.0.tgz", + "integrity": "sha512-q2YtiN7rnT1TGwPTwjjBSIPIzDJCRE+XAUahWxnh+buKK99Kks4WLMHoexw38GXx9OUxAsrp44f9qXe5VEMYhw==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-codemirror": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-4.0.0.tgz", + "integrity": "sha512-hQSojc/5imn1GJK3A75m9hEZZhc3urojA5gMpnar4JHmgLnuM3CUIARPpEk86glEKr3c54Po3WV/vCaO/U8g3Q==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.1.tgz", + "integrity": "sha512-VfFJxBmi+LYXeb4pIfZGbuaFCpWZh0qXbUAKP/s6B8tigV6R4D8j5PDlTtMMWawa7+DcNySVoF7kPWz0EMYuCQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-6.0.0.tgz", + "integrity": "sha512-7WPwzTp3eRMot/2mbTAHF8m/0Ue4F/R/sMpSjmhBYi/+xnW2SqnXL/FMuYqEpNC2v3rjzRZ4p+9tYcKfHn02Cg==", + "dev": true, + "dependencies": { + "@hutson/parse-repository-url": "^5.0.0", + "add-stream": "^1.0.0", + "conventional-changelog-writer": "^7.0.0", + "conventional-commits-parser": "^5.0.0", + "git-raw-commits": "^4.0.0", + "git-remote-origin-url": "^2.0.0", + "git-semver-tags": "^6.0.0", + "hosted-git-info": "^7.0.0", + "normalize-package-data": "^6.0.0", + "read-pkg": "^8.0.0", + "read-pkg-up": "^10.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core/node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core/node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-core/node_modules/hosted-git-info": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.0.tgz", + "integrity": "sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/conventional-changelog-core/node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-changelog-core/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/conventional-changelog-core/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-core/node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/conventional-changelog-core/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/conventional-changelog-core/node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-ember": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-4.0.0.tgz", + "integrity": "sha512-D0IMhwcJUg1Y8FSry6XAplEJcljkHVlvAZddhhsdbL1rbsqRsMfGx/PIkPYq0ru5aDgn+OxhQ5N5yR7P9mfsvA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-eslint": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-5.0.0.tgz", + "integrity": "sha512-6JtLWqAQIeJLn/OzUlYmzd9fKeNSWmQVim9kql+v4GrZwLx807kAJl3IJVc3jTYfVKWLxhC3BGUxYiuVEcVjgA==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-express": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-4.0.0.tgz", + "integrity": "sha512-yWyy5c7raP9v7aTvPAWzqrztACNO9+FEI1FSYh7UP7YT1AkWgv5UspUeB5v3Ibv4/o60zj2o9GF2tqKQ99lIsw==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-jquery": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-5.0.0.tgz", + "integrity": "sha512-slLjlXLRNa/icMI3+uGLQbtrgEny3RgITeCxevJB+p05ExiTgHACP5p3XiMKzjBn80n+Rzr83XMYfRInEtCPPw==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-jshint": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-4.0.0.tgz", + "integrity": "sha512-LyXq1bbl0yG0Ai1SbLxIk8ZxUOe3AjnlwE6sVRQmMgetBk+4gY9EO3d00zlEt8Y8gwsITytDnPORl8al7InTjg==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-preset-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-4.0.0.tgz", + "integrity": "sha512-xYGvKMkJs8o6vnKDbo2v5VcalZmH54lVU+OCvFQvxj3AQKRMJhbKwvBVsSXfQSuhaG9r6mdK8TIMOaiwiStasg==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-writer": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-7.0.0.tgz", + "integrity": "sha512-9/6vTDd3wDbH9yayZNOq53UWI4QqYlbiLBtWf+alsQA/bBFHG+k3KnQ8Fu/xzHqsbQfzPg3w1H1piWYn/GD9Tw==", + "dev": true, + "dependencies": { + "conventional-commits-filter": "^4.0.0", + "handlebars": "^4.7.7", + "json-stringify-safe": "^5.0.1", + "meow": "^12.0.1", + "semver": "^7.5.2", + "split2": "^4.0.0" + }, + "bin": { + "conventional-changelog-writer": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-writer/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-changelog-writer/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/conventional-changelog/node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-filter": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-4.0.0.tgz", + "integrity": "sha512-rnpnibcSOdFcdclpFwWa+pPlZJhXE7l+XK04zxhbWrhgpR96h33QLz8hITTXbcYICxVr3HZFtbtUAQ+4LdBo9A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz", + "integrity": "sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q==", + "dev": true, + "dependencies": { + "is-text-path": "^1.0.1", + "JSONStream": "^1.0.4", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/conventional-recommended-bump": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-8.0.0.tgz", + "integrity": "sha512-yvGN+VMy00WIe/pJufpmN+I4B2cM/WFK+CFCmDcjyVLyQR6J1KT2iecmA4NQ58gQAiNkvStEjcZp/W9h1JDM1A==", + "dev": true, + "dependencies": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^4.0.0", + "conventional-commits-filter": "^4.0.0", + "conventional-commits-parser": "^5.0.0", + "git-raw-commits": "^4.0.0", + "git-semver-tags": "^6.0.0", + "meow": "^12.0.1" + }, + "bin": { + "conventional-recommended-bump": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-recommended-bump/node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-recommended-bump/node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-recommended-bump/node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-recommended-bump/node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/conventional-recommended-bump/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/conventional-recommended-bump/node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/conventional-recommended-bump/node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/convert-to-spaces": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/core-js-pure": { + "version": "3.32.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.1.tgz", + "integrity": "sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ==", + "dev": true, + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz", + "integrity": "sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q==", + "dev": true, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=7", + "ts-node": ">=10", + "typescript": ">=3" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-4.0.0.tgz", + "integrity": "sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dargs": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", + "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/date-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/date-time/-/date-time-3.1.0.tgz", + "integrity": "sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==", + "dev": true, + "dependencies": { + "time-zone": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/debug/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/default-browser": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz", + "integrity": "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==", + "dev": true, + "dependencies": { + "bundle-name": "^3.0.0", + "default-browser-id": "^3.0.0", + "execa": "^7.1.1", + "titleize": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", + "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", + "dev": true, + "dependencies": { + "bplist-parser": "^0.2.0", + "untildify": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defaults": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/del": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-7.0.0.tgz", + "integrity": "sha512-tQbV/4u5WVB8HMJr08pgw0b6nG4RGt/tj+7Numvq+zqcvUFeMaIWWOUFltiU+6go8BSO2/ogsB4EasDaj0y68Q==", + "dev": true, + "dependencies": { + "globby": "^13.1.2", + "graceful-fs": "^4.2.10", + "is-glob": "^4.0.3", + "is-path-cwd": "^3.0.0", + "is-path-inside": "^4.0.0", + "p-map": "^5.5.0", + "rimraf": "^3.0.2", + "slash": "^4.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==", + "dev": true + }, + "node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-6.0.1.tgz", + "integrity": "sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.333", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.333.tgz", + "integrity": "sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ==", + "dev": true + }, + "node_modules/emittery": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.1.tgz", + "integrity": "sha512-2ID6FdrMD9KDLldGesP6317G78K7km/kMcwItRtVFva7I/cSEOIaLpewaUb+YLXVwdAp3Ctfxh/V5zIl1sj7dQ==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", + "dev": true + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz", + "integrity": "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.1", + "human-signals": "^4.3.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^3.0.7", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": "^14.18.0 || ^16.14.0 || >=18.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-diff": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", + "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/figures": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", + "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", + "dev": true, + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "dev": true, + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "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==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-uri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.1.tgz", + "integrity": "sha512-7ZqONUVqaabogsYNWlYj0t3YZaL6dhuEueZXGF+/YVmf6dHmaFg8/6psJKqhx9QykIDKzpGcy2cn4oV4YC7V/Q==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^5.0.1", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/data-uri-to-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-5.0.1.tgz", + "integrity": "sha512-a9l6T1qqDogvvnw0nKlfZzqsyikEBZBClF39V3TFoKhDtGBqHu2HkuomJc02j5zft8zrUaXEuoicLeW54RkzPg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/git-raw-commits": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.11.tgz", + "integrity": "sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A==", + "dev": true, + "dependencies": { + "dargs": "^7.0.0", + "lodash": "^4.17.15", + "meow": "^8.0.0", + "split2": "^3.0.0", + "through2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==", + "dev": true, + "dependencies": { + "gitconfiglocal": "^1.0.0", + "pify": "^2.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/git-semver-tags": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-6.0.0.tgz", + "integrity": "sha512-v5BL6psuUy+Ftuo99141XlOIDoJtKw5+YyDANS7fknSP0iT4cVIanc3toDsH4K+VpIWc19l2/xkwQmXMfloeUA==", + "dev": true, + "dependencies": { + "meow": "^12.0.1", + "semver": "^7.5.2" + }, + "bin": { + "git-semver-tags": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/git-semver-tags/node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/git-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/git-up/-/git-up-7.0.0.tgz", + "integrity": "sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==", + "dev": true, + "dependencies": { + "is-ssh": "^1.4.0", + "parse-url": "^8.1.0" + } + }, + "node_modules/git-url-parse": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/git-url-parse/-/git-url-parse-13.1.0.tgz", + "integrity": "sha512-5FvPJP/70WkIprlUZ33bm4UAaFdjcLkJLpWft1BeZKqwR0uhhNGoKwlUaPtVb4LxCSQ++erHapRak9kWGj+FCA==", + "dev": true, + "dependencies": { + "git-up": "^7.0.0" + } + }, + "node_modules/gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==", + "dev": true, + "dependencies": { + "ini": "^1.3.2" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz", + "integrity": "sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "dev": true, + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/got/-/got-13.0.0.tgz", + "integrity": "sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/handlebars": { + "version": "4.7.7", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.7.tgz", + "integrity": "sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" + }, + "bin": { + "handlebars": "bin/handlebars" + }, + "engines": { + "node": ">=0.4.7" + }, + "optionalDependencies": { + "uglify-js": "^3.1.4" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", + "integrity": "sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", + "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "dev": true + }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-2.2.0.tgz", + "integrity": "sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ==", + "dev": true, + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-by-default": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", + "dev": true, + "engines": { + "node": ">=10 <11 || >=12 <13 || >=14" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true + }, + "node_modules/inquirer": { + "version": "9.2.10", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.10.tgz", + "integrity": "sha512-tVVNFIXU8qNHoULiazz612GFl+yqNfjMTbLuViNJE/d860Qxrd3NMrse8dm40VUQLOQeULvaQF8lpAhvysjeyA==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/inquirer/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/inquirer/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, + "node_modules/irregular-plurals": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", + "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-error": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz", + "integrity": "sha512-IOQqts/aHWbiisY5DuPJQ0gcbvaLFCa7fBa9xoLfxBZvQ+ZI/Zh9xoI7Gk+G64N0FdK4AbibytHht2tWgpJWLg==", + "dev": true + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-installed-globally/node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-6.0.0.tgz", + "integrity": "sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-ssh": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/is-ssh/-/is-ssh-1.4.0.tgz", + "integrity": "sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==", + "dev": true, + "dependencies": { + "protocols": "^2.0.1" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==", + "dev": true, + "dependencies": { + "text-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dev": true, + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true + }, + "node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-wsl/node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.4.1.tgz", + "integrity": "sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/issue-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/issue-parser/-/issue-parser-6.0.0.tgz", + "integrity": "sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA==", + "dev": true, + "dependencies": { + "lodash.capitalize": "^4.2.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.uniqby": "^4.7.0" + }, + "engines": { + "node": ">=10.13" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-processinfo/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/iterate-iterator": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.2.tgz", + "integrity": "sha512-t91HubM4ZDQ70M9wqp+pcNpu8OyJ9UAtXntT/Bcsvp5tZMnz9vRa+IunKXeI8AnfZMTv0jNuVEmGeLSMjVvfPw==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/iterate-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz", + "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==", + "dev": true, + "dependencies": { + "es-get-iterator": "^1.0.2", + "iterate-iterator": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/js-string-escape": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, + "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": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/just-extend": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", + "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/latest-version": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-7.0.0.tgz", + "integrity": "sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==", + "dev": true, + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", + "dev": true + }, + "node_modules/lodash.capitalize": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz", + "integrity": "sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==", + "dev": true + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==", + "dev": true + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true + }, + "node_modules/lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", + "dev": true + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==", + "dev": true + }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true + }, + "node_modules/lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==", + "dev": true + }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, + "node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-3.0.0.tgz", + "integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/macos-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-3.2.0.tgz", + "integrity": "sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, + "node_modules/map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "dev": true, + "dependencies": { + "p-defer": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/matcher": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/md5-hex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-3.0.1.tgz", + "integrity": "sha512-BUiRtTtV39LIJwinWBjqVsU9xhdnz7/i889V859IBFpuqGAj6LuOvHv5XLbgZ2R7ptJoJaEcxkv88/h25T7Ciw==", + "dev": true, + "dependencies": { + "blueimp-md5": "^2.10.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mem": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", + "dev": true, + "dependencies": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sindresorhus/mem?sponsor=1" + } + }, + "node_modules/meow": { + "version": "8.1.2", + "resolved": "https://registry.npmjs.org/meow/-/meow-8.1.2.tgz", + "integrity": "sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, + "node_modules/meow/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/meow/node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/meow/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-4.0.0.tgz", + "integrity": "sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minimist-options/node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/new-github-release-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/new-github-release-url/-/new-github-release-url-2.0.0.tgz", + "integrity": "sha512-NHDDGYudnvRutt/VhKFlX26IotXe1w0cmkDm6JGquh5bz/bDTw0LufSmH/GxTjEdpHEO+bVKFTwdrcGa/9XlKQ==", + "dev": true, + "dependencies": { + "type-fest": "^2.5.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/new-github-release-url/node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nise": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.4.tgz", + "integrity": "sha512-8+Ib8rRJ4L0o3kfmyVCL7gzrohyDe0cMFTBa2d364yIrEGMEoetznKJx899YxjybU6bL9SQkYPSBBs1gyYs8Xg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^2.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "path-to-regexp": "^1.7.0" + } + }, + "node_modules/nise/node_modules/@sinonjs/commons": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-2.0.0.tgz", + "integrity": "sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==", + "dev": true, + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "dev": true + }, + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true, + "engines": { + "node": ">=12.19" + } + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.0.tgz", + "integrity": "sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nyc/node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-9.1.0.tgz", + "integrity": "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==", + "dev": true, + "dependencies": { + "default-browser": "^4.0.0", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "dev": true, + "dependencies": { + "restore-cursor": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.2.1.tgz", + "integrity": "sha512-97g6QgOk8zlDRdgq1WxwgTMgEWGVAQvB5Fdpgc1MkNy56la5SKP9GsMXKDOdqwn90/41a8yPwIGk1Y6WVbeMQA==", + "dev": true + }, + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-name": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-5.1.0.tgz", + "integrity": "sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ==", + "dev": true, + "dependencies": { + "macos-release": "^3.1.0", + "windows-release": "^5.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-3.0.0.tgz", + "integrity": "sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==", + "dev": true, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-event": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", + "dev": true, + "dependencies": { + "p-timeout": "^5.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "dev": true, + "dependencies": { + "aggregate-error": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-8.1.1.tgz", + "integrity": "sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==", + "dev": true, + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json/node_modules/got": { + "version": "12.6.1", + "resolved": "https://registry.npmjs.org/got/-/got-12.6.1.tgz", + "integrity": "sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==", + "dev": true, + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-ms": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-path": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/parse-path/-/parse-path-7.0.0.tgz", + "integrity": "sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==", + "dev": true, + "dependencies": { + "protocols": "^2.0.0" + } + }, + "node_modules/parse-url": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/parse-url/-/parse-url-8.1.0.tgz", + "integrity": "sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==", + "dev": true, + "dependencies": { + "parse-path": "^7.0.0" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", + "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "dev": true, + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-to-regexp/node_modules/isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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 + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/plur": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", + "dev": true, + "dependencies": { + "irregular-plurals": "^3.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-ms": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", + "dev": true, + "dependencies": { + "parse-ms": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-on-spawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.0.0.tgz", + "integrity": "sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg==", + "dev": true, + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/promise.allsettled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.6.tgz", + "integrity": "sha512-22wJUOD3zswWFqgwjNHa1965LvqTX87WPu/lreY2KSd7SVcERfuZ4GfUaOnJNnvtoIv2yXT/W00YIGMetXtFXg==", + "dev": true, + "dependencies": { + "array.prototype.map": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "iterate-value": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", + "dev": true + }, + "node_modules/protocols": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", + "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", + "dev": true + }, + "node_modules/proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pupa": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-3.1.0.tgz", + "integrity": "sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==", + "dev": true, + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "dev": true, + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dev": true, + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/read-pkg": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-8.1.0.tgz", + "integrity": "sha512-PORM8AgzXeskHO/WEv312k9U03B8K9JSiWF/8N9sUuFjBa+9SF2u6K7VClzXwDXab51jCd8Nd36CNM+zR97ScQ==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.1", + "normalize-package-data": "^6.0.0", + "parse-json": "^7.0.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-10.1.0.tgz", + "integrity": "sha512-aNtBq4jR8NawpKJQldrQcSW9y/d+KWH4v24HWkHljOZ7H0av+YTGANBzRh9A5pw7v/bLVsLVPpOhJ7gHNVy8lA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0", + "read-pkg": "^8.1.0", + "type-fest": "^4.2.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.3.1.tgz", + "integrity": "sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.0.tgz", + "integrity": "sha512-ICclEpTLhHj+zCuSb2/usoNXSVkxUSIopre+b1w8NDY9Dntp9LO4vLdHYI336TH8sAqwrRgnSfdkBG2/YpisHA==", + "dev": true, + "dependencies": { + "lru-cache": "^10.0.1" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/json-parse-even-better-errors": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.0.tgz", + "integrity": "sha512-iZbGHafX/59r39gPwVPRBGw0QQKnA7tte5pSMrhWOW7swGsVvVTjmfyAV9pNqk8YGT7tRCdxRu8uzcgZwoDooA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/lines-and-columns": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.3.tgz", + "integrity": "sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/read-pkg/node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "dev": true, + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.0.tgz", + "integrity": "sha512-UL7ELRVxYBHBgYEtZCXjxuD5vPxnmvMGq0jp/dGPKKrN7tfsBh2IY7TlJ15WWwdjRWD3RJbnsygUurTK3xkPkg==", + "dev": true, + "dependencies": { + "hosted-git-info": "^7.0.0", + "is-core-module": "^2.8.1", + "semver": "^7.3.5", + "validate-npm-package-license": "^3.0.4" + }, + "engines": { + "node": "^16.14.0 || >=18.0.0" + } + }, + "node_modules/read-pkg/node_modules/parse-json": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-7.1.0.tgz", + "integrity": "sha512-ihtdrgbqdONYD156Ap6qTcaGcGdkdAxodO1wLqQ/j7HP1u2sFYppINiq4jyC8F+Nm+4fVufylCV00QmkTHkSUg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.21.4", + "error-ex": "^1.3.2", + "json-parse-even-better-errors": "^3.0.0", + "lines-and-columns": "^2.0.3", + "type-fest": "^3.8.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/parse-json/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "dev": true, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.3.1.tgz", + "integrity": "sha512-pphNW/msgOUSkJbH58x8sqpq8uQj6b0ZKGxEsLKMUnGorRcDjrUaLS+39+/ub41JNTwrrMyJcUB8+YZs3mbwqw==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "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 + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-5.0.2.tgz", + "integrity": "sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==", + "dev": true, + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-6.0.1.tgz", + "integrity": "sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==", + "dev": true, + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/release-it": { + "version": "16.1.5", + "resolved": "https://registry.npmjs.org/release-it/-/release-it-16.1.5.tgz", + "integrity": "sha512-w/zCljPZBSYcCwR9fjDB1zaYwie1CAQganUrwNqjtXacXhrrsS5E6dDUNLcxm2ypu8GWAgZNMJfuBJqIO2E7fA==", + "dev": true, + "dependencies": { + "@iarna/toml": "2.2.5", + "@octokit/rest": "19.0.13", + "async-retry": "1.3.3", + "chalk": "5.3.0", + "cosmiconfig": "8.2.0", + "execa": "7.2.0", + "git-url-parse": "13.1.0", + "globby": "13.2.2", + "got": "13.0.0", + "inquirer": "9.2.10", + "is-ci": "3.0.1", + "issue-parser": "6.0.0", + "lodash": "4.17.21", + "mime-types": "2.1.35", + "new-github-release-url": "2.0.0", + "node-fetch": "3.3.2", + "open": "9.1.0", + "ora": "7.0.1", + "os-name": "5.1.0", + "promise.allsettled": "1.0.6", + "proxy-agent": "6.3.0", + "semver": "7.5.4", + "shelljs": "0.8.5", + "update-notifier": "6.0.2", + "url-join": "5.0.0", + "wildcard-match": "5.1.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "release-it": "bin/release-it.js" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==", + "dev": true + }, + "node_modules/resolve-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dev": true, + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-global/-/resolve-global-1.0.0.tgz", + "integrity": "sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw==", + "dev": true, + "dependencies": { + "global-dirs": "^0.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-global/node_modules/global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", + "dev": true, + "dependencies": { + "ini": "^1.3.4" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/responselike": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-3.0.0.tgz", + "integrity": "sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==", + "dev": true, + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-applescript": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz", + "integrity": "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/run-applescript/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/run-applescript/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-applescript/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/run-applescript/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/run-applescript/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-4.0.0.tgz", + "integrity": "sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/serialize-error": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", + "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", + "dev": true, + "dependencies": { + "type-fest": "^0.13.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz", + "integrity": "sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==", + "dev": true, + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/sinon": { + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.0.4.tgz", + "integrity": "sha512-uzmfN6zx3GQaria1kwgWGeKiXSSbShBbue6Dcj0SI8fiCNFbiUDqKl57WFlY5lyhxZVUKmXvzgG2pilRQCBwWg==", + "dev": true, + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.0.2", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/sinon/node_modules/diff": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dev": true, + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dev": true, + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/temp-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", + "dev": true, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-extensions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, + "node_modules/through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "dev": true, + "dependencies": { + "readable-stream": "3" + } + }, + "node_modules/time-zone": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/titleize": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", + "integrity": "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "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", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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 + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", + "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/uglify-js": { + "version": "3.17.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", + "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "dev": true, + "optional": true, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-3.0.0.tgz", + "integrity": "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==", + "dev": true, + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universal-user-agent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz", + "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==", + "dev": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-6.0.2.tgz", + "integrity": "sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==", + "dev": true, + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.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/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "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==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.2.1.tgz", + "integrity": "sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/well-known-symbols": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/well-known-symbols/-/well-known-symbols-2.0.0.tgz", + "integrity": "sha512-ZMjC3ho+KXo0BfJb7JgtQ5IBuvnShdlACNkKkdsqBmYw3bPAaJfPeYUo6tLUaT5tG/Gkh7xkpBhKRQ9e7pyg9Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==", + "dev": true + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", + "integrity": "sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==", + "dev": true, + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard-match": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/wildcard-match/-/wildcard-match-5.1.2.tgz", + "integrity": "sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ==", + "dev": true + }, + "node_modules/windows-release": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-5.1.1.tgz", + "integrity": "sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==", + "dev": true, + "dependencies": { + "execa": "^5.1.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/windows-release/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/windows-release/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/windows-release/node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/windows-release/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/windows-release/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/write-file-atomic": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.0.tgz", + "integrity": "sha512-R7NYMnHSlV42K54lwY9lvW6MnSm1HSJqZL3xiSgi9E7//FYaI74r2G0rd+/X6VAMkHEdzxQaU5HUOXWUz5kA/w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.7" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-5.1.0.tgz", + "integrity": "sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xregexp": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-5.1.1.tgz", + "integrity": "sha512-fKXeVorD+CzWvFs7VBuKTYIW63YD1e1osxwQ8caZ6o1jg6pDAbABDG54LCIq0j5cy7PjRvGIq6sef9DYPXpncg==", + "dev": true, + "dependencies": { + "@babel/runtime-corejs3": "^7.16.5" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/javascript/package.json b/javascript/package.json new file mode 100644 index 0000000..9e11b8e --- /dev/null +++ b/javascript/package.json @@ -0,0 +1,46 @@ +{ + "name": "glrepl", + "version": "1.0.0-beta.9", + "description": "GLRepl is a Max opengl REPL that you can use with your patches", + "main": "tw.gl.repl.maxpat", + "scripts": { + "generate-max-binding": "npx ts-node --skip-project ./src/MaxBindings/generateMaxBindings.ts", + "compile": "npx tsc; npm run generate-max-binding", + "test": "nyc --cwd ./../ --report-dir=javascript/coverage --temp-dir=javascript/.nyc_output --reporter=lcov --reporter=text ava", + "report": "nyc report --reporter=html --exclude-node-modules=false", + "release": "release-it", + "release-beta-minor": "release-it minor --preRelease=beta", + "release-beta-major": "release-it major --preRelease=beta", + "release-beta": "release-it --preRelease=beta" + }, + "author": "Tom Whiston", + "license": "GPL", + "devDependencies": { + "@commitlint/cli": "^17.6.3", + "@commitlint/config-conventional": "^17.6.3", + "@j-ulrich/release-it-regex-bumper": "^5.0.0", + "@release-it/conventional-changelog": "^7.0.1", + "@types/glob": "^8.1.0", + "@types/maxmsp": "^1.0.0", + "@types/node": "^18.16.3", + "@vercel/ncc": "^0.36.1", + "ava": "^5.2.0", + "handlebars": "^4.7.7", + "nyc": "^15.1.0", + "reflect-metadata": "^0.1.13", + "release-it": "^16.1.5", + "sinon": "^15.0.4", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.2.0", + "typescript": "^5.0.2" + }, + "ava": { + "extensions": [ + "ts" + ], + "require": [ + "ts-node/register", + "tsconfig-paths/register" + ] + } +} diff --git a/javascript/src/Cursor/Cursor.test.ts b/javascript/src/Cursor/Cursor.test.ts new file mode 100644 index 0000000..8168b19 --- /dev/null +++ b/javascript/src/Cursor/Cursor.test.ts @@ -0,0 +1,153 @@ +import test from 'ava'; +import { Cursor, CursorPosition } from './Cursor'; + +test('initial position', (t) => { + const cursor = new Cursor(); + const expected = { line: 0, char: 0 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); +}); + +test('increment char', (t) => { + const cursor = new Cursor(); + cursor.incrementChar(); + const expected = { line: 0, char: 1 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); +}); + +test('decrement char', (t) => { + const cursor = new Cursor(); + cursor.incrementChar(); + cursor.decrementChar(); + const expected = { line: 0, char: 0 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); +}); + +test('cannot decrement char below -1', t => { + const cursor = new Cursor(); + cursor.decrementChar(); + t.is(cursor.char(), -1); +}); + +test('increment line', (t) => { + const cursor = new Cursor(); + const ival = cursor.incrementLine(); + const expected = { line: 1, char: 0 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); + t.is(ival, 1) +}); + +test('set char', (t) => { + const cursor = new Cursor(); + cursor.setChar(10); + const expected = { line: 0, char: 10 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); +}); + +test('set line', (t) => { + const cursor = new Cursor(); + cursor.setLine(5); + const expected = { line: 5, char: 0 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); +}); + +test('reset', (t) => { + const cursor = new Cursor(); + cursor.setChar(10); + cursor.setLine(5); + cursor.reset(); + const expected = { line: 0, char: 0 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); + + cursor.incrementChar(); + cursor.incrementChar(); + cursor.incrementLine(); + cursor.incrementLine(); + cursor.incrementLine(); + cursor.reset(); + const actual2 = cursor.position(); + t.deepEqual(actual2, expected); +}); + +test('reset char', (t) => { + const cursor = new Cursor(); + cursor.setChar(10); + cursor.resetChar(); + const expected = { line: 0, char: 0 }; + const actual = cursor.position(); + t.deepEqual(actual, expected); +}); + +test('reset line', t => { + const cursor = new Cursor(); + cursor.incrementLine(); + cursor.resetLine(); + t.is(cursor.line(), 0); +}); + +test('Position returns object with current line and char values', t => { + const cursor = new Cursor(); + const position = cursor.position(); + t.deepEqual(position, { line: 0, char: 0 }); +}); + +test('Line returns the current line value', t => { + const cursor = new Cursor(); + cursor.incrementLine(); + t.is(cursor.line(), 1); +}); + +test('Char returns the current char value', t => { + const cursor = new Cursor(); + cursor.incrementChar(); + t.is(cursor.char(), 1); +}); + +test('decrementLine method should reduce curLine by 1', t => { + const cursor = new Cursor(); + cursor.incrementLine(); + cursor.decrementLine(); + t.is(cursor.line(), 0); +}); + +test('decrementLine method should not reduce curLine below 0', t => { + const cursor = new Cursor(); + cursor.decrementLine(); + t.is(cursor.line(), 0); + cursor.incrementLine(); + cursor.decrementLine(); + cursor.decrementLine(); + t.is(cursor.line(), 0); +}); + +test('cursor mutation', t => { + + const cursor = new Cursor(); + cursor.setLine(1); + cursor.setChar(10); + + const l1 = cursor.position(); + const line1 = cursor.line(); + const char1 = cursor.char(); + t.is(l1.line, 1) + t.is(l1.char, 10) + t.is(line1, 1) + t.is(char1, 10) + + cursor.setLine(5); + cursor.setChar(99); + const l2 = cursor.position(); + t.is(l2.line, 5) + t.is(l2.char, 99) + t.is(l1.line, 1) + t.is(l1.char, 10) + t.is(line1, 1) + t.is(char1, 10) + +}); \ No newline at end of file diff --git a/javascript/src/Cursor/Cursor.ts b/javascript/src/Cursor/Cursor.ts new file mode 100644 index 0000000..83c49f6 --- /dev/null +++ b/javascript/src/Cursor/Cursor.ts @@ -0,0 +1,66 @@ +export interface CursorPosition { + line: number; + char: number; +} + +export class Cursor { + private pos: CursorPosition; + + constructor() { + this.pos = { line: 0, char: 0 } + } + + reset() { + this.pos.char = 0; + this.pos.line = 0; + } + + resetChar() { + this.pos.char = 0; + } + + resetLine() { + this.pos.line = 0; + } + + position(): CursorPosition { + //shallow copy + return { ...this.pos }; + } + + line(): number { + return this.pos.line; + } + + char(): number { + return this.pos.char; + } + + incrementChar(): number { + return this.pos.char++; + } + + decrementChar(): number { + //This is minimum -1 to cover the case where it should go back a line + this.pos.char = Math.max(-1, (this.pos.char -= 1)); + return this.pos.char; + } + + incrementLine(): number { + return ++this.pos.line; + } + + decrementLine(): number { + //This is minimum -1 to cover the case where it should go back a line + this.pos.line = Math.max(0, (this.pos.line -= 1)); + return this.pos.line; + } + + setChar(pos: number): void { + this.pos.char = pos; + } + + setLine(pos: number): void { + this.pos.line = pos; + } +} \ No newline at end of file diff --git a/javascript/src/GLRender/GLRender.test.ts b/javascript/src/GLRender/GLRender.test.ts new file mode 100644 index 0000000..3635b3d --- /dev/null +++ b/javascript/src/GLRender/GLRender.test.ts @@ -0,0 +1,190 @@ +import test from "ava"; +import { CursorPosition } from '../Cursor/Cursor'; +import { GLRender, Color } from "./GLRender"; +var sinon = require("sinon"); + + +test('Color class', (t) => { + const defaultColor = new Color(); + t.deepEqual(defaultColor.toArray(), [0, 0, 0, 0]); + + const customColor = new Color(0.5, 0.5, 0.5, 0.5); + t.deepEqual(customColor.toArray(), [0.5, 0.5, 0.5, 0.5]); + + const colorWithNoAlpha = new Color(1, 1, 1); + t.deepEqual(colorWithNoAlpha.toArray(), [1, 1, 1, 0]); +}); + +test('GLRender', (t) => { + const glRender = new GLRender(123); + + t.is(glRender.UNIQ, 123); + + // Test drawto method + glRender.drawto('test_context'); + t.is((glRender.glVid).drawto, 'test_context'); + + // Test setCursorChars method + glRender.setCursorChars('>>'); + t.deepEqual(glRender.getCursorChars(), [62, 62]); + + const initialPosition = (glRender.animNode).position; + t.deepEqual(initialPosition, [0, 0, 0]); + + glRender.position(0.5, 0.5); + const updatedPosition = (glRender.animNode).position; + t.deepEqual(updatedPosition, [0.5, 0.5, 0]); + + glRender.scale(1.0) + const initialScale = (glRender.animNode).scale; + t.deepEqual(initialScale, [1, 1, 0]); + + glRender.scale(2.0); + const updatedScale = (glRender.animNode).scale; + t.deepEqual(updatedScale, [2, 2, 0]); + + const initialColor = glRender.getTextColor(); + t.deepEqual(initialColor, new Color(1, 1, 1, 1)); + + glRender.setTextColor(0.5, 0.5, 0.5, 0.5); + const updatedColor = glRender.getTextColor(); + t.deepEqual(updatedColor, new Color(0.5, 0.5, 0.5, 0.5)); + glRender.setTextColor(1, 0, 0, 0.5); + const tc = glRender.getTextColor() + t.deepEqual(tc, new Color(1, 0, 0, 0.5)); + + + // Test setLineWidth method + glRender.line_width(5); + t.is((glRender.glTextObj.text).line_width, 5); + + + // Test setLineLength method + glRender.line_length(10); + t.is((glRender.glTextObj.text).line_length, 10); + + + // Test setTracking method + glRender.tracking(1); + t.is((glRender.glTextObj.text).tracking, 1); + + + // Test disableText method + glRender.disableText(true); + t.is(glRender.textDisabled(), true); + t.is((glRender.glTextObj).text.gl_color[3], 0.5); + glRender.disableText(false); + t.is(glRender.textDisabled(), false); + t.is((glRender.glTextObj).text.gl_color[3], 1.0); + + + // Test setLeadscale method + glRender.leadscale(0.5); + t.is((glRender.glTextObj.text).leadscale, 0.5); + t.is((glRender.glTextObj.crsr).leadscale, 0.5); + t.is((glRender.glTextObj.lnmr).leadscale, 0.5); + + + // Test setFont method + let af = glRender.activeFont() + t.is(af, 'Arial') + glRender.font('Comic Sans'); + af = glRender.activeFont() + t.is(af, 'Comic Sans') + // Comic Sans is objectively bad, only use it for jokes! + + + // Test setFontsize method + let fs = glRender.getFontSize() + t.is(fs, 100) + glRender.fontsize(12); + fs = glRender.getFontSize() + t.is(fs, 12) + + + t.is((glRender.glTextObj.lnmr).cull_face, 1) + t.is((glRender.glTextObj.crsr).cull_face, 1) + t.is((glRender.glTextObj.text).cull_face, 1) + glRender.cull_face(2) + t.is((glRender.glTextObj.lnmr).cull_face, 2) + t.is((glRender.glTextObj.crsr).cull_face, 2) + t.is((glRender.glTextObj.text).cull_face, 2) + + // Test blink method + glRender.blink_enable(true); + const initialCrsrColor = (glRender.glTextObj.crsr).gl_color; + glRender.blink(); + const afterBlinkCrsrColor = (glRender.glTextObj.crsr).gl_color; + t.notDeepEqual(afterBlinkCrsrColor, initialCrsrColor); + + // Test runBlink method + const initialTextColor = (glRender.glTextObj.text).gl_color; + glRender.runBlink(0.5); + const afterRunBlinkTextColor = (glRender.glTextObj.text).gl_color; + t.notDeepEqual(afterRunBlinkTextColor, initialTextColor); + +}); + +test('Blink', (t) => { + + const glRender = new GLRender(123); + let crsrColor = (glRender.glTextObj.crsr).gl_color; + glRender.blink_enable(false); + glRender.blink(); + let newCrsrColor = (glRender.glTextObj.crsr).gl_color; + t.deepEqual(newCrsrColor, crsrColor); + + glRender.blink_enable(true); + glRender.blink(); + newCrsrColor = (glRender.glTextObj.crsr).gl_color; + t.notDeepEqual(newCrsrColor, crsrColor); + + glRender.blink_color(1, 0, 0, 0.5); + glRender.blink(); + glRender.blink(); + newCrsrColor = (glRender.glTextObj.crsr).gl_color; + t.deepEqual(newCrsrColor, new Color(1, 0, 0, 0.5).toArray()); + + + glRender.cursor_color(0, 0, 1, 0.5); + // cursor_color itself calls blink so we don't need to call it here to see a change + newCrsrColor = (glRender.glTextObj.crsr).gl_color; + t.deepEqual(newCrsrColor, new Color(0, 0, 1, 0.5).toArray()); + + glRender.number_color(1, 1, 0, 0.5); + const initialNumberColor = (glRender.glTextObj.lnmr).gl_color; + t.deepEqual(initialNumberColor, [1, 1, 0, 0.5]); + + const preRun = (glRender.glTextObj.text).gl_color; + glRender.run_color(0, 1, 0, 0.5); + glRender.runBlink(0.5) + const postRun = (glRender.glTextObj.text).gl_color; + t.notDeepEqual(postRun, preRun) + +}) + +test('GLRender draw, drawCursor, drawNumbers, drawText and matrixToText methods', (t) => { + const renderer = new GLRender(1); + const textBuf = ['hello', 'world']; + const curPos = { line: 0, char: 0 }; + + // === Internal Function Calls === + const drawTextStub = sinon.stub(renderer, 'drawText'); + const drawCursorStub = sinon.stub(renderer, 'drawCursor'); + const drawNumbersStub = sinon.stub(renderer, 'drawNumbers'); + //const matrixToTextStub = sinon.stub(renderer, 'matrixToText'); + + renderer.draw(textBuf, curPos); + + // Verify internal functions were called correctly. + t.true(drawTextStub.calledWith(textBuf)); + t.true(drawCursorStub.calledWith(textBuf, curPos)); + t.true(drawNumbersStub.calledWith(textBuf, curPos)); + //t.true(matrixToTextStub.calledOnce); + + // Restore functions + drawTextStub.restore(); + drawCursorStub.restore(); + drawNumbersStub.restore(); + //matrixToTextStub.restore(); +}); \ No newline at end of file diff --git a/javascript/src/GLRender/GLRender.ts b/javascript/src/GLRender/GLRender.ts new file mode 100644 index 0000000..8f23c51 --- /dev/null +++ b/javascript/src/GLRender/GLRender.ts @@ -0,0 +1,569 @@ +import { CursorPosition } from 'Cursor'; +import { maxMspBinding } from 'MaxBindings'; +import 'array.extensions'; + + +/* + * The following wrappers allow us to make the GLRender class testable + * Basically they pass a proxy into the test environment where all of + * the max classes are unavailable. It's cumbersome but necessary if + * we want unit tests here. Luckily they are internal to the implementation. + */ +/* istanbul ignore next */ +type JitterMatrixConstructor = new (...args: any[]) => JitterMatrix; + +/* istanbul ignore next */ +class FallbackJitterMatrix { + constructor(...args: any[]) { + const handler = { + get: (target: any, propName: string) => { + //throw new Error("JitterMatrix is not available in this context"); + if (propName === 'setall' || propName === 'setcell2d') { + return (...funcArgs: any[]) => { + // console.log('Custom method called with arguments:', funcArgs); + }; + } + }, + }; + + const proxy = new Proxy({}, handler); + Object.setPrototypeOf(proxy, FallbackJitterMatrix.prototype); + return proxy; + } +} +/* istanbul ignore next */ +const WrappedJitterMatrix: JitterMatrixConstructor = + typeof JitterMatrix === "undefined" + ? (FallbackJitterMatrix as any) + : JitterMatrix; +/* istanbul ignore next */ +type JitterObjectConstructor = new (...args: any[]) => JitterObject; + +/* istanbul ignore next */ +class FallbackJitterObject { + constructor(...args: any[]) { + const handler = { + get: (target: any, propName: string) => { + // Define a custom method implementation + if (propName === 'font' || propName === 'size' || propName === 'jit_matrix') { + return (...funcArgs: any[]) => { + // console.log('Custom method called with arguments:', funcArgs); + }; + } + if (typeof target[propName] === "function") { + return (...funcArgs: any[]) => { + // If JitterObject is not available, throw an error or provide fallback implementation + target[propName].apply(target, funcArgs); + }; + } + // If JitterObject is not available, return undefined or provide fallback attribute values + //console.warn(`JitterObject property '${propName}' is not available in this context`); + return target[propName]; + }, + }; + + const proxy = new Proxy({}, handler); + Object.setPrototypeOf(proxy, FallbackJitterObject.prototype); + return proxy; + } +} +/* istanbul ignore next */ +const WrappedJitterObject: JitterObjectConstructor = + typeof JitterObject === "undefined" + ? (FallbackJitterObject as any) + : JitterObject; + +// polyfill Object.entries for archaic max runtimes +// test environment has this function so hard to test, hence we ignore it +/* istanbul ignore next */ +if (!Object.entries) + Object.entries = function (obj) { + var ownProps = Object.keys(obj), + i = ownProps.length, + resArray = new Array(i); // preallocate the Array + + while (i--) + resArray[i] = [ownProps[i], obj[ownProps[i]]]; + return resArray; + }; + +export class Color { + r: number + g: number + b: number + a: number + constructor(r?: number, g?: number, b?: number, a?: number) { + this.r = r || 0.0 + this.g = g || 0.0 + this.b = b || 0.0 + this.a = a || 0.0 + } + toArray(): Array { + return [this.r, this.g, this.b, this.a]; + } +}; + +//There's a lot of casting to any in this class to make typescript happy, it's a bit tedious +//but hopefully it never has to be touched ;) +@maxMspBinding({ instanceName: 'glrepl.renderer', isMethod: true, isAttribute: true }) +export class GLRender { + + // the main node that all text is drawn to + // for display on videoplane through camera capture + textNode = new WrappedJitterObject("jit.gl.node"); + // the main anim node to position all text according to screensize + animNode = new WrappedJitterObject("jit.anim.node"); + // the anim node and text for the command line + textAnim = new WrappedJitterObject("jit.anim.node"); + + glText = new WrappedJitterObject("jit.gl.text"); + + // the anim node and text for the cursor + crsrAnim = new WrappedJitterObject("jit.anim.node"); + + // the anim node and text for the line numbers + nmbrAnim = new WrappedJitterObject("jit.anim.node"); + + // add all objects to array for easy access when + // changing multiple parameters + glTextObj = { + text: new WrappedJitterObject("jit.gl.text"), + crsr: new WrappedJitterObject("jit.gl.text"), + lnmr: new WrappedJitterObject("jit.gl.text") + } + + // the camera for capture + glCam = new WrappedJitterObject("jit.gl.camera"); + // the videoplane for display in world + glVid = new WrappedJitterObject("jit.gl.videoplane"); + + // matrices for text display + textMtx: JitterMatrix + crsrMtx: JitterMatrix + nmbrMtx: JitterMatrix + + readonly UNIQ: number; + private readonly NODE_CTX: string; + private readonly ANIM_NODE: string; + private readonly CAM_CAP: string; + private readonly DEFAULT_FONT = 'Arial'; + private ACTIVE_FONT = this.DEFAULT_FONT; + private FONT_SIZE = 100; + private MAIN_CTX = "CTX"; + private SCALING = 1; + private CRSR = "<<"; + private CRSR_CHARS = []; + //TODO: can get rid of most accessor functions for these + // and use an annotation to make a binding + private textAlpha = 1; //TODO: why are we not using the a from the rgba? + private useBlink = true; + private blinkToggle = 0; + private isDisabled = false; + + private textColor = new Color(1, 1, 1, 1); + private runColor = new Color(0, 0, 0, 1); + private cursorColor = new Color(1, 0.501961, 0, 1); + private blinkColor = new Color(0.4, 0.8, 1, 1); + + private hideDisplay: boolean = false; + + // THE HORROR!! + constructor(uuid: number) { + + this.UNIQ = uuid; + this.NODE_CTX = "node" + this.UNIQ; + this.ANIM_NODE = "anim" + this.UNIQ; + this.CAM_CAP = "cam" + this.UNIQ; + + this.textMtx = new WrappedJitterMatrix("text" + this.UNIQ); + this.crsrMtx = new WrappedJitterMatrix("crsr" + this.UNIQ); + this.nmbrMtx = new WrappedJitterMatrix("nmbr" + this.UNIQ); + + (this.textNode).fsaa = 1; + (this.textNode).type = "float32"; + (this.textNode).name = this.NODE_CTX; + (this.textNode).adapt = 0; + + (this.animNode).name = this.ANIM_NODE; + (this.animNode).position = [0, 0, 0]; + + (this.textAnim).anim = this.ANIM_NODE; + (this.textAnim).position = [0.9, 0, 0]; + + (this.glTextObj.text).drawto = this.NODE_CTX; + (this.glTextObj.text).anim = (this.textAnim).name; + (this.glTextObj.text).gl_color = this.textColor.toArray(); + (this.glTextObj.text).screenmode = 0; + (this.glTextObj.text).cull_face = 1; + + (this.crsrAnim).anim = this.ANIM_NODE; + (this.crsrAnim).position = [0.9, 0, 0]; + + (this.glTextObj.crsr).drawto = this.NODE_CTX; + (this.glTextObj.crsr).anim = (this.crsrAnim).name; + (this.glTextObj.crsr).gl_color = this.cursorColor.toArray(); + (this.glTextObj.crsr).screenmode = 0; + (this.glTextObj.crsr).cull_face = 1; + (this.glTextObj.crsr).layer = 10; + + (this.nmbrAnim).anim = this.ANIM_NODE; + + (this.glTextObj.lnmr).drawto = this.NODE_CTX; + (this.glTextObj.lnmr).anim = (this.nmbrAnim).name; + (this.glTextObj.lnmr).gl_color = [0.6, 0.6, 0.6, 1]; + (this.glTextObj.lnmr).screenmode = 0; + (this.glTextObj.lnmr).cull_face = 1; + (this.glTextObj.lnmr).layer = 10; + + (this.glCam).drawto = this.NODE_CTX; + (this.glCam).out_name = this.CAM_CAP; + (this.glCam).erase_color = [0, 0, 0, 0]; + (this.glCam).capture = 1; + (this.glCam).ortho = 2; + + (this.glVid).texture = this.CAM_CAP; + (this.glVid).transform_reset = 2; + (this.glVid).blend_enable = 1; + (this.glVid).depth_enable = 0; + (this.glVid).layer = 1000; + (this.glVid).blend = "difference"; + + this.font(this.DEFAULT_FONT) + this.setCursorChars(this.CRSR) + } + + /* istanbul ignore next */ + /* + * free all the jitter objects, called via [freebang] in abstraction + * it is not routed so can only be called from inside the abstraction + * and as such is not available for use + */ + @maxMspBinding({ isAttribute: false, isMethod: false, noroute: true, functionName: "_close" }) + destroy() { + this.textNode.freepeer() + this.animNode.freepeer() + this.textAnim.freepeer() + this.glText.freepeer() + this.crsrAnim.freepeer() + this.nmbrAnim.freepeer() + this.glTextObj.text.freepeer() + this.glTextObj.crsr.freepeer() + this.glTextObj.lnmr.freepeer() + this.glCam.freepeer() + this.glVid.freepeer() + } + + /* + * Set the render context for displaying the repl. + * This is the same as the rendering-context argument + */ + @maxMspBinding({ isAttribute: false }) + drawto(v: string) { + this.MAIN_CTX = v; + (this.textNode).drawto = this.MAIN_CTX; + (this.glVid).drawto = this.MAIN_CTX; + } + + /* + * set the text position. + * This is mostly called internally to dynamically resize text and should not need to be called by the user + * in regular use of the repl + */ + @maxMspBinding({ customHandler: 'textScalingHandler' }) + position(x: number, y: number) { + (this.animNode).position = [x, y, 0]; + } + + /* + * set the text scaling. + * This is mostly called internally to dynamically resize text and should not need to be called by the user + * in regular use of the repl + */ + @maxMspBinding({ customHandler: 'textScalingHandler' }) + scale(s: number) { + this.SCALING = s * 100 / this.FONT_SIZE; + (this.animNode).scale = [this.SCALING, this.SCALING, 0]; + } + + hideText(hide: boolean) { + this.hideDisplay = hide; + } + + draw(textBuf: Array, pos: CursorPosition) { + if (this.hideDisplay) { + this.textMtx.setall([0]); + this.crsrMtx.setall([0]); + this.nmbrMtx.setall([0]); + } else { + this.drawText(textBuf); //place the strings as text in a matrix + this.drawCursor(textBuf, pos); //draw the cursor position in a matrix + this.drawNumbers(textBuf, pos); //draw the line numbers in a matrix + } + this.matrixToText(); //set the matrices to the gl text objects + } + + // draw the text to a jitter matrix as ascii + drawText(textBuf: Array) { + //Uses the Array extension which you can see code for in TextBuffer.ts + const maxChars = textBuf.getMaxChar() + this.textMtx = new WrappedJitterMatrix("text" + this.UNIQ, 1, "char", maxChars, textBuf.length); + this.textMtx.setall([0]); + // draw all the characters as ascii code in a matrix + for (var l = 0; l < textBuf.length; l++) { + // check if not an empty line/string + if (!textBuf[l].match(/^[ \t]*$/g)) { + for (var c = 0; c < textBuf[l].length; c++) { + this.textMtx.setcell2d(c, l, textBuf[l].charCodeAt(c)); + } + } + } + } + + // draw the cursor to a jitter matrix as ascii + drawCursor(textBuf: Array, cur: CursorPosition) { + const maxChars = textBuf.getMaxChar() + // TODO: If you don't draw something into every cell and put something proper other than + // space into each line it does not want to draw the cursor properly! + // why is this! it sucks! + // To work around this we make a massively wide matrix and fill it with spaces and a single dot! + this.crsrMtx = new WrappedJitterMatrix("crsr" + this.UNIQ, 1, "char", 1000, textBuf.length); + this.crsrMtx.setall([32]); + for (var i = 0; i < textBuf.length; i++) { + this.crsrMtx.setcell2d(999, i, 46); + } + for (var c = 0; c < this.CRSR_CHARS.length; c++) { + this.crsrMtx.setcell2d(cur.char + c, cur.line, this.CRSR_CHARS[c]); + } + } + + // draw the numbers to a jitter matrix as ascii + drawNumbers(textBuf: Array, pos: CursorPosition) { + this.nmbrMtx = new WrappedJitterMatrix("nmbr" + this.UNIQ, 1, "char", 3, textBuf.length); + for (var i = 0; i < textBuf.length; i++) { + var digits = new Array(2); + digits[0] = String(Math.floor((i) / 10)); + digits[1] = String((i) % 10); + if (digits[0] == 0) { + digits[0] = " "; + } + for (var n = 0; n < 2; n++) { + this.nmbrMtx.setcell2d(n, i, digits[n].charCodeAt(0)); + } + } + this.nmbrMtx.setcell2d(0, pos.line, 62); + this.nmbrMtx.setcell2d(1, pos.line, 62); + } + + matrixToText() { + (this.glTextObj.text).jit_matrix(this.textMtx.name); + (this.glTextObj.crsr).jit_matrix(this.crsrMtx.name); + (this.glTextObj.lnmr).jit_matrix(this.nmbrMtx.name); + } + + /* + * set the text colour. + * R G B A format where A is optional and default set to 1.0 + */ + @maxMspBinding({ functionName: "color" }) + setTextColor(r: number, g: number, b: number, a: number = 1.0) { + this.color(new Color(r, g, b, a)) + } + + color(color: Color) { + this.textColor = color; + (this.glTextObj.text).gl_color = color.toArray(); + } + + getTextColor() { + return this.textColor; + } + + /* + * set the run colour. + * This is the colour things change to briefly when the run/execute function is called + * R G B A format where A is optional and default set to 1.0 + */ + @maxMspBinding({}) + run_color(r: number, g: number, b: number, a: number = 1.0) { + this.runColor = new Color(r, g, b, a); + } + + /* + * set the line number colour. + * R G B A format where A is optional and default set to 1.0 + */ + @maxMspBinding({}) + number_color(r: number, g: number, b: number, a: number = 1.0) { + const color = new Color(r, g, b, a); + (this.glTextObj.lnmr).gl_color = color.toArray(); + } + + /* + * set the cursor character colour. + * R G B A format where A is optional and default set to 1.0 + */ + @maxMspBinding({}) + cursor_color(r: number, g: number, b: number, a: number = 1.0) { + const color = new Color(r, g, b, a); + this.cursorColor = color; + this.blink(); + } + + /* + * set the cursor characters. + * default is << + */ + @maxMspBinding({ draw: true, functionName: 'cursor' }) + setCursorChars(c: string) { + this.CRSR = c.toString(); + this.CRSR_CHARS = []; + for (var i = 0; i < this.CRSR.length; i++) { + this.CRSR_CHARS.push(this.CRSR[i].charCodeAt(0)); + } + } + + getCursorChars() { + return this.CRSR_CHARS; + } + + /* + * Turn the blinking cursor on and off. + * In normal operation this is called internally when ignore_keys is true to give + * a visual indication of the locked state of the repl. + */ + @maxMspBinding({}) + blink_enable(v: boolean) { + this.useBlink = v; + } + + /* + * set the blink colour. + * R G B A format where A is optional and default set to 1.0 + */ + @maxMspBinding({}) + blink_color(r: number, g: number, b: number, a: number = 1.0) { + const color = new Color(r, g, b, a); + this.blinkColor = color; + } + + + /* + * runs the blink command, called internally in abstraction and not exposed via routing + */ + @maxMspBinding({ noroute: true, isMethod: false, isAttribute: false }) + runBlink(t: number) { + var c = []; + var carr = this.textColor.toArray() + var runc = this.runColor.toArray() + for (var i = 0; i < carr.length; i++) { + c[i] = carr[i] * (1 - t) + runc[i] * t; + } + (this.glTextObj.text).gl_color = c; + } + + /* + * blinks the cursor + * called internally and not exposed to the router + */ + @maxMspBinding({ noroute: true, isMethod: false, isAttribute: false }) + blink() { + if (this.useBlink) { + this.blinkToggle = 1 - this.blinkToggle; + if (this.blinkToggle) { + (this.glTextObj.crsr).gl_color = this.blinkColor.toArray(); + } else { + (this.glTextObj.crsr).gl_color = this.cursorColor.toArray(); + } + } else { + (this.glTextObj.crsr).gl_color = this.cursorColor.toArray(); + } + } + + //CHANGE ALL FUNCTIONS + //Things below here change all things in the text objects + alpha(a: number) { + this.textAlpha = Math.max(0, Math.min(1, a)); + for (const [k, v] of Object.entries(this.glTextObj)) { + var c = (v).gl_color; + c[3] = this.textAlpha; + (v).gl_color = c; + } + } + + //TODO: tighten type + cull_face(c: any) { + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).cull_face = c; + } + } + + /* + * set the font. + * set the font by name in all objects, should be the name of a valid font installed on the system + */ + @maxMspBinding({}) + font(f: string) { + this.ACTIVE_FONT = f; + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).font(f); + } + } + + activeFont(): string { + return this.ACTIVE_FONT + } + + fontsize(s: number) { + this.FONT_SIZE = s; + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).size(this.FONT_SIZE); + } + this.scale(this.SCALING); + } + + getFontSize(): number { + return this.FONT_SIZE + } + + /* + * set the lead scale + * float value + */ + @maxMspBinding({}) + leadscale(l: number) { + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).leadscale = l; + } + } + + disableText(state: boolean) { + this.isDisabled = state; + this.alpha(1.0 - Number(this.isDisabled) * 0.5); + } + + textDisabled() { + return this.isDisabled; + } + + /* + * set the tracking on the gl text objects + */ + @maxMspBinding({}) + tracking(t: any) { + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).tracking = t; + } + } + + line_length(l: number) { + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).line_length = l; + } + } + + line_width(w: number) { + for (const [k, v] of Object.entries(this.glTextObj)) { + (v).line_width = w; + } + } +} \ No newline at end of file diff --git a/javascript/src/KeypressProcessor/KeypressProcessor.test.ts b/javascript/src/KeypressProcessor/KeypressProcessor.test.ts new file mode 100644 index 0000000..dd714e9 --- /dev/null +++ b/javascript/src/KeypressProcessor/KeypressProcessor.test.ts @@ -0,0 +1,284 @@ +import test from 'ava'; +import { KeypressProcessor, KeyProcessor } from './KeypressProcessor'; + +test('Test attachFunctions and processKeypress', t => { + const keypressProcessor = new KeypressProcessor(); + keypressProcessor.attachFunctions('testFunc1', 25, [() => { return 'A pressed'; }]); + keypressProcessor.attachFunctions('testFunc2', 25, [() => { return 'A pressed again'; }]); + const funcs = keypressProcessor.processKeypress(25); + t.is(funcs.length, 2); + t.is(funcs[0](1, {}), 'A pressed'); + t.is(funcs[1](1, {}), 'A pressed again'); +}); + +test('Test attachFunctions with an array', t => { + const keypressProcessor = new KeypressProcessor(); + keypressProcessor.attachFunctions('testFunc1', 20, [() => { return 'A pressed'; }, () => { return 'A pressed again'; }]); + const funcs = keypressProcessor.processKeypress(20); + t.is(funcs.length, 2); + t.is(funcs[0](1, {}), 'A pressed'); + t.is(funcs[1](1, {}), 'A pressed again'); +}); + +function testReply() { + return 'hello!'; +} +test('Test attachFunctions with a function reference', t => { + const keypressProcessor = new KeypressProcessor(); + keypressProcessor.attachFunctions('testFunc1', -3, [testReply]); + const funcs = keypressProcessor.processKeypress(-3); + t.is(funcs.length, 1); + t.is(funcs[0](1, {}), 'hello!'); +}); + +test('Test replaceFunctions and processKeypress', t => { + const keypressProcessor = new KeypressProcessor(); + keypressProcessor.replaceFunctions('testFunc3', 10, [() => { return 'B pressed' }]); + const funcs = keypressProcessor.processKeypress(10); + t.is(funcs.length, 1); + t.is(funcs[0](1, {}), 'B pressed'); +}); + +test('Test loadConfigFromJSON', t => { + const jsonConfig = `{ + "bindings":[ + { + "id": "testFunc4", + "asciiCode": 1, + "functions": [ + "return('C pressed function 1');", + "return('C pressed function 2');" + ] + }, + { + "id": "testFunc5", + "asciiCode": 2, + "functions": "return('D pressed');" + } + ]}`; + + const keypressProcessor = new KeypressProcessor(); + keypressProcessor.loadConfigFromJSON(jsonConfig); + + const funcsC = keypressProcessor.processKeypress(1); + t.is(funcsC.length, 2); + t.is(funcsC[0](1, {}), 'C pressed function 1'); + t.is(funcsC[1](1, {}), 'C pressed function 2'); + + const funcsD = keypressProcessor.processKeypress(2); + t.is(funcsD.length, 1); + t.is(funcsD[0](1, {}), 'D pressed'); + +}); + +test('Test processKeypress with character keys', t => { + const keypressProcessor = new KeypressProcessor(); + const funcs = keypressProcessor.processKeypress(34); + t.is(funcs.length, 0); + //t.is(funcs[0](), 'to customize call replaceFunctions on 127'); + + keypressProcessor.replaceFunctions('alphanum', 127, [() => { return 'ok' }]); + for (let index = 33; index < 127; index++) { + const funcs = keypressProcessor.processKeypress(index); + t.is(funcs.length, 1); + t.is(funcs[0](1, {}), 'ok'); + } +}); +test('Test processKeypress with non-existent key code', t => { + const keypressProcessor = new KeypressProcessor(); + const funcs = keypressProcessor.processKeypress(129); + t.deepEqual(funcs, []); +}); + + +test('customAlphaNum overrides alphanum key processing when set to true', t => { + const kp = new KeypressProcessor(); + const testFunc = () => { return 'testing'; }; + kp.replaceFunctions('alphanum', 127, [testFunc]); + + kp.customAlphaNum(true); + const results = kp.processKeypress(36); // + t.is(results.length, 0); + t.deepEqual(results, []); + + kp.customAlphaNum(false); + const results2 = kp.processKeypress(36); // + t.is(results2.length, 1); + t.deepEqual(results2[0](1, {}), 'testing'); +}); + +test('customAlphaNum does not override alphanum key processing when set to false', t => { + const kp = new KeypressProcessor(); + const testFunc = () => { return 'override' }; + kp.replaceFunctions('alphanum', 127, [testFunc]); + + kp.customAlphaNum(false); + const results = kp.processKeypress(65); // 'A' key + t.is(results.length, 1); + t.deepEqual(results[0](1, {}), 'override'); + + kp.customAlphaNum(true); + const results2 = kp.processKeypress(65); // 'A' key + t.is(results2.length, 0); + t.deepEqual(results2, []); +}); + +test('customAlphaNum sets overrideAlphaNum property correctly', t => { + const kp = new KeypressProcessor(); + + kp.customAlphaNum(true); + t.true(kp.overrideAlphaNum); + + kp.customAlphaNum(false); + t.false(kp.overrideAlphaNum); +}); + +test('loadConfigFromJSON should attach functions specified in JSON config', (t) => { + const processor = new KeypressProcessor(); + + const functionOne = (k: number, ctx: {}) => { + return `Function One called with key: ${k} and context: ${ctx}`; + }; + + const functionTwo = (k: number, ctx: {}) => { + return `Function Two called with key: ${k} and context: ${ctx}`; + }; + + processor.preloadFunction('functionOne', functionOne); + processor.preloadFunction('functionTwo', functionTwo); + + //Need to say this is custom alpha as we will bind to key id 65 + processor.customAlphaNum(true) + + const config = JSON.stringify({ + "bindings": [ + { + id: 'testConfig', + asciiCode: 65, + functions: ['functionOne', 'functionTwo'], + }, + ] + }); + + processor.loadConfigFromJSON(config); + + const res = processor.processKeypress(65); + + t.is(res.length, 2); + const res1 = res[0](65, {}) + const res2 = res[1](65, {}) + t.is(res1, "Function One called with key: 65 and context: [object Object]") + t.is(res2, "Function Two called with key: 65 and context: [object Object]") +}); + +test('preloading a function to a non alphanumerical key works without override true', (t) => { + const processor = new KeypressProcessor(); + + const functionOne = (k: number, ctx: {}) => { + return `Function One called with key: ${k} and context: ${ctx}`; + }; + processor.preloadFunction('deckardsDream', functionOne); + + const config = JSON.stringify({ + "bindings": [ + { + id: 'testConfig', + asciiCode: 356, + functions: ['deckardsDream'], + }, + ] + }); + + processor.loadConfigFromJSON(config); + + const res = processor.processKeypress(356); + + t.is(res.length, 1); + const res1 = res[0](356, {}) + t.is(res1, "Function One called with key: 356 and context: [object Object]") +}); + +test('processKeypress method overrides alphaNum processing if overrideAlphaNum is true', (t) => { + const keypressProcessor = new KeypressProcessor(); + // Attach test functions to ASCII code 127 (used for general alphanumeric keys if overrideAlphaNum is false) + keypressProcessor.attachFunctions('alphanum', 127, [ + (k: number, ctx: any) => { + return 'Alphanumeric handler executed'; + }, + ]); + + // Set overrideAlphaNum to true to disable default alphanumeric processing + keypressProcessor.customAlphaNum(true); + + // Generate an alphanumeric keypress event (ASCII code between 33 and 126) + const alphaNumKeyCode = 65; // 'A' + const result = keypressProcessor.processKeypress(alphaNumKeyCode); + + // Verify that default alphanumeric processing was not called + t.is(result.length, 0); +}); + +test('processKeypress method does not override alphaNum processing if overrideAlphaNum is false', (t) => { + const keypressProcessor = new KeypressProcessor(); + // Attach test functions to ASCII code 127 (used for general alphanumeric keys if overrideAlphaNum is false) + keypressProcessor.attachFunctions('alphanum', 127, [ + (k: number, ctx: any) => { + return 'Alphanumeric handler executed'; + }, + ]); + + // Set overrideAlphaNum to false to enable default alphanumeric processing + keypressProcessor.customAlphaNum(false); + + // Generate an alphanumeric keypress event (ASCII code between 33 and 126) + const alphaNumKeyCode = 65; // 'A' + const result = keypressProcessor.processKeypress(alphaNumKeyCode); + + // Verify that default alphanumeric processing was called + t.is(result.length, 1); + t.is(result[0](alphaNumKeyCode, null), 'Alphanumeric handler executed'); +}); + +test('processKeypress method calls both default key handler and custom function if overrideAlphaNum is false', (t) => { + const keypressProcessor = new KeypressProcessor(); + // Attach test functions to ASCII code 127 (used for general alphanumeric keys if overrideAlphaNum is false) + keypressProcessor.attachFunctions('alphanum', 127, [ + (k: number, ctx: any) => { + return 'Alphanumeric handler executed'; + }, + ]); + + + // Attach test function to an alphanumeric key + const alphaNumKeyCode = 65; // 'A' + keypressProcessor.attachFunctions('custom', alphaNumKeyCode, [ + (k: number, ctx: any) => { + return 'Custom handler executed'; + }, + ]); + + // Set overrideAlphaNum to false to enable default alphanumeric processing + keypressProcessor.customAlphaNum(false); + + // Generate an alphanumeric keypress event + const result = keypressProcessor.processKeypress(alphaNumKeyCode); + + // Verify that both default alphanumeric processing and custom function were called + t.is(result.length, 2); + t.is(result[0](alphaNumKeyCode, null), 'Alphanumeric handler executed'); + t.is(result[1](alphaNumKeyCode, null), 'Custom handler executed'); + +}); + +test("loadConfigFromJSON changes overrideAlphaNum", (t) => { + const kp = new KeypressProcessor(); + + const config = JSON.stringify({ + settings: { + keypressProcessor: { overrideAlphaNum: true }, + }, + }); + + kp.loadConfigFromJSON(config); + t.true(kp.overrideAlphaNum); +}); \ No newline at end of file diff --git a/javascript/src/KeypressProcessor/KeypressProcessor.ts b/javascript/src/KeypressProcessor/KeypressProcessor.ts new file mode 100644 index 0000000..b1087d8 --- /dev/null +++ b/javascript/src/KeypressProcessor/KeypressProcessor.ts @@ -0,0 +1,116 @@ +import { maxMspBinding } from "MaxBindings" + +//Used internally but not exposed as users add functions directly +interface FunctionIdentifier { + id: string + functions: Array +} + +interface FunctionBinding { + id: string + asciiCode: number + functions: Array +} + +export type KeyProcessor = (k: number, ctx: any) => any + +@maxMspBinding({ instanceName: 'i.repl.kp' }) +export class KeypressProcessor { + + private attachedFunctions: { [key: string]: Array } = {}; + private preloadedFunctions: { [key: string]: KeyProcessor } = {}; + overrideAlphaNum: boolean + + constructor() { + //this.attachFunctions('alphanum hint', 127, () => { return 'to customize call replaceFunctions on 127' }); + this.overrideAlphaNum = false + } + + //if you dont want to invoke the generic handler for alphanumerical characters set this to true + //TODO: do we want to also execute specifcally attached functions to keys when false? + //recurse keypress function with output context to do this + customAlphaNum(state: boolean) { + this.overrideAlphaNum = state; + } + + //preload a function so we can refer to it in our json config later + //function should have the signature (k, ctx) where k is the key pressed and context is whatever you need to send to it + //preloaded functions can ONLY be bound via json files. They are not meant to be added in code!!!! attach functions directly instead + preloadFunction(id: string, func: KeyProcessor) { + this.preloadedFunctions[id] = func; + } + + // Function to attach a function to an ASCII code + attachFunctions(id: string, keyCode: number, funcs: Array) { + if (!this.attachedFunctions[keyCode]) { + this.attachedFunctions[keyCode] = []; + } + this.attachedFunctions[keyCode].push({ + id: id, + functions: funcs, + }); + } + + // Function to replace functions attached to an ASCII code + replaceFunctions(id: string, keyCode: number, func: Array) { + this.attachedFunctions[keyCode] = []; + this.attachFunctions(id, keyCode, func); + } + + // Function to process a keypress and return any attached functions + processKeypress(k: number): Array { + //to handle general alphanumeric keys we do a little trickery here + let funcs: FunctionIdentifier[] = []; + if (k > 32 && k <= 126) { + if (this.overrideAlphaNum === false) { + funcs = funcs.concat(this.attachedFunctions[127] ?? []) + } + } + funcs = funcs.concat(this.attachedFunctions[k] ?? []) // Get the attached functions, if any + // const fId = (k > 32 && k <= 126 && this.overrideAlphaNum === false) ? 127 : k; + const results = []; + if (funcs && funcs.length > 0) { + // If there are attached functions, call each one with the event object as the argument + for (const func of funcs) { + for (const f of func.functions) { + results.push(f); + } + } + } + return results; + } + + // Function to load configuration from a JSON object + loadConfigFromJSON(config: string) { + const json = JSON.parse(config); + + if (json.settings?.keypressProcessor?.overrideAlphaNum ?? false) { + this.overrideAlphaNum = json.settings.keypressProcessor.overrideAlphaNum + } + + this.attachedFunctions = {}; + + if (json.bindings === undefined) + return; + + json.bindings.forEach((item: FunctionBinding) => { + const id = item.id; + const asciiCode = item.asciiCode; + const functions = item.functions; + const functionArray = Array.isArray(functions) ? functions : [functions]; + const parsedFunctions = functionArray.map((funcString) => { + //If we have preloaded a function with this name then include it + const func = this.preloadedFunctions[funcString]; + let f = undefined; + if (func !== undefined) { + f = func; + } else { + //otherwise assume it is a direct function body and wrap it in a Function + f = new Function('k', 'ctx', funcString); + } + return f; + }, this); + this.replaceFunctions(id, asciiCode, parsedFunctions); + }); + } +} diff --git a/javascript/src/KeypressProcessor/example.json b/javascript/src/KeypressProcessor/example.json new file mode 100644 index 0000000..db8bc8d --- /dev/null +++ b/javascript/src/KeypressProcessor/example.json @@ -0,0 +1,28 @@ +{ + "settings": { + "repl": { + "MAX_CHARS": 40, + "INDENTATION": 4, + "BUFFER_SIZE": 30, + "CMNT": "//" + }, + "keypressProcessor": { + "overrideAlphaNum": true + } + }, + "bindings": [ + { + "id": "testFunc4", + "asciiCode": 67, + "functions": [ + "return(k+' pressed function 1');", + "return('C pressed function 2');" + ] + }, + { + "id": "testFunc5", + "asciiCode": 68, + "functions": "myFunctionName" + } + ] +} \ No newline at end of file diff --git a/javascript/src/KeypressProcessor/keyhandler.old.js b/javascript/src/KeypressProcessor/keyhandler.old.js new file mode 100644 index 0000000..6c1f25d --- /dev/null +++ b/javascript/src/KeypressProcessor/keyhandler.old.js @@ -0,0 +1,138 @@ + +//Keybindings +var keyList = [] +function keyDef(id, code, hint) { + return { + id: id, + code: code, + hint: hint + } +} +var intKeys = [ + keyDef("space", -2, ""), + keyDef("escape", -3, ""), + keyDef("return", -4, ""), + keyDef("tab", -5, ""), + keyDef("delete", -6, ""), + keyDef("backspace", -7, ""), + keyDef("up", -9, ""), + keyDef("down", -10, ""), + keyDef("left", -11, ""), + keyDef("right", -12, ""), +]; + + +function procDef(id, call) { + return { + id: id, + call: call, + } +} +const intProc = [ + procDef(-2, function (k, wm) { wm.addChar(32); }), + procDef(-3, function (k, wm) { }), + procDef(-4, function (k, wm) { wm.newLine(); }), + procDef(-5, function (k, wm) { addTab(); }), + procDef(-6, function (k, wm) { wm.deleteChar(); }), + procDef(-7, function (k, wm) { wm.backSpace(); }), + procDef(-9, upDown), + procDef(-10, upDown), + procDef(-11, leftRight), + procDef(-12, leftRight), +] + +function upDown(k, wm) { + wm.gotoLine(1 - (k + 10)); +} + +function leftRight(k, wm) { + wm.gotoCharacter(1 - (k + 12)); +} + + +var processors = intProc; + +// load keybindings from json file +exports.setBindings = function (dict) { + keyList = intKeys; + var keys = sKeys.getkeys() + for (let i = 0; i < keys.length; i++) { + var binding = sKeys.get(keys[i]); + keyList.append(keyDef(keys[i], binding[1], binding[0])); + } +} + +exports.addProcessor = function (proc) { + processors.append(proc); +} + +// choose method based on keypress +exports.handle = function (k) { + + var exists = keyList.filter(obj => { + return obj.code === k + }) + if (exists !== undefined || exists.length > 0) { + var pList = processors.filter(obj => { + return obj.code === k + }) + return pList; + } else if (k > 32 && k <= 126) { + return [function (k, wm) { wm.addChar(k) }] + } else { + post("unknown keypress: @char", k, "\n"); + return []; + } + // post("@char", k, "\n"); + if (k == sKeys.get("disable-editor")[1]) { + disableText(); + } + else if (!isDisabled) { + // CHARACTER KEYS + if (k > 32 && k <= 126) { addChar(k); } + + + // arrow keys ASCII + // else if (k == 30 || k == 31){ gotoLine(k-30); } + // else if (k == 28 || k == 29){ gotoCharacter(k-28); } + + // SHORTKEYS + else if (k == sKeys.get("comment")[1]) { commentLine(); } + + else if (k == sKeys.get("delete-line")[1]) { deleteLine(); } + else if (k == sKeys.get("copy-line")[1]) { copyLine(); } + else if (k == sKeys.get("copy-all")[1]) { copyAll(); } + else if (k == sKeys.get("paste-line")[1]) { pasteInsertLine(); } + else if (k == sKeys.get("paste-replace-line")[1]) { pasteReplaceLine(); } + + else if (k == sKeys.get("clear")[1]) { clear(); } + else if (k == sKeys.get("ephemeral-mode")[1]) { EPHEMERAL_MODE = !EPHEMERAL_MODE; } + // else if (k == ALT_B){ backSpace(); } + + // Jump Top/Bottom/Start/End with ALT + Arrow Keys + else if (k == sKeys.get("jump-top")[1]) { jumpTo(2); } + else if (k == sKeys.get("jump-bottom")[1]) { jumpTo(3); } + else if (k == sKeys.get("jump-begin")[1]) { jumpTo(0); } + else if (k == sKeys.get("jump-end")[1]) { jumpTo(1); } + + // Navigate the editor with ASDW + else if (k == sKeys.get("left")[1]) { gotoCharacter(0); } + else if (k == sKeys.get("right")[1]) { gotoCharacter(1); } + else if (k == sKeys.get("down")[1]) { gotoLine(1); } + else if (k == sKeys.get("up")[1]) { gotoLine(0); } + + else if (k == sKeys.get("jump-word-left")[1]) { gotoWord(0); } + else if (k == sKeys.get("jump-word-right")[1]) { gotoWord(1); } + + // Jump to top/bottom + // else if (k == ALT_Q){ jumpTo(2); } + // else if (k == ALT_SHFT_Q){ jumpTo(3); } + + // TO-DO + // else if (k == ALT_Z){ getHistory(); } + } + + // for (var t=0; t line.replace(/(\/\/|[\/*])/g, '')) + .join(' ') + .trim(); + return cleanComment; +}); + +Handlebars.registerHelper('firstSentanceOrLine', function (comment: string) { + const cleanComment = comment.split('\\n') + .map(line => line.replace(/(\/\/|[\/*])/g, '')) + .join('\n') + .trim(); + return cleanComment.split(/[.\n]/, 1)[0]; +}); + + +// Using a self-invoking function just to illustrate the closure +(function () { + // Start at 1, name this unique to anything in this closure + var positionCounter = 0; + + Handlebars.registerHelper('outletCounter', function () { + return positionCounter++; + }); + + // Compile/render your template here + // It will use the helper whenever it seems position +})(); + + +Handlebars.registerHelper('maxSelfReference', function (name: string) { + return (name === "this") +}); + +Handlebars.registerHelper("truthy", function (conditional, options): any { + if (conditional === 'true' || conditional === true) { + // @ts-ignore + return options.fn(this); + } else { + // @ts-ignore + return options.inverse(this); + } +}); + +Handlebars.registerHelper('isTextArgument', function (name: string, options): any { + if (name === 'text') { + // @ts-ignore + return options.fn(this); + } else { + // @ts-ignore + return options.inverse(this); + } +}); + +Handlebars.registerHelper('moreThanOne', function (a: string, options): any { + if (a.length > 1) { + // @ts-ignore + return options.fn(this); + } + // @ts-ignore + return options.inverse(this); +}); + +//code types +//string number boolean unknown any string[] +//max types +//bang signal signal/float float int symbol list +const inputTypes = [ + { name: 'string', outputType: 'symbol' }, + { name: 'number', outputType: 'float' }, + { name: 'boolean', outputType: 'bang/int' }, + { name: 'any', outputType: 'symbol' }, + { name: 'string[]', outputType: 'list' }, +]; +Handlebars.registerHelper('maxTypeMapper', function (jsType) { + const typeMapping = inputTypes.find(type => type.name === jsType); + + if (typeMapping) { + return typeMapping.outputType; + } else { + return jsType; + //throw new Error(`Invalid input type: ${jsType}`); + } +}); + +function getCustomFunctionDefinitions(): Array { + let genFuncs: any = [] + //Add all of our custom functionsa which live in our template and which are not generated on the fly + // adding them here makes sure they also get added to the router and output appropriately to a mix + // of custom handlers, the default out, back to the js object etc. + genFuncs.push({ + functionName: "init", + noroute: true, + isMethod: true, + isAttribute: false, + paramCount: 0, + comment: "Initialize the repl. This sets everything up and will clear the display etc. You should not need to call this in normal operation, prefer clear to empty the buffer. Loading a new settings dict will implictly call init()" + }); + genFuncs.push({ + functionName: "ignore_keys", + noroute: true, + isMethod: true, + isAttribute: true, + paramCount: 0, + comment: "Will stop the repl listening for any keypress, it will also stop blink from running as a visual indicator. Note that if you call this from within the repl you obviously can't start it again so you need to send a message from max to enable again" + }); + genFuncs.push({ + functionName: "keyPress", + noroute: false, + isMethod: true, + isAttribute: false, + paramCount: 0, + handlerInlet: 1, + customHandler: "ignoreKeyGate", + comment: "Process a keypress with the repl. This method is usually only called internally, but it is useful to expose in the router for functionality related to clipboard pasting. If in doubt you probably shouldn't be calling this from your code or configuration!" + }); + genFuncs.push({ + functionName: "replay", + noroute: false, + isMethod: true, + isAttribute: false, + paramCount: 0, + handlerInlet: 0, + comment: "Replay some text into the repl, passing it through the keyPress function. This may or may not insert it into the buffer depending on configuration" + }); + genFuncs.push({ + functionName: "run", + customHandler: "runHandler", + handlerInlet: 0, + isMethod: true, + isAttribute: false, + paramCount: 0, + comment: "output all the code in the repl, after passing it through attached formatters" + }); + genFuncs.push({ + functionName: "run_line", + customHandler: "runHandler", + handlerInlet: 0, + noRoute: false, + isMethod: true, + isAttribute: false, + paramCount: 0, + comment: "output the currently selected line of code in the repl, after passing it through attached formatters" + }); + genFuncs.push({ + functionName: "read", + customHandler: "readHandler", + handlerInlet: 0, + isMethod: true, + isAttribute: false, + paramCount: 1, + comment: "read (playback) a file into the repl through the keypress handler. Optional first argument for filename otherwise opendialog", + params: [ + { + name: "filename", + default: false, + type: "string", + } + ] + }); + genFuncs.push({ + functionName: "write", + customHandler: "writeHandler", + handlerInlet: 0, + isMethod: true, + isAttribute: false, + paramCount: 1, + params: [ + { + name: "filename", + default: false, + type: "string", + } + ], + comment: "write all the data in the repl to a file. Optional first argument for file otherwise savedialog. format_writes true/false (0/1) will affect if the output is passed throguh the formatters before being written to disk" + }); + genFuncs.push({ + functionName: "keybindings", + customHandler: "this", + handlerInlet: 0, + isMethod: true, + isAttribute: false, + paramCount: 1, + params: [ + { + name: "dictid", + default: false, + type: "string", + } + ], + comment: "pass the name of a dict containing the config for the repl. By default loads shortkeys.json provided with the project. Cannot be used as an attribute so send you app configuration with a loadbang referencing a dict name instead" + }); + genFuncs.push({ + functionName: "output_matrix", + handlerInlet: 0, + isMethod: true, + isAttribute: true, + paramCount: 1, + params: [ + { + name: "v", + default: false, + type: "bang/int", + } + ], + comment: "If true then also output the text matrix name behind the command routing jit_matrix when code is run. Note that this does not stop other messages being output from the repl" + }); + genFuncs.push({ + functionName: "supress_output", + handlerInlet: 0, + isMethod: true, + isAttribute: true, + paramCount: 1, + params: [ + { + name: "v", + default: false, + type: "bang/int", + } + ], + comment: "If true then dont output the formatted messages. Can be used with output_matrix to only output the jit_matrix name from the repl" + }); + genFuncs.push({ + functionName: "ephemeral_mode", + handlerInlet: 0, + isAttribute: true, + isMethod: true, + paramCount: 1, + params: [ + { + name: "v", + default: false, + type: "bang/int", + } + ], + comment: "if true then after a run the text or line which was executed will be deleted from the repl" + }); + genFuncs.push({ + functionName: "format_writes", + handlerInlet: 0, + isAttribute: true, + isMethod: true, + paramCount: 1, + params: [ + { + name: "v", + default: false, + type: "bang/int", + } + ], + comment: "if true then run the repl content through formatters before saving to disk. if not dump directly. Defaults to true" + }); + genFuncs.push({ + functionName: "output_paste_bin", + customHandler: "this", + handlerInlet: 0, + isMethod: true, + isAttribute: false, + paramCount: 0, + comment: "output the current contents of the pastebin from the second outlet. You should bind this to a key. See default bindings for example" + }); + genFuncs.push({ + functionName: "hide_text", + handlerInlet: 0, + isAttribute: true, + isMethod: true, + paramCount: 1, + params: [ + { + name: "hide", + default: false, + type: "bang/int", + } + ], + comment: "if true then hide all text rendering in the repl" + }) + + return genFuncs; +} +export class MaxGenerator { + + readonly projectDir: string; + readonly srcDir: string; + readonly outputDir: string; + readonly outputPath: string; + + templateFiles = {} + + templates: { [k: string]: HandlebarsTemplateDelegate; } + + constructor(projectDir: string, templateFiles: any, outDir: string = 'dist', fileName: string = 'tw.gl.repl.js') { + this.templateFiles = templateFiles + this.projectDir = projectDir + this.srcDir = path.join(this.projectDir, 'src'); + this.outputDir = path.join(this.projectDir, outDir); + this.outputPath = path.join(this.outputDir, fileName); + + this.templates = Object.fromEntries( + Object.entries(this.templateFiles).map(([name, filePath]) => { + return [name, Handlebars.compile(fs.readFileSync(filePath as any, 'utf8'))]; + }) + ); + } + + generate(filteredFiles: Array, checker: ts.TypeChecker) { + let bindings = new Map(); + for (const file of filteredFiles) { + bindings = this.mergeMaps(bindings, this.findMaxMspBindings(file, checker)) + } + + // // Write the generated code to a file + this.writeGeneratedCode(bindings); + } + + //helper function to merge all the maps we are going to make of bindings + protected mergeMaps(map1: Map, map2: Map): Map { + return new Map([...map1, ...map2]); + } + + protected uniq(array: T[]) { + return array.filter((value, index) => array.indexOf(value) === index); + } + + writeGeneratedCode(bindings: Map) { + //Implement this in a child class and write a file + //fs.writeFileSync(this.outputPath, generatedCode); + } + + protected findMaxMspBindings(sourceFile: ts.SourceFile, checker: ts.TypeChecker): Map { + const bindings = new Map(); + let classOptions: MaxMspBindingOptions = {}; + const visit = (node: ts.Node) => { + //function visit(node: ts.Node) { + const kindName = ts.SyntaxKind[node.kind]; + if (ts.isClassDeclaration(node)) { + const decorators = ts.canHaveDecorators(node) ? ts.getDecorators(node) : undefined; + if (decorators === undefined) + return; + let maxMspBindingDecorator = decorators.find(dec => ts.isIdentifier((dec.expression).expression) && ((dec.expression).expression.escapedText === 'maxMspBinding')); + if (maxMspBindingDecorator) { + classOptions = this.extractBindings((maxMspBindingDecorator?.expression).arguments[0], checker) + } + } else if (ts.isMethodDeclaration(node)) { + //const decorators = ts.canHaveModifiers(node) ? ts.getModifiers(node) : undefined; + const decorators = ts.canHaveDecorators(node) ? ts.getDecorators(node) : undefined; + if (decorators === undefined) + return; + let maxMspBindingDecorator = decorators.find(dec => ts.isIdentifier((dec.expression).expression) && ((dec.expression).expression.escapedText === 'maxMspBinding')); + if (maxMspBindingDecorator) { + + + const options = this.extractBindings((maxMspBindingDecorator?.expression).arguments[0], checker) + + const name = node.name?.getText() || 'anonymousFunction'; + const filePath = sourceFile.fileName; + options.instanceName = classOptions.instanceName || options.instanceName; + if (options.useArgsForText === undefined) + options.useArgsForText = false; + options.draws = classOptions.draws || options.draws; + options.throws = classOptions.throws || options.throws; + options.noroute = classOptions.noroute || options.noroute; + if (options.handlerInlet === undefined) + options.handlerInlet = 0; + if (options.isAttribute === undefined) { + options.isAttribute = classOptions.isAttribute; + } + if (options.isAttribute === undefined) { + options.isAttribute = false + } + if (options.isMethod === undefined) { + options.isMethod = classOptions.isMethod; + } + if (options.isMethod === undefined) { + options.isMethod = false + } + options.functionName = options.functionName || name; + options.callName = name; + options.paramCount = node.parameters.length + options.params = [] + for (const param of node.parameters) { + const parameterName = param.name.getText(sourceFile); + let parameterType: string + if (param.type === undefined) + parameterType = 'unknown' + else + parameterType = checker.typeToString(checker.getTypeAtLocation(param.type)); + + const hasDefaultValue = param.initializer !== undefined; + const defaultValue = hasDefaultValue ? param.initializer.getText(sourceFile) : false; + options.params.push({ + name: parameterName, + type: parameterType, + default: defaultValue + }) + } + + const leadingTrivia = ts.getLeadingCommentRanges(sourceFile.text, maxMspBindingDecorator.getFullStart()); + if (leadingTrivia && leadingTrivia.length > 0) { + const commentRange = leadingTrivia[leadingTrivia.length - 1]; + options.comment = sourceFile.text.substring(commentRange.pos, commentRange.end).trim(); + } + + bindings.set(name, { filePath, options }); + } + } + ts.forEachChild(node, visit); + } + visit(sourceFile); + return bindings; + } + + protected extractBindings(optionsArg: any, checker: ts.TypeChecker): MaxMspBindingOptions { + + const options: MaxMspBindingOptions = {}; + + if (!ts.isObjectLiteralExpression(optionsArg)) { + // Handle invalid argument types + console.warn('maxMspBinding decorator called with invalid arguments:', optionsArg); + return options; + } + + // Extract the options from the object literal + for (const prop of optionsArg.properties) { + if (ts.isPropertyAssignment(prop) && ts.isIdentifier(prop.name)) { + const propName = prop.name.escapedText.toString(); + const propValue = checker.typeToString(checker.getTypeAtLocation(prop.initializer)); + //strip any quotes + options[propName] = propValue.replace(/['"]+/g, ''); + } + } + + return options; + } + +} + +export class MaxXmlGenerator extends MaxGenerator { + + protected generateMethodCode(options: MaxMspBindingOptions) { + return { + rendered: this.templates.methodTemplate({ options }) + } + } + + protected generateAttributeCode(options: MaxMspBindingOptions) { + return { + rendered: this.templates.attributeTemplate({ options }) + } + } + + writeGeneratedCode(bindings: Map) { + const bindingArr = Array.from(bindings.entries()) + let genMethods: any = [] + let genAttributes: any = [] + //Add our custom function definitions to our ones scraped from annotations + const genFuncs = getCustomFunctionDefinitions() + for (const b of bindingArr) { + genFuncs.push(b[1].options) + } + //process inner templates + for (const f of genFuncs) { + const o = this.generateMethodCode(f) + if (o.rendered !== '') + genMethods.push(o) + + const a = this.generateAttributeCode(f) + if (a.rendered !== '') + genAttributes.push(a) + } + const generatedCode = this.templates.mainTemplate({ methods: genMethods, attributes: genAttributes }) + + fs.writeFileSync(this.outputPath, generatedCode); + } + +} + +export class MaxBindingGenerator extends MaxGenerator { + + protected generateFunctionCode(name: string, options: MaxMspBindingOptions) { + return { + rendered: this.templates.functionTemplate({ options }) + } + } + + writeGeneratedCode(bindings: Map) { + const bindingArr = Array.from(bindings.entries()) + let genFuncs: any = [] + let importPaths: Array = [] + //initialize with the fixed functions we have in our template + let funcNames: Array = ['init', 'keyPress', 'run', 'read', 'write'] + for (const b of bindingArr) { + const relativePath = path.relative("src", path.dirname(b[1].filePath)); + importPaths.push(relativePath) + const o = this.generateFunctionCode(b[0], b[1].options) + genFuncs.push(o) + funcNames.push(b[0]) + } + importPaths = this.uniq(importPaths) + const generatedCode = this.templates.mainTemplate({ imports: importPaths, functions: genFuncs, functionNames: funcNames }) + + fs.writeFileSync(this.outputPath, generatedCode); + } + +} + +export class PatcherInitGenerator extends MaxGenerator { + + + writeGeneratedCode(bindings: Map) { + const bindingArr = Array.from(bindings.entries()) + + const genFuncs = getCustomFunctionDefinitions(); + //initialize with the fixed functions we have in our template + for (const b of bindingArr) { + genFuncs.push(b[1].options) + } + const generatedCode = this.templates.mainTemplate({ functions: genFuncs }) + + fs.writeFileSync(this.outputPath, generatedCode); + } + +} \ No newline at end of file diff --git a/javascript/src/MaxBindings/MaxBindings.ts b/javascript/src/MaxBindings/MaxBindings.ts new file mode 100644 index 0000000..df70cbf --- /dev/null +++ b/javascript/src/MaxBindings/MaxBindings.ts @@ -0,0 +1,54 @@ +import 'reflect-metadata' + +export interface MaxMspBindingOptions extends Record { + //usually best to add this on a class level, the instance name that + //method calls will be attached to + instanceName?: string; + //if set the generated function name will be different to the + //method it is attached to, so you can refactor without changing + //the max bindings for compatibility + functionName?: string; + //if true then the generated function will use `arguments` instead of the + //function argument when passing data to internal function calls, needed when + //input might be an array of variable length because we can't use any modern + // js like (...arg) to get it! For this to work your methods Array argument + //MUST be named "text" and it MUST be the second argument passed to your function + //if your function has more than one argument + useArgsForText?: boolean; + //if true call the glrender draw function after calling this + //in generated max code + draw?: boolean; + //if true then exception handling will be generated around the + //function call + throws?: boolean; + //if true do not include in the routepass generation at init + //ie make this a private function to tw.gl.repl.maxpatch + noroute?: boolean; + //if in the routepass geneneration and not a simple list output + //for javascript input then give the scriptingName of an object + //to connect to + customHandler?: string; + //If connected to a custom handler then what inlet number should it be? + handlerInlet?: number; + //should be added as an attribute to the max xml + isAttribute?: boolean; + //should be added as a method to the max xml + isMethod?: boolean; +} + +//This is used effectively as a compile time decorator as we are using it for code generation +//Therefore it cannot be wrapped in a decorator factory and all our logic is done in the ast +export function maxMspBinding(options: MaxMspBindingOptions): any { + return function (target: any, key: string, descriptor: PropertyDescriptor) { + //Need this checking for compatibility, otherwise tests and things can fail + if (descriptor === undefined) + descriptor = {} + if (descriptor.value === undefined) + descriptor.value = {} + // Add options to the method descriptor + descriptor.value.maxMspBindingOptions = options; + // Add a new property to the method descriptor + descriptor.value.maxMspBinding = true; + } +} + diff --git a/javascript/src/MaxBindings/generateMaxBindings.ts b/javascript/src/MaxBindings/generateMaxBindings.ts new file mode 100644 index 0000000..40e2542 --- /dev/null +++ b/javascript/src/MaxBindings/generateMaxBindings.ts @@ -0,0 +1,48 @@ +import ts from 'typescript'; +import glob from 'glob'; +import path from 'path'; +import { MaxBindingGenerator, MaxXmlGenerator, PatcherInitGenerator } from './MaxBindingGenerator'; + +const templates = { + mainTemplate: './src/MaxBindings/templates/main.hbs', + functionTemplate: './src/MaxBindings/templates/function.hbs' +}; + +const xmlTemplates = { + mainTemplate: './src/MaxBindings/templates/xml/main.hbs', + attributeTemplate: './src/MaxBindings/templates/xml/attribute.hbs', + methodTemplate: './src/MaxBindings/templates/xml/method.hbs' +}; + +const patcherTemplates = { + mainTemplate: './src/MaxBindings/templates/patcher-init.hbs' +} +//new rendered with the route path +const mbg = new MaxBindingGenerator("./", templates) +const mbgXml = new MaxXmlGenerator("./", xmlTemplates, './../docs', 'tw.gl.repl.maxref.xml') +const pmbg = new PatcherInitGenerator("./", patcherTemplates, 'dist', 'patcher-init.js') +// Options to configure the TypeScript Compiler API +const options: ts.CompilerOptions = { + target: ts.ScriptTarget.ES5, + module: ts.ModuleKind.CommonJS, + downlevelIteration: true +}; + +// Find all TypeScript files in the source directory +const files = glob.sync('**/*.ts', { cwd: mbg.srcDir }); + +// Create a TypeScript program from the source files and options +const program = ts.createProgram(files.map(file => path.join(mbg.srcDir, file)), options); +//IMPORTANT!!! You must call this to force bindings or names etc. will not work +const checker = program.getTypeChecker(); + +// Get the root file of the program +const filteredFiles = program.getSourceFiles().filter(sourceFile => files.includes(path.relative(mbg.srcDir, sourceFile.fileName))) + +// Find bindings and generate +mbg.generate(filteredFiles, checker); +// Generate xml helper file +mbgXml.generate(filteredFiles, checker); +// Generate patcher-init +pmbg.generate(filteredFiles, checker); + diff --git a/javascript/src/MaxBindings/templates/function.hbs b/javascript/src/MaxBindings/templates/function.hbs new file mode 100644 index 0000000..5fefa73 --- /dev/null +++ b/javascript/src/MaxBindings/templates/function.hbs @@ -0,0 +1,20 @@ +{{#if options.comment}}{{options.comment}}{{else}}//auto-bound to max via annotation{{/if}} +function {{options.functionName}}({{#each options.params}}{{this.name}}{{#unless @last}},{{/unless}}{{/each}}) { + {{#if options.throws}} + try { + {{/if}} +{{#if options.useArgsForText~}} + var slicedArgs = arrayfromargs(arguments) +{{#moreThanOne options.params}} + slicedArgs = Array.prototype.slice.call(slicedArgs, 1); +{{/moreThanOne}} + {{options.instanceName}}.{{options.callName}}({{#each options.params}}{{#isTextArgument this.name}}slicedArgs{{else}}{{this.name}}{{/isTextArgument}}{{#unless @last}},{{/unless}}{{/each}}) +{{else}} + {{options.instanceName}}.{{options.callName}}({{#each options.params}}{{this.name}}{{#unless @last}},{{/unless}}{{/each}}) +{{/if}} +{{#if options.throws}} + } catch (error){ + post(error.message); + }{{/if~}} +{{#if options.draw}} draw(){{/if}} +} \ No newline at end of file diff --git a/javascript/src/MaxBindings/templates/main.hbs b/javascript/src/MaxBindings/templates/main.hbs new file mode 100644 index 0000000..cd8d980 --- /dev/null +++ b/javascript/src/MaxBindings/templates/main.hbs @@ -0,0 +1,251 @@ +/////////////////////////////////////////////////////// +// THIS FILE IS AUTO GENERATED, DO NOT EDIT BY HAND +// See README.md and ./src/MaxBindings for more +/////////////////////////////////////////////////////// + + +// This require loads all our source code and importantly gives access to the following items +// renderer , manager +var glrepl = require("includes") + +inlets = 1; +outlets = 4; + +//Call keybindings with the name of a dict with a repl settings file in and it will +//reconfigure the repl to use it. This will clear all current content of the repl! +var sKeys = new Dict(jsarguments[2]); +function keybindings(dictid) { + sKeys = new Dict(dictid); + init(); +} + +/** + * If OUT_MAT === true then additionally output the name of the jitter matrix which contains the text + * when you run/execute the code in the repl. it will be prefixed by jit_matrix + */ +var OUT_MAT = false; +function output_matrix(v) { + if(v === undefined){ + OUT_MAT = !OUT_MAT + } else { + OUT_MAT = v != 0; + } +} + +/** + * If SUPRESS_OUTPUT === true then dont output the formatted messages. + * Can be used with output_matrix to only output the jit_matrix name from the repl + */ +var SUPRESS_OUTPUT = false; +function supress_output(v){ + if(v === undefined){ + SUPRESS_OUTPUT = !SUPRESS_OUTPUT + } else { + SUPRESS_OUTPUT = v != 0; + } +} + +/** + * If EPHEMERAL_MODE === true then the buffer will clear every time you run/execute + * If you run all it will empty all, if you run line it will empty the current line + */ +var EPHEMERAL_MODE = false; +function ephemeral_mode(v) { + if(v === undefined){ + EPHEMERAL_MODE = !EPHEMERAL_MODE + } else { + EPHEMERAL_MODE = v != 0; + } +} + +/** + * If FORMAT_WRITES === true then format the output with any textFormatters before writing it to a File + */ + var FORMAT_WRITES = true; + function format_writes(v){ + if(v === undefined){ + FORMAT_WRITES = !FORMAT_WRITES + } else { + FORMAT_WRITES = v != 0; + } + } + +// Contains the generated function to generate the routing objects for the +// tw.js.repl patch, so no config routing updates if you change what methods +// are exposed, just compile again and it will update on init. +include("patcher-init") + +// Optionally include a user-repl file where you can define some additional things +// You will have access to glrepl.renderer and glrepl.manager in ths code at runtime so +// you can preload or attach your custom functions etc. +include("user-repl") + +/* + * Functions below here are handcrafted in a template, and referenced in the generator script. + * They should not be edited by hand in the output js file + */ +function init() { + patcher_init(); + + if (jsarguments.length > 1) { + glrepl.renderer.drawto(jsarguments[1]); + //post("drawing to context: ", jsarguments[1], "\n"); + } + glrepl.manager.clear(); + //load config from a dict string (ie json) + try { + glrepl.manager.loadConfigFromJSON(sKeys.stringify()) + } catch (error) { + outlet(0, "error "+error.message) + } + + glrepl.renderer.font("Courier New Bold"); + glrepl.renderer.fontsize(100); + glrepl.renderer.leadscale(0.94); + glrepl.renderer.tracking(1); + glrepl.renderer.line_length(999999); + glrepl.renderer.alpha(1); + + draw(); +} + +function keyPress(k) { + //our functions might return something which we want to output + //these will usually be messages for max such as the run command + var msgs = glrepl.manager.keyPress(k) + for(var a = 0; a < msgs.length; a++){ + outlet(0, msgs[a]); + } + draw(); +} + +function replay(text) { + var slicedArgs = arrayfromargs(arguments) + var msgs = glrepl.manager.replay(slicedArgs) + for(var a = 0; a < msgs.length; a++){ + outlet(0, msgs[a]); + } + draw() +} + +// output the parsed code if output_matrix is disabled +function run() { + try { + var formatted = glrepl.manager.tb.format(); + run_output(formatted); + if (EPHEMERAL_MODE) + clear(); + } catch (error){ + outlet(0, "error "+error.message) + } + draw() +} + +function run_line() { + try { + var currentLine = glrepl.manager.c.line(); + var formatted = glrepl.manager.tb.formatLine(currentLine); + run_output(formatted); + if (EPHEMERAL_MODE) { + glrepl.manager.tb.deleteLine(glrepl.manager.c.line()); + glrepl.manager.c.decrementLine(); + if (glrepl.manager.c.line() == 0) + glrepl.manager.jumpLine(-1); + } + } catch (error) { + outlet(0, "error " + error.message) + } + draw() +} + +function run_output(out){ + //guard against input which is only the run command and nothing else + //as this will cause a stack overflow + if(out.length == 1 && out[0] == "run") + return + if(SUPRESS_OUTPUT === false){ + for (var a = 0; a < out.length; a++) { + outlet(0, out[a]); + } + } + if (OUT_MAT) { + outlet(0, "jit_matrix " + glrepl.renderer.textMtx.name); + } + outlet(3, "bang") +} +run_output.local = 1; + +//output whatever is in the pastebin using formatters +function output_paste_bin(){ + outlet(2, glrepl.manager.tb.pasteBinFormat()); +} + +// draw the text and output all info +// this will be called by any generated function which +// has the draw attribute set true. +function draw() { + + glrepl.renderer.draw(glrepl.manager.tb.get(), glrepl.manager.c.position()) + + //Send some data out about the state + var status = glrepl.manager.status() + for (var a = 0; a < status.length; a++) { + outlet(1, status[a]) + } + +} +draw.local = 1 + +//Read from a filename (provided by opendialog) and replay it's keypresses +function read(filename) { + f = new File(filename, "read") + f.open() + var data = f.readbytes(f.eof); + f.close() + + for (var index = 0; index < data.length; index++) { + keyPress(data[index]); + } + draw() +} + +//write the buffer to a file (provided by savedialog), to be played back later +function write(filename) { + f = new File(filename, "write", "TEXT") + f.open() + f.eof = 0; + + var data = [] + if(FORMAT_WRITES){ + data = glrepl.manager.tb.format() + } else { + data = glrepl.manager.tb.get() + } + + for (var index = 0; index < data.length; index++) { + f.writeline(data[index]) + } + f.close() +} + +//hide the text in the REPL from being drawn +var HIDE_TEXT = false; +function hide_text(hide) { + if(hide === undefined){ + HIDE_TEXT = !HIDE_TEXT + } else { + HIDE_TEXT = hide != 0; + } + glrepl.renderer.hideText(HIDE_TEXT) + draw() +} + +/* + * REPL BINDINGS + * Functions below here are generated from class methods decorated with @maxMspBinding + * This exposes functions to the max api so they can be called from max + */ + +{{#each functions}} +{{{rendered }}} +{{/each}} \ No newline at end of file diff --git a/javascript/src/MaxBindings/templates/patcher-init.hbs b/javascript/src/MaxBindings/templates/patcher-init.hbs new file mode 100644 index 0000000..dc89a7b --- /dev/null +++ b/javascript/src/MaxBindings/templates/patcher-init.hbs @@ -0,0 +1,39 @@ +function patcher_init(){ + + // These objects are manually created in max and are what the generated parts connect with + var initpass = this.patcher.getnamed("initpass") + var cmdList = this.patcher.getnamed("cmdList") + var routedMsgOutput = this.patcher.getnamed("routedMsgOutput") + var ourself = this.box + // Our generated routepass object + var routepass = this.patcher.getnamed("routepass") + //delete and remake the routepass object + this.patcher.remove(routepass) + routepass = this.patcher.newdefault(385, 243, "routepass", {{#each functions}}{{#unless this.noroute}}"{{this.functionName}}"{{#unless @last}},{{/unless}}{{/unless}}{{/each}} ) + //set the scripting name so we can get it again later + routepass.varname = "routepass" + routepass.rect = [380., 244., 780, 444] + //init pass is our internal first routepass where we filter fixed names + //no route output of that goes into our new object + this.patcher.connect(initpass, 5, routepass, 0) + + //connect the router outlets to either a custom handler or the simple `t l` object cmdList + //handlerInlet is 0 if not set otherwise + {{#each functions}}{{~#unless this.noroute}}{{~#if this.customHandler}} + {{~#if (maxSelfReference this.customHandler)}} + //{{this.functionName}} + this.patcher.connect(routepass, {{outletCounter}}, ourself, {{this.handlerInlet}}) + {{~else}} + //{{this.functionName}} + var {{this.customHandler}} = this.patcher.getnamed("{{this.customHandler}}") + this.patcher.connect(routepass, {{outletCounter}}, {{this.customHandler}}, {{this.handlerInlet}}) + {{/if}}{{~else}} + //{{this.functionName}} + this.patcher.connect(routepass, {{outletCounter}}, cmdList,{{this.handlerInlet}}) + {{/if}}{{/unless}} + {{~#if @last}} + //Unrouted messages are sent to the object output to be routed by the user + this.patcher.connect(routepass, {{outletCounter}}, routedMsgOutput, 0) + {{/if}}{{/each}} +} +patcher_init.local = 1 \ No newline at end of file diff --git a/javascript/src/MaxBindings/templates/xml/attribute.hbs b/javascript/src/MaxBindings/templates/xml/attribute.hbs new file mode 100644 index 0000000..932af21 --- /dev/null +++ b/javascript/src/MaxBindings/templates/xml/attribute.hbs @@ -0,0 +1,8 @@ +{{#truthy options.isAttribute}} + + {{#if options.comment}}{{firstSentanceOrLine options.comment}}{{else}}auto-bound to max via annotation{{/if}} + + {{#if options.comment}}{{cutComment options.comment}}{{else}}This function was auto bound to the max interface, but it does not have a comment describing what it does.{{/if}} + + +{{/truthy}} \ No newline at end of file diff --git a/javascript/src/MaxBindings/templates/xml/main.hbs b/javascript/src/MaxBindings/templates/xml/main.hbs new file mode 100644 index 0000000..8a99108 --- /dev/null +++ b/javascript/src/MaxBindings/templates/xml/main.hbs @@ -0,0 +1,120 @@ + + + + + + + Create a repl with javascipt and opengl. + + + + A configurable repl for opengl in Max. Add the object to your setup and initialize it with the + name of the render context. Make sure you send it the render bang in the top inlet. You can execute + the text in the repl to pass it through some formatters and output it, where you can do whatever you + like with it in max.For example control parameters of gl objects, control musical parameters, + lighting shows, just use it as a typewriter or whatever you think of! + You can also attach functions to each key that the repl processes, this allows you to easily create + dsl's or command languages, you could output commands, or output messages that the repl itself responds to. + All messages output from functions attached to keys are processed by the repl, and then if not matched + are output outlet 2, where you can route them yourself. + + tw.gl.repl (c) Tom Whiston 2023. + + This project is based on th.gl.texteditor (c) Timo Hoogland 2020. + + + + + Tom Whiston + tw.gl + max + jitter + opengl + code + repl + text + texteditor + + + + + + bang from jit.world or command for repl + + + + + + + message output from repl + + any message output from the repl will be filtered through the repls own routepass and if + not handled then it is output from this outlet for you to handle. + + + + clipboard data + + anything copied to the clipboard is output here so you can implement any additional logic + that you need to copy to the system clipboard, write to a file etc... + + + + run bang + + if a run/execute function has successfully completed bang from this output. This is useful to + start actions after the repl text has been fully formatted and output + + + + + + + + The named drawing context in which to draw (default = none). + + Set the name of the rendering context. This is the name given to the jit.world, jit.gl.render or + jit.gl.node object. + + + + Width of the render context + + Set the width of the render context for scaling etc. + + + + Height of the render context + + Set the height of the render context for scaling etc. + + + + + + +{{#each methods}} +{{{ rendered }}} +{{/each}} + + + + +{{#each attributes}} +{{{ rendered }}} +{{/each}} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/javascript/src/MaxBindings/templates/xml/method.hbs b/javascript/src/MaxBindings/templates/xml/method.hbs new file mode 100644 index 0000000..4600317 --- /dev/null +++ b/javascript/src/MaxBindings/templates/xml/method.hbs @@ -0,0 +1,15 @@ +{{#truthy options.isMethod}} + +{{#if options.params}} + + {{#each options.params}} + + {{/each}} + +{{/if}} + {{#if options.comment}}{{firstSentanceOrLine options.comment}}{{else}}auto-bound to max via annotation{{/if}} + + {{#if options.comment}}{{cutComment options.comment}}{{else}}This function was auto bound to the max interface, but it does not have a comment describing what it does.{{/if}} + + +{{/truthy}} \ No newline at end of file diff --git a/javascript/src/REPLManager/REPLManager.test.ts b/javascript/src/REPLManager/REPLManager.test.ts new file mode 100644 index 0000000..2fc57f9 --- /dev/null +++ b/javascript/src/REPLManager/REPLManager.test.ts @@ -0,0 +1,1115 @@ +import test from 'ava'; +import { Direction, JumpDirection, PreloadIdentifier, REPLManager, REPLSettings } from './REPLManager'; +import { TextFormatter } from '../TextBuffer/TextFormatter'; + +test('REPLManager: Initialization', t => { + const repl = new REPLManager(); + + t.truthy(repl.tb, 'Text buffer should not be null'); + t.truthy(repl.c, 'Cursor should not be null'); + t.truthy(repl.kp, 'Keypress processor should not be null'); +}); + +class TestFormatter implements TextFormatter { + id = "testformatter" + //replaces all forms of whitespace with a space and trims the end + format(strArr: Array, ctx?: {}) { return strArr; } + +} +test('REPLManager buffers preload not directly added', t => { + const config = new REPLSettings(); + const bufferFormatterMock = new TestFormatter(); + const replManager = new REPLManager(config, [], [bufferFormatterMock]); + const formatters = replManager.tb.formatters; + + t.deepEqual(formatters, []); +}); + +test('preloadFormatter works as intended', (t) => { + class CustomFormatter implements TextFormatter { + id: string + constructor(id) { + this.id = id; + } + format(strArr: string[], ctx?: {} | undefined): string[] { + return strArr + } + } + + const formatter1 = new CustomFormatter('formatter1'); + + const repl = new REPLManager(); + + repl.preloadFormatter(formatter1); + + t.is(repl.formatterPreloads.length, 1, 'REPLManager should have 1 formatter preloaded'); + t.is(repl.formatterPreloads[0].id, 'formatter1', 'REPLManager should have formatter with id "formatter1" preloaded'); +}); + +test('addTab method adds spaces to text', t => { + const repl = new REPLManager(new REPLSettings(100), []); + repl.addTab(); + repl.addTab(); + repl.addTab(); + + t.is(repl.tb.getLine(0), ' '); +}); + +test('addChar method adds a character to the buffer', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + repl.addChar(72); // Adds the character "H" + t.is(repl.tb.getLine(0), 'H'); +}); + +test('backSpace method removes the last character added', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + repl.addChar(72); // Adds the character "H" + repl.backSpace(); // Deletes the character "H" + t.is(repl.tb.getLine(0), ''); +}); + +test('clear method clears the buffer', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + repl.addChar(72); // Adds the character "H" + repl.clear(); // Clears the buffer + t.is(repl.tb.getLine(0), ''); +}); + +test('deleteChar method removes the character in front of the cursor position', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + repl.addChar(72); // Adds the character "H" + repl.addChar(105); // Adds the character "i" + + repl.c.setChar(1); + repl.deleteChar(); // Deletes the character "i" + t.is(repl.tb.getLine(0), 'H'); +}); + +test('gotoCharacter move the cursor to the left', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + repl.addChar(72); // Adds the character "H" + repl.addChar(105); // Adds the character "i" + repl.addChar(105); // Adds the character "i" + repl.addChar(105); // Adds the character "i" + repl.jumpChar(-1); // Moves the cursor to the left + t.is(repl.c.position().char, 3); + repl.jumpChar(-1); // Moves the cursor to the left + t.is(repl.c.position().char, 2); + repl.jumpChar(1); // Moves the cursor to the left + t.is(repl.c.position().char, 3); +}); + +test('gotoLine moves cursor to the specified line', (t) => { + const repl = new REPLManager(new REPLSettings(3)); + const initialPosition = repl.c.position(); + t.is(initialPosition.line, 0, 'initial position line should be 0'); + + repl.jumpLine(1); + const newPosition = repl.c.position(); + t.is(newPosition.line, 0, 'position line should be 0'); + + repl.newLine(); + const finalPosition = repl.c.position(); + t.is(finalPosition.line, 1, 'position line should be 1'); + +}); + +test('gotoLine does not move cursor beyond last line', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + const initialPosition = repl.c.position(); + const lastLineIndex = repl.tb.length() - 1; + + repl.jumpLine(1); + const newPosition = repl.c.position(); + t.is(newPosition.line, lastLineIndex, 'position line should be last line index'); +}); + +function preloadTest(k: number, ctx: any): any { + return 'external test function' +} + +test('test preload function', (t) => { + + const preload: PreloadIdentifier = { + id: 'testFunction', + func: (k: number, ctx: any): any => 'test function' + } + + const extPreload: PreloadIdentifier = { + id: 'extTestFunction', + func: preloadTest + } + + const jsonConfig = `{ + "bindings":[ + { + "id": "testFunc2", + "asciiCode": 2, + "functions": "testFunction" + }, + { + "id": "testFunc3", + "asciiCode": 3, + "functions": "extTestFunction" + } + ]}`; + + const repl = new REPLManager(new REPLSettings(100), [preload, extPreload]); + repl.kp.loadConfigFromJSON(jsonConfig); + const res = repl.kp.processKeypress(2); + const output = res[0](1, {}); + t.is(output, 'test function'); + const res1 = repl.kp.processKeypress(3); + const output1 = res1[0](1, {}); + t.is(output1, 'external test function'); +}); + +test('gotoWord method moves the cursor to the next word', (t) => { + const repl = new REPLManager(new REPLSettings(1)); + repl.addChar(72); // Adds the character "H" + repl.addChar(105); // Adds the character "i" + repl.addChar(32); // Adds a space + repl.addChar(116); // Adds the character "t" + repl.addChar(104); // Adds the character "h" + repl.jumpWord(1); // Moves the cursor to the next word + t.is(repl.c.position().char, 5); +}); + +test('jumpTo moves to the beginning of the next or previous word', (t) => { + const replManager = new REPLManager(new REPLSettings(80)); + replManager.clear(); + replManager.addChar(97); + replManager.addChar(98); + replManager.addChar(99); + replManager.addChar(32); + replManager.addChar(100); + replManager.addChar(101); + replManager.addChar(102); + + // jump to end of line, makes no difference + replManager.jumpTo(1); + t.is(replManager.c.position().char, 7); + + // jump to beginning of line + replManager.jumpTo(0); + t.is(replManager.c.position().char, 0); + + // jump to end of line again + replManager.jumpTo(1); + t.is(replManager.c.position().char, 7); + + // add more characters and spaces + replManager.addTab(); + replManager.addChar(103); + replManager.addChar(104); + replManager.addChar(105); + replManager.addChar(32); + replManager.addChar(106); + replManager.addChar(107); + replManager.addChar(108); + + // jump to end of line + replManager.jumpTo(1); + t.is(replManager.c.position().char, 18); + + // jump to the start of the line + replManager.jumpTo(0); + t.is(replManager.c.position().char, 0); + + //TODO: test moving top to bottom +}); + +test('gotoIndex moves to correct index', (t) => { + const rm = new REPLManager(new REPLSettings(1)); + rm.clear(); + rm.addChar(72); + rm.addChar(101); + rm.addChar(108); + rm.addChar(108); + rm.addChar(111); + rm.gotoIndex(0); + t.is(rm.c.position().char, 0); + rm.gotoIndex(2); + t.is(rm.c.position().char, 2); + rm.gotoIndex(5); + t.is(rm.c.position().char, 5); +}); + + +test('newLine should add a new line to the text buffer and move the cursor to the start of the new line', t => { + const repl = new REPLManager(new REPLSettings()); + + // Simulate typing some text + repl.addChar(72); // H + repl.addChar(101); // e + repl.addChar(108); // l + repl.addChar(108); // l + repl.addChar(111); // o + + // Add a new line + repl.newLine(); + + // Check that a new line was added + t.is(repl.tb.length(), 2); + + // Check that the cursor moved to the start of the new line + const pos = repl.c.position(); + t.is(pos.line, 1); + t.is(pos.char, 0); + + // Add a new line + repl.newLine(); + + // Check that a new line was added + t.is(repl.tb.length(), 3); + + // Check that the cursor moved to the start of the new line + const pos2 = repl.c.position(); + t.is(pos2.line, 2); + t.is(pos2.char, 0); +}); + +test('newline should work when lines have text in', (t) => { + // initialize a REPLManager instance + const repl = new REPLManager(new REPLSettings()); + + // add some lines + repl.addChar('h'.charCodeAt(0)); + repl.addChar('e'.charCodeAt(0)); + repl.addChar('l'.charCodeAt(0)); + repl.addChar('l'.charCodeAt(0)); + repl.addChar('o'.charCodeAt(0)); + t.is(repl.tb.getLine(0), 'hello'); + repl.newLine(); + t.is(repl.tb.getLine(0), 'hello'); + t.not(repl.tb.getLine(1), 'hello'); + t.is(repl.tb.getLine(1), ''); + repl.addChar('w'.charCodeAt(0)); + repl.addChar('o'.charCodeAt(0)); + repl.addChar('r'.charCodeAt(0)); + repl.addChar('l'.charCodeAt(0)); + repl.addChar('d'.charCodeAt(0)); + repl.newLine(); + repl.addChar('t'.charCodeAt(0)); + repl.addChar('e'.charCodeAt(0)); + repl.addChar('s'.charCodeAt(0)); + repl.addChar('t'.charCodeAt(0)); + + // delete the second line + repl.jumpLine(-1); + repl.deleteLine(); + + // check that the second line was deleted + t.is(repl.tb.length(), 2); + t.is(repl.tb.getLine(0), 'hello'); + t.is(repl.tb.getLine(1), 'test'); +}); + +test('spliceLine removes the correct line', t => { + const repl = new REPLManager(new REPLSettings(3)); + repl.addTab(); + repl.addChar(65); + repl.newLine(); + repl.addTab(); + repl.addChar(66); + repl.newLine(); + repl.addTab(); + repl.addChar(67); + repl.spliceLine(); + const output = repl.tb.format().toString() + t.is(output, ' A, B C'); +}); + + +test('deleteLine should delete the correct line', (t) => { + // initialize a REPLManager instance + const repl = new REPLManager(); + + // add some lines + repl.addChar('h'.charCodeAt(0)); + repl.addChar('e'.charCodeAt(0)); + repl.addChar('l'.charCodeAt(0)); + repl.addChar('l'.charCodeAt(0)); + repl.addChar('o'.charCodeAt(0)); + repl.newLine(); + repl.addChar('w'.charCodeAt(0)); + repl.addChar('o'.charCodeAt(0)); + repl.addChar('r'.charCodeAt(0)); + repl.addChar('l'.charCodeAt(0)); + repl.addChar('d'.charCodeAt(0)); + repl.newLine(); + repl.addChar('t'.charCodeAt(0)); + repl.addChar('e'.charCodeAt(0)); + repl.addChar('s'.charCodeAt(0)); + repl.addChar('t'.charCodeAt(0)); + + // delete the second line + repl.jumpLine(-1); + repl.deleteLine(); + + // check that the second line was deleted + t.is(repl.tb.length(), 2); + t.is(repl.tb.getLine(0), 'hello'); + t.is(repl.tb.getLine(1), 'test'); +}); + +test('backSpace should remove a character', t => { + const repl = new REPLManager(new REPLSettings(10)); + repl.addChar(97); + repl.addChar(98); + repl.backSpace(); + // expect line to be "a" + t.is(repl.tb.getLine(0), "a"); +}); + +test('backSpace should remove a character at the end of a line and move to previous line', t => { + const repl = new REPLManager(new REPLSettings(10)); + repl.addChar(97); + repl.addChar(98); + repl.newLine(); + repl.addChar(99); + repl.backSpace(); + // expect line to be "ab" + t.is(repl.tb.getLine(0), "ab"); +}); + +test('backSpace should remove a line if the cursor is at the beginning', t => { + const repl = new REPLManager(new REPLSettings(10)); + repl.addChar(97); + repl.newLine(); + repl.backSpace(); + // expect only one line left + t.is(repl.tb.length(), 1); +}); + +test('backSpace should do nothing if the cursor is at char 0 and the beginning of the first line is reached', t => { + const repl = new REPLManager(new REPLSettings(10)); + repl.backSpace(); + // expect empty TextBuffer + t.deepEqual(repl.tb.get(), ['']); +}); + +test('should return position at the left end of the line when direction is -1', t => { + const replManager = new REPLManager(new REPLSettings(10)); + replManager.jumpTo(3); // go to bottom + replManager.jumpTo(1); // go to end of the line + replManager.jumpChar(-1); + const pos = replManager.c.position(); + t.is(pos.char, 0); +}); + +test('should return position at the beginning of the line when already at the beginning of the line and direction is -1', t => { + const replManager = new REPLManager(new REPLSettings(10)); + replManager.jumpTo(0); // go to the beginning of the line + replManager.jumpChar(-1); + const pos = replManager.c.position(); + t.is(pos.char, 0); +}); + +test('should return position at the right end of the line when direction is 1', t => { + const replManager = new REPLManager(new REPLSettings(10)); + replManager.addChar(65); // Add A + replManager.addChar(65); // Add A + replManager.jumpChar(1); + const pos = replManager.c.position(); + t.is(pos.char, 2); +}); + +test('should return position at the end of the line when already at the end of the line and direction is 1', t => { + const replManager = new REPLManager(new REPLSettings(10)); + replManager.addChar(65); // Add A + replManager.jumpChar(1); + const pos = replManager.c.position(); + t.is(pos.char, 1); +}); + +test('jumpLine - else branch', t => { + const rl = new REPLManager(new REPLSettings(20)); + + rl.tb.set(['a'.repeat(20), 'b'.repeat(20)]); + + rl.c.setLine(1); + rl.c.setChar(5); + + rl.jumpLine(-1); + + const currentLine = rl.c.line(); + + t.is(currentLine, 0); // Check if lines are the same before and after the operation +}); + +test('jumpWord', (t) => { + const manager = new REPLManager(new REPLSettings()) + const input = 'word1 word2 word3 word4' + for (var i = 0; i < input.length; i++) { + manager.addChar(input.charCodeAt(i)); + } + + var pos = manager.c.position() + var len = manager.tb.lineLength(pos.line) + + t.deepEqual(pos, { line: 0, char: 23 }) + + manager.jumpWord(-1) + pos = manager.c.position() + t.deepEqual(pos, { line: 0, char: 17 }) + + manager.jumpWord(1) + pos = manager.c.position() + t.deepEqual(pos, { line: 0, char: 23 }) + + manager.jumpWord(-1) + manager.jumpWord(-1) + pos = manager.c.position() + t.deepEqual(pos, { line: 0, char: 11 }) + + manager.tb.append(['word5 word6 word7 word8 word9']) + + manager.jumpTo(JumpDirection.END) + manager.jumpTo(JumpDirection.EOL) + pos = manager.c.position() + t.deepEqual(pos, { line: 1, char: 29 }) + + manager.jumpWord(-1) + pos = manager.c.position() + t.deepEqual(pos, { line: 1, char: 23 }) + + manager.jumpWord(1) + pos = manager.c.position() + t.deepEqual(pos, { line: 1, char: 29 }) + + manager.jumpLine(-1) + pos = manager.c.position() + t.deepEqual(pos, { line: 0, char: 23 }) + + manager.jumpWord(-1) + pos = manager.c.position() + t.deepEqual(pos, { line: 0, char: 17 }) + +}) + +test('jumpword else clause', t => { + const repl = new REPLManager(); + repl.jumpTo(3); + t.is(repl.c.line(), 0); + repl.jumpWord(-1); + t.is(repl.c.char(), 0); +}); + +test('jumpTo function tests all branches', t => { + //beginning of line + let repl = new REPLManager(new REPLSettings(2)); + repl.addTab(); repl.addTab(); repl.addTab(); + //jump to beginning of line + repl.jumpTo(JumpDirection.BOL) + let pos = repl.c.position(); + t.is(pos.char, 0) + + //end of line + repl = new REPLManager(new REPLSettings(2)); + repl.addTab(); repl.addTab(); repl.addTab(); + //jump to end of line + repl.jumpTo(JumpDirection.EOL) + pos = repl.c.position(); + t.is(pos.char, 12) + + //top of text array + repl = new REPLManager(new REPLSettings(2)); + repl.addTab(); repl.addTab(); repl.addTab(); + repl.newLine(); repl.addTab(); repl.addTab(); repl.addTab(); + //jump to beginning (top) + repl.jumpTo(JumpDirection.TOP) + pos = repl.c.position(); + t.is(pos.char, 12) + t.is(pos.line, 0); + + //bottom of text array + repl = new REPLManager(new REPLSettings(3)); + repl.addTab(); + repl.newLine(); repl.addTab(); + repl.newLine(); repl.addTab(); + //jump to end (bottom) + repl.jumpTo(JumpDirection.END) + pos = repl.c.position(); + t.is(pos.char, 4) + t.is(pos.line, 2); +}); + +test('gotoIndex', t => { + // create an empty REPLManager + const rm = new REPLManager(new REPLSettings(2)); + + // add some chars to the buffer + rm.addChar(72); rm.addChar(101); rm.addChar(108); rm.addChar(108); rm.addChar(111); + + // move the cursor to the index 2 + rm.gotoIndex(2); + + // check that the cursor is at the correct position + t.deepEqual(rm.c.position(), { line: 0, char: 2 }); + + // move the cursor to the index -1 + rm.gotoIndex(-1); + + // check that the cursor is at the correct position + t.deepEqual(rm.c.position(), { line: 0, char: 0 }); + + // move the cursor to an index greater than the max length + rm.gotoIndex(100); + + // check that the cursor is at the end of the last line + t.deepEqual(rm.c.position(), { line: 0, char: 5 }); +}); + +test('newLine adds a new line after the current line', t => { + const replManager = new REPLManager(new REPLSettings(10)); // initialize the text buffer with size 10 + replManager.addChar(65); // add A to the first line + replManager.addChar(66); // add B to the first line + replManager.newLine(); // add a new line, now we should be on the second line + replManager.addChar(67); // add C to the second line + + t.is(replManager.tb.getLine(0), 'AB'); + t.is(replManager.tb.getLine(1), 'C'); +}); + +test('deleteLine function should work properly', t => { + const replManager = new REPLManager(new REPLSettings(30)); + + replManager.tb.set(['line1']) + let pos = replManager.c.position(); + replManager.deleteLine(); + let after = replManager.c.position(); + + // Test 1 - for a line within range + replManager.tb.set([ + "line1", + "line2", + "line3", + "line4", + "line5", + "line6", + "line7", + "line8", + "line9", + "line10" + ]); + replManager.c.setLine(5); + let posBefore = replManager.c.position(); + replManager.deleteLine(); + let posAfter = replManager.c.position(); + t.is(replManager.tb.length(), 9); + t.is(posAfter.line, posBefore.line); + t.is(posAfter.char, replManager.tb.lineLength(posAfter.line)); + + // Test 2 - delete last line + replManager.c.setLine(replManager.tb.length() - 1); + let posBeforeLast = replManager.c.position(); + replManager.deleteLine(); + let posAfterLast = replManager.c.position(); + t.is(replManager.tb.length(), 8); + t.is(posAfterLast.line, posBeforeLast.line - 1); + t.is(posAfterLast.char, posBeforeLast.char); + + // Test 3 - for the last line + replManager.c.setLine(replManager.tb.length() - 1); + const posLast = replManager.c.position(); + replManager.deleteLine(); + t.is(replManager.tb.length(), 7); + t.is(replManager.c.line(), 6); + t.is(replManager.c.char(), replManager.tb.lineLength(6)); + + +}); + +test('jumpChar with dir === 1 at end of line with no new line maintains position', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.jumpChar(1 as Direction); + //stays in the same place + t.is(repl.c.position().char, 3); +}); + +test('jumpChar with dir === -1 moves the cursor one character to the left', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.jumpChar(-1 as Direction); + t.is(repl.c.position().char, 2); +}); + +test('jumpChar with dir === 1 not at end line moves the cursor one character to the left', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.jumpChar(-1 as Direction); + repl.jumpChar(-1 as Direction); + t.is(repl.c.position().char, 1); + repl.jumpChar(1 as Direction); + t.is(repl.c.position().char, 2); + repl.jumpChar(1 as Direction); + t.is(repl.c.position().char, 3); + repl.jumpChar(1 as Direction); + t.is(repl.c.position().char, 3); +}); + +test('jumpChar with dir === -1 at the beginning of the line moves the cursor to the previous line', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.jumpTo(JumpDirection.BOL); + repl.jumpChar(-1 as Direction); + t.is(repl.c.position().line, 0); + t.is(repl.c.position().char, 3); +}); + +test('jumpChar with dir === 1 at the end of the line moves the cursor to the next line', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.jumpTo(JumpDirection.TOP); + repl.jumpChar(1 as Direction); + repl.jumpChar(1 as Direction); + repl.jumpChar(1 as Direction); + t.is(repl.c.position().line, 1); + t.is(repl.c.position().char, 2); +}); + +test('deleteChar else branch - when cursor is at the end of last line', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.jumpTo(JumpDirection.EOL); // cursor is at the end of last line + repl.deleteChar(); // should not delete anything + t.is(repl.tb.getLine(0), "abc"); +}); + +test('deleteChar if clause inside the else branch', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.jumpTo(JumpDirection.TOP); + repl.jumpTo(JumpDirection.EOL); + repl.deleteChar(); + t.is(repl.tb.getLine(0), "abcdef"); + t.is(repl.c.position().line, 0); + t.is(repl.c.position().char, 3); +}); + +test('set method - replace all text', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.set(["xyz", "123"]); + + + t.is(repl.tb.getLine(0), "xyz"); + t.is(repl.tb.getLine(1), "123"); + t.is(repl.tb.length(), 2); + t.is(repl.c.position().line, 1); + t.is(repl.c.position().char, 3); + +}); + +test('insert method - insert between totalLines', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.insert(1, ["xyz", "123"]); + t.is(repl.tb.getLine(0), "abc"); + t.is(repl.tb.getLine(1), "xyz"); + t.is(repl.tb.getLine(2), "123"); + t.is(repl.tb.getLine(3), "def"); + t.is(repl.tb.length(), 4); +}); + + +test('insert method - append to code and insert empty strings', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.insert(2, ["xyz", "123"]); + t.is(repl.tb.getLine(0), "abc"); + t.is(repl.tb.getLine(1), ""); + t.is(repl.tb.getLine(2), "xyz"); + t.is(repl.tb.getLine(3), "123"); + t.is(repl.tb.length(), 4); +}); + +test('remove method - remove at specified index', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.newLine(); + repl.add("ghi"); + repl.remove(1); + t.is(repl.tb.getLine(0), "abc"); + t.is(repl.tb.getLine(1), "ghi"); + t.is(repl.tb.length(), 2); +}); + +test('remove method - remove last line if no index provided', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.remove(); + t.is(repl.tb.getLine(0), "abc"); + t.is(repl.tb.length(), 1); +}); + +test('prepend method - prepend lines to the beginning', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine() + repl.add("def"); + repl.prepend(["123", "456"]); + t.is(repl.tb.getLine(0), "123"); + t.is(repl.tb.getLine(1), "456"); + t.is(repl.tb.getLine(2), "abc"); + t.is(repl.tb.getLine(3), "def"); + t.is(repl.tb.length(), 4); +}); + +test('append method - append lines to the end', t => { + const repl = new REPLManager(); + repl.add("abc"); + repl.newLine(); + repl.add("def"); + repl.append(["123", "456"]); + t.is(repl.tb.getLine(0), "abc"); + t.is(repl.tb.getLine(1), "def"); + t.is(repl.tb.getLine(2), "123"); + t.is(repl.tb.getLine(3), "456"); + t.is(repl.tb.length(), 4); +}); + +test('add method - char code 13 or 10', t => { + const repl = new REPLManager(); + repl.add("abc\r\ndef"); + t.is(repl.tb.getLine(0), "abc"); + t.is(repl.tb.getLine(1), ""); + t.is(repl.tb.getLine(2), "def"); + t.is(repl.tb.length(), 3); +}); + + +test('keyPress should not execute when no matching key is found', t => { + const repl = new REPLManager(); + const messages = repl.keyPress(5); + t.deepEqual(messages, []); +}); + +test('keyPress should execute a single matching function', t => { + const repl = new REPLManager(); + let executed = false; + repl.kp.attachFunctions("test", 1, [() => { executed = true; }]); + const messages = repl.keyPress(1); + t.true(executed); + t.deepEqual(messages, []); +}); + +test('keyPress should execute multiple matching functions', t => { + const repl = new REPLManager(); + let executed1 = false; + let executed2 = false; + repl.kp.attachFunctions("test", 1, [() => { executed1 = true; }, () => { executed2 = true; }]); + const messages = repl.keyPress(1); + t.true(executed1); + t.true(executed2); + t.deepEqual(messages, []); +}); + +test('keyPress should return messages from matching functions', t => { + const repl = new REPLManager(); + repl.kp.attachFunctions("test", 1, [() => { return ['message1', 'message2']; }]); + const messages = repl.keyPress(1); + t.deepEqual(messages, ['message1', 'message2']); +}); + +test('keyPress should catch and return errors thrown by matching functions', t => { + const repl = new REPLManager(); + repl.kp.attachFunctions("test", 1, [() => { + throw new Error('Function failed'); + }]); + const messages = repl.keyPress(1); + t.deepEqual(messages, ['error Function failed']); +}); + +test('keyPress should execute all matching functions even if some fail', t => { + const repl = new REPLManager(); + let executed1 = false; + let executed2 = false; + repl.kp.attachFunctions("test", 1, [ + () => { executed1 = true; }, + () => { throw new Error('Function failed'); }, + () => { executed2 = true; } + ]); + const messages = repl.keyPress(1); + t.true(executed1); + t.true(executed2); + t.deepEqual(messages, ['error Function failed']); +}); + +test('keyPress should execute all matching functions in order', t => { + const repl = new REPLManager(); + let order = 0; + repl.kp.attachFunctions("test", 1, [ + () => { t.is(order, 0); order++; }, + () => { t.is(order, 1); order++; }, + () => { t.is(order, 2); order++; }, + () => { t.is(order, 3); } + ]); + repl.keyPress(1); + t.is(order, 3); +}); + +test('commentLine', t => { + const repl = new REPLManager(new REPLSettings()); + const testInput = ['Test line 1', 'Test line 2', '// Test line 3']; + repl.set(testInput); + repl.jumpTo(JumpDirection.TOP); + repl.commentLine(); // Comment first line + t.is(repl.tb.getLine(0), '// Test line 1'); + + repl.jumpLine(1); // Move to second line + repl.commentLine(); // Comment second line + t.is(repl.tb.getLine(1), '// Test line 2'); + + repl.jumpLine(1); // Move to third line + repl.commentLine(); // Uncomment third line + t.is(repl.tb.getLine(2), 'Test line 3'); +}); + +test('loadConfigFromJSON loads settings from JSON correctly', (t) => { + const jsonData = { + "settings": { + "repl": { + "BUFFER_SIZE": "80", + "setting3": true, + } + }, + "bindings": [] + }; + const jsonStr = JSON.stringify(jsonData); + + const testClass = new REPLManager(); + + t.notThrows(() => testClass.loadConfigFromJSON(jsonStr), 'should not throw error when loading a JSON with settings and bindings'); + +}); + +test("loadConfigFromJSON updates settings and doesn't throw", (t) => { + const config = { + settings: { "repl": { INDENTATION: 2, BUFFER_SIZE: 40, CMNT: "#" } }, + bindings: [] + }; + const jsonConfig = JSON.stringify(config); + + const replSettings = new REPLSettings(); + const replManager = new REPLManager(replSettings); + + t.notThrows(() => replManager.loadConfigFromJSON(jsonConfig)); + t.is(replManager.config.INDENTATION, 2); + t.is(replManager.config.CMNT, "#"); +}); + +test("loadConfigFromJSON updates incomplete settings and doesn't throw", (t) => { + const config = { + settings: { "repl": { INDENTATION: 2, } }, + bindings: [] + }; + const jsonConfig = JSON.stringify(config); + + const replSettings = new REPLSettings(); + const replManager = new REPLManager(replSettings); + + t.notThrows(() => replManager.loadConfigFromJSON(jsonConfig)); + t.is(replManager.config.INDENTATION, 2); + t.is(replManager.config.CMNT, "//"); +}); + +test("updateWith updates REPLSettings properties correctly", (t) => { + const initialSettings = new REPLSettings(30, 4); + const updatedSettings = new REPLSettings(50, 2); + updatedSettings.CMNT = "/*"; + + initialSettings.updateWith(updatedSettings); + + t.is(initialSettings.INDENTATION, 2); + t.is(initialSettings.CMNT, "/*"); +}); + +test("cmntToChars works when called directly", (t) => { + const settings = new REPLSettings(); + settings.CMNT = "/*"; + settings.cmntToChars(); + + t.deepEqual(settings.CMNT_CHARS, [47, 42, 32]); +}); + +test("cmntToChars works when called via updateWith", (t) => { + const initialSettings = new REPLSettings(); + const updatedSettings = new REPLSettings(); + updatedSettings.CMNT = "/*"; + + initialSettings.updateWith(updatedSettings); + + t.deepEqual(initialSettings.CMNT_CHARS, [47, 42, 32]); +}); + +test('loadConfigFromJson removes attachedFunctions from KeyProcessor', (t) => { + + const repl = new REPLManager(); + + let executed1 = false; + repl.kp.attachFunctions("test", 42, [ + () => { executed1 = true; }, + ]); + + const newSettings = { + settings: { + repl: { + INDENTATION: 2 + } + } + }; + + repl.keyPress(42) + t.true(executed1) + executed1 = false; + //unbind the original settings when loading new ones + repl.loadConfigFromJSON(JSON.stringify(newSettings)); + repl.keyPress(42) + + t.false(executed1) +}); + +test('loadConfigFromJson can load formatter by id', (t) => { + class CustomFormatter implements TextFormatter { + id: string + constructor(id) { + this.id = id; + } + format(strArr: string[], ctx?: {} | undefined): string[] { + return strArr + } + } + + const formatter1 = new CustomFormatter('formatter1'); + const formatter2 = new CustomFormatter('formatter2'); + + const repl = new REPLManager(undefined, undefined, [formatter1, formatter2]); + + const newSettings = { + settings: { + textbuffer: { + formatters: ['formatter2'] + } + } + }; + + repl.loadConfigFromJSON(JSON.stringify(newSettings)); + + t.is(repl.tb.formatters.length, 1, 'TextBuffer should have 1 formatter'); + t.is(repl.tb.formatters[0].id, 'formatter2', 'TextBuffer should load formatter with id "formatter2"'); +}); + + +test('preloadFormatter can preload formatter and load it from json', t => { + + const repl = new REPLManager(); + + class CustomFormatter implements TextFormatter { + id: string = "customformatter" + constructor() { } + format(strArr: string[], ctx?: {} | undefined): string[] { + return strArr.map(line => line.toUpperCase()); + } + } + const testFormatter = new CustomFormatter() + repl.preloadFormatter(testFormatter) + + const input = 'this is a test'; + const expectedResult = ['THIS IS A TEST']; + + const jsonConfiguration = JSON.stringify({ + settings: { + repl: {}, + textbuffer: { + formatters: [testFormatter.id] + } + } + }); + + repl.loadConfigFromJSON(jsonConfiguration); + repl.add(input); + + const actualResult = repl.tb.format(); + t.deepEqual(actualResult, expectedResult); +}); + +var testData: Array = [] +function replayfunc(k, ctx) { + testData.push(k); +} +test('Replay method test', (t) => { + const replManager = new REPLManager(new REPLSettings()); + replManager.kp.attachFunctions("test", 127, [replayfunc]) + const input = ['hello', 'world']; + replManager.replay(input); + t.is(replManager.tb.length(), 3); + t.is(testData.length, 10); +}); + + +test('Keypress function triggering test', (t) => { + let keyPressTriggered = false; + let keyPressTriggered2 = false; + const replManager = new REPLManager(); + const testFunction = (key, ctx) => { + keyPressTriggered = true; + }; + const testFunction2 = (key, ctx) => { + keyPressTriggered2 = true; + }; + + replManager.kp.customAlphaNum(true) + replManager.kp.attachFunctions("testFunction", 65, [testFunction]) + replManager.kp.attachFunctions("testFunction2", 66, [testFunction2]) + + replManager.keyPress(65); + t.true(keyPressTriggered); + t.false(keyPressTriggered2); + replManager.keyPress(66); + t.true(keyPressTriggered); + t.true(keyPressTriggered2); +}); + +//This is a real edge case seen +test('ephemeral mode on and clear line does not break status output', (t) => { + const repl = new REPLManager(); + repl.clear(); + let clearStatus = repl.status(); + t.is(clearStatus[0], 'lines 1') + //we can't call the run line command specifically here as it's part of the max interface but we can simulate what it does + repl.tb.deleteLine(repl.c.line()); + var lineDeleteStatus = repl.status(); + t.not(lineDeleteStatus[0], 'lines 0') + t.is(lineDeleteStatus[0], 'lines 1') +}); + +test('formatPasteBin', t => { + const repl = new REPLManager(); + repl.set(["var x = 5;", "function foo() {", " console.log(x);", "}"]); + repl.tb.pasteBinCopyAll() + const formattedPasteBin = repl.formatPasteBin(); + + //default formatters wil ltrim off the whitespace + t.deepEqual(formattedPasteBin, [ + "var x = 5;", + "function foo() {", + "console.log(x);", + "}", + ]); + +}); diff --git a/javascript/src/REPLManager/REPLManager.ts b/javascript/src/REPLManager/REPLManager.ts new file mode 100644 index 0000000..2ef5904 --- /dev/null +++ b/javascript/src/REPLManager/REPLManager.ts @@ -0,0 +1,559 @@ +import { TextBuffer } from "TextBuffer"; +import { Cursor } from "Cursor"; +import { KeypressProcessor, KeyProcessor } from 'KeypressProcessor'; +import { maxMspBinding } from 'MaxBindings'; +import { TextFormatter } from "TextFormatter"; +import 'array.extensions'; +import 'object.extensions'; + +//DEFAULT SETTINGS +// INDENTATION = 4; +// EDITOR_LINES = 30; +// CMNT = "//"; +export class REPLSettings { + INDENTATION: number + CMNT: string + CMNT_CHARS = [] + constructor(bufferSize: number = 30, indentation: number = 4) { + this.INDENTATION = indentation + this.CMNT = "//" + this.cmntToChars() + } + updateWith(instance: REPLSettings): void { + this.INDENTATION = instance.INDENTATION !== this.INDENTATION ? instance.INDENTATION : this.INDENTATION; + this.CMNT = instance.CMNT !== this.CMNT ? instance.CMNT : this.CMNT; + this.cmntToChars(); + } + cmntToChars() { + this.CMNT_CHARS = []; + for (var i = 0; i < this.CMNT.length; i++) { + this.CMNT_CHARS.push(this.CMNT[i].charCodeAt(0)); + } + this.CMNT_CHARS = this.CMNT_CHARS.concat(32); + } +} + +//We use this externally so we have a type we can use to ensure we get both an id and a function when preloading +export interface PreloadIdentifier { + id: string + func: KeyProcessor +} + +export type Direction = 1 | -1; + +export enum JumpDirection { + // beginning of line + BOL, + // end of line + EOL, + // top of text array + TOP, + //bottom of text array + END +} + +@maxMspBinding({ instanceName: 'glrepl.manager' }) +export class REPLManager { + + tb: TextBuffer + c: Cursor + kp: KeypressProcessor + formatterPreloads: Array = [] + config: REPLSettings + + constructor(config?: REPLSettings, functionPreloads?: Array, formatterPreloads?: Array) { + this.c = new Cursor() + this.kp = new KeypressProcessor() + //apply default settings if none are passed in + if (config === undefined) + config = new REPLSettings + this.config = config + this.tb = new TextBuffer(); + + //set an array of formatters. Note that the text buffer will call them in the order they are listed in the array + if (formatterPreloads !== undefined) { + this.formatterPreloads = formatterPreloads; + } + //preload any functions that we want users to be able to refer to in json config files + if (functionPreloads !== undefined) { + //functionPreloads = Array.isArray(functionPreloads) ? functionPreloads : [functionPreloads] + for (const func of functionPreloads) { + this.kp.preloadFunction(func.id, func.func); + } + } + this.setCommentChars(this.config.CMNT); + } + + /* + process a keypress + This needs more around it so it's not a simple bind + if a function which is called throws it is expected that + it should return some info about why in the error, which will + be output with the word error prepended as a msg + Manually bound to max in the main binding template + */ + keyPress(k: number): Array { + const res = this.kp.processKeypress(k) + let msgs: Array = []; + for (const func of res) { + try { + let msg = func(k, this) + if (msg !== "" && msg !== undefined) { + msgs.push(...msg); + } + } catch (error) { + msgs.push("error " + error.message) + } + } + return msgs; + } + + /* + * Replay some text into the repl, passing it through the keyPress function + * This may or may not insert it into the buffer depending on configuration + * Manually bound to max in the main binding template + */ + replay(text: Array): Array { + let msgs: Array = []; + for (const k of text) { + for (var i = 0; i < k.length; i++) { + var char = k.charCodeAt(i); + msgs.concat(this.keyPress(char)); + } + this.newLine() + } + return msgs; + } + + status(): Array { + var len = this.tb.textBuf.getMaxChar(); + var tbLen = this.tb.length(); + let msg: Array = [] + msg.push(this.msgFormatter("lines", tbLen.toString())) + msg.push(this.msgFormatter("length", len.toString())) + return msg; + } + + //Need to fromSymbol these messages when we output them in max + msgFormatter(type: string, arg) { + return type + " " + arg; + } + + // set the comment characters. bind the comment function to a key combo to use + @maxMspBinding({ draw: true, functionName: "comment", isMethod: true, isAttribute: true }) + setCommentChars(c: string) { + this.config.CMNT = c.toString() + //because we are targeting below EMCA5 we cannot use setters + //so we need to call this every time we change the comment chars + this.config.cmntToChars() + } + + + // add multiple spaces to the text (tab) + addTab() { + const pos = this.c.position() + //TODO: why does the original do this? + // var numSpaces = this.config.INDENTATION - (pos.char % this.config.INDENTATION); + var numSpaces = this.config.INDENTATION; + for (var i = 0; i < numSpaces; i++) { + this.addChar(32); + } + } + + // preload a TextFormatter, which can then be referenced from a config file by id + preloadFormatter(formatter: TextFormatter) { + this.formatterPreloads.push(formatter); + } + + /* + * add a character (alpha-numeric, numeric, special characters) + * DOES NOT PROCESS KEYPRESSES, WRITES DIRECTLY TO BUFFER + * All methods marked with this note are usually used by binding + * to a key rather than calling it directly in code. Binding to a key + * ensures that the keyPress function array is invoked, which may then + * write the data to the buffer depending on configuration + */ + addChar(char: number) { + if (char === 13 || char === 10) { + this.newLine(); + } else if (char > 31 && char < 126) { + this.addCharToBuffer(char); + } + } + + // add one or multiple characters as a string. DOES NOT PROCESS KEYPRESSES, WRITES DIRECTLY TO BUFFER + @maxMspBinding({ draw: true, throws: true, isMethod: true }) + add(c: string) { + for (var i = 0; i < c.length; i++) { + var char = c.charCodeAt(i); + this.addChar(char); + } + } + + + private addCharToBuffer(k: number) { + let pos = this.c.position(); + pos = this.c.position(); + // ascii code to string + let c = String.fromCharCode(k); + // insert character at index + this.tb.insertCharAt(pos.line, pos.char, c); + // increment current character + this.c.incrementChar(); + } + + // append a line of text or multiple symbols per line. DOES NOT PROCESS KEYPRESSES, WRITES DIRECTLY TO BUFFER + @maxMspBinding({ draw: true, isMethod: true, useArgsForText: true }) + append(text: Array) { + if (text.length > 0) + this.newLine(); + for (var i = 0; i < text.length; i++) { + this.add(text[i]); + if (i < text.length - 1) + this.newLine(); + } + this.jumpTo(JumpDirection.TOP); + this.jumpTo(JumpDirection.EOL); + } + + /* + * prepend a line of text or multiple symbols per line. + * DOES NOT PROCESS KEYPRESSES, WRITES DIRECTLY TO BUFFER + */ + @maxMspBinding({ draw: true, isMethod: true, useArgsForText: true }) + prepend(text: Array) { + this.c.reset(); + for (var i = 0; i < text.length; i++) { + this.add(text[i]); + this.newLine(); + } + this.jumpTo(JumpDirection.TOP); + this.jumpTo(JumpDirection.EOL); + } + + /* + * remove a line of text at a specified index + * if no idx is provided it will remove the last line of the buffer. + */ + @maxMspBinding({ draw: true, isMethod: true }) + remove(idx: number = -1) { + if (idx === -1) { idx = this.tb.length() - 1; } + this.c.setLine(idx); + this.deleteLine(); + } + + /* + * insert a line of text or multiple symbols at a specified index + * a list of symbols will insert one line per symbol + * DOES NOT PROCESS KEYPRESSES, WRITES DIRECTLY TO BUFFER + */ + @maxMspBinding({ draw: true, throws: true, isMethod: true, useArgsForText: true }) + insert(idx: number, text: Array) { + // if insert between totalLines + if (idx < this.tb.length()) { + var u = this.tb.textBuf.slice(0, Math.max(0, idx)); + u = Array.isArray(u) ? u : [u]; + u = u.concat(text); + this.tb.set(u.concat(this.tb.textBuf.slice(idx))) + } else { + // else append to code and insert empty strings + var diff = idx - this.tb.length(); + for (var d = 0; d < diff; d++) { + this.tb.textBuf.push(''); + } + this.tb.set(this.tb.textBuf.concat(text)) + } + } + + /* + * replace all the text with the incoming arguments + * this can be a list of symbols for every line + * DOES NOT PROCESS KEYPRESSES, WRITES DIRECTLY TO BUFFER + */ + @maxMspBinding({ draw: true, isMethod: true, useArgsForText: true }) + set(text: Array) { + + text = (text.length < 1) ? [''] : text; + text = (!Array.isArray(text)) ? [text] : text; + + text = text.slice(0, text.length); + // empty buffer + this.tb.set(text); + + this.c.setLine(this.tb.length() - 1) + this.jumpTo(JumpDirection.END); + this.jumpTo(JumpDirection.EOL); + } + + + // backspace a character + @maxMspBinding({ functionName: 'back', draw: true, isMethod: true }) + backSpace() { + // decrement character index + this.c.decrementChar() + + var pos = this.c.position() + if (pos.char >= 0) { + // remove character at index + this.tb.removeCharAt(pos.line, pos.char); + } else if (pos.line > 0) { + // remove line if at beginning of line + this.spliceLine(); + } else { + // else index is 0 + this.c.resetChar(); + } + } + + //reset the cursor and empty the buffer + @maxMspBinding({ draw: true, isMethod: true }) + clear() { + this.c.reset() + this.tb.clear(); + } + + // delete the character in front of the cursor + @maxMspBinding({ functionName: 'del', draw: true, isMethod: true }) + deleteChar() { + var pos = this.c.position() + if (pos.char < this.tb.lineLength(pos.line)) { + this.tb.setLine(pos.line, this.tb.getLine(pos.line).removeCharAt(pos.char)) + } else { + if (pos.line < this.tb.length() - 1) { + this.jumpLine(1 as Direction); + this.spliceLine(); + } + } + } + + formatPasteBin(): string[] { + return this.tb.pasteBinFormat(); + } + + // move one character to the right or left + //NB used to be called gotoCharacter + jumpChar(dir: Direction) { + + // if (dir !== -1 && dir !== 1) { + // throw new Error('gotoCharacter direction out of bounds: ' + dir); + // } + var pos = this.c.position() + this.c.setChar(pos.char + dir); + pos = this.c.position() + var len = this.tb.lineLength(pos.line); + + if (pos.char < 0 && pos.line > 0) { + this.jumpLine(-1); + this.jumpTo(1); + } else if (pos.char > len && pos.line != this.tb.length() - 1) { + this.jumpLine(1); + this.jumpTo(0); + } else { + this.c.setChar(Math.min(len, Math.max(0, pos.char))) + } + } + + // move one line up or down + //NB used to be called gotoLine + @maxMspBinding({ draw: true, isMethod: true }) + jumpLine(k: Direction) { + var pos = this.c.position() + //k = k * 2 - 1; + var prevLen = this.tb.lineLength(pos.line); + + this.c.setLine(Math.min(Math.max(0, (pos.line + k)), this.tb.length() - 1)) + pos = this.c.position() + var len = this.tb.lineLength(pos.line); + + if (pos.char == prevLen) { + this.c.setChar(len); + } else { + this.c.setChar(Math.min(len, pos.char)); + } + } + + // jump to the next or previous word (looks for seprated by spaces) + //NB used to be called gotoWord + @maxMspBinding({ draw: true, isMethod: true }) + jumpWord(k: Direction) { + var pos = this.c.position() + if (k === -1) { + var l = this.tb.getLine(pos.line).slice(0, pos.char); + if (l.match(/\ +[^ ]*$/g)) { + const match = l.match(/\s+[^\s]*(\s?)+$/g) + if (match !== null) { + var move = match[0].length; + this.c.setChar(pos.char - move); + } + } else { + this.jumpTo(0); + this.jumpChar(-1); + } + } else if (k === 1) { + var l = this.tb.getLine(pos.line).slice(pos.char); + if (l.match(/^[^ ]*\ +/g)) { + const match = l.match(/\s+[^\s]*(\s?)+$/g) + if (match !== null) { + var move = match[0].length; + this.c.setChar(pos.char + move); + } + } else { + this.jumpTo(1); + this.jumpChar(1); + } + } + } + + // jump to beginning/end of line or top/bottom of the tb string array + jumpTo(k: JumpDirection): void { + var pos = this.c.position() + var len = this.tb.lineLength(pos.line); + switch (k) { + // beginning of line + case JumpDirection.BOL: this.c.setChar(0); break; + // end of line + case JumpDirection.EOL: this.c.setChar(len); break; + // to beginning (top) + case JumpDirection.TOP: + this.c.setLine(0); + len = this.tb.lineLength(0); + //TODO: test this logic! + this.c.setChar(Math.min(len, pos.char)) + break; + // to end (bottom) + case JumpDirection.END: + this.c.setLine(this.tb.length() - 1); + len = this.tb.lineLength(this.c.line()); + this.c.setChar(Math.min(len, pos.char)) + break; + } + } + + // move the cursor to the index of the letter in the full text + @maxMspBinding({ draw: true, isMethod: true }) + gotoIndex(idx: number): void { + // go to beginning if index less then 0 + if (idx < 0) { + this.jumpTo(0); + this.jumpTo(2); + return; + } + // else move to the index by checking every line length + for (var l = 0; l < this.tb.length(); l++) { + if (idx < this.tb.lineLength(l)) { + this.c.setLine(l) + this.c.setChar(idx) + return; + } else { + // curLine = l; + // curChar = textBuf[l].length; + idx -= this.tb.lineLength(l); + } + } + // else jump to end if index greater than max length; + this.jumpTo(3); + this.jumpTo(1); + } + + newLine(): void { + if (this.tb.endOfLines()) { + throw new Error('End of lines reached, cannot create new line'); + } + // split array in left and right of cursor + var pos = this.c.position(); + var line = this.tb.getLine(pos.line); + var l = line.slice(0, pos.char); + var r = line.slice(pos.char); + + // store line left on current line + this.tb.setLine(pos.line, l); + + // update the line position + pos.line = this.c.incrementLine(); + + // insert new line on right side of cursor + var u = this.tb.get().slice(0, pos.line); + u = Array.isArray(u) ? u : [u]; + u.push(r); + // store to text buffer + this.tb.set(u.concat(this.tb.get().slice(pos.line))); + // jump to beginning of line + this.jumpTo(JumpDirection.BOL); + } + + //NB: This used to be called removeLine + spliceLine(): void { + // cursors at end of previous line + const line = this.c.line() + this.c.setChar(this.tb.lineLength(line - 1)) + + this.tb.spliceLine(line) + + // update the line position + this.c.setLine(Math.max(0, line - 1)); + } + + deleteLine(): void { + if (this.tb.length() == 1) { + this.tb.clear(); + this.c.setLine(0); + this.jumpTo(JumpDirection.TOP); + this.jumpTo(JumpDirection.BOL); + } else { + this.tb.deleteLine(this.c.line()) + + if (this.c.line() == this.tb.length()) { + this.c.decrementLine() + } + // place cursor + this.c.setChar(Math.max(this.tb.lineLength(this.c.line()), this.c.char())) + } + } + + // Add or remove comment at start of line + commentLine() { + // add comment-characters to regex + // escape special characters + var esc = this.config.CMNT.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + + var rgx = new RegExp('^ *' + esc + ' ?', 'g'); + // if has comment remove it, else add + let cLine = this.c.line(); + if (this.tb.getLine(cLine).match(rgx)) { + this.tb.setLine(cLine, this.tb.getLine(cLine).replace(rgx, '')); + } else { + this.tb.setLine(cLine, this.config.CMNT + ' ' + this.tb.getLine(cLine)); + } + this.c.setChar(this.tb.lineLength(this.c.line())); + } + + //kp load also throws! + loadConfigFromJSON(dictstring: string) { + const json = JSON.parse(dictstring); + + if (json.settings?.repl ?? false) { + let newSettings = new REPLSettings() + Object.assign(newSettings, json.settings.repl); + this.config.updateWith(newSettings); + } + + let newTB = new TextBuffer(); + if (json.settings?.textbuffer?.formatters ?? false) { + for (const formatter of json.settings.textbuffer.formatters) { + var result = this.formatterPreloads.filter(obj => { + return obj.id === formatter + }) + if (result !== undefined) { + for (const f of result) { + newTB.addFormatter(f) + } + } + } + } + + this.tb = newTB; + + this.kp.loadConfigFromJSON(dictstring) + } + +} \ No newline at end of file diff --git a/javascript/src/TextBuffer/TextBuffer.test.ts b/javascript/src/TextBuffer/TextBuffer.test.ts new file mode 100644 index 0000000..586df8e --- /dev/null +++ b/javascript/src/TextBuffer/TextBuffer.test.ts @@ -0,0 +1,401 @@ +import test from 'ava'; +import { TextBuffer } from './TextBuffer'; +import { TextFormatter } from './TextFormatter'; +import './../extensions/array.extensions'; + +class TestWhiteSpaceTrimFormatter implements TextFormatter { + id = "TestWhiteSpaceTrimFormatter" + format(strArr: Array, ctx: {}): Array { + return strArr.map(str => str.trim()); + } +} + +class TestWhiteSpaceReplacerFormatter implements TextFormatter { + id = "TestWhiteSpaceReplacerFormatter" + format(strArr: Array, ctx: {}): Array { + return strArr.map(str => str.replace(/\{/g, '').replace(/\}/g, '').trim()); + } +} + +class TestUppercaseFormatter implements TextFormatter { + id = "TestUppercaseFormatter" + format(strArr: Array, ctx: {}): Array { + return strArr.map(str => str.toUpperCase()); // Example implementation that returns all strings in uppercase + } +} + +class TestBoldFormatter implements TextFormatter { + id = "TestBoldFormatter" + format(strArr: Array, ctx: { author: string }): Array { + return strArr.map(str => { + const boldPattern = /{bold}/g; + const closeBoldPattern = /{\/bold}/g; + const authorPattern = /{author}/g; + const replacedText = str.replace(boldPattern, '').replace(closeBoldPattern, '').replace(authorPattern, ctx.author); + return replacedText + }); + } +} + +test('TextBuffer initializes with empty array', t => { + const tb = new TextBuffer(); + t.deepEqual(tb.get(), ['']); +}); + +test('set sets the buffer to the input string', t => { + const tb = new TextBuffer(); + tb.set(['Hello world!']); + t.deepEqual(tb.get(), ['Hello world!']); +}); + +test('setLine sets a specific line in the buffer to the input string', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.setLine(0, 'New Line 1'); + t.deepEqual(tb.get(), ['New Line 1', 'Line 2']); +}); + +test('append adds the input string to the end of the buffer', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.append(['Line 3']); + t.deepEqual(tb.get(), ['Line 1', 'Line 2', 'Line 3']); +}); + +test('prepend adds the input string to the beginning of the buffer', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.prepend(['New Line 1']); + t.deepEqual(tb.get(), ['New Line 1', 'Line 1', 'Line 2']); +}); + +test('emptyLine sets a specific line in the buffer to an empty string', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.emptyLine(0); + t.deepEqual(tb.get(), ['', 'Line 2']); +}); + +test('lineLength returns the length of a specific line in the buffer', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + t.is(tb.lineLength(0), 6); +}); + +test('format applies all registered formatters to the buffer', t => { + const tb = new TextBuffer(); + tb.set([' Line 1 ', ' { Line 2 } ']); + tb.addFormatter(new TestWhiteSpaceTrimFormatter); + tb.addFormatter(new TestWhiteSpaceReplacerFormatter); + const formatted = tb.format(); + t.deepEqual(formatted, ['Line 1', 'Line 2']); +}); + +test('TextBuffer.formatLine applies formatter to a specific line', t => { + + class TestFormatter implements TextFormatter { + id: string + constructor(id: string) { + this.id = id + } + + format(source: string[]): string[] { + return source.map(line => line.toUpperCase()); + } + } + + const textBuffer = new TextBuffer(); + const testFormatter = new TestFormatter('test-formatter'); + + textBuffer.set(['first line', 'second line']); + textBuffer.addFormatter(testFormatter); + + const expectedResult = ['SECOND LINE']; + const actualResult = textBuffer.formatLine(1); + + t.deepEqual(actualResult, expectedResult); +}); + +test('insertCharAt inserts a character into a specific position in a line', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.insertCharAt(0, 3, '!'); + t.deepEqual(tb.get(), ['Lin!e 1', 'Line 2']); +}); + +test('removeCharAt removes a character from a specific position in a line', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.removeCharAt(0, 3); + t.deepEqual(tb.get(), ['Lin 1', 'Line 2']); +}); + +test('spliceLine does not create negative indices when splcing on 0', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.spliceLine(0); + const arr = tb.get() + const val = arr[-1]; // accessing negative index + let undef = false; + if (val !== undefined) { + undef = true + } + t.is(false, undef, 'negative index exists') + +}); + +test('spliceLine splice a specific line from the buffer into the previous', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2']); + tb.spliceLine(0); + t.deepEqual(tb.get(), ['Line 2']); +}); + +test('spliceLine should splice a line from text buffer into the previous', t => { + const tb = new TextBuffer(); + tb.set(['line1', 'line2', 'line3']); + tb.spliceLine(1); + t.deepEqual(tb.get(), ['line1line2', 'line3']); +}); + +test('deleteLine should remove a line from text buffer', t => { + const tb = new TextBuffer(); + tb.set(['line1', 'line2', 'line3']); + tb.deleteLine(1); + t.deepEqual(tb.get(), ['line1', 'line3']); +}); + +test('insertCharAt should insert a character at a specific index in a line', t => { + const tb = new TextBuffer(); + tb.set(['line1', 'line2', 'line3']); + tb.insertCharAt(1, 1, 'x'); + t.deepEqual(tb.get(), ['line1', 'lxine2', 'line3']); +}); + +test('removeCharAt should remove a character at a specific index in a line', t => { + const tb = new TextBuffer(); + tb.set(['line1', 'line2', 'line3']); + tb.removeCharAt(2, 1); + t.deepEqual(tb.get(), ['line1', 'line2', 'lne3']); +}); + +////////////////////// + +test('set sets the text buffer to the given array of strings', t => { + const tb = new TextBuffer(); + const input = ['line 1', 'line 2', 'line 3']; + tb.set(input); + t.deepEqual(tb.get(), input); +}); + +test('set sets the text buffer to an array containing the given string if a string is provided', t => { + const tb = new TextBuffer(); + const input = ['line 1']; + tb.set(input); + t.deepEqual(tb.get(), input); +}); + +test('setLine sets the given line to the given string', t => { + const tb = new TextBuffer(); + tb.set(['line 1', 'line 2', 'line 3']); + const input = 'new line'; + tb.setLine(1, input); + t.is(tb.getLine(1), input); +}); + +test('append appends an array of strings to the text buffer', t => { + const tb = new TextBuffer(); + tb.set(['line 1', 'line 2']); + const input = ['line 3', 'line 4']; + tb.append(input); + t.deepEqual(tb.get(), ['line 1', 'line 2', 'line 3', 'line 4']); +}); + +test('prepend prepends an array of strings to the text buffer', t => { + const tb = new TextBuffer(); + tb.set(['line 3', 'line 4']); + const input = ['line 1', 'line 2']; + tb.prepend(input); + t.deepEqual(tb.get(), ['line 1', 'line 2', 'line 3', 'line 4']); +}); + + +test('deleteLine removes the given line from the text buffer', t => { + const tb = new TextBuffer(); + tb.set(['line 1', 'line 2', 'line 3']); + tb.deleteLine(1); + t.deepEqual(tb.get(), ['line 1', 'line 3']); +}); + +test('clear() removes all lines from the buffer and sets the first line to an empty string', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2', 'Line 3']); + tb.clear(); + t.deepEqual(tb.get(), ['']); +}); + +test('setFormatters sets the formatters array', t => { + const tb = new TextBuffer(); + tb.addFormatter(new TestWhiteSpaceTrimFormatter); + tb.addFormatter(new TestWhiteSpaceReplacerFormatter); + + const formatter1 = new TestUppercaseFormatter + const formatter2 = new TestUppercaseFormatter + const formatters = [formatter1, formatter2]; + + tb.setFormatters(formatters); + t.deepEqual(tb.formatters, formatters); +}); + +test('lines returns the number of lines in the buffer', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2', 'Line 3']); + t.is(tb.length(), 3); +}); + +test('length returns the number of lines in the buffer', t => { + const tb = new TextBuffer(); + tb.set(['Line 1', 'Line 2', 'Line 3']); + t.is(tb.length(), 3); +}); + +test('pasteBinCopyLine should return the line specified in pasteBin', t => { + const buffer = new TextBuffer(); + buffer.set(['Line 1', 'Line 2', 'Line 3']); + + const pasteBinLine = 1; + const result = buffer.pasteBinCopyLine(pasteBinLine); + + t.deepEqual(result, ['Line 2']); +}); + +test('pasteBinCopyLine should throw an error if line index is out of range > ', t => { + const buffer = new TextBuffer(); + buffer.set(['Line 1', 'Line 2', 'Line 3']); + + const pasteBinLine = 5; + const error = t.throws(() => { + buffer.pasteBinCopyLine(pasteBinLine); + }, { instanceOf: Error }); + if (error !== undefined) + t.is(error.message, 'pastebin line index out of range'); +}); + +test('pasteBinCopyLine should throw an error if line index is out of range < 0', t => { + const buffer = new TextBuffer(); + buffer.set(['Line 1', 'Line 2', 'Line 3']); + + const pasteBinLine = -2; + const error = t.throws(() => { + buffer.pasteBinCopyLine(pasteBinLine); + }, { instanceOf: Error }); + if (error !== undefined) + t.is(error.message, 'pastebin line index out of range'); +}); + +test('pasteBinCopyLine should set the pasteBin array with the line specified', t => { + const buffer = new TextBuffer(); + buffer.set(['Line 1', 'Line 2', 'Line 3']); + + const pasteBinLine = 1; + buffer.pasteBinCopyLine(pasteBinLine); + + t.deepEqual(buffer.pasteBin, ['Line 2']); +}); + + +test('pasteBinCopyAll', t => { + const tb = new TextBuffer(); + tb.set([' line 1', ' line 2 ', 'line 3']); + const copy = tb.pasteBinCopyAll(); + t.deepEqual(copy, ['line 1', 'line 2', 'line 3']); +}); + +test('pasteBinGet', t => { + const tb = new TextBuffer(); + tb.pasteBin = ['line 1', 'line 2']; + const pasteBin = tb.pasteBinGet(); + t.deepEqual(pasteBin, ['line 1', 'line 2']); +}); + +test('pasteBinInsertLine', t => { + const tb = new TextBuffer(); + tb.set(['line 1', 'line 2', 'line 3']); + tb.pasteBin = ['new line 1', 'new line 2']; + tb.pasteBinInsertLine(1); + t.deepEqual(tb.get(), ['line 1', 'new line 1', 'new line 2', 'line 2', 'line 3']); +}); + +test('pasteBinReplaceLine replaces line with pasteBin content', t => { + const tb = new TextBuffer(); + const originalText = ['This is line 1', 'This is line 2', 'This is line 3']; + tb.set(originalText); + + const pasteBinContent = ['New line 1', 'New line 2']; + tb.pasteBin = pasteBinContent; + + const lineIndex = 1; + tb.pasteBinReplaceLine(lineIndex); + + const expectedText = ['This is line 1', 'New line 1', 'New line 2', 'This is line 3']; + const actualText = tb.get(); + + t.deepEqual(actualText, expectedText); +}); + +test('pasteBinMutateLine should insert and remove elements from textBuf', t => { + const tb = new TextBuffer(); + tb.set(['Hello', 'World']); + tb.pasteBin = ['new', 'text']; + tb.pasteBinMutateLine(1, 2); + t.deepEqual(tb.textBuf, ['Hello', 'new', 'text']); +}); + +test('pasteBinMutateLine throws an error if insert or remove ID out of range', t => { + const tb = new TextBuffer(); + tb.set(['line 1', 'line 2']); + + t.throws(() => { + tb.pasteBinMutateLine(5, 0); // insertID out of range + }, { instanceOf: Error, message: 'insert or remove ID out of range: 5 0' }); + + t.throws(() => { + tb.pasteBinMutateLine(0, 5); // removeID out of range + }, { instanceOf: Error, message: 'insert or remove ID out of range: 0 5' }); +}); + +test('getMaxChar should return the number of characters in the longest line in the buffer', t => { + const buffer = new TextBuffer(); + buffer.set(['one', 'two', 'three', 'four', 'five']); + t.is(buffer.textBuf.getMaxChar(), 5); + + buffer.append(['a really long line here']); + t.is(buffer.textBuf.getMaxChar(), 23); + + buffer.prepend(['another long line']); + //the previously added line is still longer + t.is(buffer.textBuf.getMaxChar(), 23); + + buffer.prepend(['supercalirfagilisticexpialidocious']); + //newly longest line + t.is(buffer.textBuf.getMaxChar(), 34); +}); + +test('TextBuffer.pasteBinFormat applies formatters to the pasteBin', t => { + const textBuffer = new TextBuffer(); + const testFormatter = new TestUppercaseFormatter(); + + textBuffer.append(["the owls are not what they seem"]) + textBuffer.pasteBinCopyAll(); + textBuffer.addFormatter(testFormatter); + + const expectedResult = textBuffer.pasteBin.map(line => line.toUpperCase()); + const actualResult = textBuffer.pasteBinFormat(); + + t.deepEqual(actualResult, expectedResult); +}); + +test('minimumIndex does not return negative values', t => { + const textBuffer = new TextBuffer(); + t.true(textBuffer.minimumIndex() >= 0); +}); \ No newline at end of file diff --git a/javascript/src/TextBuffer/TextBuffer.ts b/javascript/src/TextBuffer/TextBuffer.ts new file mode 100644 index 0000000..1a51f39 --- /dev/null +++ b/javascript/src/TextBuffer/TextBuffer.ts @@ -0,0 +1,155 @@ +import 'string.extensions'; +import 'array.extensions'; +import { TextFormatter } from 'TextFormatter'; + +export class TextBuffer { + textBuf: Array + formatters: Array + pasteBin: Array + + constructor() { + this.textBuf = ['']; + this.formatters = []; + this.pasteBin = []; + } + + clear() { + this.textBuf = ['']; + } + + get() { + return this.textBuf; + } + + getLine(line: number): string { + return this.textBuf[line] || ''; + } + + set(strArr: Array): void { + this.textBuf = strArr; + } + + setLine(line: number, str: string): void { + this.textBuf[line] = str; + } + + append(strArr: Array): void { + this.textBuf = this.textBuf.concat(strArr); + } + + prepend(strArr: Array): void { + this.textBuf = strArr.concat(this.textBuf); + } + + emptyLine(line: number): void { + this.textBuf[line] = ''; + } + + //TODO: get rid of one of these 2 + length(): number { + return this.textBuf.length; + } + + minimumIndex(): number { + return (this.length() > 0) ? this.length() - 1 : 0; + } + + lineLength(line: number): number { + return this.textBuf[line].length; + } + + addFormatter(formatter: TextFormatter): void { + this.formatters.push(formatter); + } + + setFormatters(formatters: Array): void { + this.formatters = formatters; + } + + format(): Array { + return this.formatTextArray(this.textBuf); + } + + formatLine(lineNum: number): Array { + return this.formatTextArray([this.getLine(lineNum)]); + } + + private formatTextArray(textArr: Array): Array { + let formatted = textArr; + for (let i = 0; i < this.formatters.length; i++) { + formatted = this.formatters[i].format(formatted); + } + return formatted; + } + + insertCharAt(line: number, i: number, c: string): void { + this.textBuf[line] = this.textBuf[line].insertCharAt(i, c); + } + + removeCharAt(line: number, i: number): void { + this.textBuf[line] = this.textBuf[line].removeCharAt(i); + } + + spliceLine(line: number): void { + if (line > 0) { + // add current line to line above + this.textBuf[line - 1] += this.textBuf[line]; + } + // remove item from array at index + this.textBuf.splice(line, 1); + } + + deleteLine(line: number): void { + if (this.textBuf.length <= 1) + this.clear(); + else + this.textBuf.splice(line, 1); + } + + //TODO: Deprecated + endOfLines(): boolean { + return false; + } + + pasteBinCopyLine(line: number): Array { + if (line < 0 || line > this.textBuf.length) { + throw new Error('pastebin line index out of range') + } + this.pasteBin = [this.textBuf[line]]; + return this.pasteBin; + } + + pasteBinCopyAll(): Array { + this.pasteBin = []; + for (var i = 0; i < this.textBuf.length; i++) { + this.pasteBin[i] = this.textBuf[i].trim() + } + return this.pasteBin; + } + + pasteBinFormat(): Array { + return this.formatTextArray(this.pasteBin); + } + + pasteBinGet(): Array { + return this.pasteBin; + } + + pasteBinInsertLine(lineIndex: number): void { + this.pasteBinMutateLine(lineIndex, 0) + } + + pasteBinReplaceLine(lineIndex: number) { + //replaced a line with pastebin content. could be a multiline insert! + this.pasteBinMutateLine(lineIndex, lineIndex) + } + + //Mutate the text buffer by inserting and optionally removing an element from the pasteBin + pasteBinMutateLine(insertID: number, removeID: number) { + if (insertID < this.textBuf.length + 1 && removeID < this.textBuf.length + 1) + Array.prototype.splice.apply(this.textBuf, ['splice']>>[insertID, removeID, ...this.pasteBin]); + else + throw new Error('insert or remove ID out of range: ' + insertID + " " + removeID); + } + +} diff --git a/javascript/src/TextBuffer/TextFormatter.ts b/javascript/src/TextBuffer/TextFormatter.ts new file mode 100644 index 0000000..619d4b4 --- /dev/null +++ b/javascript/src/TextBuffer/TextFormatter.ts @@ -0,0 +1,4 @@ +export interface TextFormatter { + readonly id: string + format(strArr: Array, ctx?: {}): Array +} \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/BraceBalancedFormatter.test.ts b/javascript/src/TextBuffer/formatters/BraceBalancedFormatter.test.ts new file mode 100644 index 0000000..aa01a49 --- /dev/null +++ b/javascript/src/TextBuffer/formatters/BraceBalancedFormatter.test.ts @@ -0,0 +1,79 @@ +import test from 'ava'; +import { BraceBalancedFormatter } from './BraceBalancedFormatter'; + + +test('simple balanced braces', t => { + const bb = new BraceBalancedFormatter + t.is(bb.isBalanced("cmd(x)"), true); + t.is(bb.isBalanced("cmd[x]"), true); + t.is(bb.isBalanced("cmd{x}"), true); +}); + +test('complex balanced braces', t => { + const bb = new BraceBalancedFormatter + t.is(bb.isBalanced("save(seq(cmd(x) cmd(y) cmd(a b c) cmd (45 67 93)))"), true); + t.is(bb.isBalanced("cmd{([x])}"), true); + t.is(bb.isBalanced("cmd{{{(({[x]}))}}}"), true); +}); + +test('simple unbalanced braces', t => { + const bb = new BraceBalancedFormatter + t.is(bb.isBalanced("cmd(x"), false); + t.is(bb.isBalanced("cmd{x"), false); + t.is(bb.isBalanced("cmd[x"), false); + t.is(bb.isBalanced("cmd)"), false); + t.is(bb.isBalanced("cmd}"), false); + t.is(bb.isBalanced("cmd]"), false); +}); + +test('complex unbalanced braces', t => { + const bb = new BraceBalancedFormatter + t.is(bb.isBalanced("save(seq(cmd(x) cmd(y) cmd(a b c cmd (45 67 93)))"), false); + t.is(bb.isBalanced("save(seq(cmd(x) cmd(y) cmd(a b c) cmd (45 67 93))"), false); + t.is(bb.isBalanced("cmd{([x]}"), false); + t.is(bb.isBalanced("cmd{{{({[x]}))}}}"), false); +}); + +test('multiline balanced brace formatting', t => { + const bb = new BraceBalancedFormatter + let res = bb.format(["seq(cmd(100) cmd(666)", "cmd(200)", "cmd(300))", "cmd(300)"]) + t.deepEqual(res, ["seq(cmd(100) cmd(666) cmd(200) cmd(300))", "cmd(300)"]); +}); + +test('multiline last line unbalanced brace formatting', t => { + const bb = new BraceBalancedFormatter + let res = bb.format(["seq(cmd(100) cmd(666)", "cmd(200)", "cmd(300))", "cmd(300"]) + t.deepEqual(res, ["seq(cmd(100) cmd(666) cmd(200) cmd(300))"]); +}); + +test('multiline unbalanced brace formatting', t => { + const bb = new BraceBalancedFormatter + let res = bb.format(["seq(cmd(100) cmd(666)", "cmd(200)", "cmd(300)", "cmd(300)"]) + t.deepEqual(res, []); +}); + +test('strict balanced pass', t => { + const bb = new BraceBalancedFormatter(true) + t.notThrows(() => { bb.format(["cmd(200)"]) }); +}); + +test('strict unbalanced exception', t => { + const bb = new BraceBalancedFormatter(true) + const error = t.throws(() => { + bb.format(["cmd(200"]) + }, { instanceOf: Error }); + if (error !== undefined) + t.is(error.message, 'not balanced: cmd(200'); +}); + + +test('incorrect space insertion', t => { + const bb = new BraceBalancedFormatter + t.deepEqual(bb.format(["seq(cmd(100)", ")"]), ["seq(cmd(100))"]) +}); + + +test('incorrect space insertion at line start after break', t => { + const bb = new BraceBalancedFormatter + t.deepEqual(bb.format(["seq(cmd(", "100)", ")"]), ["seq(cmd(100))"]) +}); \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/BraceBalancedFormatter.ts b/javascript/src/TextBuffer/formatters/BraceBalancedFormatter.ts new file mode 100644 index 0000000..a4819d6 --- /dev/null +++ b/javascript/src/TextBuffer/formatters/BraceBalancedFormatter.ts @@ -0,0 +1,62 @@ +import 'string.extensions'; +import { TextFormatter } from 'TextFormatter'; + +export class BraceBalancedFormatter implements TextFormatter { + readonly id: string = "bracebalanced" + strict: boolean + constructor(strict: boolean = false) { this.strict = strict } + format(strArr: Array) { + + const reg = /([([])\s+|\s+([)\]])/g + var balanced = true; + var history = "" + var output = []; + + //max msp javascript is fucking archaic! + for (var i = 0; i < strArr.length; i++) { + //for (var v of strArr) { + var v = strArr[i]; + + var data = history + v + " "; + balanced = this.isBalanced(data) + if (!balanced) { + history = data; + } else { + const bracketSpaceFixed = data.replacerec(reg, "$1$2"); + output.push(bracketSpaceFixed.trim()) + history = ""; + } + } + + if (this.strict && !balanced) { + throw new Error("not balanced: " + history.trim()) + } + return output; + } + + //https://levelup.gitconnected.com/solving-balanced-brackets-in-javascript-with-stacks-edbc52a57309 + isBalanced(input: string) { + + var brackets = "[]{}()<>" + var stack = [] + + for (var i = 0; i < input.length; i++) { + //for (var bracket of input) { + var bracket = input[i]; + var bracketsIndex = brackets.indexOf(bracket) + + if (bracketsIndex === -1) { + continue + } + + if (bracketsIndex % 2 === 0) { + stack.push(bracketsIndex + 1) + } else { + if (stack.pop() !== bracketsIndex) { + return false; + } + } + } + return stack.length === 0 + } +} diff --git a/javascript/src/TextBuffer/formatters/CommentRemoverFormatter.test.ts b/javascript/src/TextBuffer/formatters/CommentRemoverFormatter.test.ts new file mode 100644 index 0000000..411ac96 --- /dev/null +++ b/javascript/src/TextBuffer/formatters/CommentRemoverFormatter.test.ts @@ -0,0 +1,31 @@ +import test from 'ava'; +import { CommentRemoverFormatter } from './CommentRemoverFormatter'; + +test('CommentRemoverFormatter filters out commented lines', t => { + const formatter = new CommentRemoverFormatter(); + const input = ['// this is a comment', 'this is not', '//another comment', 'still not a comment']; + const expected = ['this is not', 'still not a comment']; + const output = formatter.format(input); + t.deepEqual(output, expected); +}); + +test('CommentRemoverFormatter.id is "commentremover"', t => { + const formatter = new CommentRemoverFormatter(); + t.true(formatter.id === 'commentremover'); +}); + +test('CommentRemoverFormatter filters nothing if no comments present', t => { + const formatter = new CommentRemoverFormatter(); + const input = ['this is not a comment', 'still not a comment']; + const expected = ['this is not a comment', 'still not a comment']; + const output = formatter.format(input); + t.deepEqual(output, expected); +}); + +test('CommentRemoverFormatter if only comment', t => { + const formatter = new CommentRemoverFormatter(); + const input = ['//this is a comment']; + const expected = []; + const output = formatter.format(input); + t.deepEqual(output, expected); +}); \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/CommentRemoverFormatter.ts b/javascript/src/TextBuffer/formatters/CommentRemoverFormatter.ts new file mode 100644 index 0000000..2cd7566 --- /dev/null +++ b/javascript/src/TextBuffer/formatters/CommentRemoverFormatter.ts @@ -0,0 +1,21 @@ + +import { TextFormatter } from 'TextFormatter'; + +export class CommentRemoverFormatter implements TextFormatter { + readonly id: string = "commentremover" + readonly joiner: string + //single line output. + format(strArr: Array) { + return strArr.filter(e => !e.startsWith('//')); + } + +} + +if (!String.prototype.startsWith) { + Object.defineProperty(String.prototype, 'startsWith', { + value: function (search, rawPos) { + var pos = rawPos > 0 ? rawPos | 0 : 0; + return this.substring(pos, pos + search.length) === search; + } + }); +} \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/SingleLineOutputFormatter.test.ts b/javascript/src/TextBuffer/formatters/SingleLineOutputFormatter.test.ts new file mode 100644 index 0000000..faa5e1a --- /dev/null +++ b/javascript/src/TextBuffer/formatters/SingleLineOutputFormatter.test.ts @@ -0,0 +1,22 @@ +import test from 'ava'; +import { SingleLineOutputFormatter } from './SingleLineOutputFormatter'; + +test('SingleLineOutputFormatter - format() returns a single line string array', t => { + const singleLineOutputFormatter = new SingleLineOutputFormatter(); + const inputArray = ['hello', 'world']; + const expectedOutput = ['hello world']; + + const result = singleLineOutputFormatter.format(inputArray); + + t.deepEqual(result, expectedOutput); +}); + +test('SingleLineOutputFormatter - custom joiner', t => { + const singleLineOutputFormatter = new SingleLineOutputFormatter("+"); + const inputArray = ['hello', 'world']; + const expectedOutput = ['hello+world']; + + const result = singleLineOutputFormatter.format(inputArray); + + t.deepEqual(result, expectedOutput); +}); \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/SingleLineOutputFormatter.ts b/javascript/src/TextBuffer/formatters/SingleLineOutputFormatter.ts new file mode 100644 index 0000000..db6dbbb --- /dev/null +++ b/javascript/src/TextBuffer/formatters/SingleLineOutputFormatter.ts @@ -0,0 +1,14 @@ +import { TextFormatter } from 'TextFormatter'; + +export class SingleLineOutputFormatter implements TextFormatter { + readonly id: string = "singleline" + readonly joiner: string + constructor(join: string = " ") { + this.joiner = join + } + //single line output. + format(strArr: Array) { + return [strArr.join(this.joiner)]; + } + +} \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/WhitespaceFormatter.test.ts b/javascript/src/TextBuffer/formatters/WhitespaceFormatter.test.ts new file mode 100644 index 0000000..e360a2a --- /dev/null +++ b/javascript/src/TextBuffer/formatters/WhitespaceFormatter.test.ts @@ -0,0 +1,10 @@ +import test from 'ava'; +import { WhitespaceFormatter } from './WhitespaceFormatter'; + +test('WhitespaceFormatter should format strings correctly', t => { + const formatter = new WhitespaceFormatter(); + const input = [' hello world ', ' foo bar ', 'baz ']; + const expectedOutput = ['hello world', 'foo bar', 'baz']; + const actualOutput = formatter.format(input); + t.deepEqual(actualOutput, expectedOutput); +}); \ No newline at end of file diff --git a/javascript/src/TextBuffer/formatters/WhitespaceFormatter.ts b/javascript/src/TextBuffer/formatters/WhitespaceFormatter.ts new file mode 100644 index 0000000..8cca87c --- /dev/null +++ b/javascript/src/TextBuffer/formatters/WhitespaceFormatter.ts @@ -0,0 +1,15 @@ +//import '../string.extensions'; +import { TextFormatter } from 'TextFormatter'; + +export class WhitespaceFormatter implements TextFormatter { + readonly id: string = "whitespace" + constructor() { } + //replaces all forms of whitespace with a space and trims the end + format(strArr: Array) { + var out = strArr.map(function (t) { + return t.replace(/\s+/g, ' ').trim(); + }) + return out; + } + +} \ No newline at end of file diff --git a/javascript/src/extensions/array.extensions.test.ts b/javascript/src/extensions/array.extensions.test.ts new file mode 100644 index 0000000..52dec36 --- /dev/null +++ b/javascript/src/extensions/array.extensions.test.ts @@ -0,0 +1,14 @@ +import test from 'ava'; +import './array.extensions'; + +test('getMaxChar', t => { + const arr1 = ['one', 'two', 'three', 'four']; + const arr2 = ['a', 'ab', 'abc', 'abcd']; + const arr3 = ['', ' ', ' ']; + const arr4 = []; + + t.is(arr1.getMaxChar(), 5); + t.is(arr2.getMaxChar(), 4); + t.is(arr3.getMaxChar(), 2); + t.is(arr4.getMaxChar(), 0); +}); \ No newline at end of file diff --git a/javascript/src/extensions/array.extensions.ts b/javascript/src/extensions/array.extensions.ts new file mode 100644 index 0000000..134de7f --- /dev/null +++ b/javascript/src/extensions/array.extensions.ts @@ -0,0 +1,14 @@ + +interface Array { + getMaxChar(): number +} + +Array.prototype.getMaxChar = function () { + var lengths = []; + for (var l = 0; l < this.length; l++) { + lengths[l] = this[l].length; + } + var sortArr = lengths.slice(0); + sortArr.sort(function (a, b) { return b - a }); + return sortArr[0] || 0; +}; \ No newline at end of file diff --git a/javascript/src/extensions/object.extensions.test.ts b/javascript/src/extensions/object.extensions.test.ts new file mode 100644 index 0000000..61954f6 --- /dev/null +++ b/javascript/src/extensions/object.extensions.test.ts @@ -0,0 +1,36 @@ +import test from 'ava'; +import { createObjectAssignPolyfill } from './object.extensions'; +test('Object.assign polyfill', t => { + + const obj1 = { a: 1 }; + const obj2 = { b: 2 }; + const obj3 = { c: 3 }; + createObjectAssignPolyfill(); + const result = Object.assign({}, obj1, obj2, obj3); + t.deepEqual(result, { a: 1, b: 2, c: 3 }); +}); + +test('Object.assign polyfill with undefined/null values', t => { + + const obj1 = { a: 1 }; + const obj2 = undefined; + const obj3 = null; + const obj4 = { b: 2 }; + + createObjectAssignPolyfill(); + const result = Object.assign({}, obj1, obj2, obj3, obj4); + + t.deepEqual(result, { a: 1, b: 2 }); +}); + +test('Object.assign polyfill with empty objects', t => { + + const obj1 = {}; + const obj2 = {}; + const obj3 = { a: 1, b: 2 }; + + createObjectAssignPolyfill(); + const result = Object.assign(obj1, obj2, obj3); + + t.deepEqual(result, { a: 1, b: 2 }); +}); diff --git a/javascript/src/extensions/object.extensions.ts b/javascript/src/extensions/object.extensions.ts new file mode 100644 index 0000000..655d7c1 --- /dev/null +++ b/javascript/src/extensions/object.extensions.ts @@ -0,0 +1,32 @@ +/** + * Object.assign() - Polyfill + * https://github.com/ryanhefner/Object.assign + * + * @ref https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign + */ +export function createObjectAssignPolyfill() { + Object.assign = function (target: any) { + 'use strict'; + if (target === undefined || target === null) { + throw new TypeError('Cannot convert undefined or null to object'); + } + var output = Object(target); + for (var index = 1; index < arguments.length; index++) { + var source = arguments[index]; + if (source !== undefined && source !== null) { + for (var nextKey in source) { + if (source.hasOwnProperty(nextKey)) { + output[nextKey] = source[nextKey]; + } + } + } + } + return output; + }; +}; + +(function () { + if (typeof Object.assign != 'function') { + createObjectAssignPolyfill(); + } +})(); \ No newline at end of file diff --git a/javascript/src/extensions/string.extensions.test.ts b/javascript/src/extensions/string.extensions.test.ts new file mode 100644 index 0000000..2e7c188 --- /dev/null +++ b/javascript/src/extensions/string.extensions.test.ts @@ -0,0 +1,32 @@ +import test from 'ava'; +import './string.extensions'; + +test('removeCharAt removes the character at the specified index', t => { + const str = 'hello'; + const newStr = str.removeCharAt(1); + t.is(newStr, 'hllo'); +}); + +test('insertCharAt inserts a character at the specified index', t => { + const str = 'hello'; + const newStr = str.insertCharAt(1, 'a'); + t.is(newStr, 'haello'); +}); + +test('insertCharAt appends the character if the index is greater than the string length', t => { + const str = 'hello'; + const newStr = str.insertCharAt(5, 'a'); + t.is(newStr, 'helloa'); +}); + +test('insertCharAt prepends the character if the index is 0', t => { + const str = 'hello'; + const newStr = str.insertCharAt(0, 'a'); + t.is(newStr, 'ahello'); +}); + +test('insertCharAt inserts the character at the end of the string if the index is negative', t => { + const str = 'hello'; + const newStr = str.insertCharAt(-1, 'a'); + t.is(newStr, 'hellao'); +}); diff --git a/javascript/src/extensions/string.extensions.ts b/javascript/src/extensions/string.extensions.ts new file mode 100644 index 0000000..720ccd4 --- /dev/null +++ b/javascript/src/extensions/string.extensions.ts @@ -0,0 +1,24 @@ +interface String { + removeCharAt(i: number): string; + insertCharAt(i: number, c: string): string; + replacerec(pattern: RegExp, what: string): string; +} + +String.prototype.removeCharAt = function (i: number) { + const tmp = this.split(''); + tmp.splice(i, 1); + return tmp.join(''); +}; + +String.prototype.insertCharAt = function (i: number, c: string) { + const l = this.slice(0, i); + const r = this.slice(i); + return l + c + r; +}; + +String.prototype.replacerec = function (pattern: RegExp, what: string) { + var newstr = this.replace(pattern, what); + if (newstr == this) + return newstr; + return newstr.replace(pattern, what); +}; \ No newline at end of file diff --git a/javascript/src/includes.ts b/javascript/src/includes.ts new file mode 100644 index 0000000..dd52eaf --- /dev/null +++ b/javascript/src/includes.ts @@ -0,0 +1,15 @@ +import { GLRender } from "GLRender"; +import { REPLManager, REPLSettings } from 'REPLManager'; +import { BraceBalancedFormatter } from "BraceBalancedFormatter"; +import { WhitespaceFormatter } from "WhitespaceFormatter"; +import { SingleLineOutputFormatter } from "SingleLineOutputFormatter"; +import { CommentRemoverFormatter } from "CommentRemoverFormatter"; + +//preload all our formatters +const bbf = new BraceBalancedFormatter(true); +const wsf = new WhitespaceFormatter(); +const slf = new SingleLineOutputFormatter(""); +const crf = new CommentRemoverFormatter(); + +exports.renderer = new GLRender(Date.now()); +exports.manager = new REPLManager(new REPLSettings(), [], [wsf, bbf, slf, crf]); diff --git a/javascript/tsconfig.json b/javascript/tsconfig.json new file mode 100644 index 0000000..87d882e --- /dev/null +++ b/javascript/tsconfig.json @@ -0,0 +1,160 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + /* Language and Environment */ + "target": "ES5", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": [ + "ES5" + ], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ + "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + /* Modules */ + "module": "CommonJS", /* Specify what module code is generated. */ + // "rootDir": "./", /* Specify the root folder within your source files. */ + // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "src", /* Specify the base directory to resolve non-relative module names. */ + /* We need to do these rewrites because of how max will resolve the requires in the end */ + "paths": { + "Cursor": [ + "Cursor/Cursor" + ], + "GLRender": [ + "GLRender/GLRender" + ], + "KeypressProcessor": [ + "KeypressProcessor/KeypressProcessor" + ], + "MaxBindings": [ + "MaxBindings/MaxBindings" + ], + "REPLManager": [ + "REPLManager/REPLManager" + ], + "TextBuffer": [ + "TextBuffer/TextBuffer" + ], + "TextFormatter": [ + "TextBuffer/TextFormatter" + ], + "WhitespaceFormatter": [ + "TextBuffer/formatters/WhitespaceFormatter" + ], + "BraceBalancedFormatter": [ + "TextBuffer/formatters/BraceBalancedFormatter" + ], + "SingleLineOutputFormatter": [ + "TextBuffer/formatters/SingleLineOutputFormatter" + ], + "CommentRemoverFormatter": [ + "TextBuffer/formatters/CommentRemoverFormatter" + ], + "string.extensions": [ + "extensions/string.extensions" + ], + "array.extensions": [ + "extensions/array.extensions" + ], + "object.extensions": [ + "extensions/object.extensions" + ] + }, + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + "types": [ + "maxmsp", + "node" + ], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ + // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ + // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ + // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ + // "resolveJsonModule": true, /* Enable importing .json files. */ + // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + /* JavaScript Support */ + // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + //"sourceMap": false, /* Create source map files for emitted JavaScript files. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + //"outFile": "./dist/repl.js", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist", /* Specify an output folder for all emitted files. */ + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ + //"allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + //"esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + /* Type Checking */ + //"strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true, /* Skip type checking all .d.ts files. */ + "ignoreDeprecations": "5.0" /* ignore that es3 is not supported soon */ + }, + "exclude": [ + "./src/MaxBindings/*", + "./src/**/*.test.ts" + ], + "include": [ + "./src/**/*", + "./src/**/*.d.ts" + ], +} \ No newline at end of file diff --git a/lefthook.yml b/lefthook.yml new file mode 100644 index 0000000..f0f8e10 --- /dev/null +++ b/lefthook.yml @@ -0,0 +1,4 @@ +commit-msg: + commands: + commit-msg-lint: + run: commitlint --from HEAD~1 --to HEAD --verbose \ No newline at end of file diff --git a/media/Screen Shot 2020-04-22 at 14.48.20.png b/media/Screen Shot 2020-04-22 at 14.48.20.png deleted file mode 100644 index 988fbcb..0000000 Binary files a/media/Screen Shot 2020-04-22 at 14.48.20.png and /dev/null differ diff --git a/media/Screen Shot 2020-04-22 at 14.52.06.png b/media/Screen Shot 2020-04-22 at 14.52.06.png deleted file mode 100644 index d5603cc..0000000 Binary files a/media/Screen Shot 2020-04-22 at 14.52.06.png and /dev/null differ diff --git a/media/Screen Shot 2020-04-22 at 14.52.21.png b/media/Screen Shot 2020-04-22 at 14.52.21.png deleted file mode 100644 index d197642..0000000 Binary files a/media/Screen Shot 2020-04-22 at 14.52.21.png and /dev/null differ diff --git a/media/Screen Shot 2020-04-22 at 14.54.30.png b/media/Screen Shot 2020-04-22 at 14.54.30.png deleted file mode 100644 index 36e05d6..0000000 Binary files a/media/Screen Shot 2020-04-22 at 14.54.30.png and /dev/null differ diff --git a/media/Screen Shot 2020-04-22 at 15.15.43.png b/media/Screen Shot 2020-04-22 at 15.15.43.png deleted file mode 100644 index 2631299..0000000 Binary files a/media/Screen Shot 2020-04-22 at 15.15.43.png and /dev/null differ diff --git a/media/screenshot.png b/media/screenshot.png deleted file mode 100644 index dfa29fd..0000000 Binary files a/media/screenshot.png and /dev/null differ diff --git a/media/screenshot_2.png b/media/screenshot_2.png deleted file mode 100644 index a7919a7..0000000 Binary files a/media/screenshot_2.png and /dev/null differ diff --git a/media/screenshot_3.png b/media/screenshot_3.png deleted file mode 100644 index 1c02b8d..0000000 Binary files a/media/screenshot_3.png and /dev/null differ diff --git a/misc/replkeys.json b/misc/replkeys.json new file mode 100644 index 0000000..f32ae69 --- /dev/null +++ b/misc/replkeys.json @@ -0,0 +1,342 @@ +{ + "settings": { + "textbuffer": { + "formatters": [ + "commentremover", + "whitespace", + "bracebalanced" + ] + } + }, + "bindings": [ + { + "id": "execute-opt+enter-mac", + "asciiCode": 2044, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute-ctrl+enter-win", + "asciiCode": 4348, + "functions": [ + "return ['run']" + ] + }, + { + "id": "execute_line+ctrl+opt+enter-mac", + "asciiCode": 6140, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "execute_line+shift+ctrl+enter-win", + "asciiCode": 4860, + "functions": [ + "return ['run_line']" + ] + }, + { + "id": "alphahandler", + "asciiCode": 127, + "functions": [ + "ctx.addChar(k)" + ] + }, + { + "id": "addSpace", + "asciiCode": -2, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "addSpace", + "asciiCode": 32, + "functions": [ + "ctx.addChar(32)" + ] + }, + { + "id": "newLine", + "asciiCode": -4, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 10, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "newLine", + "asciiCode": 13, + "functions": [ + "ctx.newLine()" + ] + }, + { + "id": "addTab", + "asciiCode": -5, + "functions": [ + "ctx.addTab()" + ] + }, + { + "id": "delete", + "asciiCode": -6, + "functions": [ + "ctx.deleteChar()" + ] + }, + { + "id": "backspace", + "asciiCode": -7, + "functions": [ + "ctx.backSpace()" + ] + }, + { + "id": "comment-opt+/-mac", + "asciiCode": 247, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "comment-ctrl+/-win", + "asciiCode": 4399, + "functions": [ + "ctx.commentLine()" + ] + }, + { + "id": "clear-opt+z-mac", + "asciiCode": 937, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "clear-ctrl+z-win", + "asciiCode": 4474, + "functions": [ + "ctx.clear()" + ] + }, + { + "id": "cutLine-opt+x-mac", + "asciiCode": 8776, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "cutLine-ctrl+x-win", + "asciiCode": 4472, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());ctx.deleteLine();return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-opt+c-mac", + "asciiCode": 231, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyLine-ctrl+c-win", + "asciiCode": 4451, + "functions": [ + "ctx.tb.pasteBinCopyLine(ctx.c.line());return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-opt+k-mac", + "asciiCode": 730, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "copyAll-ctrl+k-win", + "asciiCode": 4459, + "functions": [ + "ctx.tb.pasteBinCopyAll();return ['output_paste_bin']" + ] + }, + { + "id": "paste-opt+v-mac", + "asciiCode": 8730, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "paste-ctrl+v-win", + "asciiCode": 4470, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}};" + ] + }, + { + "id": "replaceLine-opt+p-mac", + "asciiCode": 960, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "replaceLine-ctrl+p-win", + "asciiCode": 4464, + "functions": [ + "var pb = ctx.tb.pasteBinGet(); var startLine = ctx.c.line(); ctx.deleteLine(); if(ctx.c.line() < ctx.tb.length()-1){ctx.jumpLine(-1);ctx.jumpTo(1);} if(startLine === 0){ctx.jumpTo(0); ctx.newLine(); ctx.jumpTo(2); }else { ctx.newLine(); } for(var i = 0; i < pb.length; i++){for (var a = 0; a < pb[i].length; a++) {var char = pb[i].charCodeAt(a); ctx.keyPress(char)}}" + ] + }, + { + "id": "up", + "asciiCode": -9, + "functions": [ + "ctx.jumpLine(-1)" + ] + }, + { + "id": "down", + "asciiCode": -10, + "functions": [ + "ctx.jumpLine(1)" + ] + }, + { + "id": "left", + "asciiCode": -11, + "functions": [ + "ctx.jumpChar(-1)" + ] + }, + { + "id": "right", + "asciiCode": -12, + "functions": [ + "ctx.jumpChar(1)" + ] + }, + { + "id": "jump_top-opt+up-mac", + "asciiCode": 2039, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump_top-ctrl+up-win", + "asciiCode": 4343, + "functions": [ + "ctx.jumpTo(2)" + ] + }, + { + "id": "jump_bottom-opt+down-mac", + "asciiCode": 2038, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump_bottom-opt+down-win", + "asciiCode": 4342, + "functions": [ + "ctx.jumpTo(3)" + ] + }, + { + "id": "jump_startline-opt+left-mac", + "asciiCode": 2037, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump_startline-ctrl+left-win", + "asciiCode": 4341, + "functions": [ + "ctx.jumpTo(0)" + ] + }, + { + "id": "jump_endline-opt+right-mac", + "asciiCode": 2036, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jump_endline-ctrl+right-win", + "asciiCode": 4340, + "functions": [ + "ctx.jumpTo(1)" + ] + }, + { + "id": "jumpWord_left-cmd+left-mac", + "asciiCode": 245, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord_left-ctrl+shift+left-win", + "asciiCode": 4853, + "functions": [ + "ctx.jumpWord(-1)" + ] + }, + { + "id": "jumpWord_right-cmd+right-mac", + "asciiCode": 244, + "functions": [ + "ctx.jumpWord(1)" + ] + }, + { + "id": "jumpWord_right-ctrl+shift+right-win", + "asciiCode": 4852, + "functions": [ + "ctx.jumpWord(1)" + ] + }, + { + "id": "ephemeral_mode-opt+g-mac", + "asciiCode": 169, + "functions": [ + "return ['ephemeral_mode']" + ] + }, + { + "id": "ephemeral_mode-ctrl+g-win", + "asciiCode": 4455, + "functions": [ + "return ['ephemeral_mode']" + ] + }, + { + "id": "hide_text-opt+h-mac", + "asciiCode": 729, + "functions": [ + "return ['hide_text']" + ] + }, + { + "id": "hide_text-ctrl+h-win", + "asciiCode": 4456, + "functions": [ + "return ['hide_text']" + ] + } + ] +} \ No newline at end of file diff --git a/package-info.json b/package-info.json new file mode 100644 index 0000000..664c579 --- /dev/null +++ b/package-info.json @@ -0,0 +1,35 @@ +{ + "author": "Tom Whiston", + "description": "OpenGL REPL for creating livecoding style interactions with max patches", + "max_version_min": "8.0", + "max_version_max": "none", + "name": "GLRepl", + "os": { + "macintosh": { + "platform": [ + "aarch64", + "x64" + ], + "min_version": "none" + }, + "windows": { + "platform": [ + "x64" + ], + "min_version": "none" + } + }, + "package_extra": { + "forcerestart": 1, + "reverse_domain": "com.tomwhiston", + "copyright": "see Licence" + }, + "tags": [ + "opengl", + "repl", + "livecoding" + ], + "extensible": 1, + "version": "1.0.0-beta.9", + "website": "https://github.com/twhiston/tw.gl.repl" +} \ No newline at end of file diff --git a/patchers/tw.gl.repl.dynamic-size-helper.maxpat b/patchers/tw.gl.repl.dynamic-size-helper.maxpat new file mode 100644 index 0000000..784ce3f --- /dev/null +++ b/patchers/tw.gl.repl.dynamic-size-helper.maxpat @@ -0,0 +1,276 @@ +{ + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 4, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 768.0, 430.0, 453.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 47.0, 87.0, 54.0, 22.0 ], + "text" : "qlim 100" + } + + } +, { + "box" : { + "annotation" : "connect to inlet 1 of jit.world", + "comment" : "connect to inlet 1 of jit.world", + "hint" : "connect to inlet 1 of jit.world", + "id" : "obj-8", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 47.0, 157.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 47.0, 122.0, 116.0, 22.0 ], + "text" : "sendwindow getsize" + } + + } +, { + "box" : { + "annotation" : "connect to outlet 2 of jit.world", + "comment" : "connect to outlet 2 of jit.world", + "hint" : "connect to outlet 2 of jit.world", + "id" : "obj-4", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 47.0, 40.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "annotation" : "connect to outlet 3 of jit.world", + "comment" : "connect to outlet 3 of jit.world", + "hint" : "connect to outlet 3 of jit.world", + "id" : "obj-3", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 243.0, 31.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "annotation" : "connect to inlet of tw.gl.repl", + "comment" : "connect to inlet of tw.gl.repl", + "hint" : "connect to inlet of tw.gl.repl", + "id" : "obj-2", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 243.0, 281.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 243.0, 239.0, 77.0, 22.0 ], + "text" : "prepend size" + } + + } +, { + "box" : { + "id" : "obj-80", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 243.0, 197.0, 71.5, 22.0 ], + "text" : "pak" + } + + } +, { + "box" : { + "id" : "obj-60", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "int", "int" ], + "patching_rect" : [ 295.5, 157.0, 48.0, 22.0 ], + "text" : "change" + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 243.0, 128.0, 72.0, 22.0 ], + "text" : "unpack" + } + + } +, { + "box" : { + "id" : "obj-58", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "int", "int" ], + "patching_rect" : [ 243.0, 157.0, 48.0, 22.0 ], + "text" : "change" + } + + } +, { + "box" : { + "id" : "obj-54", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 243.0, 95.0, 61.0, 22.0 ], + "text" : "route size" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-54", 0 ], + "source" : [ "obj-3", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-59", 0 ], + "source" : [ "obj-54", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 0 ], + "source" : [ "obj-58", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-58", 0 ], + "source" : [ "obj-59", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-60", 0 ], + "source" : [ "obj-59", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-80", 1 ], + "source" : [ "obj-60", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-1", 0 ], + "source" : [ "obj-80", 0 ] + } + + } + ] + } + +} diff --git a/patchers/th.gl.texteditor.maxpat b/patchers/tw.gl.repl.maxpat similarity index 64% rename from patchers/th.gl.texteditor.maxpat rename to patchers/tw.gl.repl.maxpat index c58e535..30b081d 100644 --- a/patchers/th.gl.texteditor.maxpat +++ b/patchers/tw.gl.repl.maxpat @@ -3,14 +3,14 @@ "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 2, - "revision" : 0, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 34.0, 78.0, 824.0, 788.0 ], + "rect" : [ 929.0, 100.0, 724.0, 794.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -40,102 +40,195 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-24", + "id" : "obj-25", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "int" ], - "patching_rect" : [ 210.0, 390.0, 29.5, 22.0 ], - "text" : "!- 1" + "patching_rect" : [ 141.5, 347.0, 33.0, 22.0 ], + "text" : "== 0" } } , { "box" : { - "id" : "obj-23", + "id" : "obj-15", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 2, "outlettype" : [ "", "" ], - "patching_rect" : [ 210.0, 357.0, 104.0, 22.0 ], + "patching_rect" : [ 164.148611111111109, 309.0, 104.0, 22.0 ], "text" : "route ignore_keys" } } , { "box" : { - "id" : "obj-21", - "maxclass" : "newobj", + "id" : "obj-20", + "linecount" : 2, + "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 153.0, 435.0, 42.0, 22.0 ], - "text" : "gate 1" + "patching_rect" : [ 32.56122685185187, 568.0, 56.0, 35.0 ], + "text" : "scale 1.7" } } , { "box" : { - "id" : "obj-20", + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 3.0, 347.0, 50.0, 22.0 ], + "text" : "select 1" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 1.5, 309.0, 53.0, 22.0 ], + "text" : "== 8706" + } + + } +, { + "box" : { + "id" : "obj-41", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 322.5, 120.5, 56.0, 22.0 ], + "text" : "freebang" + } + + } +, { + "box" : { + "id" : "obj-9", + "ignoreclick" : 1, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 753.0, 510.0, 19.0, 22.0 ], - "text" : "t l" + "patching_rect" : [ 322.5, 151.5, 43.0, 22.0 ], + "text" : "_close" } } , { "box" : { - "id" : "obj-16", - "linecount" : 3, + "comment" : "(bang) bang on run", + "id" : "obj-13", + "index" : 3, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 453.648611111111052, 767.0, 30.0, 30.0 ], + "varname" : "clipboardOutput[1]" + } + + } +, { + "box" : { + "id" : "obj-18", "maxclass" : "newobj", - "numinlets" : 5, - "numoutlets" : 5, - "outlettype" : [ "", "", "", "", "" ], - "patching_rect" : [ 753.0, 405.0, 88.0, 49.0 ], - "text" : "routepass add back del gotoIndex" + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 177.648611111111109, 708.0, 189.0, 22.0 ], + "text" : "prepend #1 :" } } , { "box" : { - "id" : "obj-2", + "id" : "obj-11", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 472.0, 203.5, 317.0, 33.0 ], + "text" : "THIS ROUTEPASS IS GENERATED ON INIT FROM JS CODE. DO NOT EDIT IT MANUALLY!" + } + + } +, { + "box" : { + "id" : "obj-46", "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 4, - "outlettype" : [ "dictionary", "", "", "" ], - "patching_rect" : [ 508.0, 135.0, 156.0, 22.0 ], - "saved_object_attributes" : { - "embed" : 0, - "parameter_enable" : 0, - "parameter_mappable" : 0 - } -, - "text" : "dict #0_sk shortkeys.json" + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 361.648611111111109, 638.0, 71.0, 22.0 ], + "text" : "fromsymbol" } } , { "box" : { - "id" : "obj-6", + "id" : "obj-24", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 103.248611111111131, 451.0, 70.0, 22.0 ], + "text" : "loadmess 0" + } + + } +, { + "box" : { + "id" : "obj-56", + "maxclass" : "toggle", + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 141.5, 377.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "id" : "obj-47", + "maxclass" : "newobj", + "numinlets" : 6, + "numoutlets" : 6, + "outlettype" : [ "", "", "", "", "", "" ], + "patching_rect" : [ 141.5, 209.0, 287.0, 22.0 ], + "text" : "routepass init ignore_keys blink_time slide_time size", + "varname" : "initpass" + } + + } +, { + "box" : { + "id" : "obj-59", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], "patcher" : { "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 2, - "revision" : 0, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 312.0, 131.0, 778.0, 672.0 ], + "rect" : [ 838.0, 303.0, 640.0, 480.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -165,1037 +258,731 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-51", + "id" : "obj-15", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 56.75, 88.0, 29.5, 22.0 ], + "text" : "t l l" + } + + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 67.0, 200.0, 42.0, 22.0 ], + "text" : "gate 2" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 2, - "revision" : 0, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 59.0, 103.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-21", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "patching_rect" : [ 71.0, 145.0, 29.5, 22.0 ], - "text" : "t i i" - } - - } -, { - "box" : { - "id" : "obj-26", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "patching_rect" : [ 142.0, 145.0, 29.5, 22.0 ], - "text" : "t i i" - } + "patching_rect" : [ 67.25, 161.0, 133.0, 22.0 ], + "text" : "if $i1 == 1 then 1 else 2" + } - } -, { - "box" : { - "id" : "obj-28", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 310.0, 19.0, 22.0 ], - "text" : "t i" - } + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 67.25, 129.0, 37.0, 22.0 ], + "text" : "zl.len" + } - } -, { - "box" : { - "id" : "obj-30", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 142.0, 325.0, 29.5, 22.0 ], - "text" : "&&" - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-2", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 66.75, 345.0, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-31", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 152.5, 190.0, 29.5, 22.0 ], - "text" : "> 0" - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 57.0, 40.0, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-32", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "bang", "int" ], - "patching_rect" : [ 110.0, 220.0, 29.5, 22.0 ], - "text" : "t b i" - } - - } -, { - "box" : { - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 99.5, 280.0, 40.0, 22.0 ], - "text" : "zl.sub" - } - - } -, { - "box" : { - "id" : "obj-35", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 142.0, 355.0, 29.5, 22.0 ], - "text" : "+ 1" - } - - } -, { - "box" : { - "id" : "obj-36", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 54.5, 400.0, 52.0, 22.0 ], - "text" : "switch 2" - } - - } -, { - "box" : { - "id" : "obj-38", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 99.5, 250.0, 75.0, 22.0 ], - "text" : "0 4 16 20 50" - } - - } -, { - "box" : { - "id" : "obj-43", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 110.0, 190.0, 33.0, 22.0 ], - "text" : ">> 7" - } - - } -, { - "box" : { - "id" : "obj-44", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 71.0, 190.0, 29.5, 22.0 ], - "text" : "+" - } + } +, { + "box" : { + "id" : "obj-51", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 66.75, 302.0, 80.0, 22.0 ], + "text" : "prepend read" + } - } -, { - "box" : { - "id" : "obj-45", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 4, - "outlettype" : [ "int", "int", "int", "int" ], - "patching_rect" : [ 50.0, 100.0, 50.5, 22.0 ], - "text" : "keyup" - } + } +, { + "box" : { + "id" : "obj-50", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 66.75, 248.0, 22.0, 22.0 ], + "text" : "t b" + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-50", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 54.5, 482.0, 30.0, 30.0 ] - } + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "patching_rect" : [ 66.75, 276.0, 67.0, 22.0 ], + "text" : "opendialog" + } - } + } ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-43", 0 ], - "source" : [ "obj-21", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-44", 0 ], - "source" : [ "obj-21", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-31", 0 ], - "source" : [ "obj-26", 1 ] - } + "lines" : [ { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-1", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-44", 1 ], - "source" : [ "obj-26", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "midpoints" : [ 99.5, 234.0, 42.0, 234.0, 42.0, 339.0, 76.25, 339.0 ], + "source" : [ "obj-10", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-36", 2 ], - "source" : [ "obj-28", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-10", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-30", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "midpoints" : [ 66.25, 129.0, 54.0, 129.0, 54.0, 192.0, 99.5, 192.0 ], + "source" : [ "obj-15", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 1 ], - "source" : [ "obj-31", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-15", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-34", 1 ], - "source" : [ "obj-32", 1 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-51", 0 ], + "source" : [ "obj-18", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-38", 0 ], - "source" : [ "obj-32", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-3", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 0 ], - "source" : [ "obj-34", 1 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-36", 0 ], - "source" : [ "obj-35", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-50", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-50", 0 ], - "source" : [ "obj-36", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-51", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-34", 0 ], - "source" : [ "obj-38", 0 ] - } + } + ] + } +, + "patching_rect" : [ 422.699999999999989, 444.0, 85.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p readHandler", + "varname" : "readHandler" + } - } -, { - "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-43", 0 ] - } + } +, { + "box" : { + "id" : "obj-53", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 838.0, 243.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 59.75, 83.0, 29.5, 22.0 ], + "text" : "t l l" + } - } -, { - "patchline" : { - "destination" : [ "obj-36", 1 ], - "source" : [ "obj-44", 0 ] - } + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 70.0, 195.0, 42.0, 22.0 ], + "text" : "gate 2" + } - } -, { - "patchline" : { - "destination" : [ "obj-21", 0 ], - "source" : [ "obj-45", 2 ] - } + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 70.25, 156.0, 133.0, 22.0 ], + "text" : "if $i1 == 1 then 1 else 2" + } - } -, { - "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-45", 3 ] - } + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 70.25, 124.0, 37.0, 22.0 ], + "text" : "zl.len" + } - } -, { - "patchline" : { - "destination" : [ "obj-28", 0 ], - "source" : [ "obj-45", 0 ] - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-4", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 69.75, 340.0, 30.0, 30.0 ] + } - } - ] - } -, - "patching_rect" : [ 150.0, 45.0, 53.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p keyUp" + } +, { + "box" : { + "comment" : "", + "id" : "obj-6", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 60.0, 35.0, 30.0, 30.0 ] } } , { "box" : { - "id" : "obj-49", + "id" : "obj-7", "maxclass" : "newobj", - "numinlets" : 0, + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 2, - "revision" : 0, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 125.0, 194.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-21", - "maxclass" : "number", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 99.5, 451.0, 50.0, 22.0 ] - } + "patching_rect" : [ 69.75, 297.0, 81.0, 22.0 ], + "text" : "prepend write" + } - } -, { - "box" : { - "id" : "obj-19", - "maxclass" : "number", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 142.0, 400.0, 50.0, 22.0 ] - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 69.75, 243.0, 22.0, 22.0 ], + "text" : "t b" + } - } -, { - "box" : { - "id" : "obj-17", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "patching_rect" : [ 71.0, 145.0, 29.5, 22.0 ], - "text" : "t i i" - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 3, + "outlettype" : [ "", "", "bang" ], + "patching_rect" : [ 69.75, 271.0, 66.0, 22.0 ], + "text" : "savedialog" + } - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "patching_rect" : [ 142.0, 145.0, 29.5, 22.0 ], - "text" : "t i i" - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "midpoints" : [ 102.5, 229.0, 45.0, 229.0, 45.0, 334.0, 79.25, 334.0 ], + "source" : [ "obj-10", 1 ] + } - } -, { - "box" : { - "id" : "obj-42", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 310.0, 19.0, 22.0 ], - "text" : "t i" - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-10", 0 ] + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 142.0, 325.0, 29.5, 22.0 ], - "text" : "&&" - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 1 ], + "midpoints" : [ 69.25, 124.0, 57.0, 124.0, 57.0, 187.0, 102.5, 187.0 ], + "source" : [ "obj-15", 0 ] + } - } -, { - "box" : { - "id" : "obj-39", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 152.5, 190.0, 29.5, 22.0 ], - "text" : "> 0" - } + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-15", 1 ] + } - } -, { - "box" : { - "id" : "obj-33", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "bang", "int" ], - "patching_rect" : [ 110.0, 220.0, 29.5, 22.0 ], - "text" : "t b i" - } + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-2", 0 ] + } - } -, { - "box" : { - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 99.5, 280.0, 40.0, 22.0 ], - "text" : "zl.sub" - } + } +, { + "patchline" : { + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 142.0, 355.0, 29.5, 22.0 ], - "text" : "+ 1" - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-6", 0 ] + } - } -, { - "box" : { - "id" : "obj-24", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 54.5, 400.0, 52.0, 22.0 ], - "text" : "switch 2" - } + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-7", 0 ] + } - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 99.5, 250.0, 75.0, 22.0 ], - "text" : "0 4 16 20 50" - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-8", 0 ] + } - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 110.0, 190.0, 33.0, 22.0 ], - "text" : ">> 7" - } + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-9", 0 ] + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 71.0, 190.0, 29.5, 22.0 ], - "text" : "+" - } + } + ] + } +, + "patching_rect" : [ 516.0, 444.0, 86.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p writeHandler", + "varname" : "writeHandler" + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 4, - "outlettype" : [ "int", "int", "int", "int" ], - "patching_rect" : [ 50.0, 100.0, 50.5, 22.0 ], - "text" : "key" - } + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 177.648611111111109, 638.0, 71.0, 22.0 ], + "text" : "fromsymbol" + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-48", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 54.5, 482.0, 30.0, 30.0 ] - } + } +, { + "box" : { + "color" : [ 1.0, 0.0, 0.0, 1.0 ], + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 177.648611111111109, 738.0, 133.0, 22.0 ], + "text" : "print tw.gl.repl @level 2" + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-39", 0 ], - "source" : [ "obj-16", 1 ] - } + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 177.648611111111109, 677.0, 65.0, 22.0 ], + "text" : "route error" + } - } -, { - "patchline" : { - "destination" : [ "obj-8", 1 ], - "source" : [ "obj-16", 0 ] - } + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 269.648611111111109, 638.0, 71.0, 22.0 ], + "text" : "fromsymbol" + } - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "source" : [ "obj-17", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-17", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-21", 0 ], - "order" : 0, - "source" : [ "obj-24", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-48", 0 ], - "order" : 1, - "source" : [ "obj-24", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-3", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-3", 1 ], - "source" : [ "obj-33", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-33", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-2", 1 ], - "source" : [ "obj-39", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-19", 0 ], - "order" : 0, - "source" : [ "obj-4", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-24", 0 ], - "order" : 1, - "source" : [ "obj-4", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-24", 2 ], - "source" : [ "obj-42", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-5", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-33", 0 ], - "source" : [ "obj-7", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-24", 1 ], - "source" : [ "obj-8", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-9", 3 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-17", 0 ], - "source" : [ "obj-9", 2 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-42", 0 ], - "source" : [ "obj-9", 0 ] - } - - } - ] - } -, - "patching_rect" : [ 45.0, 45.0, 68.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "newobj", + "numinlets" : 4, + "numoutlets" : 0, + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } , - "text" : "p keyDown" + "classnamespace" : "box", + "rect" : [ 432.0, 171.0, 887.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 0, + "patching_rect" : [ 456.0, 175.0, 160.0, 22.0 ], + "text" : "print print tw.gl.repl-pasteBin" } } , { "box" : { - "id" : "obj-25", + "id" : "obj-31", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 150.0, 165.0, 22.0, 22.0 ], - "text" : "t 0" + "numoutlets" : 0, + "patching_rect" : [ 336.0, 175.0, 113.0, 22.0 ], + "text" : "print tw.gl.repl-state" } } , { "box" : { - "id" : "obj-10", + "id" : "obj-30", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 150.0, 300.0, 47.0, 22.0 ], - "text" : "qlim 50" + "numoutlets" : 0, + "patching_rect" : [ 199.0, 175.0, 136.0, 22.0 ], + "text" : "print print tw.gl.repl-cmd" } } , { "box" : { - "id" : "obj-13", + "id" : "obj-7", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "bang", "" ], - "patching_rect" : [ 150.0, 270.0, 36.0, 22.0 ], - "text" : "sel 1" + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 456.0, 110.0, 32.0, 22.0 ], + "text" : "gate" } } , { "box" : { - "id" : "obj-14", + "id" : "obj-6", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 150.0, 240.0, 41.0, 22.0 ], - "text" : "> 250" + "outlettype" : [ "" ], + "patching_rect" : [ 336.0, 110.0, 32.0, 22.0 ], + "text" : "gate" } } , { "box" : { - "id" : "obj-15", + "id" : "obj-5", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 4, - "outlettype" : [ "bang", "int", "int", "int" ], - "patching_rect" : [ 45.0, 90.0, 70.0, 22.0 ], - "text" : "t b i i i" + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 199.0, 110.0, 32.0, 22.0 ], + "text" : "gate" } } , { "box" : { - "id" : "obj-18", - "maxclass" : "newobj", - "numinlets" : 2, + "comment" : "", + "id" : "obj-4", + "index" : 4, + "maxclass" : "inlet", + "numinlets" : 0, "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 51.5, 360.0, 29.5, 22.0 ], - "text" : "int" + "outlettype" : [ "" ], + "patching_rect" : [ 470.0, 52.0, 30.0, 30.0 ] } } , { "box" : { - "id" : "obj-22", - "maxclass" : "newobj", - "numinlets" : 2, + "comment" : "", + "id" : "obj-3", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 150.0, 209.982421999999985, 63.0, 22.0 ], - "text" : "clocker 40" + "outlettype" : [ "" ], + "patching_rect" : [ 348.0, 52.0, 30.0, 30.0 ] } } , { "box" : { - "id" : "obj-23", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "bang", "" ], - "patching_rect" : [ 150.0, 135.0, 29.5, 22.0 ], - "text" : "sel" - } + "comment" : "", + "id" : "obj-2", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 212.0, 52.0, 30.0, 30.0 ] + } } , { "box" : { "comment" : "", - "id" : "obj-234", + "id" : "obj-1", "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 79.0, 405.0, 30.0, 30.0 ] + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 154.0, 52.0, 30.0, 30.0 ] } } ], "lines" : [ { "patchline" : { - "destination" : [ "obj-18", 0 ], - "midpoints" : [ 159.5, 341.5, 61.0, 341.5 ], - "source" : [ "obj-10", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-13", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-13", 0 ], - "source" : [ "obj-14", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-18", 1 ], - "source" : [ "obj-15", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-22", 0 ], - "midpoints" : [ 54.5, 199.991211000000021, 159.5, 199.991211000000021 ], - "source" : [ "obj-15", 0 ] + "destination" : [ "obj-5", 0 ], + "order" : 2, + "source" : [ "obj-1", 0 ] } } , { "patchline" : { - "destination" : [ "obj-23", 1 ], - "midpoints" : [ 105.5, 123.0, 170.0, 123.0 ], - "source" : [ "obj-15", 3 ] + "destination" : [ "obj-6", 0 ], + "order" : 1, + "source" : [ "obj-1", 0 ] } } , { "patchline" : { - "destination" : [ "obj-234", 0 ], - "source" : [ "obj-15", 2 ] + "destination" : [ "obj-7", 0 ], + "order" : 0, + "source" : [ "obj-1", 0 ] } } , { "patchline" : { - "destination" : [ "obj-234", 0 ], - "source" : [ "obj-18", 0 ] + "destination" : [ "obj-5", 1 ], + "source" : [ "obj-2", 0 ] } } , { "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-22", 0 ] + "destination" : [ "obj-6", 1 ], + "source" : [ "obj-3", 0 ] } } , { "patchline" : { - "destination" : [ "obj-25", 0 ], - "source" : [ "obj-23", 0 ] + "destination" : [ "obj-7", 1 ], + "source" : [ "obj-4", 0 ] } } , { "patchline" : { - "destination" : [ "obj-22", 0 ], - "source" : [ "obj-25", 0 ] + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-5", 0 ] } } , { "patchline" : { - "destination" : [ "obj-15", 0 ], - "source" : [ "obj-49", 0 ] + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-6", 0 ] } } , { "patchline" : { - "destination" : [ "obj-23", 0 ], - "source" : [ "obj-51", 0 ] - } - - } - ], - "styles" : [ { - "name" : "AudioStatus_Menu", - "default" : { - "bgfillcolor" : { - "type" : "color", - "color" : [ 0.294118, 0.313726, 0.337255, 1 ], - "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39, - "autogradient" : 0 - } - + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-7", 0 ] } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "Audiomix", - "default" : { - "bgfillcolor" : { - "type" : "gradient", - "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39 - } - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberB-1", - "default" : { - "accentcolor" : [ 0.011765, 0.396078, 0.752941, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberG-1", - "default" : { - "accentcolor" : [ 0.0, 0.533333, 0.168627, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberGold-1", - "default" : { - "accentcolor" : [ 0.764706, 0.592157, 0.101961, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberR-1", - "default" : { - "accentcolor" : [ 0.784314, 0.145098, 0.023529, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 } ] } , - "patching_rect" : [ 84.5, 357.0, 67.0, 22.0 ], + "patching_rect" : [ 84.56122685185187, 600.0, 296.087384259259238, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -1203,29 +990,97 @@ "tags" : "" } , - "text" : "p quickKey" + "text" : "p debug" } } , { "box" : { - "id" : "obj-37", - "maxclass" : "newobj", + "id" : "obj-43", + "maxclass" : "toggle", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "parameter_enable" : 0, + "patching_rect" : [ 84.56122685185187, 568.0, 24.0, 24.0 ] + } + + } +, { + "box" : { + "comment" : "(list) clipboard contents", + "id" : "obj-27", + "index" : 2, + "maxclass" : "outlet", "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 361.648611111111109, 767.0, 30.0, 30.0 ], + "varname" : "clipboardOutput" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 126.600000000000023, 281.0, 35.0, 22.0 ], + "text" : "8706" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], + "patching_rect" : [ 160.75, 403.0, 49.0, 22.0 ], + "text" : "gate 1", + "varname" : "ignoreKeyGate" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 4, + "outlettype" : [ "dictionary", "", "", "" ], + "patching_rect" : [ 538.0, 131.0, 163.0, 22.0 ], + "saved_object_attributes" : { + "embed" : 0, + "parameter_enable" : 0, + "parameter_mappable" : 0 + } +, + "text" : "dict #0_sk replkeys.json" + } + + } +, { + "box" : { + "id" : "obj-6", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "int" ], "patcher" : { "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 2, - "revision" : 0, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 59.0, 103.0, 640.0, 480.0 ], + "rect" : [ 903.0, 367.0, 778.0, 672.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -1255,339 +1110,979 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 180.0, 54.0, 22.0 ], - "text" : "deferlow" - } - - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "patching_rect" : [ 50.0, 150.0, 57.0, 22.0 ], - "text" : "line 0. 10" - } - - } -, { - "box" : { - "id" : "obj-31", + "id" : "obj-51", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 210.0, 99.0, 22.0 ], - "text" : "prepend runBlink" - } - - } -, { - "box" : { - "id" : "obj-30", - "maxclass" : "message", - "numinlets" : 2, + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 120.0, 119.0, 22.0 ], - "text" : "0 0 1 10 1 200 0 250" - } - - } -, { - "box" : { - "comment" : "", - "id" : "obj-35", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "run" ], - "patching_rect" : [ 50.0, 75.0, 30.0, 30.0 ] + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 59.0, 103.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 71.0, 145.0, 29.5, 22.0 ], + "text" : "t i i" + } + + } +, { + "box" : { + "id" : "obj-26", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 142.0, 145.0, 29.5, 22.0 ], + "text" : "t i i" + } + + } +, { + "box" : { + "id" : "obj-28", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 50.0, 310.0, 19.0, 22.0 ], + "text" : "t i" + } + + } +, { + "box" : { + "id" : "obj-30", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 142.0, 325.0, 29.5, 22.0 ], + "text" : "&&" + } + + } +, { + "box" : { + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 152.5, 190.0, 29.5, 22.0 ], + "text" : "> 0" + } + + } +, { + "box" : { + "id" : "obj-32", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "int" ], + "patching_rect" : [ 110.0, 220.0, 29.5, 22.0 ], + "text" : "t b i" + } + + } +, { + "box" : { + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 99.5, 280.0, 40.0, 22.0 ], + "text" : "zl.sub" + } + + } +, { + "box" : { + "id" : "obj-35", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 142.0, 355.0, 29.5, 22.0 ], + "text" : "+ 1" + } + + } +, { + "box" : { + "id" : "obj-36", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 54.5, 400.0, 52.0, 22.0 ], + "text" : "switch 2" + } + + } +, { + "box" : { + "id" : "obj-38", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 99.5, 250.0, 75.0, 22.0 ], + "text" : "0 4 16 20 50" + } + + } +, { + "box" : { + "id" : "obj-43", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 110.0, 190.0, 33.0, 22.0 ], + "text" : ">> 7" + } + + } +, { + "box" : { + "id" : "obj-44", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 71.0, 190.0, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-45", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 50.0, 100.0, 50.5, 22.0 ], + "text" : "keyup" + } + + } +, { + "box" : { + "comment" : "", + "id" : "obj-50", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 54.5, 482.0, 30.0, 30.0 ] + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-43", 0 ], + "source" : [ "obj-21", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-44", 0 ], + "source" : [ "obj-21", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-26", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-44", 1 ], + "source" : [ "obj-26", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 2 ], + "source" : [ "obj-28", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-30", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 1 ], + "source" : [ "obj-31", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 1 ], + "source" : [ "obj-32", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-38", 0 ], + "source" : [ "obj-32", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-30", 0 ], + "source" : [ "obj-34", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-35", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "source" : [ "obj-36", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-34", 0 ], + "source" : [ "obj-38", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-43", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-36", 1 ], + "source" : [ "obj-44", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-45", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-26", 0 ], + "source" : [ "obj-45", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-28", 0 ], + "source" : [ "obj-45", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 150.0, 45.0, 53.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p keyUp" } } , { "box" : { - "comment" : "", - "id" : "obj-36", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 50.0, 255.0, 30.0, 30.0 ] - } + "id" : "obj-49", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 125.0, 194.0, 640.0, 480.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-6", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 287.0, 199.0, 50.0, 22.0 ], + "text" : "8706" + } + + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 99.5, 451.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "number", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 142.0, 400.0, 50.0, 22.0 ] + } + + } +, { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 71.0, 145.0, 29.5, 22.0 ], + "text" : "t i i" + } + + } +, { + "box" : { + "id" : "obj-16", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 142.0, 145.0, 29.5, 22.0 ], + "text" : "t i i" + } + + } +, { + "box" : { + "id" : "obj-42", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 50.0, 310.0, 19.0, 22.0 ], + "text" : "t i" + } + + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 142.0, 325.0, 29.5, 22.0 ], + "text" : "&&" + } + + } +, { + "box" : { + "id" : "obj-39", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 152.5, 190.0, 29.5, 22.0 ], + "text" : "> 0" + } + + } +, { + "box" : { + "id" : "obj-33", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "int" ], + "patching_rect" : [ 110.0, 220.0, 29.5, 22.0 ], + "text" : "t b i" + } + + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 99.5, 280.0, 40.0, 22.0 ], + "text" : "zl.sub" + } + + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 142.0, 355.0, 29.5, 22.0 ], + "text" : "+ 1" + } + + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 54.5, 400.0, 52.0, 22.0 ], + "text" : "switch 2" + } + + } +, { + "box" : { + "id" : "obj-5", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 99.5, 250.0, 75.0, 22.0 ], + "text" : "0 4 16 20 50" + } + + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 110.0, 190.0, 33.0, 22.0 ], + "text" : ">> 7" + } + + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 71.0, 190.0, 29.5, 22.0 ], + "text" : "+" + } + + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 0, + "numoutlets" : 4, + "outlettype" : [ "int", "int", "int", "int" ], + "patching_rect" : [ 50.0, 100.0, 50.5, 22.0 ], + "text" : "key" + } - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-48", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 54.5, 482.0, 30.0, 30.0 ] + } + + } ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-30", 0 ] - } + "lines" : [ { + "patchline" : { + "destination" : [ "obj-39", 0 ], + "source" : [ "obj-16", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-36", 0 ], - "source" : [ "obj-31", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "source" : [ "obj-16", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-30", 0 ], - "source" : [ "obj-35", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-17", 1 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-4", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-17", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-31", 0 ], - "source" : [ "obj-5", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-2", 0 ] + } - } - ] - } -, - "patching_rect" : [ 84.5, 315.0, 36.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p run" - } + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "order" : 0, + "source" : [ "obj-24", 0 ] + } - } -, { - "box" : { - "id" : "obj-33", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "blink" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 2, - "revision" : 0, - "architecture" : "x64", - "modernui" : 1 - } + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "order" : 1, + "source" : [ "obj-24", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "source" : [ "obj-3", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 1 ], + "source" : [ "obj-33", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-33", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-2", 1 ], + "source" : [ "obj-39", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-19", 0 ], + "order" : 0, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 0 ], + "order" : 1, + "source" : [ "obj-4", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 2 ], + "source" : [ "obj-42", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-3", 0 ], + "source" : [ "obj-5", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-33", 0 ], + "source" : [ "obj-7", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-24", 1 ], + "source" : [ "obj-8", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-9", 3 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-17", 0 ], + "source" : [ "obj-9", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-42", 0 ], + "order" : 1, + "source" : [ "obj-9", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-6", 1 ], + "order" : 0, + "source" : [ "obj-9", 0 ] + } + + } + ] + } , - "classnamespace" : "box", - "rect" : [ 59.0, 103.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "assistshowspatchername" : 0, - "boxes" : [ { + "patching_rect" : [ 45.0, 45.0, 68.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p keyDown" + } + + } +, { "box" : { - "id" : "obj-16", - "maxclass" : "message", - "numinlets" : 2, + "id" : "obj-25", + "maxclass" : "newobj", + "numinlets" : 1, "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 98.0, 75.0, 29.5, 22.0 ], - "text" : "$2" + "outlettype" : [ "int" ], + "patching_rect" : [ 150.0, 165.0, 22.0, 22.0 ], + "text" : "t 0" } } , { "box" : { - "id" : "obj-43", - "maxclass" : "message", + "id" : "obj-10", + "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 75.0, 29.5, 22.0 ], - "text" : "$2" + "patching_rect" : [ 150.0, 300.0, 47.0, 22.0 ], + "text" : "qlim 50" } } , { "box" : { - "id" : "obj-41", + "id" : "obj-13", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 135.0, 32.0, 22.0 ], - "text" : "gate" + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 150.0, 270.0, 36.0, 22.0 ], + "text" : "sel 1" } } , { "box" : { - "id" : "obj-21", + "id" : "obj-14", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "blink" ], - "patching_rect" : [ 63.0, 210.0, 40.0, 22.0 ], - "text" : "t blink" + "outlettype" : [ "int" ], + "patching_rect" : [ 150.0, 240.0, 41.0, 22.0 ], + "text" : "> 250" } } , { "box" : { - "id" : "obj-20", + "id" : "obj-15", "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 63.0, 180.0, 54.0, 22.0 ], - "text" : "qlim 250" + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "bang", "int", "int", "int" ], + "patching_rect" : [ 45.0, 90.0, 70.0, 22.0 ], + "text" : "t b i i i" } } , { "box" : { - "comment" : "", - "id" : "obj-23", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 63.0, 40.000000085937472, 30.0, 30.0 ] + "outlettype" : [ "int" ], + "patching_rect" : [ 51.5, 360.0, 29.5, 22.0 ], + "text" : "int" } } , { "box" : { - "comment" : "", - "id" : "obj-24", - "index" : 2, - "maxclass" : "inlet", - "numinlets" : 0, + "id" : "obj-22", + "maxclass" : "newobj", + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 98.0, 40.000000085937472, 30.0, 30.0 ] + "outlettype" : [ "float" ], + "patching_rect" : [ 150.0, 209.982421999999985, 63.0, 22.0 ], + "text" : "clocker 40" } } , { "box" : { - "comment" : "", - "id" : "obj-29", - "index" : 3, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 135.0, 40.000000085937472, 30.0, 30.0 ] + "id" : "obj-23", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 150.0, 135.0, 29.5, 22.0 ], + "text" : "sel" } } , { "box" : { "comment" : "", - "id" : "obj-32", + "id" : "obj-234", "index" : 1, "maxclass" : "outlet", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 63.0, 255.0, 30.0, 30.0 ] + "patching_rect" : [ 79.0, 405.0, 30.0, 30.0 ] } } ], "lines" : [ { "patchline" : { - "destination" : [ "obj-20", 1 ], - "source" : [ "obj-16", 0 ] + "destination" : [ "obj-18", 0 ], + "midpoints" : [ 159.5, 341.5, 61.0, 341.5 ], + "source" : [ "obj-10", 0 ] } } , { "patchline" : { - "destination" : [ "obj-21", 0 ], - "source" : [ "obj-20", 0 ] + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-13", 0 ] } } , { "patchline" : { - "destination" : [ "obj-32", 0 ], - "source" : [ "obj-21", 0 ] + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-14", 0 ] } } , { "patchline" : { - "destination" : [ "obj-41", 1 ], - "source" : [ "obj-23", 0 ] + "destination" : [ "obj-18", 1 ], + "source" : [ "obj-15", 1 ] } } , { "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-24", 0 ] + "destination" : [ "obj-22", 0 ], + "midpoints" : [ 54.5, 199.991211000000021, 159.5, 199.991211000000021 ], + "source" : [ "obj-15", 0 ] } } , { "patchline" : { - "destination" : [ "obj-43", 0 ], - "source" : [ "obj-29", 0 ] + "destination" : [ "obj-23", 1 ], + "midpoints" : [ 105.5, 123.0, 170.0, 123.0 ], + "source" : [ "obj-15", 3 ] } } , { "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-41", 0 ] + "destination" : [ "obj-234", 0 ], + "source" : [ "obj-15", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-234", 0 ], + "source" : [ "obj-18", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-14", 0 ], + "source" : [ "obj-22", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-23", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-25", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-49", 0 ] } } , { "patchline" : { - "destination" : [ "obj-41", 0 ], - "source" : [ "obj-43", 0 ] + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-51", 0 ] } } @@ -1596,13 +2091,13 @@ "name" : "AudioStatus_Menu", "default" : { "bgfillcolor" : { - "type" : "color", + "angle" : 270.0, + "autogradient" : 0, "color" : [ 0.294118, 0.313726, 0.337255, 1 ], "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, "proportion" : 0.39, - "autogradient" : 0 + "type" : "color" } } @@ -1614,12 +2109,12 @@ "name" : "Audiomix", "default" : { "bgfillcolor" : { - "type" : "gradient", + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39 + "proportion" : 0.39, + "type" : "gradient" } } @@ -1666,7 +2161,7 @@ ] } , - "patching_rect" : [ 511.799999999999955, 390.0, 43.0, 22.0 ], + "patching_rect" : [ 56.600000000000023, 281.0, 67.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -1674,41 +2169,29 @@ "tags" : "" } , - "text" : "p blink" - } - - } -, { - "box" : { - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 405.0, 135.0, 58.0, 22.0 ], - "text" : "loadbang" + "text" : "p quickKey" } } , { "box" : { - "id" : "obj-39", + "id" : "obj-37", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], + "numoutlets" : 2, + "outlettype" : [ "", "" ], "patcher" : { "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 2, - "revision" : 0, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 84.0, 128.0, 640.0, 480.0 ], + "rect" : [ 34.0, 297.0, 640.0, 480.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -1738,163 +2221,151 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 50.0, 142.5, 87.0, 22.0 ], - "text" : "route jit_matrix" + "id" : "obj-6", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 223.0, 210.0, 111.0, 33.0 ], + "text" : "pass through for the run message" } } , { "box" : { - "id" : "obj-30", + "comment" : "", + "id" : "obj-1", + "index" : 2, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 205.0, 255.0, 30.0, 30.0 ] + } + + } +, { + "box" : { + "id" : "obj-5", "maxclass" : "newobj", "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 50.0, 172.5, 99.0, 22.0 ], - "text" : "prepend readFile" + "patching_rect" : [ 50.0, 180.0, 54.0, 22.0 ], + "text" : "deferlow" } } , { "box" : { - "id" : "obj-29", + "id" : "obj-4", "maxclass" : "newobj", - "numinlets" : 2, + "numinlets" : 3, "numoutlets" : 2, - "outlettype" : [ "bang", "" ], - "patching_rect" : [ 86.0, 202.5, 34.0, 22.0 ], - "text" : "sel 1" + "outlettype" : [ "", "bang" ], + "patching_rect" : [ 50.0, 150.0, 57.0, 22.0 ], + "text" : "line 0. 10" } } , { "box" : { - "id" : "obj-28", - "maxclass" : "message", - "numinlets" : 2, + "id" : "obj-31", + "maxclass" : "newobj", + "numinlets" : 1, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 86.0, 172.5, 29.5, 22.0 ], - "text" : "$2" + "patching_rect" : [ 50.0, 210.0, 99.0, 22.0 ], + "text" : "prepend runBlink" } } , { "box" : { - "id" : "obj-24", - "maxclass" : "newobj", + "id" : "obj-30", + "maxclass" : "message", "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 86.0, 142.5, 63.0, 22.0 ], - "text" : "route read" - } - - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 3, - "outlettype" : [ "jit_matrix", "jit_matrix", "" ], - "patching_rect" : [ 50.0, 112.5, 55.0, 22.0 ], - "text" : "jit.textfile" + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 50.0, 120.0, 119.0, 22.0 ], + "text" : "0 0 1 10 1 200 0 250" } } , { "box" : { "comment" : "", - "id" : "obj-37", + "id" : "obj-35", "index" : 1, "maxclass" : "inlet", "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 49.99998933333336, 40.0, 30.0, 30.0 ] + "patching_rect" : [ 50.0, 75.0, 30.0, 30.0 ] } } , { "box" : { "comment" : "", - "id" : "obj-38", + "id" : "obj-36", "index" : 1, "maxclass" : "outlet", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 49.99998933333336, 297.0, 30.0, 30.0 ] + "patching_rect" : [ 50.0, 255.0, 30.0, 30.0 ] } } ], "lines" : [ { "patchline" : { - "destination" : [ "obj-24", 0 ], - "source" : [ "obj-2", 2 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-34", 0 ], - "source" : [ "obj-2", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-28", 0 ], - "source" : [ "obj-24", 0 ] + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-30", 0 ] } } , { "patchline" : { - "destination" : [ "obj-29", 0 ], - "source" : [ "obj-28", 0 ] + "destination" : [ "obj-36", 0 ], + "source" : [ "obj-31", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], - "midpoints" : [ 95.5, 234.5, 159.5, 234.5, 159.5, 101.5, 59.5, 101.5 ], - "source" : [ "obj-29", 0 ] + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 59.5, 108.0, 214.5, 108.0 ], + "order" : 0, + "source" : [ "obj-35", 0 ] } } , { "patchline" : { - "destination" : [ "obj-38", 0 ], - "source" : [ "obj-30", 0 ] + "destination" : [ "obj-30", 0 ], + "order" : 1, + "source" : [ "obj-35", 0 ] } } , { "patchline" : { - "destination" : [ "obj-30", 0 ], - "source" : [ "obj-34", 0 ] + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-4", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-37", 0 ] + "destination" : [ "obj-31", 0 ], + "source" : [ "obj-5", 0 ] } } ] } , - "patching_rect" : [ 343.555555555555543, 630.0, 76.0, 22.0 ], + "patching_rect" : [ 342.0, 444.0, 78.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -1902,102 +2373,30 @@ "tags" : "" } , - "text" : "p fileHandler" + "text" : "p runHandler", + "varname" : "runHandler" } } , { "box" : { - "id" : "obj-18", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 343.555555555555543, 330.0, 19.0, 22.0 ], - "text" : "t l" - } - - } -, { - "box" : { - "id" : "obj-14", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 377.0, 210.0, 66.0, 22.0 ], - "text" : "route done" - } - - } -, { - "box" : { - "id" : "obj-13", + "id" : "obj-33", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 120.0, 570.0, 29.5, 22.0 ], - "text" : "+ 1" - } - - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 620.294117647058783, 510.0, 29.5, 22.0 ], - "text" : "$2" - } - - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 120.0, 630.0, 52.0, 22.0 ], - "text" : "switch 2" - } - - } -, { - "box" : { - "fontface" : 3, - "fontsize" : 24.0, - "id" : "obj-17", - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 60.0, 45.0, 330.0, 33.0 ], - "text" : "th.gl.texteditor" - } - - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "run" ], + "outlettype" : [ "blink" ], "patcher" : { "fileversion" : 1, "appversion" : { "major" : 8, - "minor" : 2, - "revision" : 0, + "minor" : 5, + "revision" : 5, "architecture" : "x64", "modernui" : 1 } , "classnamespace" : "box", - "rect" : [ 91.0, 166.0, 640.0, 480.0 ], + "rect" : [ 797.0, 375.0, 640.0, 480.0 ], "bglocked" : 0, "openinpresentation" : 0, "default_fontsize" : 12.0, @@ -2027,1475 +2426,1452 @@ "assistshowspatchername" : 0, "boxes" : [ { "box" : { - "id" : "obj-49", - "maxclass" : "newobj", - "numinlets" : 0, + "id" : "obj-16", + "maxclass" : "message", + "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 2, - "revision" : 0, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 59.0, 103.0, 640.0, 480.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-17", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "patching_rect" : [ 71.0, 145.0, 29.5, 22.0 ], - "text" : "t i i" - } - - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "int", "int" ], - "patching_rect" : [ 142.0, 145.0, 29.5, 22.0 ], - "text" : "t i i" - } - - } -, { - "box" : { - "id" : "obj-42", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 50.0, 310.0, 19.0, 22.0 ], - "text" : "t i" - } - - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 142.0, 325.0, 29.5, 22.0 ], - "text" : "&&" - } - - } -, { - "box" : { - "id" : "obj-39", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 152.5, 190.0, 29.5, 22.0 ], - "text" : "> 0" - } - - } -, { - "box" : { - "id" : "obj-33", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "bang", "int" ], - "patching_rect" : [ 110.0, 220.0, 29.5, 22.0 ], - "text" : "t b i" - } + "patching_rect" : [ 98.0, 75.0, 29.5, 22.0 ], + "text" : "$2" + } - } -, { - "box" : { - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 99.5, 280.0, 40.0, 22.0 ], - "text" : "zl.sub" - } + } +, { + "box" : { + "id" : "obj-21", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "blink" ], + "patching_rect" : [ 63.0, 210.0, 40.0, 22.0 ], + "text" : "t blink" + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 142.0, 355.0, 29.5, 22.0 ], - "text" : "+ 1" - } + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 63.0, 180.0, 54.0, 22.0 ], + "text" : "qlim 250" + } - } -, { - "box" : { - "id" : "obj-24", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 54.5, 400.0, 52.0, 22.0 ], - "text" : "switch 2" - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-23", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 63.0, 40.000000085937472, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 99.5, 250.0, 75.0, 22.0 ], - "text" : "0 4 16 20 50" - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-24", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 98.0, 40.000000085937472, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 110.0, 190.0, 33.0, 22.0 ], - "text" : ">> 7" - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-32", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 63.0, 255.0, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "int" ], - "patching_rect" : [ 71.0, 190.0, 29.5, 22.0 ], - "text" : "+" - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-20", 1 ], + "source" : [ "obj-16", 0 ] + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 0, - "numoutlets" : 4, - "outlettype" : [ "int", "int", "int", "int" ], - "patching_rect" : [ 50.0, 100.0, 50.5, 22.0 ], - "text" : "key" - } + } +, { + "patchline" : { + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-20", 0 ] + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-48", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 54.5, 482.0, 30.0, 30.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-21", 0 ] + } - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-39", 0 ], - "source" : [ "obj-16", 1 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-20", 0 ], + "source" : [ "obj-23", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-8", 1 ], - "source" : [ "obj-16", 0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-16", 0 ], + "source" : [ "obj-24", 0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-7", 0 ], - "source" : [ "obj-17", 1 ] - } + } + ], + "styles" : [ { + "name" : "AudioStatus_Menu", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "autogradient" : 0, + "color" : [ 0.294118, 0.313726, 0.337255, 1 ], + "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "color" + } - } -, { - "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-17", 0 ] - } + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "Audiomix", + "default" : { + "bgfillcolor" : { + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], + "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], + "proportion" : 0.39, + "type" : "gradient" + } - } -, { - "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-2", 0 ] - } + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "numberB-1", + "default" : { + "accentcolor" : [ 0.011765, 0.396078, 0.752941, 1.0 ] + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "numberG-1", + "default" : { + "accentcolor" : [ 0.0, 0.533333, 0.168627, 1.0 ] + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "numberGold-1", + "default" : { + "accentcolor" : [ 0.764706, 0.592157, 0.101961, 1.0 ] + } +, + "parentstyle" : "", + "multi" : 0 + } +, { + "name" : "numberR-1", + "default" : { + "accentcolor" : [ 0.784314, 0.145098, 0.023529, 1.0 ] + } +, + "parentstyle" : "", + "multi" : 0 + } + ] + } +, + "patching_rect" : [ 182.699999999999989, 266.0, 85.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p blinkHandler", + "varname" : "blinkHandler" + } - } -, { - "patchline" : { - "destination" : [ "obj-48", 0 ], - "source" : [ "obj-24", 0 ] - } + } +, { + "box" : { + "id" : "obj-12", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 261.0, 120.5, 58.0, 22.0 ], + "text" : "loadbang" + } - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-3", 1 ] - } + } +, { + "box" : { + "id" : "obj-14", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 381.75, 155.0, 66.0, 22.0 ], + "text" : "route done" + } - } -, { - "patchline" : { - "destination" : [ "obj-3", 1 ], - "source" : [ "obj-33", 1 ] - } + } +, { + "box" : { + "fontface" : 3, + "fontsize" : 24.0, + "id" : "obj-17", + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 90.0, 6.0, 330.0, 33.0 ], + "text" : "tw.gl.repl" + } - } -, { - "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-33", 0 ] - } + } +, { + "box" : { + "id" : "obj-7", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 177.648611111111109, 155.0, 77.0, 22.0 ], + "text" : "prepend size" + } - } -, { - "patchline" : { - "destination" : [ "obj-2", 1 ], - "source" : [ "obj-39", 0 ] - } + } +, { + "box" : { + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 157.75, 120.5, 55.0, 22.0 ], + "text" : "zl.slice 1" + } - } -, { - "patchline" : { - "destination" : [ "obj-24", 0 ], - "source" : [ "obj-4", 0 ] - } + } +, { + "box" : { + "id" : "obj-10", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 56.600000000000023, 309.0, 105.0, 22.0 ], + "text" : "prepend keyPress" + } - } -, { - "patchline" : { - "destination" : [ "obj-24", 2 ], - "source" : [ "obj-42", 0 ] - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 90.0, 217.0, 22.0, 22.0 ], + "text" : "t b" + } - } -, { - "patchline" : { - "destination" : [ "obj-3", 0 ], - "source" : [ "obj-5", 0 ] - } + } +, { + "box" : { + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 177.648611111111109, 482.0, 19.0, 22.0 ], + "text" : "t l", + "varname" : "cmdList" + } - } -, { - "patchline" : { - "destination" : [ "obj-33", 0 ], - "source" : [ "obj-7", 0 ] - } + } +, { + "box" : { + "id" : "obj-222", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 741.0, 101.0, 737.0, 848.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-17", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "float" ], + "patching_rect" : [ 169.75, 498.0, 29.5, 22.0 ], + "text" : "t b f" + } - } -, { - "patchline" : { - "destination" : [ "obj-24", 1 ], - "source" : [ "obj-8", 0 ] - } + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 100.0, 498.0, 29.5, 22.0 ], + "text" : "f" + } - } -, { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-9", 3 ] - } + } +, { + "box" : { + "id" : "obj-12", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 177.0, 576.0, 50.0, 35.0 ], + "text" : "2.666667" + } - } -, { - "patchline" : { - "destination" : [ "obj-17", 0 ], - "source" : [ "obj-9", 2 ] - } + } +, { + "box" : { + "id" : "obj-9", + "linecount" : 2, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 168.75, 627.0, 50.0, 35.0 ], + "text" : "2.666667" + } - } -, { - "patchline" : { - "destination" : [ "obj-42", 0 ], - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "id" : "obj-3", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 229.333333333333343, 218.0, 29.5, 22.0 ], + "text" : "f" + } - } - ] - } -, - "patching_rect" : [ 45.0, 45.0, 68.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p keyDown" + } +, { + "box" : { + "id" : "obj-18", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "bang", "" ], + "patching_rect" : [ 408.0, 131.0, 29.5, 22.0 ], + "text" : "t b l" } } , { "box" : { - "id" : "obj-18", + "id" : "obj-140", "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 69.0, 90.0, 22.0, 22.0 ], - "text" : "t b" + "numinlets" : 2, + "numoutlets" : 2, + "outlettype" : [ "float", "int" ], + "patching_rect" : [ 100.0, 527.0, 84.0, 22.0 ], + "text" : "minimum 1. 1." } } , { "box" : { - "id" : "obj-17", - "maxclass" : "newobj", + "format" : 6, + "id" : "obj-137", + "maxclass" : "flonum", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "run" ], - "patching_rect" : [ 45.0, 285.0, 33.0, 22.0 ], - "text" : "t run" + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 205.75, 498.0, 50.0, 22.0 ] } } , { "box" : { - "id" : "obj-16", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 88.0, 180.0, 29.5, 22.0 ], - "text" : "$3" + "format" : 6, + "id" : "obj-135", + "maxclass" : "flonum", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 45.0, 502.0, 50.0, 22.0 ] } } , { "box" : { - "id" : "obj-12", + "id" : "obj-111", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "bang", "" ], - "patching_rect" : [ 45.0, 225.0, 54.0, 22.0 ], - "text" : "sel 2044" + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 169.75, 388.5, 29.5, 22.0 ], + "text" : "/ 1." } } , { "box" : { - "id" : "obj-8", - "maxclass" : "message", + "id" : "obj-112", + "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 69.0, 120.0, 71.0, 22.0 ], - "text" : "get execute" + "patching_rect" : [ 169.75, 359.5, 55.0, 22.0 ], + "text" : "pak 0. 0." } } , { "box" : { - "comment" : "", - "id" : "obj-4", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, + "id" : "obj-110", + "maxclass" : "newobj", + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 129.0, 45.0, 30.0, 30.0 ] + "outlettype" : [ "float" ], + "patching_rect" : [ 100.250000000000057, 388.5, 29.5, 22.0 ], + "text" : "/ 1." } } , { "box" : { - "id" : "obj-20", + "id" : "obj-109", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 129.0, 90.0, 160.0, 22.0 ], - "text" : "substitute keybindings name" + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 100.250000000000057, 359.5, 55.0, 22.0 ], + "text" : "pak 0. 0." } } , { "box" : { - "id" : "obj-2", + "id" : "obj-97", "maxclass" : "newobj", "numinlets" : 2, - "numoutlets" : 4, - "outlettype" : [ "dictionary", "", "", "" ], - "patching_rect" : [ 69.0, 150.0, 76.0, 22.0 ], - "saved_object_attributes" : { - "embed" : 0, - "parameter_enable" : 0, - "parameter_mappable" : 0 - } -, - "text" : "dict #0_sk" + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 136.250000000000057, 325.0, 33.0, 22.0 ], + "text" : "* 30." } } , { "box" : { - "id" : "obj-3", - "linecount" : 15, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 392.0, 45.0, 120.0, 208.0 ], - "text" : "Run shortkeys:\n\nmac: \ncmd+r (370)\nalt+r (2162)\nctrl+r (4210)\n\nalt+return (2044)\ncmd+return (252)\nctrl+return (4092)\nshift+return (508)\n\nwindows:\nalt+return\nalt+r" + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 180.25, 439.0, 29.5, 22.0 ], + "text" : "/ 6." } } , { "box" : { - "comment" : "", - "id" : "obj-1", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 45.0, 381.0, 30.0, 30.0 ] + "id" : "obj-84", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 111.750000000000057, 439.0, 39.0, 22.0 ], + "text" : "/ 100." } } , { "box" : { - "id" : "obj-14", + "id" : "obj-74", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "run" ], - "patching_rect" : [ 84.0, 330.0, 33.0, 22.0 ], - "text" : "t run" + "outlettype" : [ "float" ], + "patching_rect" : [ 101.250000000000057, 469.0, 29.5, 22.0 ], + "text" : "/ 1." } } , { "box" : { - "id" : "obj-9", + "id" : "obj-70", "maxclass" : "newobj", - "numinlets" : 8, - "numoutlets" : 8, - "outlettype" : [ "bang", "bang", "bang", "bang", "bang", "bang", "bang", "" ], - "patching_rect" : [ 84.0, 285.0, 214.0, 22.0 ], - "text" : "sel 370 2162 4210 2044 252 4092 508" - } - - } - ], - "lines" : [ { - "patchline" : { - "destination" : [ "obj-17", 0 ], - "source" : [ "obj-12", 0 ] + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 205.75, 325.0, 29.5, 22.0 ], + "text" : "+ 4" } } , { - "patchline" : { - "destination" : [ "obj-12", 1 ], - "source" : [ "obj-16", 0 ] + "box" : { + "id" : "obj-64", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 169.75, 469.0, 29.5, 22.0 ], + "text" : "/ 1." } } , { - "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-17", 0 ] + "box" : { + "format" : 6, + "id" : "obj-115", + "maxclass" : "flonum", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 126.000000000000057, 746.0, 50.0, 22.0 ] } } , { - "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-18", 0 ] + "box" : { + "id" : "obj-38", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 238.000000000000057, 640.0, 151.0, 35.0 ], + "text" : "position -1.742222 0.266 0" } } , { - "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-2", 1 ] - } + "box" : { + "id" : "obj-1", + "maxclass" : "newobj", + "numinlets" : 5, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patcher" : { + "fileversion" : 1, + "appversion" : { + "major" : 8, + "minor" : 5, + "revision" : 5, + "architecture" : "x64", + "modernui" : 1 + } +, + "classnamespace" : "box", + "rect" : [ 854.0, 206.0, 457.0, 705.0 ], + "bglocked" : 0, + "openinpresentation" : 0, + "default_fontsize" : 12.0, + "default_fontface" : 0, + "default_fontname" : "Arial", + "gridonopen" : 1, + "gridsize" : [ 15.0, 15.0 ], + "gridsnaponopen" : 1, + "objectsnaponopen" : 1, + "statusbarvisible" : 2, + "toolbarvisible" : 1, + "lefttoolbarpinned" : 0, + "toptoolbarpinned" : 0, + "righttoolbarpinned" : 0, + "bottomtoolbarpinned" : 0, + "toolbars_unpinned_last_save" : 0, + "tallnewobj" : 0, + "boxanimatetime" : 200, + "enablehscroll" : 1, + "enablevscroll" : 1, + "devicewidth" : 0.0, + "description" : "", + "digest" : "", + "tags" : "", + "style" : "", + "subpatcher_template" : "", + "assistshowspatchername" : 0, + "boxes" : [ { + "box" : { + "id" : "obj-53", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "int" ], + "patching_rect" : [ 212.0, 93.0, 29.5, 22.0 ], + "text" : "- 1" + } - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-20", 0 ] - } + } +, { + "box" : { + "format" : 6, + "id" : "obj-52", + "maxclass" : "flonum", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 269.0, 184.0, 50.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-4", 0 ] - } + } +, { + "box" : { + "format" : 6, + "id" : "obj-50", + "maxclass" : "flonum", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 378.0, 339.0, 50.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-12", 0 ], - "order" : 1, - "source" : [ "obj-49", 0 ] - } + } +, { + "box" : { + "format" : 6, + "id" : "obj-47", + "maxclass" : "flonum", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "bang" ], + "parameter_enable" : 0, + "patching_rect" : [ 259.0, 243.0, 50.0, 22.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-18", 0 ], - "order" : 0, - "source" : [ "obj-49", 0 ] - } + } +, { + "box" : { + "id" : "obj-20", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 227.5, 644.0, 80.0, 22.0 ], + "text" : "loadmess 0 0" + } + + } +, { + "box" : { + "id" : "obj-19", + "linecount" : 3, + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 297.0, 718.0, 50.0, 62.0 ], + "text" : "-1.742222 0.266" + } + + } +, { + "box" : { + "id" : "obj-48", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 151.25, 110.0, 47.0, 22.0 ], + "text" : "unpack" + } + + } +, { + "box" : { + "id" : "obj-36", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 208.25, 357.5, 138.0, 33.0 ], + "text" : "above 0.955 will make line 0 rise above the top" + } + + } +, { + "box" : { + "id" : "obj-29", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 158.25, 328.0, 184.0, 22.0 ], + "text" : "if $f1 > 0.955 then 0.955 else $f1" + } - } -, { - "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-8", 0 ] - } + } +, { + "box" : { + "id" : "obj-11", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 179.25, 150.0, 32.0, 22.0 ], + "text" : "/ 28." + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 6 ] - } + } +, { + "box" : { + "id" : "obj-2", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 159.25, 186.0, 39.0, 22.0 ], + "text" : "/ 480." + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 5 ] - } + } +, { + "box" : { + "id" : "obj-177", + "maxclass" : "newobj", + "numinlets" : 6, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 158.25, 293.0, 211.0, 22.0 ], + "text" : "scale 0. 2. 0.266 0.95 0.15 @classic 0" + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 4 ] - } + } +, { + "box" : { + "id" : "obj-142", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 128.0, 588.0, 44.0, 22.0 ], + "text" : "* -0.98" + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 3 ] - } + } +, { + "box" : { + "id" : "obj-138", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 128.0, 556.0, 29.5, 22.0 ], + "text" : "/ 0." + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 2 ] - } + } +, { + "box" : { + "annotation" : "lines", + "comment" : "lines", + "hint" : "lines", + "id" : "obj-10", + "index" : 3, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 185.375, 49.0, 30.0, 30.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 1 ] - } + } +, { + "box" : { + "annotation" : "size [i i]", + "comment" : "size [i i]", + "hint" : "size [i i]", + "id" : "obj-7", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 129.0, 49.0, 30.0, 30.0 ] + } - } -, { - "patchline" : { - "destination" : [ "obj-14", 0 ], - "source" : [ "obj-9", 0 ] - } + } +, { + "box" : { + "annotation" : "position", + "comment" : "position", + "hint" : "position is added to calculated position [i i]", + "id" : "obj-6", + "index" : 4, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 439.5, 49.0, 30.0, 30.0 ] + } - } - ], - "styles" : [ { - "name" : "AudioStatus_Menu", - "default" : { - "bgfillcolor" : { - "type" : "color", - "color" : [ 0.294118, 0.313726, 0.337255, 1 ], - "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39, - "autogradient" : 0 - } + } +, { + "box" : { + "id" : "obj-24", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 25.75, 644.0, 121.0, 22.0 ], + "text" : "-1.742222 0.266" + } - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "Audiomix", - "default" : { - "bgfillcolor" : { - "type" : "gradient", - "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39 - } + } +, { + "box" : { + "id" : "obj-15", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 293.75, 565.0, 19.0, 22.0 ], + "text" : "t f" + } - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberB-1", - "default" : { - "accentcolor" : [ 0.011765, 0.396078, 0.752941, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberG-1", - "default" : { - "accentcolor" : [ 0.0, 0.533333, 0.168627, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberGold-1", - "default" : { - "accentcolor" : [ 0.764706, 0.592157, 0.101961, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberR-1", - "default" : { - "accentcolor" : [ 0.784314, 0.145098, 0.023529, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } - ] - } -, - "patching_rect" : [ 84.5, 256.0, 65.0, 22.0 ], - "saved_object_attributes" : { - "description" : "", - "digest" : "", - "globalpatchername" : "", - "tags" : "" - } -, - "text" : "p runCode" - } + } +, { + "box" : { + "id" : "obj-37", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 155.0, 673.0, 91.5, 22.0 ], + "text" : "vexpr $f1 + $f2" + } - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 189.0, 210.0, 77.0, 22.0 ], - "text" : "prepend size" - } + } +, { + "box" : { + "id" : "obj-9", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 200.25, 584.0, 29.5, 22.0 ], + "text" : "f" + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 153.0, 180.0, 55.0, 22.0 ], - "text" : "zl.slice 1" - } + } +, { + "box" : { + "id" : "obj-8", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 200.25, 615.0, 112.5, 22.0 ], + "text" : "slide 15 15" + } - } -, { - "box" : { - "id" : "obj-10", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 84.5, 390.0, 105.0, 22.0 ], - "text" : "prepend keyPress" - } + } +, { + "box" : { + "id" : "obj-27", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 155.0, 644.0, 64.25, 22.0 ], + "text" : "pak f f" + } - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 153.0, 570.0, 113.0, 22.0 ], - "text" : "routepass jit_matrix" - } + } +, { + "box" : { + "id" : "obj-25", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 154.75, 709.0, 93.0, 22.0 ], + "text" : "position $1 $2 0" + } - } -, { - "box" : { - "id" : "obj-26", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 565.0, 432.0, 19.0, 22.0 ], - "text" : "t l" - } + } +, { + "box" : { + "annotation" : "slide_time", + "comment" : "slide_time", + "hint" : "slide_time", + "id" : "obj-5", + "index" : 5, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 510.0, 49.0, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-25", - "linecount" : 5, - "maxclass" : "newobj", - "numinlets" : 18, - "numoutlets" : 18, - "outlettype" : [ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ], - "patching_rect" : [ 565.0, 303.0, 207.0, 76.0 ], - "text" : "routepass cursor_color blink_color number_color color blink_enable output_matrix font tracking leadscale cursor comment run_color set insert append prepend remove" - } + } +, { + "box" : { + "comment" : "", + "id" : "obj-4", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 154.75, 752.0, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 60.0, 450.0, 22.0, 22.0 ], - "text" : "t b" - } + } +, { + "box" : { + "annotation" : "bang", + "comment" : "bang", + "hint" : "bang", + "id" : "obj-3", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 72.0, 49.0, 30.0, 30.0 ] + } - } -, { - "box" : { - "id" : "obj-19", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 176.0, 357.0, 19.0, 22.0 ], - "text" : "t l" - } + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-10", 0 ] + } - } -, { - "box" : { - "id" : "obj-222", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patcher" : { - "fileversion" : 1, - "appversion" : { - "major" : 8, - "minor" : 2, - "revision" : 0, - "architecture" : "x64", - "modernui" : 1 - } -, - "classnamespace" : "box", - "rect" : [ 34.0, 79.0, 1372.0, 783.0 ], - "bglocked" : 0, - "openinpresentation" : 0, - "default_fontsize" : 12.0, - "default_fontface" : 0, - "default_fontname" : "Arial", - "gridonopen" : 1, - "gridsize" : [ 15.0, 15.0 ], - "gridsnaponopen" : 1, - "objectsnaponopen" : 1, - "statusbarvisible" : 2, - "toolbarvisible" : 1, - "lefttoolbarpinned" : 0, - "toptoolbarpinned" : 0, - "righttoolbarpinned" : 0, - "bottomtoolbarpinned" : 0, - "toolbars_unpinned_last_save" : 0, - "tallnewobj" : 0, - "boxanimatetime" : 200, - "enablehscroll" : 1, - "enablevscroll" : 1, - "devicewidth" : 0.0, - "description" : "", - "digest" : "", - "tags" : "", - "style" : "", - "subpatcher_template" : "", - "assistshowspatchername" : 0, - "boxes" : [ { - "box" : { - "id" : "obj-19", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 406.0, 435.0, 93.0, 22.0 ], - "text" : "route slide_time" - } + } +, { + "patchline" : { + "destination" : [ "obj-2", 1 ], + "source" : [ "obj-11", 0 ] + } - } -, { - "box" : { - "id" : "obj-16", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 129.5, 533.0, 19.0, 22.0 ], - "text" : "t f" - } + } +, { + "patchline" : { + "destination" : [ "obj-142", 0 ], + "source" : [ "obj-138", 0 ] + } - } -, { - "box" : { - "id" : "obj-15", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 639.0, 466.0, 19.0, 22.0 ], - "text" : "t f" - } + } +, { + "patchline" : { + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-142", 0 ] + } - } -, { - "box" : { - "comment" : "", - "id" : "obj-6", - "index" : 2, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 406.0, 399.0, 30.0, 30.0 ] - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 2 ], + "order" : 0, + "source" : [ "obj-15", 0 ] + } - } -, { - "box" : { - "id" : "obj-14", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 615.0, 255.0, 155.0, 33.0 ], - "text" : "replaces \n[ease @function in_sine]" - } + } +, { + "patchline" : { + "destination" : [ "obj-8", 1 ], + "order" : 1, + "source" : [ "obj-15", 0 ] + } - } -, { - "box" : { - "id" : "obj-13", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 330.0, 255.0, 193.0, 33.0 ], - "text" : "replaces \n[ease @function in_out_sine]" - } + } +, { + "patchline" : { + "destination" : [ "obj-29", 0 ], + "order" : 1, + "source" : [ "obj-177", 0 ] + } - } -, { - "box" : { - "id" : "obj-10", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 105.0, 255.0, 193.0, 33.0 ], - "text" : "replaces \n[ease @function in_out_sine]" - } + } +, { + "patchline" : { + "destination" : [ "obj-50", 0 ], + "order" : 0, + "source" : [ "obj-177", 0 ] + } - } -, { - "box" : { - "id" : "obj-12", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 317.0, 176.0, 29.5, 22.0 ], - "text" : "f" - } + } +, { + "patchline" : { + "destination" : [ "obj-177", 0 ], + "order" : 1, + "source" : [ "obj-2", 0 ] + } - } -, { - "box" : { - "id" : "obj-37", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 555.0, 575.0, 88.0, 22.0 ], - "text" : "vexpr $f1 + $f2" - } + } +, { + "patchline" : { + "destination" : [ "obj-47", 0 ], + "order" : 0, + "source" : [ "obj-2", 0 ] + } - } -, { - "box" : { - "id" : "obj-36", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 624.0, 544.0, 81.0, 22.0 ], - "text" : "route position" - } + } +, { + "patchline" : { + "destination" : [ "obj-37", 1 ], + "source" : [ "obj-20", 0 ] + } - } -, { - "box" : { - "id" : "obj-34", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.0, 459.0, 48.0, 22.0 ], - "text" : "pak f 1." - } + } +, { + "patchline" : { + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-25", 0 ] + } - } -, { - "box" : { - "id" : "obj-35", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 92.0, 489.0, 29.5, 22.0 ], - "text" : "* 1." - } + } +, { + "patchline" : { + "destination" : [ "obj-24", 1 ], + "order" : 1, + "source" : [ "obj-27", 0 ] + } - } -, { - "box" : { - "id" : "obj-32", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 148.0, 399.0, 67.0, 22.0 ], - "text" : "route scale" - } + } +, { + "patchline" : { + "destination" : [ "obj-37", 0 ], + "order" : 0, + "source" : [ "obj-27", 0 ] + } - } -, { - "box" : { - "id" : "obj-1", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "float", "float" ], - "patching_rect" : [ 92.0, 180.0, 29.5, 22.0 ], - "text" : "t f f" - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 1 ], + "midpoints" : [ 167.75, 528.0, 220.25, 528.0 ], + "source" : [ "obj-29", 0 ] + } - } -, { - "box" : { - "id" : "obj-11", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 792.0, 198.0, 70.0, 22.0 ], - "text" : "loadmess 1" - } + } +, { + "patchline" : { + "destination" : [ "obj-9", 0 ], + "midpoints" : [ 81.5, 543.0, 209.75, 543.0 ], + "source" : [ "obj-3", 0 ] + } - } -, { - "box" : { - "id" : "obj-5", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 45.0, 489.0, 22.0, 22.0 ], - "text" : "t b" - } + } +, { + "patchline" : { + "destination" : [ "obj-19", 1 ], + "order" : 0, + "source" : [ "obj-37", 0 ] + } - } -, { - "box" : { - "id" : "obj-2", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 45.0, 90.0, 66.0, 22.0 ], - "text" : "route bang" - } + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "order" : 1, + "source" : [ "obj-37", 0 ] + } - } -, { - "box" : { - "id" : "obj-9", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 589.5, 484.0, 29.5, 22.0 ], - "text" : "f" - } + } +, { + "patchline" : { + "destination" : [ "obj-177", 0 ], + "source" : [ "obj-47", 0 ] + } - } -, { - "box" : { - "id" : "obj-8", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 589.5, 515.0, 67.0, 22.0 ], - "text" : "slide 15 15" - } + } +, { + "patchline" : { + "destination" : [ "obj-11", 0 ], + "source" : [ "obj-48", 1 ] + } - } -, { - "box" : { - "id" : "obj-7", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 81.5, 544.0, 29.5, 22.0 ], - "text" : "f" - } + } +, { + "patchline" : { + "destination" : [ "obj-15", 0 ], + "midpoints" : [ 519.5, 552.0, 303.25, 552.0 ], + "source" : [ "obj-5", 0 ] + } - } -, { - "box" : { - "id" : "obj-4", - "maxclass" : "newobj", - "numinlets" : 3, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 81.5, 575.0, 67.0, 22.0 ], - "text" : "slide 15 15" - } + } +, { + "patchline" : { + "destination" : [ "obj-2", 0 ], + "order" : 1, + "source" : [ "obj-53", 0 ] + } - } -, { - "box" : { - "id" : "obj-3", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 317.0, 135.0, 83.0, 22.0 ], - "text" : "route nLength" - } + } +, { + "patchline" : { + "destination" : [ "obj-52", 0 ], + "order" : 0, + "source" : [ "obj-53", 0 ] + } - } -, { - "box" : { - "id" : "obj-213", - "maxclass" : "preset", - "numinlets" : 1, - "numoutlets" : 4, - "outlettype" : [ "preset", "int", "preset", "int" ], - "patching_rect" : [ 792.0, 235.0, 100.0, 40.0 ], - "preset_data" : [ { - "number" : 1, - "data" : [ 5, "obj-174", "flonum", "float", 0.150000005960464, 5, "obj-175", "flonum", "float", 0.870000004768372, 5, "obj-176", "flonum", "float", 0.266000002622604, 5, "obj-24", "flonum", "float", -0.904999971389771, 5, "obj-126", "flonum", "float", 0.135000005364418, 5, "obj-127", "flonum", "float", 0.070869997143745, 5, "obj-128", "flonum", "float", 0.699999988079071, 5, "obj-121", "flonum", "float", 0.259999990463257, 5, "obj-119", "flonum", "float", 0.113099999725819, 5, "obj-118", "flonum", "float", 0.699999988079071 ] - } - ] - } + } +, { + "patchline" : { + "destination" : [ "obj-37", 1 ], + "midpoints" : [ 449.0, 671.0, 246.0, 671.0, 246.0, 672.0, 237.0, 672.0 ], + "source" : [ "obj-6", 0 ] + } - } -, { - "box" : { - "id" : "obj-212", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 317.0, 399.0, 41.0, 22.0 ], - "text" : "pak f f" - } + } +, { + "patchline" : { + "destination" : [ "obj-138", 0 ], + "order" : 1, + "source" : [ "obj-7", 0 ] + } - } -, { - "box" : { - "id" : "obj-205", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "float", "int" ], - "patching_rect" : [ 92.0, 429.0, 71.0, 22.0 ], - "text" : "minimum 0." - } + } +, { + "patchline" : { + "destination" : [ "obj-48", 0 ], + "order" : 0, + "source" : [ "obj-7", 0 ] + } - } -, { - "box" : { - "id" : "obj-203", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.0, 399.0, 41.0, 22.0 ], - "text" : "pak f f" - } + } +, { + "patchline" : { + "destination" : [ "obj-27", 1 ], + "source" : [ "obj-8", 0 ] + } - } -, { - "box" : { - "id" : "obj-201", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 317.0, 429.0, 29.5, 22.0 ], - "text" : "* 0." + } +, { + "patchline" : { + "destination" : [ "obj-8", 0 ], + "source" : [ "obj-9", 0 ] + } + + } + ] + } +, + "patching_rect" : [ 408.0, 640.0, 131.0, 22.0 ], + "saved_object_attributes" : { + "description" : "", + "digest" : "", + "globalpatchername" : "", + "tags" : "" + } +, + "text" : "p position" } } , { "box" : { - "id" : "obj-200", + "id" : "obj-93", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 3, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 317.0, 235.0, 206.0, 22.0 ], - "text" : "expr cos($f1 * 3.141593) * - 0.5 + 0.5" + "patching_rect" : [ 91.0, 710.0, 80.0, 22.0 ], + "text" : "clip 0.001 1.7" } } , { "box" : { - "id" : "obj-183", + "id" : "obj-79", "maxclass" : "newobj", - "numinlets" : 1, + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 600.0, 235.0, 185.0, 22.0 ], - "text" : "expr 1 - cos($f1 * 3.141593 * 0.5)" - } - - } -, { - "box" : { - "format" : 6, - "id" : "obj-174", - "maxclass" : "flonum", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 792.0, 310.0, 50.0, 22.0 ] + "outlettype" : [ "float" ], + "patching_rect" : [ 91.0, 746.0, 29.5, 22.0 ], + "text" : "f" } } , { "box" : { - "format" : 6, - "id" : "obj-175", - "maxclass" : "flonum", + "bgcolor" : [ 0.035526446998119, 0.0, 0.700718522071838, 1.0 ], + "id" : "obj-78", + "maxclass" : "number", "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 735.0, 310.0, 50.0, 22.0 ] + "patching_rect" : [ 392.5, 200.0, 50.0, 22.0 ] } } , { "box" : { - "format" : 6, - "id" : "obj-176", - "maxclass" : "flonum", + "bgcolor" : [ 0.094930529594421, 0.722835063934326, 0.036581769585609, 1.0 ], + "id" : "obj-54", + "maxclass" : "number", "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 680.5, 310.0, 50.0, 22.0 ] - } - - } -, { - "box" : { - "id" : "obj-177", - "maxclass" : "newobj", - "numinlets" : 6, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 600.0, 355.0, 211.0, 22.0 ], - "text" : "scale 0. 1. 0.266 0.87 0.15 @classic 0" + "patching_rect" : [ 471.0, 193.0, 50.0, 22.0 ] } } , { "box" : { - "id" : "obj-163", + "id" : "obj-48", "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.0, 235.0, 206.0, 22.0 ], - "text" : "expr cos($f1 * 3.141593) * - 0.5 + 0.5" - } - - } -, { - "box" : { - "id" : "obj-142", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 555.0, 355.0, 29.5, 22.0 ], - "text" : "* 0." - } - - } -, { - "box" : { - "id" : "obj-139", - "maxclass" : "newobj", - "numinlets" : 2, "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 582.0, 135.0, 61.0, 22.0 ], - "text" : "route size" + "outlettype" : [ "int", "int" ], + "patching_rect" : [ 418.5, 160.0, 47.0, 22.0 ], + "text" : "unpack" } } , { "box" : { - "id" : "obj-138", - "maxclass" : "newobj", + "bgcolor" : [ 0.554750263690948, 0.113253846764565, 0.09394408762455, 1.0 ], + "bgcolor2" : [ 0.2, 0.2, 0.2, 1.0 ], + "bgfillcolor_angle" : 270.0, + "bgfillcolor_autogradient" : 0.0, + "bgfillcolor_color" : [ 0.554750263690948, 0.113253846764565, 0.09394408762455, 1.0 ], + "bgfillcolor_color1" : [ 0.554750263690948, 0.113253846764565, 0.09394408762455, 1.0 ], + "bgfillcolor_color2" : [ 0.2, 0.2, 0.2, 1.0 ], + "bgfillcolor_proportion" : 0.5, + "bgfillcolor_type" : "gradient", + "gradient" : 1, + "id" : "obj-44", + "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "float" ], - "patching_rect" : [ 555.0, 235.0, 29.5, 22.0 ], - "text" : "/ 0." - } - - } -, { - "box" : { - "format" : 6, - "id" : "obj-126", - "maxclass" : "flonum", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 506.0, 310.0, 50.0, 22.0 ] + "outlettype" : [ "" ], + "patching_rect" : [ 548.0, 131.0, 50.0, 22.0 ], + "text" : "0 0" } } , { "box" : { + "bgcolor" : [ 0.090707004070282, 0.709746658802032, 0.701321244239807, 1.0 ], "format" : 6, - "id" : "obj-127", + "id" : "obj-30", "maxclass" : "flonum", "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 437.0, 310.0, 60.0, 22.0 ] + "patching_rect" : [ 246.0, 131.0, 50.0, 22.0 ] } } , { "box" : { + "bgcolor" : [ 0.589827179908752, 0.717309176921844, 0.043264884501696, 1.0 ], "format" : 6, - "id" : "obj-128", + "id" : "obj-23", "maxclass" : "flonum", "numinlets" : 1, "numoutlets" : 2, "outlettype" : [ "", "bang" ], "parameter_enable" : 0, - "patching_rect" : [ 377.0, 310.0, 50.0, 22.0 ] + "patching_rect" : [ 346.0, 131.0, 50.0, 22.0 ] } } , { "box" : { - "id" : "obj-132", + "id" : "obj-10", "maxclass" : "newobj", - "numinlets" : 6, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 317.0, 355.0, 208.0, 22.0 ], - "text" : "scale 0. 1 0.7 0.063 0.135 @classic 0" + "numinlets" : 7, + "numoutlets" : 7, + "outlettype" : [ "", "", "", "", "", "", "" ], + "patching_rect" : [ 27.0, 99.0, 626.0, 22.0 ], + "text" : "route bang scale lines length size position" } } , { "box" : { - "format" : 6, - "id" : "obj-121", - "maxclass" : "flonum", - "numinlets" : 1, + "id" : "obj-19", + "maxclass" : "newobj", + "numinlets" : 2, "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 277.0, 310.0, 50.0, 22.0 ] + "outlettype" : [ "", "" ], + "patching_rect" : [ 520.0, 556.0, 93.0, 22.0 ], + "text" : "route slide_time" } } , { "box" : { - "format" : 6, - "id" : "obj-119", - "maxclass" : "flonum", + "id" : "obj-16", + "maxclass" : "newobj", "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 197.0, 310.0, 67.0, 22.0 ] + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 138.5, 640.0, 19.0, 22.0 ], + "text" : "t f" } } , { "box" : { - "format" : 6, - "id" : "obj-118", - "maxclass" : "flonum", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 127.5, 310.0, 50.0, 22.0 ] + "id" : "obj-34", + "maxclass" : "newobj", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 100.0, 568.0, 48.0, 22.0 ], + "text" : "pak f 1." } } , { "box" : { - "id" : "obj-107", + "id" : "obj-35", "maxclass" : "newobj", - "numinlets" : 6, + "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 92.0, 355.0, 204.0, 22.0 ], - "text" : "scale 0. 1. 0.7 0.113 0.26 @classic 0" + "outlettype" : [ "float" ], + "patching_rect" : [ 100.0, 598.0, 29.5, 22.0 ], + "text" : "* 1." } } , { "box" : { - "id" : "obj-91", + "id" : "obj-5", "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 92.0, 135.0, 75.0, 22.0 ], - "text" : "route nLines" + "numinlets" : 1, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 27.0, 478.0, 22.0, 22.0 ], + "text" : "t b" } } , { "box" : { - "id" : "obj-27", + "id" : "obj-7", "maxclass" : "newobj", "numinlets" : 2, "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 555.0, 544.0, 53.5, 22.0 ], - "text" : "pak f f" + "outlettype" : [ "float" ], + "patching_rect" : [ 90.5, 651.0, 29.5, 22.0 ], + "text" : "f" } } , { "box" : { - "format" : 6, - "id" : "obj-24", - "maxclass" : "flonum", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "bang" ], - "parameter_enable" : 0, - "patching_rect" : [ 565.5, 310.0, 50.0, 22.0 ] + "id" : "obj-4", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 1, + "outlettype" : [ "float" ], + "patching_rect" : [ 90.5, 682.0, 67.0, 22.0 ], + "text" : "slide 15 15" } } , { "box" : { - "id" : "obj-25", + "id" : "obj-21", "maxclass" : "message", "numinlets" : 2, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 555.0, 609.0, 93.0, 22.0 ], - "text" : "position $1 $2 0" + "patching_rect" : [ 91.0, 773.0, 53.0, 22.0 ], + "text" : "scale $1" } } , { "box" : { - "id" : "obj-21", - "maxclass" : "message", - "numinlets" : 2, + "comment" : "", + "id" : "obj-6", + "index" : 2, + "maxclass" : "inlet", + "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "" ], - "patching_rect" : [ 81.5, 609.0, 53.0, 22.0 ], - "text" : "scale $1" + "patching_rect" : [ 520.0, 510.0, 30.0, 30.0 ] } } @@ -3508,7 +3884,7 @@ "numinlets" : 0, "numoutlets" : 1, "outlettype" : [ "bang" ], - "patching_rect" : [ 45.0, 45.0, 30.0, 30.0 ] + "patching_rect" : [ 27.0, 56.0, 30.0, 30.0 ] } } @@ -3520,525 +3896,474 @@ "maxclass" : "outlet", "numinlets" : 1, "numoutlets" : 0, - "patching_rect" : [ 81.5, 660.0, 30.0, 30.0 ] + "patching_rect" : [ 91.0, 824.0, 30.0, 30.0 ] } } ], "lines" : [ { "patchline" : { - "destination" : [ "obj-163", 0 ], + "destination" : [ "obj-221", 0 ], + "midpoints" : [ 417.5, 810.0, 100.5, 810.0 ], + "order" : 1, "source" : [ "obj-1", 0 ] } } , { "patchline" : { - "destination" : [ "obj-183", 0 ], - "source" : [ "obj-1", 1 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-203", 0 ], - "source" : [ "obj-107", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-213", 0 ], - "source" : [ "obj-11", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-107", 3 ], - "source" : [ "obj-118", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-107", 4 ], - "source" : [ "obj-119", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-200", 0 ], - "source" : [ "obj-12", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-107", 5 ], - "source" : [ "obj-121", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-132", 5 ], - "source" : [ "obj-126", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-132", 4 ], - "source" : [ "obj-127", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-132", 3 ], - "source" : [ "obj-128", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-212", 0 ], - "source" : [ "obj-132", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-142", 0 ], + "destination" : [ "obj-38", 1 ], "order" : 0, - "source" : [ "obj-138", 0 ] + "source" : [ "obj-1", 0 ] } } , { "patchline" : { - "destination" : [ "obj-212", 1 ], + "color" : [ 0.554750263690948, 0.113253846764565, 0.09394408762455, 1.0 ], + "destination" : [ "obj-1", 3 ], + "midpoints" : [ 542.333333333333258, 495.0, 501.5, 495.0 ], "order" : 1, - "source" : [ "obj-138", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-138", 0 ], - "source" : [ "obj-139", 0 ] + "source" : [ "obj-10", 5 ] } } , { "patchline" : { - "destination" : [ "obj-36", 0 ], - "source" : [ "obj-139", 1 ] + "color" : [ 0.280446320772171, 0.0, 0.700844764709473, 1.0 ], + "destination" : [ "obj-1", 1 ], + "order" : 0, + "source" : [ "obj-10", 4 ] } } , { "patchline" : { - "destination" : [ "obj-27", 0 ], - "source" : [ "obj-142", 0 ] + "color" : [ 0.035526446998119, 0.0, 0.700718522071838, 1.0 ], + "destination" : [ "obj-18", 0 ], + "order" : 1, + "source" : [ "obj-10", 4 ] } } , { "patchline" : { - "destination" : [ "obj-8", 2 ], + "color" : [ 0.589827179908752, 0.717309176921844, 0.043264884501696, 1.0 ], + "destination" : [ "obj-23", 0 ], "order" : 0, - "source" : [ "obj-15", 0 ] + "source" : [ "obj-10", 3 ] } } , { "patchline" : { - "destination" : [ "obj-8", 1 ], + "color" : [ 0.090707004070282, 0.709746658802032, 0.701321244239807, 1.0 ], + "destination" : [ "obj-3", 0 ], "order" : 1, - "source" : [ "obj-15", 0 ] + "source" : [ "obj-10", 2 ] } } , { "patchline" : { - "destination" : [ "obj-4", 2 ], + "color" : [ 0.090707004070282, 0.709746658802032, 0.701321244239807, 1.0 ], + "destination" : [ "obj-30", 0 ], "order" : 0, - "source" : [ "obj-16", 0 ] - } - - } -, { - "patchline" : { - "destination" : [ "obj-4", 1 ], - "order" : 1, - "source" : [ "obj-16", 0 ] + "source" : [ "obj-10", 2 ] } } , { "patchline" : { - "destination" : [ "obj-107", 0 ], - "source" : [ "obj-163", 0 ] + "color" : [ 1.0, 0.0, 0.0, 1.0 ], + "destination" : [ "obj-34", 1 ], + "source" : [ "obj-10", 1 ] } } , { "patchline" : { - "destination" : [ "obj-177", 5 ], - "source" : [ "obj-174", 0 ] + "color" : [ 0.554750263690948, 0.113253846764565, 0.09394408762455, 1.0 ], + "destination" : [ "obj-44", 1 ], + "order" : 0, + "source" : [ "obj-10", 5 ] } } , { "patchline" : { - "destination" : [ "obj-177", 4 ], - "source" : [ "obj-175", 0 ] + "color" : [ 0.201406925916672, 0.201406925916672, 0.201406925916672, 0.6572066327 ], + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-10", 0 ] } } , { "patchline" : { - "destination" : [ "obj-177", 3 ], - "source" : [ "obj-176", 0 ] + "color" : [ 0.589827179908752, 0.717309176921844, 0.043264884501696, 1.0 ], + "destination" : [ "obj-70", 0 ], + "midpoints" : [ 340.0, 123.0, 307.0, 123.0, 307.0, 156.0, 306.0, 156.0, 306.0, 301.0, 215.25, 301.0 ], + "order" : 1, + "source" : [ "obj-10", 3 ] } } , { "patchline" : { - "destination" : [ "obj-9", 1 ], - "source" : [ "obj-177", 0 ] + "destination" : [ "obj-110", 0 ], + "source" : [ "obj-109", 0 ] } } , { "patchline" : { - "destination" : [ "obj-177", 0 ], - "source" : [ "obj-183", 0 ] + "destination" : [ "obj-74", 0 ], + "source" : [ "obj-110", 0 ] } } , { "patchline" : { - "destination" : [ "obj-15", 0 ], - "order" : 0, - "source" : [ "obj-19", 0 ] + "destination" : [ "obj-64", 0 ], + "source" : [ "obj-111", 0 ] } } , { "patchline" : { - "destination" : [ "obj-16", 0 ], - "order" : 1, - "source" : [ "obj-19", 0 ] + "destination" : [ "obj-111", 0 ], + "source" : [ "obj-112", 0 ] } } , { "patchline" : { - "destination" : [ "obj-12", 0 ], + "destination" : [ "obj-12", 1 ], "order" : 0, - "source" : [ "obj-2", 0 ] + "source" : [ "obj-140", 0 ] } } , { "patchline" : { - "destination" : [ "obj-5", 0 ], + "destination" : [ "obj-34", 0 ], "order" : 1, - "source" : [ "obj-2", 0 ] + "source" : [ "obj-140", 0 ] } } , { "patchline" : { - "destination" : [ "obj-91", 0 ], - "source" : [ "obj-2", 1 ] + "destination" : [ "obj-140", 0 ], + "source" : [ "obj-15", 0 ] } } , { "patchline" : { - "destination" : [ "obj-132", 0 ], - "source" : [ "obj-200", 0 ] + "color" : [ 0.9786491556, 0.701961, 0.701961, 1.0 ], + "destination" : [ "obj-4", 2 ], + "order" : 0, + "source" : [ "obj-16", 0 ] } } , { "patchline" : { - "destination" : [ "obj-203", 1 ], - "source" : [ "obj-201", 0 ] + "color" : [ 0.9786491556, 0.701961, 0.701961, 1.0 ], + "destination" : [ "obj-4", 1 ], + "order" : 1, + "source" : [ "obj-16", 0 ] } } , { "patchline" : { - "destination" : [ "obj-205", 0 ], - "source" : [ "obj-203", 0 ] + "destination" : [ "obj-140", 1 ], + "source" : [ "obj-17", 1 ] } } , { "patchline" : { - "destination" : [ "obj-34", 0 ], - "source" : [ "obj-205", 0 ] + "destination" : [ "obj-15", 0 ], + "source" : [ "obj-17", 0 ] } } , { "patchline" : { - "destination" : [ "obj-221", 0 ], - "source" : [ "obj-21", 0 ] + "color" : [ 0.035526446998119, 0.0, 0.700718522071838, 1.0 ], + "destination" : [ "obj-3", 0 ], + "midpoints" : [ 417.5, 156.0, 405.0, 156.0, 405.0, 186.0, 238.833333333333343, 186.0 ], + "source" : [ "obj-18", 0 ] } } , { "patchline" : { - "destination" : [ "obj-201", 0 ], - "source" : [ "obj-212", 0 ] + "color" : [ 0.280446320772171, 0.0, 0.700844764709473, 1.0 ], + "destination" : [ "obj-48", 0 ], + "source" : [ "obj-18", 1 ] } } , { "patchline" : { - "destination" : [ "obj-118", 0 ], - "hidden" : 1, - "order" : 9, - "source" : [ "obj-213", 0 ] + "color" : [ 0.978649155594406, 0.701961, 0.701961, 1.0 ], + "destination" : [ "obj-1", 4 ], + "order" : 0, + "source" : [ "obj-19", 0 ] } } , { "patchline" : { - "destination" : [ "obj-119", 0 ], - "hidden" : 1, - "order" : 8, - "source" : [ "obj-213", 0 ] + "color" : [ 0.9786491556, 0.701961, 0.701961, 1.0 ], + "destination" : [ "obj-16", 0 ], + "midpoints" : [ 529.5, 608.0, 148.0, 608.0 ], + "order" : 1, + "source" : [ "obj-19", 0 ] } } , { "patchline" : { - "destination" : [ "obj-121", 0 ], - "hidden" : 1, - "order" : 7, - "source" : [ "obj-213", 0 ] + "destination" : [ "obj-221", 0 ], + "source" : [ "obj-21", 0 ] } } , { "patchline" : { - "destination" : [ "obj-126", 0 ], - "hidden" : 1, - "order" : 4, - "source" : [ "obj-213", 0 ] + "destination" : [ "obj-10", 0 ], + "source" : [ "obj-219", 0 ] } } , { "patchline" : { - "destination" : [ "obj-127", 0 ], - "hidden" : 1, - "order" : 5, - "source" : [ "obj-213", 0 ] + "color" : [ 0.090707004070282, 0.709746658802032, 0.701321244239807, 1.0 ], + "destination" : [ "obj-1", 2 ], + "midpoints" : [ 238.833333333333343, 466.0, 473.5, 466.0 ], + "order" : 0, + "source" : [ "obj-3", 0 ] } } , { "patchline" : { - "destination" : [ "obj-128", 0 ], - "hidden" : 1, - "order" : 6, - "source" : [ "obj-213", 0 ] + "color" : [ 0.091, 0.709746658802032, 0.701321244239807, 1.0 ], + "destination" : [ "obj-97", 0 ], + "midpoints" : [ 238.833333333333343, 250.0, 145.750000000000057, 250.0 ], + "order" : 1, + "source" : [ "obj-3", 0 ] } } , { "patchline" : { - "destination" : [ "obj-174", 0 ], - "hidden" : 1, - "order" : 0, - "source" : [ "obj-213", 0 ] + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-34", 0 ] } } , { "patchline" : { - "destination" : [ "obj-175", 0 ], - "hidden" : 1, + "destination" : [ "obj-7", 1 ], "order" : 1, - "source" : [ "obj-213", 0 ] + "source" : [ "obj-35", 0 ] } } , { "patchline" : { - "destination" : [ "obj-176", 0 ], - "hidden" : 1, - "order" : 2, - "source" : [ "obj-213", 0 ] + "destination" : [ "obj-9", 1 ], + "order" : 0, + "source" : [ "obj-35", 0 ] } } , { "patchline" : { - "destination" : [ "obj-24", 0 ], - "hidden" : 1, - "order" : 3, - "source" : [ "obj-213", 0 ] + "destination" : [ "obj-93", 0 ], + "source" : [ "obj-4", 0 ] } } , { "patchline" : { - "destination" : [ "obj-2", 0 ], - "source" : [ "obj-219", 0 ] + "color" : [ 0.094930529594421, 0.722835063934326, 0.036581769585609, 1.0 ], + "destination" : [ "obj-109", 0 ], + "midpoints" : [ 456.0, 312.0, 109.750000000000057, 312.0 ], + "order" : 3, + "source" : [ "obj-48", 1 ] } } , { "patchline" : { - "destination" : [ "obj-142", 1 ], - "source" : [ "obj-24", 0 ] + "color" : [ 0.035526446998119, 0.0, 0.700718522071838, 1.0 ], + "destination" : [ "obj-112", 0 ], + "midpoints" : [ 428.0, 280.0, 179.25, 280.0 ], + "order" : 1, + "source" : [ "obj-48", 0 ] } } , { "patchline" : { - "destination" : [ "obj-221", 0 ], - "source" : [ "obj-25", 0 ] + "color" : [ 0.094930529594421, 0.722835063934326, 0.036581769585609, 1.0 ], + "destination" : [ "obj-54", 0 ], + "order" : 0, + "source" : [ "obj-48", 1 ] } } , { "patchline" : { - "destination" : [ "obj-37", 0 ], - "source" : [ "obj-27", 0 ] + "color" : [ 0.035526446998119, 0.0, 0.700718522071838, 1.0 ], + "destination" : [ "obj-78", 0 ], + "midpoints" : [ 428.0, 186.0, 402.0, 186.0 ], + "order" : 0, + "source" : [ "obj-48", 0 ] } } , { "patchline" : { - "destination" : [ "obj-12", 0 ], - "source" : [ "obj-3", 0 ] + "color" : [ 0.094930529594421, 0.722835063934326, 0.036581769585609, 1.0 ], + "destination" : [ "obj-84", 0 ], + "midpoints" : [ 456.0, 430.0, 121.250000000000057, 430.0 ], + "order" : 2, + "source" : [ "obj-48", 1 ] } } , { "patchline" : { - "destination" : [ "obj-139", 0 ], - "source" : [ "obj-3", 1 ] + "color" : [ 0.094930529594421, 0.722835063934326, 0.036581769585609, 1.0 ], + "destination" : [ "obj-85", 0 ], + "midpoints" : [ 456.0, 429.0, 189.75, 429.0 ], + "order" : 1, + "source" : [ "obj-48", 1 ] } } , { "patchline" : { - "destination" : [ "obj-34", 1 ], - "source" : [ "obj-32", 0 ] + "color" : [ 0.201406925916672, 0.201406925916672, 0.201406925916672, 0.6572066327 ], + "destination" : [ "obj-1", 0 ], + "midpoints" : [ 36.5, 560.0, 87.0, 560.0, 87.0, 560.0, 417.5, 560.0 ], + "order" : 0, + "source" : [ "obj-5", 0 ] } } , { "patchline" : { - "destination" : [ "obj-35", 0 ], - "source" : [ "obj-34", 0 ] + "color" : [ 0.201406925916672, 0.201406925916672, 0.201406925916672, 0.6572066327 ], + "destination" : [ "obj-7", 0 ], + "midpoints" : [ 36.5, 636.0, 100.0, 636.0 ], + "order" : 1, + "source" : [ "obj-5", 0 ] } } , { "patchline" : { - "destination" : [ "obj-7", 1 ], - "source" : [ "obj-35", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-6", 0 ] } } , { "patchline" : { - "destination" : [ "obj-37", 1 ], - "source" : [ "obj-36", 0 ] + "destination" : [ "obj-137", 0 ], + "order" : 0, + "source" : [ "obj-64", 0 ] } } , { "patchline" : { - "destination" : [ "obj-25", 0 ], - "source" : [ "obj-37", 0 ] + "destination" : [ "obj-17", 0 ], + "order" : 1, + "source" : [ "obj-64", 0 ] } } , { "patchline" : { - "destination" : [ "obj-21", 0 ], - "source" : [ "obj-4", 0 ] + "destination" : [ "obj-4", 0 ], + "source" : [ "obj-7", 0 ] } } , { "patchline" : { - "destination" : [ "obj-7", 0 ], - "order" : 1, - "source" : [ "obj-5", 0 ] + "destination" : [ "obj-112", 1 ], + "source" : [ "obj-70", 0 ] } } , { "patchline" : { - "destination" : [ "obj-9", 0 ], - "order" : 0, - "source" : [ "obj-5", 0 ] + "destination" : [ "obj-135", 0 ], + "order" : 1, + "source" : [ "obj-74", 0 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-6", 0 ] + "destination" : [ "obj-15", 0 ], + "order" : 0, + "source" : [ "obj-74", 0 ] } } , { "patchline" : { - "destination" : [ "obj-4", 0 ], - "source" : [ "obj-7", 0 ] + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-79", 0 ] } } , { "patchline" : { - "destination" : [ "obj-27", 1 ], - "source" : [ "obj-8", 0 ] + "destination" : [ "obj-74", 1 ], + "source" : [ "obj-84", 0 ] } } , { "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-9", 0 ] + "destination" : [ "obj-64", 1 ], + "source" : [ "obj-85", 0 ] } } , { "patchline" : { - "destination" : [ "obj-1", 0 ], - "source" : [ "obj-91", 0 ] + "destination" : [ "obj-115", 0 ], + "order" : 0, + "source" : [ "obj-93", 0 ] } } , { "patchline" : { - "destination" : [ "obj-3", 0 ], - "order" : 0, - "source" : [ "obj-91", 1 ] + "destination" : [ "obj-79", 0 ], + "order" : 1, + "source" : [ "obj-93", 0 ] } } , { "patchline" : { - "destination" : [ "obj-32", 0 ], - "order" : 1, - "source" : [ "obj-91", 1 ] + "destination" : [ "obj-109", 1 ], + "source" : [ "obj-97", 0 ] } } @@ -4047,13 +4372,13 @@ "name" : "AudioStatus_Menu", "default" : { "bgfillcolor" : { - "type" : "color", + "angle" : 270.0, + "autogradient" : 0, "color" : [ 0.294118, 0.313726, 0.337255, 1 ], "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, "proportion" : 0.39, - "autogradient" : 0 + "type" : "color" } } @@ -4065,12 +4390,12 @@ "name" : "Audiomix", "default" : { "bgfillcolor" : { - "type" : "gradient", + "angle" : 270.0, + "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39 + "proportion" : 0.39, + "type" : "gradient" } } @@ -4117,7 +4442,7 @@ ] } , - "patching_rect" : [ 317.800000000000011, 510.0, 77.0, 22.0 ], + "patching_rect" : [ 79.124305555555566, 523.0, 77.0, 22.0 ], "saved_object_attributes" : { "description" : "", "digest" : "", @@ -4125,606 +4450,776 @@ "tags" : "" } , - "text" : "p textScaling" + "text" : "p textScaling", + "varname" : "textScalingHandler" + } + + } +, { + "box" : { + "fontsize" : 11.0, + "id" : "obj-3", + "linecount" : 2, + "maxclass" : "comment", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 90.0, 41.0, 330.0, 31.0 ], + "text" : "Copyright (c) 2023 Tom Whiston\nThe GNU LGPL v.3 License", + "textcolor" : [ 0.0, 0.0, 0.0, 0.5 ] + } + + } +, { + "box" : { + "id" : "obj-85", + "maxclass" : "newobj", + "numinlets" : 3, + "numoutlets" : 3, + "outlettype" : [ "", "", "" ], + "patching_rect" : [ 26.0, 155.0, 150.0, 22.0 ], + "text" : "route bang ignore_keys_id" + } + + } +, { + "box" : { + "id" : "obj-83", + "linecount" : 2, + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 2, + "outlettype" : [ "", "" ], + "patching_rect" : [ 157.75, 76.0, 243.0, 35.0 ], + "text" : "patcherargs ctx 1280 720 @blink_enable 1 @output_matrix 0 @position 0 0 @scale 1" + } + + } +, { + "box" : { + "id" : "obj-22", + "maxclass" : "message", + "numinlets" : 2, + "numoutlets" : 1, + "outlettype" : [ "" ], + "patching_rect" : [ 261.0, 155.0, 29.5, 22.0 ], + "text" : "init" + } + + } +, { + "box" : { + "comment" : "(bang / arguments) render bang, drawto", + "id" : "obj-1", + "index" : 1, + "maxclass" : "inlet", + "numinlets" : 0, + "numoutlets" : 1, + "outlettype" : [ "bang" ], + "patching_rect" : [ 26.0, 108.5, 30.0, 30.0 ] + } + + } +, { + "box" : { + "color" : [ 0.952941, 0.564706, 0.098039, 1.0 ], + "id" : "obj-153", + "maxclass" : "newobj", + "numinlets" : 1, + "numoutlets" : 4, + "outlettype" : [ "", "", "", "" ], + "patching_rect" : [ 177.648611111111109, 568.0, 294.999999999999943, 22.0 ], + "saved_object_attributes" : { + "filename" : "tw.gl.repl", + "parameter_enable" : 0 + } +, + "text" : "js tw.gl.repl #1 #0_sk" + } + + } +, { + "box" : { + "comment" : "(list) messages typed", + "id" : "obj-176", + "index" : 1, + "maxclass" : "outlet", + "numinlets" : 1, + "numoutlets" : 0, + "patching_rect" : [ 177.648611111111109, 767.0, 30.0, 30.0 ], + "varname" : "routedMsgOutput" + } + + } +, { + "box" : { + "id" : "obj-5", + "linecount" : 6, + "maxclass" : "newobj", + "numinlets" : 39, + "numoutlets" : 39, + "outlettype" : [ "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ], + "patching_rect" : [ 380.0, 244.0, 400.0, 89.0 ], + "text" : "routepass keyPress replay run run_line read write keybindings output_matrix supress_output ephemeral_mode format_writes output_paste_bin drawto position scale color run_color number_color cursor_color cursor blink_enable blink_color font leadscale tracking comment add append prepend remove insert set back clear del jumpLine jumpWord gotoIndex", + "varname" : "routepass" + } + + } + ], + "lines" : [ { + "patchline" : { + "destination" : [ "obj-85", 0 ], + "source" : [ "obj-1", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-21", 1 ], + "midpoints" : [ 66.100000000000023, 397.0, 200.25, 397.0 ], + "source" : [ "obj-10", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-22", 0 ], + "source" : [ "obj-12", 0 ] + } + + } +, { + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-47", 0 ], + "midpoints" : [ 438.25, 194.0, 151.0, 194.0 ], + "source" : [ "obj-14", 1 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-25", 0 ], + "source" : [ "obj-15", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-13", 0 ], + "source" : [ "obj-153", 3 ] + } + + } +, { + "patchline" : { + "color" : [ 0.589827239513397, 0.717309296131134, 0.043264910578728, 1.0 ], + "destination" : [ "obj-31", 0 ], + "order" : 1, + "source" : [ "obj-153", 1 ] + } + + } +, { + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-42", 0 ], + "order" : 1, + "source" : [ "obj-153", 0 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 3 ], + "order" : 0, + "source" : [ "obj-153", 2 ] + } + + } +, { + "patchline" : { + "destination" : [ "obj-45", 2 ], + "order" : 0, + "source" : [ "obj-153", 1 ] } } , { - "box" : { - "fontsize" : 11.0, - "id" : "obj-3", - "linecount" : 2, - "maxclass" : "comment", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 60.0, 80.0, 330.0, 31.0 ], - "text" : "Copyright (c) 2020 Timo Hoogland\nThe GNU LGPL v.3 License", - "textcolor" : [ 0.0, 0.0, 0.0, 0.5 ] + "patchline" : { + "destination" : [ "obj-45", 1 ], + "order" : 0, + "source" : [ "obj-153", 0 ] } } , { - "box" : { - "id" : "obj-85", - "maxclass" : "newobj", - "numinlets" : 2, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 60.0, 180.0, 66.0, 22.0 ], - "text" : "route bang" + "patchline" : { + "destination" : [ "obj-46", 0 ], + "order" : 1, + "source" : [ "obj-153", 2 ] } } , { - "box" : { - "id" : "obj-83", - "linecount" : 2, - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 153.0, 135.0, 243.0, 35.0 ], - "text" : "patcherargs ctx 1280 720 @blink_enable 1 @output_matrix 0 @position 0 0 @scale 1" + "patchline" : { + "destination" : [ "obj-23", 0 ], + "source" : [ "obj-16", 0 ] } } , { - "box" : { - "id" : "obj-76", - "maxclass" : "newobj", - "numinlets" : 11, - "numoutlets" : 11, - "outlettype" : [ "", "", "", "", "", "", "", "", "", "", "" ], - "patching_rect" : [ 153.0, 256.0, 431.0, 22.0 ], - "text" : "routepass init run drawto clear size write read keybindings slide_time blink_time" + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-35", 0 ], + "source" : [ "obj-18", 0 ] } } , { - "box" : { - "id" : "obj-22", - "maxclass" : "message", - "numinlets" : 2, - "numoutlets" : 1, - "outlettype" : [ "" ], - "patching_rect" : [ 405.0, 165.0, 29.5, 22.0 ], - "text" : "init" + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-153", 0 ], + "source" : [ "obj-19", 0 ] } } , { - "box" : { - "comment" : "(bang / arguments) render bang, drawto", - "id" : "obj-1", - "index" : 1, - "maxclass" : "inlet", - "numinlets" : 0, - "numoutlets" : 1, - "outlettype" : [ "bang" ], - "patching_rect" : [ 60.0, 135.0, 30.0, 30.0 ] + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-19", 0 ], + "midpoints" : [ 170.25, 437.0, 187.148611111111109, 437.0 ], + "source" : [ "obj-21", 0 ] } } , { - "box" : { - "color" : [ 0.952941, 0.564706, 0.098039, 1.0 ], - "id" : "obj-153", - "maxclass" : "newobj", - "numinlets" : 1, - "numoutlets" : 2, - "outlettype" : [ "", "" ], - "patching_rect" : [ 153.0, 510.0, 147.0, 22.0 ], - "saved_object_attributes" : { - "filename" : "th.gl.editor", - "parameter_enable" : 0 - } -, - "text" : "js th.gl.editor #1 #0_sk" + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-47", 0 ], + "midpoints" : [ 270.5, 194.0, 151.0, 194.0 ], + "source" : [ "obj-22", 0 ] } } , { - "box" : { - "comment" : "(list) messages typed", - "id" : "obj-176", - "index" : 1, - "maxclass" : "outlet", - "numinlets" : 1, - "numoutlets" : 0, - "patching_rect" : [ 120.0, 669.0, 30.0, 30.0 ] + "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-153", 0 ], + "midpoints" : [ 88.624305555555566, 557.0, 183.0, 557.0, 183.0, 563.0, 187.148611111111109, 563.0 ], + "order" : 0, + "source" : [ "obj-222", 0 ] } } - ], - "lines" : [ { +, { "patchline" : { - "destination" : [ "obj-85", 0 ], - "source" : [ "obj-1", 0 ] + "destination" : [ "obj-20", 1 ], + "order" : 1, + "source" : [ "obj-222", 0 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-10", 0 ] + "color" : [ 0.09070697426796, 0.709746718406677, 0.701321363449097, 1.0 ], + "destination" : [ "obj-56", 0 ], + "midpoints" : [ 12.5, 381.0, 126.0, 381.0, 126.0, 372.0, 151.0, 372.0 ], + "source" : [ "obj-23", 0 ] } } , { "patchline" : { - "destination" : [ "obj-13", 0 ], - "midpoints" : [ 629.794117647058783, 540.5, 129.5, 540.5 ], - "source" : [ "obj-11", 0 ] + "destination" : [ "obj-25", 0 ], + "midpoints" : [ 112.748611111111131, 474.0, 90.0, 474.0, 90.0, 342.0, 151.0, 342.0 ], + "source" : [ "obj-24", 0 ] } } , { "patchline" : { - "destination" : [ "obj-22", 0 ], - "source" : [ "obj-12", 0 ] + "destination" : [ "obj-56", 0 ], + "source" : [ "obj-25", 0 ] } } , { "patchline" : { - "destination" : [ "obj-9", 0 ], - "source" : [ "obj-13", 0 ] + "color" : [ 0.589827239513397, 0.717309296131134, 0.043264910578728, 1.0 ], + "destination" : [ "obj-222", 0 ], + "midpoints" : [ 279.148611111111109, 674.0, 42.0, 674.0, 42.0, 509.0, 88.624305555555566, 509.0 ], + "source" : [ "obj-31", 0 ] } } , { "patchline" : { - "destination" : [ "obj-76", 0 ], - "source" : [ "obj-14", 1 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-18", 0 ], + "source" : [ "obj-32", 0 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "order" : 0, - "source" : [ "obj-15", 0 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-47", 0 ], + "midpoints" : [ 233.148611111111109, 705.0, 42.0, 705.0, 42.0, 203.0, 151.0, 203.0 ], + "source" : [ "obj-32", 1 ] } } , { "patchline" : { - "destination" : [ "obj-37", 0 ], - "order" : 1, - "source" : [ "obj-15", 0 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-21", 1 ], + "midpoints" : [ 192.199999999999989, 391.0, 200.25, 391.0 ], + "source" : [ "obj-33", 0 ] } } , { "patchline" : { - "destination" : [ "obj-222", 0 ], - "source" : [ "obj-153", 1 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-19", 0 ], + "midpoints" : [ 410.5, 476.0, 237.0, 476.0, 237.0, 476.0, 187.148611111111109, 476.0 ], + "source" : [ "obj-37", 1 ] } } , { "patchline" : { - "destination" : [ "obj-5", 0 ], - "source" : [ "obj-153", 0 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-19", 0 ], + "midpoints" : [ 351.5, 475.0, 237.0, 475.0, 237.0, 475.0, 187.148611111111109, 475.0 ], + "source" : [ "obj-37", 0 ] } } , { "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-16", 3 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-7", 0 ], + "source" : [ "obj-4", 1 ] } } , { "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-16", 2 ] + "destination" : [ "obj-9", 0 ], + "source" : [ "obj-41", 0 ] } } , { "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-16", 1 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-32", 0 ], + "source" : [ "obj-42", 0 ] } } , { "patchline" : { - "destination" : [ "obj-20", 0 ], - "source" : [ "obj-16", 0 ] + "destination" : [ "obj-45", 0 ], + "source" : [ "obj-43", 0 ] } } , { "patchline" : { - "destination" : [ "obj-222", 0 ], - "source" : [ "obj-16", 4 ] + "destination" : [ "obj-27", 0 ], + "source" : [ "obj-46", 0 ] } } , { "patchline" : { - "destination" : [ "obj-39", 0 ], - "source" : [ "obj-18", 0 ] + "destination" : [ "obj-15", 0 ], + "midpoints" : [ 204.599999999999994, 252.0, 177.0, 252.0, 177.0, 303.0, 173.648611111111109, 303.0 ], + "source" : [ "obj-47", 1 ] } } , { "patchline" : { - "destination" : [ "obj-21", 1 ], - "source" : [ "obj-19", 0 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-19", 0 ], + "midpoints" : [ 151.0, 253.0, 273.0, 253.0, 273.0, 437.0, 187.148611111111109, 437.0 ], + "source" : [ "obj-47", 0 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-20", 0 ] + "color" : [ 0.589827239513397, 0.717309296131134, 0.043264910578728, 1.0 ], + "destination" : [ "obj-222", 0 ], + "midpoints" : [ 365.399999999999977, 431.0, 88.624305555555566, 431.0 ], + "source" : [ "obj-47", 4 ] } } , { "patchline" : { - "destination" : [ "obj-153", 0 ], - "source" : [ "obj-21", 0 ] + "color" : [ 0.589827239513397, 0.717309296131134, 0.043264910578728, 1.0 ], + "destination" : [ "obj-222", 1 ], + "midpoints" : [ 311.800000000000011, 508.0, 174.0, 508.0, 174.0, 508.0, 146.624305555555566, 508.0 ], + "source" : [ "obj-47", 3 ] } } , { "patchline" : { - "destination" : [ "obj-76", 0 ], - "source" : [ "obj-22", 0 ] + "destination" : [ "obj-33", 1 ], + "source" : [ "obj-47", 2 ] } } , { "patchline" : { - "destination" : [ "obj-153", 0 ], - "midpoints" : [ 327.300000000000011, 548.0, 137.699999999999989, 548.0, 137.699999999999989, 499.0, 162.5, 499.0 ], - "source" : [ "obj-222", 0 ] + "destination" : [ "obj-5", 0 ], + "source" : [ "obj-47", 5 ] } } , { "patchline" : { - "destination" : [ "obj-24", 0 ], - "source" : [ "obj-23", 0 ] + "destination" : [ "obj-153", 0 ], + "source" : [ "obj-5", 11 ] } } , { "patchline" : { - "destination" : [ "obj-21", 0 ], - "source" : [ "obj-24", 0 ] + "destination" : [ "obj-153", 0 ], + "source" : [ "obj-5", 6 ] } } , { "patchline" : { - "destination" : [ "obj-11", 0 ], - "order" : 0, - "source" : [ "obj-25", 5 ] + "destination" : [ "obj-176", 0 ], + "source" : [ "obj-5", 38 ] } } , { "patchline" : { - "destination" : [ "obj-16", 0 ], - "source" : [ "obj-25", 17 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 37 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 16 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 36 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 15 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 35 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 14 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 34 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 13 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 33 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 12 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 32 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 11 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 31 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 10 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 30 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 9 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 29 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 8 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 28 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 7 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 27 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 6 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 26 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "order" : 1, - "source" : [ "obj-25", 5 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 25 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "order" : 0, - "source" : [ "obj-25", 4 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 24 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 3 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 23 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 2 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 22 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 1 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 21 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-25", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 20 ] } } , { "patchline" : { - "destination" : [ "obj-33", 2 ], - "order" : 1, - "source" : [ "obj-25", 4 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 19 ] } } , { "patchline" : { - "destination" : [ "obj-153", 0 ], - "source" : [ "obj-26", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 18 ] } } , { "patchline" : { - "destination" : [ "obj-26", 0 ], - "source" : [ "obj-33", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 17 ] } } , { "patchline" : { "destination" : [ "obj-19", 0 ], - "source" : [ "obj-37", 0 ] + "source" : [ "obj-5", 16 ] } } , { "patchline" : { - "destination" : [ "obj-153", 0 ], - "midpoints" : [ 353.055555555555543, 662.0, 431.5, 662.0, 431.5, 499.0, 162.5, 499.0 ], - "source" : [ "obj-39", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 15 ] } } , { "patchline" : { - "destination" : [ "obj-7", 0 ], - "source" : [ "obj-4", 1 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 12 ] } } , { "patchline" : { - "destination" : [ "obj-39", 0 ], - "order" : 0, - "source" : [ "obj-5", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 10 ] } } , { "patchline" : { - "destination" : [ "obj-9", 1 ], - "source" : [ "obj-5", 1 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 9 ] } } , { "patchline" : { - "destination" : [ "obj-9", 2 ], - "order" : 1, - "source" : [ "obj-5", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 8 ] } } , { "patchline" : { - "destination" : [ "obj-10", 0 ], - "source" : [ "obj-6", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 7 ] } } , { "patchline" : { - "destination" : [ "obj-76", 0 ], - "source" : [ "obj-7", 0 ] + "destination" : [ "obj-19", 0 ], + "source" : [ "obj-5", 1 ] } } , { "patchline" : { - "destination" : [ "obj-15", 0 ], - "order" : 1, - "source" : [ "obj-76", 7 ] + "destination" : [ "obj-21", 1 ], + "source" : [ "obj-5", 0 ] } } , { "patchline" : { - "destination" : [ "obj-153", 0 ], - "order" : 0, - "source" : [ "obj-76", 7 ] + "destination" : [ "obj-222", 0 ], + "source" : [ "obj-5", 14 ] } } , { "patchline" : { - "destination" : [ "obj-18", 0 ], - "source" : [ "obj-76", 6 ] + "destination" : [ "obj-222", 0 ], + "source" : [ "obj-5", 13 ] } } , { "patchline" : { - "destination" : [ "obj-18", 0 ], - "source" : [ "obj-76", 5 ] + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-5", 3 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-76", 3 ] + "destination" : [ "obj-37", 0 ], + "source" : [ "obj-5", 2 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-76", 2 ] + "destination" : [ "obj-53", 0 ], + "source" : [ "obj-5", 5 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "order" : 0, - "source" : [ "obj-76", 1 ] + "destination" : [ "obj-59", 0 ], + "source" : [ "obj-5", 4 ] } } , { "patchline" : { - "destination" : [ "obj-19", 0 ], - "source" : [ "obj-76", 0 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-153", 0 ], + "midpoints" : [ 525.5, 554.0, 187.148611111111109, 554.0 ], + "source" : [ "obj-53", 0 ] } } , { "patchline" : { - "destination" : [ "obj-222", 1 ], - "source" : [ "obj-76", 8 ] + "destination" : [ "obj-21", 0 ], + "source" : [ "obj-56", 0 ] } } , { "patchline" : { - "destination" : [ "obj-222", 0 ], - "source" : [ "obj-76", 4 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-153", 0 ], + "midpoints" : [ 432.199999999999989, 554.0, 187.148611111111109, 554.0 ], + "source" : [ "obj-59", 0 ] } } , { "patchline" : { - "destination" : [ "obj-23", 0 ], + "destination" : [ "obj-10", 0 ], "order" : 1, - "source" : [ "obj-76", 10 ] + "source" : [ "obj-6", 0 ] } } , { "patchline" : { - "destination" : [ "obj-25", 0 ], - "order" : 0, - "source" : [ "obj-76", 10 ] + "destination" : [ "obj-16", 0 ], + "order" : 2, + "source" : [ "obj-6", 0 ] } } , { "patchline" : { - "destination" : [ "obj-33", 1 ], - "source" : [ "obj-76", 9 ] + "destination" : [ "obj-34", 1 ], + "midpoints" : [ 66.100000000000023, 304.0, 51.100000000000023, 304.0, 51.100000000000023, 276.0, 152.100000000000023, 276.0 ], + "order" : 0, + "source" : [ "obj-6", 0 ] } } , { "patchline" : { - "destination" : [ "obj-37", 0 ], - "order" : 1, - "source" : [ "obj-76", 1 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-47", 0 ], + "midpoints" : [ 187.148611111111109, 194.0, 151.0, 194.0 ], + "source" : [ "obj-7", 0 ] } } , { "patchline" : { + "color" : [ 0.659449100494385, 0.0, 0.701319992542267, 1.0 ], "destination" : [ "obj-222", 0 ], + "midpoints" : [ 99.5, 266.0, 42.0, 266.0, 42.0, 413.0, 88.624305555555566, 413.0 ], "order" : 1, "source" : [ "obj-8", 0 ] } @@ -4732,7 +5227,9 @@ } , { "patchline" : { + "color" : [ 0.659449100494385, 0.0, 0.701319992542267, 1.0 ], "destination" : [ "obj-33", 0 ], + "midpoints" : [ 99.5, 251.0, 192.199999999999989, 251.0 ], "order" : 0, "source" : [ "obj-8", 0 ] } @@ -4740,6 +5237,7 @@ } , { "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], "destination" : [ "obj-14", 0 ], "source" : [ "obj-83", 1 ] } @@ -4747,6 +5245,7 @@ } , { "patchline" : { + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], "destination" : [ "obj-4", 0 ], "source" : [ "obj-83", 0 ] } @@ -4754,96 +5253,39 @@ } , { "patchline" : { - "destination" : [ "obj-76", 0 ], + "color" : [ 0.09070697426796, 0.709746718406677, 0.701321363449097, 1.0 ], + "destination" : [ "obj-16", 1 ], + "midpoints" : [ 101.0, 204.0, 42.0, 204.0, 42.0, 303.0, 45.0, 303.0 ], "source" : [ "obj-85", 1 ] } } , { "patchline" : { - "destination" : [ "obj-8", 0 ], - "source" : [ "obj-85", 0 ] + "color" : [ 0.035526528954506, 0.0, 0.700718641281128, 1.0 ], + "destination" : [ "obj-47", 0 ], + "midpoints" : [ 166.5, 195.0, 151.0, 195.0 ], + "source" : [ "obj-85", 2 ] } } , { "patchline" : { - "destination" : [ "obj-176", 0 ], - "source" : [ "obj-9", 0 ] - } - - } - ], - "styles" : [ { - "name" : "AudioStatus_Menu", - "default" : { - "bgfillcolor" : { - "type" : "color", - "color" : [ 0.294118, 0.313726, 0.337255, 1 ], - "color1" : [ 0.454902, 0.462745, 0.482353, 0.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39, - "autogradient" : 0 - } - + "color" : [ 0.659449100494385, 0.0, 0.701319992542267, 1.0 ], + "destination" : [ "obj-8", 0 ], + "midpoints" : [ 35.5, 209.0, 99.5, 209.0 ], + "source" : [ "obj-85", 0 ] } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "Audiomix", - "default" : { - "bgfillcolor" : { - "type" : "gradient", - "color1" : [ 0.376471, 0.384314, 0.4, 1.0 ], - "color2" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "color" : [ 0.290196, 0.309804, 0.301961, 1.0 ], - "angle" : 270.0, - "proportion" : 0.39 - } - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberB-1", - "default" : { - "accentcolor" : [ 0.011765, 0.396078, 0.752941, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberG-1", - "default" : { - "accentcolor" : [ 0.0, 0.533333, 0.168627, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 - } -, { - "name" : "numberGold-1", - "default" : { - "accentcolor" : [ 0.764706, 0.592157, 0.101961, 1.0 ] - } -, - "parentstyle" : "", - "multi" : 0 } , { - "name" : "numberR-1", - "default" : { - "accentcolor" : [ 0.784314, 0.145098, 0.023529, 1.0 ] + "patchline" : { + "color" : [ 1.0, 0.0, 0.0, 1.0 ], + "destination" : [ "obj-19", 0 ], + "midpoints" : [ 332.0, 194.0, 332.0, 194.0, 332.0, 266.0, 332.0, 266.0, 332.0, 389.0, 219.0, 389.0, 219.0, 468.0, 187.148611111111109, 468.0 ], + "source" : [ "obj-9", 0 ] } -, - "parentstyle" : "", - "multi" : 0 + } ] }