diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
deleted file mode 100644
index ea280a1cf..000000000
--- a/.devcontainer/Dockerfile
+++ /dev/null
@@ -1,82 +0,0 @@
-ARG VLANG_TAG=buster-dev
-
-FROM thevlang/vlang:${VLANG_TAG} AS builder
-# VLANG_TAG is specified again because the FROM directive resets ARGs
-# (but their default value is retained if set previously)
-ARG VLANG_TAG
-
-# options
-ARG DEV_IMG="false"
-
-# disable tzdata questions
-ENV DEBIAN_FRONTEND=noninteractive
-
-# use bash
-SHELL ["/bin/bash", "-c"]
-
-# install apt-utils
-RUN apt-get update -y \
- && apt-get install -y apt-utils 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) \
- && apt-get clean && rm -rf /var/lib/apt/lists/*
-
-# essential tools
-RUN apt-get update -y && apt-get install -y --no-install-recommends \
- ca-certificates \
- netbase \
- curl \
- git \
- make \
- && apt-get clean && rm -rf /var/lib/apt/lists/*
-
-# required compilers and libraries for vsl
-RUN apt-get update -y && apt-get install -y --no-install-recommends \
- python3.8 \
- python3-pip \
- python3.8-dev \
- gcc \
- gfortran \
- libxi-dev \
- libxcursor-dev \
- mesa-common-dev \
- liblapacke-dev \
- libopenblas-dev \
- libgc-dev \
- libgl1-mesa-dev \
- libopenmpi-dev \
- libhdf5-dev \
- hdf5-tools \
- opencl-headers \
- libmetis-dev \
- libsuitesparse-dev \
- libmumps-dev \
- libfftw3-dev \
- libfftw3-mpi-dev \
- && apt-get clean && rm -rf /var/lib/apt/lists/*
-
-ENV EDITOR code
-
-# build vsl
-ARG VSL_VERSION="latest"
-COPY docker/vsl-clone-and-build.sh /tmp/library-scripts/
-RUN /bin/bash /tmp/library-scripts/vsl-clone-and-build.sh "${DEV_IMG}" "${VSL_VERSION}"
-
-##################################################################################################
-# #
-# The code below is copied from: #
-# https://github.com/microsoft/vscode-remote-try-go/blob/master/.devcontainer/Dockerfile #
-# And modifies to use v lang instead #
-# #
-##################################################################################################
-
-# Options for setup script
-ARG INSTALL_ZSH="true"
-ARG UPGRADE_PACKAGES="false"
-ARG USERNAME=vscode
-ARG USER_UID=1000
-ARG USER_GID=$USER_UID
-
-# Install needed packages and setup non-root user. Use a separate RUN statement to add your own dependencies.
-COPY docker/common-debian.sh /tmp/library-scripts/
-RUN apt-get update \
- && /bin/bash /tmp/library-scripts/common-debian.sh "${INSTALL_ZSH}" "${USERNAME}" "${USER_UID}" "${USER_GID}" "${UPGRADE_PACKAGES}" \
- && apt-get autoremove -y && apt-get clean -y && rm -rf /var/lib/apt/lists/* /tmp/library-scripts
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
index 8838cfed3..1380daeec 100644
--- a/.devcontainer/devcontainer.json
+++ b/.devcontainer/devcontainer.json
@@ -1,40 +1,36 @@
-// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
-// https://github.com/microsoft/vscode-dev-containers/tree/v0.140.1/containers/docker-existing-dockerfile
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+// README at: https://github.com/devcontainers/templates/tree/main/src/docker-existing-dockerfile
{
"name": "Existing Dockerfile",
-
- // Update the 'dockerfile' property if you aren't using the standard 'Dockerfile' filename.
"build": {
// Sets the run context to one level up instead of the .devcontainer folder.
"context": "..",
- "dockerfile": "./Dockerfile",
+ // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
+ "dockerfile": "../Dockerfile",
"args": {
"DEV_IMG": "true"
}
},
- // Add the IDs of extensions you want installed when the container is created.
+ // Features to add to the dev container. More info: https://containers.dev/features.
+ // "features": {},
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ // "forwardPorts": [],
+
+ // Uncomment the next line to run commands after the container is created.
+ // "postCreateCommand": "cat /etc/os-release",
+
+ // Configure tool-specific properties.
"customizations": {
"vscode": {
"extensions": [
- "vlanguage.vscode-vlang",
+ "VOSCA.vscode-v-analyzer",
"ms-vscode.cpptools"
]
}
},
- // Use 'forwardPorts' to make a list of ports inside the container available locally.
- // "forwardPorts": [],
-
- // Uncomment the next line to run commands after the container is created - for example installing curl.
- // "postCreateCommand": "apt-get update && apt-get install -y curl",
-
- // Uncomment when using a ptrace-based debugger like C++, Go, and Rust
- // "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
-
- // Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker.
- // "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ],
-
- // Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
+ // Uncomment to connect as an existing user other than the container default. More info: https://aka.ms/dev-containers-non-root.
"remoteUser": "vscode"
}
diff --git a/.editorconfig b/.editorconfig
index f5dc02acb..faaccec74 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,20 +1,32 @@
-# top-most EditorConfig file
root = true
-# Unix-style newlines with a newline ending every file
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
+trim_trailing_whitespace = true
-# Matches multiple files with brace expansion notation
-[*.v]
-indent_style = space
-indent_size = 8
+[*.{v,js,css}]
+indent_style = tab
+
+[*.{bat,cmd}]
+# BAT/CMD ~ DOS/Win requires BAT/CMD files to have CRLF EOLNs
+end_of_line = crlf
-[*.rst]
+[*.{yml,yaml}]
indent_style = space
-indent_size = 3
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
+# lines that are too long will trigger an error in cmd/tools/vcheck-md.v
+# run v check-md [folder/file] to test markdown files
+# the longest normal line is specified with this constant:
+# `too_long_line_length_other = 100`
+max_line_length = 100
+
+[*.{txt,out}]
+insert_final_newline = false
-[Makefile]
+[{Makefile,GNUmakefile}]
indent_style = tab
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
new file mode 100644
index 000000000..3d4e961af
--- /dev/null
+++ b/.github/FUNDING.yml
@@ -0,0 +1,13 @@
+# These are supported funding model platforms
+
+github: ulises-jeremias # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
+custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index 53cc5f1b2..da0024fb6 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -5,7 +5,6 @@ title: "(short issue description)"
labels: [bug]
assignees: []
body:
-
- type: textarea
id: description
attributes:
diff --git a/.github/ISSUE_TEMPLATE/documentation.yml b/.github/ISSUE_TEMPLATE/documentation.yml
index fdd224591..e068c7548 100644
--- a/.github/ISSUE_TEMPLATE/documentation.yml
+++ b/.github/ISSUE_TEMPLATE/documentation.yml
@@ -4,7 +4,7 @@ title: "(short issue description)"
labels: [documentation]
assignees: []
body:
- - type: textarea
+ - type: textarea
id: description
attributes:
label: Describe the issue
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index 3d572b61c..d17019ff7 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -19,7 +19,7 @@ body:
description: |
Why do you need this feature? For example: "I'm always frustrated when..."
validations:
- required: true
+ required: true
- type: textarea
id: solution
attributes:
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index b57968e6f..7b943ecb4 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -1,85 +1,38 @@
name: VSL Continuous Integration
concurrency:
- group: ci-${{ github.event.number }}
- cancel-in-progress: true
+ group: ci-${{ github.event.number }}
+ cancel-in-progress: true
on:
# Allows you to run this workflow manually from the Actions tab
workflow_dispatch:
- schedule:
- - cron: "31 1,12 * * *"
-
push:
branches:
- - master
+ - main
pull_request:
branches:
- - master
+ - main
jobs:
- shellcheck:
- name: Shellcheck
- uses: ./.github/workflows/shellcheck.yml
-
- markdownlint:
- name: Markdown Lint
- uses: ./.github/workflows/markdownlint.yml
-
- todo:
- if: github.event_name == 'push'
- name: TODO
- uses: ./.github/workflows/todo.yml
-
- validate-docs:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout VSL
- uses: actions/checkout@v2
- with:
- path: vsl
-
- - name: Setup V
- uses: vlang/setup-v@v1.3
- with:
- check-latest: true
-
- - name: V doctor
- run: v doctor
-
- - name: Install dependencies
- run: |
- sudo apt-get update && \
- sudo apt-get install --quiet -y --no-install-recommends \
- gfortran \
- libxi-dev \
- libxcursor-dev \
- mesa-common-dev \
- liblapacke-dev \
- libopenblas-dev \
- libgc-dev \
- libgl1-mesa-dev \
- libopenmpi-dev \
- libhdf5-dev \
- hdf5-tools \
- opencl-headers
-
- - name: Copy VSL source code to V Modules
- run: cp -rf ./vsl ~/.vmodules
-
- - name: Validate Docs
- run: |
- cd ~
- v check-md ~/.vmodules/vsl
+ run-tests-on-linux:
+ runs-on: ${{ matrix.os }}
- fmt-check:
- runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ os:
+ - ubuntu-22.04
+ - ubuntu-20.04
+ flags:
+ - ""
+ - "--prod"
steps:
- name: Checkout VSL
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
path: vsl
@@ -111,28 +64,27 @@ jobs:
- name: Move VSL source code to V Modules
run: mv ./vsl ~/.vmodules
- - name: Verify Fmt
- run: |
- cd ~
- v fmt -verify ~/.vmodules/vsl
+ - name: Execute Tests using Pure V Backend
+ run: ~/.vmodules/vsl/bin/test ${{ matrix.flags }}
- run-tests-on-linux:
+ - name: Execute Tests using Pure V Backend with Pure C Blas
+ run: ~/.vmodules/vsl/bin/test ${{ matrix.flags }} --use-cblas
+
+ run-tests-on-macos:
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os:
- - ubuntu-22.04
- - ubuntu-20.04
- - ubuntu-18.04
- flags:
+ - macos-latest
+ flags:
- ""
- "--prod"
steps:
- name: Checkout VSL
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
path: vsl
@@ -146,34 +98,20 @@ jobs:
- name: Install dependencies
run: |
- sudo apt-get update && \
- sudo apt-get install --quiet -y --no-install-recommends \
- gfortran \
- libxi-dev \
- libxcursor-dev \
- mesa-common-dev \
- liblapacke-dev \
- libopenblas-dev \
- libgc-dev \
- libgl1-mesa-dev \
- libopenmpi-dev \
- libhdf5-dev \
- hdf5-tools \
- opencl-headers
+ brew install coreutils
+ brew install gcc
+ brew install libomp
+ brew install hdf5
+ brew install open-mpi
+ brew install openblas
+ brew install lapack
+ brew install opencl-headers
- name: Move VSL source code to V Modules
run: mv ./vsl ~/.vmodules
- name: Execute Tests using Pure V Backend
- run: ~/.vmodules/vsl/bin/test ${{ matrix.flags }}
+ run: ~/.vmodules/vsl/bin/test
- name: Execute Tests using Pure V Backend with Pure C Blas
- run: ~/.vmodules/vsl/bin/test ${{ matrix.flags }} --use-cblas
- if: ${{ matrix.os != 'ubuntu-18.04' }}
-
- - name: Execute Tests using Pure V Backend and Garbage Collection enabled
- run: ~/.vmodules/vsl/bin/test ${{ matrix.flags }} --use-gc boehm
-
- - name: Execute Tests using Pure V Backend with Pure C Blas and Garbage Collection enabled
- run: ~/.vmodules/vsl/bin/test ${{ matrix.flags }} --use-cblas --use-gc boehm
- if: ${{ matrix.os != 'ubuntu-18.04' }}
+ run: ~/.vmodules/vsl/bin/test --use-cblas
diff --git a/.github/workflows/deploy-docs.yml b/.github/workflows/deploy-docs.yml
index a5f4a3224..427012e56 100644
--- a/.github/workflows/deploy-docs.yml
+++ b/.github/workflows/deploy-docs.yml
@@ -3,17 +3,17 @@ name: Deploy Documentation
on:
push:
branches:
- - master
+ - main
jobs:
deploy-docs:
concurrency: deployment
-
+
runs-on: ubuntu-latest
steps:
- name: Checkout VSL
- uses: actions/checkout@v2
+ uses: actions/checkout@v3
with:
path: vsl
diff --git a/.github/workflows/docker-dev.yml b/.github/workflows/docker-dev.yml
index 975f9c0e9..f4ad9204b 100644
--- a/.github/workflows/docker-dev.yml
+++ b/.github/workflows/docker-dev.yml
@@ -13,16 +13,16 @@ on:
push:
branches:
- - master
+ - main
jobs:
docker:
uses: ./.github/workflows/docker-publish.yml
with:
- dockerfile: './.devcontainer/Dockerfile'
+ target: vsl-dev
tags: ulisesjeremias/vsl:dev
build-args: |
- DEV_IMG=true
+ DEV_IMG=false
secrets:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
index 0af72588c..992db0ce4 100644
--- a/.github/workflows/docker-publish.yml
+++ b/.github/workflows/docker-publish.yml
@@ -3,32 +3,27 @@ name: Docker Publish
on:
workflow_call:
inputs:
- dockerfile:
- description: 'The dockerfile to use'
+ target:
+ description: "The target to use"
type: string
required: false
- default: './Dockerfile'
- context:
- description: 'The context to use'
- type: string
- required: false
- default: '.'
+ default: ""
build-args:
- description: 'The build args to use'
+ description: "The build args to use"
type: string
required: false
- default: ''
+ default: ""
tags:
- description: 'The tags to use'
+ description: "The tags to use"
type: string
required: false
- default: ''
+ default: ""
secrets:
DOCKERHUB_USERNAME:
- description: 'The username to use for the image'
+ description: "The username to use for the image"
required: true
DOCKERHUB_TOKEN:
- description: 'The password to use for the image'
+ description: "The password to use for the image"
required: true
jobs:
@@ -51,6 +46,6 @@ jobs:
uses: docker/build-push-action@v3
with:
push: true
- file: ${{ inputs.dockerfile }}
tags: ${{ inputs.tags }}
build-args: ${{ inputs.build-args }}
+ target: ${{ inputs.target }}
diff --git a/.github/workflows/docker-stable.yml b/.github/workflows/docker-stable.yml
index 1ec50d146..613b36df1 100644
--- a/.github/workflows/docker-stable.yml
+++ b/.github/workflows/docker-stable.yml
@@ -13,7 +13,7 @@ jobs:
docker-latest:
uses: ./.github/workflows/docker-publish.yml
with:
- dockerfile: './Dockerfile'
+ target: "vsl"
tags: ulisesjeremias/vsl:latest
build-args: |
DEV_IMG=false
@@ -24,7 +24,7 @@ jobs:
docker-tag:
uses: ./.github/workflows/docker-publish.yml
with:
- dockerfile: './Dockerfile'
+ target: "vsl"
tags: ulisesjeremias/vsl:${{ github.ref_name }}
build-args: |
DEV_IMG=false
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
new file mode 100644
index 000000000..f0feefb0d
--- /dev/null
+++ b/.github/workflows/lint.yml
@@ -0,0 +1,61 @@
+name: Lint
+
+on:
+ push:
+ branches:
+ - main
+
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ super-linter:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout VSL
+ uses: actions/checkout@v4
+ with:
+ # Full git history is needed to get a proper list of changed files within `super-linter`
+ fetch-depth: 0
+
+ - name: Run Super-Linter
+ uses: super-linter/super-linter/slim@v5
+ env:
+ DEFAULT_BRANCH: main
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ VALIDATE_ALL_CODEBASE: false
+
+ docs:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout VSL
+ uses: actions/checkout@v4
+ with:
+ path: vsl
+ - name: Setup V
+ uses: vlang/setup-v@v1.3
+ with:
+ check-latest: true
+ - name: Setup VSL as V module
+ run: mv vsl ~/.vmodules/
+ - name: Validate Docs
+ run: v check-md -hide-warnings ~/.vmodules/vsl
+
+ fmt:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout VSL
+ uses: actions/checkout@v4
+ with:
+ path: vsl
+ - name: Setup V
+ uses: vlang/setup-v@v1.3
+ with:
+ check-latest: true
+ - name: Setup VSL as V module
+ run: mv vsl ~/.vmodules/
+ - name: Check Formatting
+ # NOTE: `cd` into module dir required. Currently, running `v fmt -verify` from outside the module dir
+ # would encounter errors and `v fmt -w` would even break the module.
+ run: cd ~/.vmodules/vsl && v fmt -verify .
diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml
deleted file mode 100644
index 61b9f5b2d..000000000
--- a/.github/workflows/markdownlint.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-name: Markdown Lint
-
-on:
- workflow_call:
-
-jobs:
- markdownlint:
- name: Markdown Lint
- runs-on: ubuntu-latest
- steps:
- - name: Begin CI...
- uses: actions/checkout@v3
- - name: Markdown Lint
- uses: articulate/actions-markdownlint@v1
diff --git a/.github/workflows/shellcheck.yml b/.github/workflows/shellcheck.yml
deleted file mode 100644
index d6879d82b..000000000
--- a/.github/workflows/shellcheck.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-name: Shellcheck
-
-on:
- workflow_call:
-
-jobs:
- shellcheck:
- name: Shellcheck
- runs-on: ubuntu-latest
- steps:
- - name: Begin CI...
- uses: actions/checkout@v3
- - name: Run ShellCheck
- uses: ludeeus/action-shellcheck@1.1.0
- with:
- severity: error
diff --git a/.github/workflows/todo.yml b/.github/workflows/todo.yml
index 6b027e89a..df93c68a8 100644
--- a/.github/workflows/todo.yml
+++ b/.github/workflows/todo.yml
@@ -1,7 +1,9 @@
name: Todo Checker
on:
- workflow_call:
+ push:
+ branches:
+ - main
jobs:
todo:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 27df51696..f7167fadb 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -31,18 +31,18 @@ accordingly in the steps below.)
branch `fix_alabala` ... just do again `git push pullrequest` when you have more
commits.
-9. If there are merge conflicts, or a branch lags too much behind VSL's master,
+9. If there are merge conflicts, or a branch lags too much behind VSL's main,
you can do the following:
- 1. `git pull --rebase origin master` # solve conflicts and do
+ 1. `git pull --rebase origin main` # solve conflicts and do
`git rebase --continue`
2. `git push pullrequest -f` # this will overwrite your current remote branch
with the updated version of your changes.
The point of doing the above steps, is to never directly push to the main VSL
-repository, _only to your own fork_. Since your local `master` branch tracks the
-main VSL repository's master, then `git checkout master`, as well as
-`git pull --rebase origin master` will continue to work as expected
+repository, _only to your own fork_. Since your local `main` branch tracks the
+main VSL repository's main, then `git checkout main`, as well as
+`git pull --rebase origin main` will continue to work as expected
(these are actually used by `v up`) and git can always do it cleanly.
Git is very flexible, so there are other ways to accomplish the same thing.
diff --git a/Dockerfile b/Dockerfile
index 0d1dd3593..1dd45ed1a 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,6 +1,6 @@
-ARG VLANG_TAG=buster-dev
+ARG VLANG_TAG=buster
-FROM thevlang/vlang:${VLANG_TAG} AS builder
+FROM thevlang/vlang:${VLANG_TAG} AS vsl
# VLANG_TAG is specified again because the FROM directive resets ARGs
# (but their default value is retained if set previously)
ARG VLANG_TAG
@@ -14,48 +14,66 @@ ENV DEBIAN_FRONTEND=noninteractive
# use bash
SHELL ["/bin/bash", "-c"]
-# install apt-utils
-RUN apt-get update -y \
- && apt-get install -y apt-utils 2> >( grep -v 'debconf: delaying package configuration, since apt-utils is not installed' >&2 ) \
- && apt-get clean && rm -rf /var/lib/apt/lists/*
-
-# essential tools
-RUN apt-get update -y && apt-get install -y --no-install-recommends \
- ca-certificates \
- netbase \
- curl \
- git \
- make \
- && apt-get clean && rm -rf /var/lib/apt/lists/*
-
-# required compilers and libraries for vsl
-RUN apt-get update -y && apt-get install -y --no-install-recommends \
- python3.8 \
- python3-pip \
- python3.8-dev \
- gcc \
- gfortran \
- libxi-dev \
- libxcursor-dev \
- mesa-common-dev \
- liblapacke-dev \
- libopenblas-dev \
- libgc-dev \
- libgl1-mesa-dev \
- libopenmpi-dev \
- libhdf5-dev \
- hdf5-tools \
- opencl-headers \
- libmetis-dev \
- libsuitesparse-dev \
- libmumps-dev \
- libfftw3-dev \
- libfftw3-mpi-dev \
- && apt-get clean && rm -rf /var/lib/apt/lists/*
-
-ENV EDITOR code
+RUN <
+
-The V Scientific Library
+
- -
-- -
-- -
-- -
-- -
-- -
-0?[0]:[]);if(o.enter().append("g").classed(f.containerClassName,!0).style("cursor","pointer"),o.exit().each((function(){n.select(this).selectAll("g."+f.headerGroupClassName).each(a)})).remove(),0!==r.length){var l=o.selectAll("g."+f.headerGroupClassName).data(r,p);l.enter().append("g").classed(f.headerGroupClassName,!0);for(var u=s.ensureSingle(o,"g",f.dropdownButtonGroupClassName,(function(t){t.style("pointer-events","all")})),c=0;c 90&&i.log("Long binary search..."),h-1},e.sorterAsc=function(t,e){return t-e},e.sorterDes=function(t,e){return e-t},e.distinctVals=function(t){var r,n=t.slice();for(n.sort(e.sorterAsc),r=n.length-1;r>-1&&n[r]===o;r--);for(var i,a=n[r]-n[0]||1,s=a/(r||1)/1e4,l=[],u=0;u<=r;u++){var c=n[u],f=c-i;void 0===i?(l.push(c),i=c):f>s&&(a=Math.min(a,f),l.push(c),i=c)}return{vals:l,minDiff:a}},e.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,u=r?Math.ceil:Math.floor;i0&&(n=1),r&&n)return t.sort(e)}return n?t:t.reverse()},e.findIndexOfMin=function(t,e){e=e||a;for(var r,n=1/0,i=0;il?r.y-l:0;return Math.sqrt(u*u+f*f)}for(var p=h(u);p;){if((u+=p+r)>f)return;p=h(u)}for(p=h(f);p;){if(u>(f-=p+r))return;p=h(f)}return{min:u,max:f,len:f-u,total:c,isClosed:0===u&&f===c&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},e.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,u=n.iterationLimit||30,c=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,f=0,h=0,p=s;f0?p=i:h=i,f++}return a}},81697:function(t,e,r){"use strict";var n=r(92770),i=r(84267),a=r(25075),o=r(21081),s=r(22399).defaultLine,l=r(73627).isArrayOrTypedArray,u=a(s);function c(t,e){var r=t;return r[3]*=e,r}function f(t){if(n(t))return u;var e=a(t);return e.length?e:u}function h(t){return n(t)?t:1}t.exports={formatColor:function(t,e,r){var n,i,s,p,d,v=t.color,g=l(v),y=l(e),m=o.extractOpts(t),x=[];if(n=void 0!==m.colorscale?o.makeColorScaleFuncFromTrace(t):f,i=g?function(t,e){return void 0===t[e]?u:a(n(t[e]))}:f,s=y?function(t,e){return void 0===t[e]?1:h(t[e])}:h,g||y)for(var b=0;b
/i;e.BR_TAG_ALL=/
/gi;var _=/(^|[\s"'])style\s*=\s*("([^"]*);?"|'([^']*);?')/i,w=/(^|[\s"'])href\s*=\s*("([^"]*)"|'([^']*)')/i,T=/(^|[\s"'])target\s*=\s*("([^"\s]*)"|'([^'\s]*)')/i,k=/(^|[\s"'])popup\s*=\s*("([\w=,]*)"|'([\w=,]*)')/i;function A(t,e){if(!t)return null;var r=t.match(e),n=r&&(r[3]||r[4]);return n&&L(n)}var M=/(^|;)\s*color:/;e.plainText=function(t,e){for(var r=void 0!==(e=e||{}).len&&-1!==e.len?e.len:1/0,n=void 0!==e.allowedTags?e.allowedTags:["br"],i=t.split(m),a=[],o="",s=0,l=0;l
"+l;e.text=u}(t,o,r,u):"log"===c?function(t,e,r,n,a){var o=t.dtick,l=e.x,u=t.tickformat,c="string"==typeof o&&o.charAt(0);if("never"===a&&(a=""),n&&"L"!==c&&(o="L3",c="L"),u||"L"===c)e.text=bt(Math.pow(10,l),t,a,n);else if(i(o)||"D"===c&&s.mod(l+.01,1)<.1){var f=Math.round(l),h=Math.abs(f),p=t.exponentformat;"power"===p||mt(p)&&xt(f)?(e.text=0===f?1:1===f?"10":"10"+(f>1?"":P)+h+"",e.fontSize*=1.25):("e"===p||"E"===p)&&h>2?e.text="1"+p+(f>0?"+":P)+h:(e.text=bt(Math.pow(10,l),t,"","fakehover"),"D1"===o&&"y"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if("D"!==c)throw"unrecognized dtick "+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if("D1"===t.dtick){var d=String(e.text).charAt(0);"0"!==d&&"1"!==d||("y"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,u,v):"category"===c?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r=""),e.text=String(r)}(t,o):"multicategory"===c?function(t,e,r){var n=Math.round(e.x),i=t._categories[n]||[],a=void 0===i[1]?"":String(i[1]),o=void 0===i[0]?"":String(i[0]);r?e.text=o+" - "+a:(e.text=a,e.text2=o)}(t,o,r):Dt(t)?function(t,e,r,n,i){if("radians"!==t.thetaunit||r)e.text=bt(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text="0";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){for(var r=1;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=bt(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text="รโฌ":e.text=o[0]+"รโฌ":e.text=["",o[0],"","รขยโ","",o[1],"","รโฌ"].join(""),l&&(e.text=P+e.text)}}}}(t,o,r,u,v):function(t,e,r,n,i){"never"===i?i="":"all"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i="hide"),e.text=bt(e.x,t,i,n)}(t,o,0,u,v),n||(t.tickprefix&&!d(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!d(t.showticksuffix)&&(o.text+=t.ticksuffix)),t.labelalias&&t.labelalias.hasOwnProperty(o.text)){var g=t.labelalias[o.text];"string"==typeof g&&(o.text=g)}if("boundaries"===t.tickson||t.showdividers){var y=function(e){var r=t.l2p(e);return r>=0&&r<=t._length?e:null};o.xbnd=[y(o.x-.5),y(o.x+t.dtick-.5)]}return o},q.hoverLabelText=function(t,e,r){r&&(t=s.extendFlat({},t,{hoverformat:r}));var n=Array.isArray(e)?e[0]:e,i=Array.isArray(e)?e[1]:void 0;if(void 0!==i&&i!==n)return q.hoverLabelText(t,n,r)+" - "+q.hoverLabelText(t,i,r);var a="log"===t.type&&n<=0,o=q.tickText(t,t.c2l(a?-n:n),"hover").text;return a?0===n?"0":P+o:o};var yt=["f","p","n","รยผ","m","","k","M","G","T"];function mt(t){return"SI"===t||"B"===t}function xt(t){return t>14||t<-15}function bt(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||"B",u=e._tickexponent,c=q.getTickFormat(e),f=e.separatethousands;if(n){var h={exponentformat:l,minexponent:e.minexponent,dtick:"none"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:"none"===e.showexponent?e.range.map(e.r2d):[0,t||1]};vt(h),o=(Number(h._tickround)||0)+4,u=h._tickexponent,e.hoverformat&&(c=e.hoverformat)}if(c)return e._numFormat(c)(t).replace(/-/g,P);var p,d=Math.pow(10,-o)/2;if("none"===l&&(u=0),(t=Math.abs(t))
")):x=h.textLabel;var L={x:h.traceCoordinate[0],y:h.traceCoordinate[1],z:h.traceCoordinate[2],data:_._input,fullData:_,curveNumber:_.index,pointNumber:T};d.appendArrayPointValue(L,_,T),t._module.eventData&&(L=_._module.eventData(L,h,_,{},T));var C={points:[L]};if(e.fullSceneLayout.hovermode){var P=[];d.loneHover({trace:_,x:(.5+.5*m[0]/m[3])*s,y:(.5-.5*m[1]/m[3])*l,xLabel:k.xLabel,yLabel:k.yLabel,zLabel:k.zLabel,text:x,name:c.name,color:d.castHoverOption(_,T,"bgcolor")||c.color,borderColor:d.castHoverOption(_,T,"bordercolor"),fontFamily:d.castHoverOption(_,T,"font.family"),fontSize:d.castHoverOption(_,T,"font.size"),fontColor:d.castHoverOption(_,T,"font.color"),nameLength:d.castHoverOption(_,T,"namelength"),textAlign:d.castHoverOption(_,T,"align"),hovertemplate:f.castOption(_,T,"hovertemplate"),hovertemplateLabels:f.extendFlat({},L,k),eventData:[L]},{container:n,gd:r,inOut_bbox:P}),L.bbox=P[0]}h.distance<5&&(h.buttons||w)?r.emit("plotly_click",C):r.emit("plotly_hover",C),this.oldEventData=C}else d.loneUnhover(n),this.oldEventData&&r.emit("plotly_unhover",this.oldEventData),this.oldEventData=void 0;e.drawAnnotations(e)},k.recoverContext=function(){var t=this;t.glplot.dispose();var e=function(){t.glplot.gl.isContextLost()?requestAnimationFrame(e):t.initializeGLPlot()?t.plot.apply(t,t.plotArgs):f.error("Catastrophic and unrecoverable WebGL error. Context lost.")};requestAnimationFrame(e)};var M=["xaxis","yaxis","zaxis"];function S(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=M[i],o=a.charAt(0),s=n[a],l=e[o],u=e[o+"calendar"],c=e["_"+o+"length"];if(f.isArrayOrTypedArray(l))for(var h,p=0;p<(c||l.length);p++)if(f.isArrayOrTypedArray(l[p]))for(var d=0;d
");b.text(T).attr("data-unformatted",T).call(f.convertToTspans,t),_=c.bBox(b.node())}b.attr("transform",a(-3,8-_.height)),x.insert("rect",".static-attribution").attr({x:-_.width-6,y:-_.height-3,width:_.width+6,height:_.height+3,fill:"rgba(255, 255, 255, 0.75)"});var k=1;_.width+6>w&&(k=w/(_.width+6));var A=[n.l+n.w*h.x[1],n.t+n.h*(1-h.y[0])];x.attr("transform",a(A[0],A[1])+o(k))}},e.updateFx=function(t){for(var e=t._fullLayout,r=e._subplots[p],n=0;n
")}(e,r,n,i):v.getValue(s.text,r),v.coerceString(m,o)}(C,n,i,T,M);w=function(t,e){var r=v.getValue(t.textposition,e);return v.coerceEnumerated(x,r)}(O,i);var z="stack"===g.mode||"relative"===g.mode,R=n[i],F=!z||R._outmost;if(D&&"none"!==w&&(!R.isBlank&&s!==u&&f!==p||"auto"!==w&&"inside"!==w)){var B=C.font,N=d.getBarColor(n[i],O),j=d.getInsideTextFont(O,i,B,N),U=d.getOutsideTextFont(O,i,B),V=r.datum();I?"log"===T.type&&V.s0<=0&&(s=T.range[0]